<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;C0YBRHg4cSp7ImA9WxNXE0Q.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832</id><updated>2009-10-01T16:59:15.639+07:00</updated><title>Андрей Таранцов</title><subtitle type="html">Филиал Ктулху</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>82</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/tarantsov" type="application/atom+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">tarantsov</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CU4FQHk5cCp7ImA9WxVbFUQ.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-1511533864063554713</id><published>2009-03-26T04:46:00.005+06:00</published><updated>2009-04-01T20:51:51.728+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-01T20:51:51.728+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="notable" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Софтовый шоппинг</title><content type="html">&lt;p&gt;Есть на&amp;nbsp;свете серьёзные покупки. Например, автомобиль люди &lt;small&gt;(чаще всего)&lt;/small&gt; покупают вдумчиво: изучают характеристики, ходят по&amp;nbsp;салонам, сравнивают, изучают результаты тестов. Прямая противоположность им&amp;nbsp;&amp;#8212; рутинные покупки вроде молока и&amp;nbsp;хлеба.
&lt;p&gt;Посередине&amp;nbsp;же существует &lt;b&gt;шоппинг&lt;/b&gt;&amp;nbsp;&amp;#8212; получение удовольствия от&amp;nbsp;спонтанных &amp;laquo;удачных покупок&amp;raquo;. Что такое удачная покупка? Что-нибудь, что сразу понравилось. Или что-то потенциально полезное, но&amp;nbsp;очень дешево. Или что-то, что давно хотел и&amp;nbsp;случайно встретил. Кажется, будто люди ищут в&amp;nbsp;магазине товары, но&amp;nbsp;на&amp;nbsp;самом деле они ищут удовольствие от&amp;nbsp;самого факта покупки.
&lt;p&gt;Эти три рынка совершенно различны. Важно понимать, на&amp;nbsp;какой из&amp;nbsp;них вы&amp;nbsp;хотите попасть с&amp;nbsp;вашим товаром (или мазагином).
&lt;p&gt;&lt;b&gt;Посмотрим на&amp;nbsp;софт.&lt;/b&gt; Большинство разработчиков считает, что они продают автомобили: пользователь сначала обнаружит потребность, потом пойдет выбирать, проанализирует варианты и&amp;nbsp;что-то одно купит.
&lt;p&gt;Разумеется, часто так и&amp;nbsp;бывает. Но&amp;nbsp;не&amp;nbsp;нужно забывать и&amp;nbsp;про другие варианты. Например, возьмём MacUpdate Promo: большие (вроде 50%) скидки на&amp;nbsp;программы, которые длятся один день (каждый день продают новую программу). Я&amp;nbsp;подписан на&amp;nbsp;их&amp;nbsp;рассылку, и&amp;nbsp;там регулярно пробегает софт, который очень хочется купить.
&lt;p&gt;Или, например, по&amp;nbsp;статистике подавляющее большинство купленных в&amp;nbsp;&lt;b&gt;App Store&lt;/b&gt; iPhone-приложений никогда не&amp;nbsp;запускают второй раз. Когда Apple рекомендовали цены вроде $0,99&amp;nbsp;или $3,99, думаю, они прекрасно понимали, что делают: магазин, в&amp;nbsp;котором люди будут наслаждаться покупкой, а&amp;nbsp;не&amp;nbsp;удовлетворять возникшие потребности.
&lt;p&gt;Кто-то из&amp;nbsp;блоггеров недавно сравнивал iPhone-приложения с&amp;nbsp;шоколадными батончиками: люди считают нормальным потратить бакс на&amp;nbsp;Snickers и&amp;nbsp;съесть его за&amp;nbsp;две минуты, точно так&amp;nbsp;же нормально потратить бакс на&amp;nbsp;игрушку и&amp;nbsp;поиграться в&amp;nbsp;неё пять минут.
&lt;p&gt;Для шоппинга очень важен &lt;b&gt;user experience,&lt;/b&gt; поскольку на&amp;nbsp;самом-то деле у&amp;nbsp;пользователя нет большой потребности. Он&amp;nbsp;сбежит, если вы&amp;nbsp;не&amp;nbsp;будете его развлекать и&amp;nbsp;удерживать. &amp;laquo;Самое популярное&amp;raquo;, &amp;laquo;еще часто покупают вот это&amp;raquo;, отзывы, заказ в&amp;nbsp;один щелчок&amp;nbsp;&amp;#8212; всё это вводит пользователя в&amp;nbsp;flow state, при котором он&amp;nbsp;получает удовольствие, а&amp;nbsp;вы&amp;nbsp;&amp;#8212; деньги.
&lt;p&gt;В этом часть гениальности iTunes: он&amp;nbsp;делает шоппинг до&amp;nbsp;безобразия простым и&amp;nbsp;неотделимым от&amp;nbsp;прослушивания музыки. Apple успешно развивает рынок в&amp;nbsp;направлении &lt;b&gt;&amp;laquo;шоппинг&amp;nbsp;&amp;#8212; часть нормального использования софта&amp;raquo;.&lt;/b&gt; В&amp;nbsp;iPhone OS&amp;nbsp;3.0&amp;nbsp;можно покупать дополнения из&amp;nbsp;самих приложений; на&amp;nbsp;сцене мы&amp;nbsp;видели демку Sims 3,&amp;nbsp;где в&amp;nbsp;процессе игры можно докупать коллекции вещей, и&amp;nbsp;демку многопользовательской стрелялки, где перед боем можно купить rocket launcher и&amp;nbsp;другой полезный арсенал (за&amp;nbsp;реальные деньги! вы&amp;nbsp;только подумайте!)
&lt;p&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;помощью скидок, featured items, editor&amp;#146;s&amp;nbsp;choice, рейтингов.
&lt;p&gt;&lt;small&gt;(Разумеется, товары не&amp;nbsp;обязаны быть платными. Вы&amp;nbsp;можете зарабатывать деньги за&amp;nbsp;счет популярности или рекламы, или&amp;nbsp;же предлагать смесь платного и&amp;nbsp;бесплатного. Поэтому вас, разработчики open-source, данный метод тоже касается: ничего так не&amp;nbsp;увеличивает популярность, как каталог почти никому не&amp;nbsp;нужных фенечек, которые можно поставить одним кликом.)&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-1511533864063554713?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/O9x-qWs40a4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/1511533864063554713/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=1511533864063554713" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1511533864063554713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1511533864063554713?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/03/software-shopping.html" title="Софтовый шоппинг" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkQFR3Y9eyp7ImA9WxVVFkw.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-3406102562050486241</id><published>2009-03-09T21:17:00.004+06:00</published><updated>2009-03-09T21:58:36.863+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-09T21:58:36.863+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="builder" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><title>Sneak Peak: YourSway Builder</title><content type="html">&lt;p&gt;Наша компания отличается еще и&amp;nbsp;тем, что пользуется самописной системой сборки. Когда-нибудь мы&amp;nbsp;доведем её&amp;nbsp;до&amp;nbsp;продукта и&amp;nbsp;будем предлагать другим, как &lt;a href="http://crashkitapp.appspot.com/"&gt;CrashKit&lt;/a&gt;, но&amp;nbsp;пока что YourSway Builder&amp;nbsp;&amp;#8212; это приватное удовольствие.
&lt;img src="http://files.tarantsov.com/build-in-progress-small.png" width="393" height="232" style="float: right;" /&gt;
&lt;p&gt;Зачем писать своё, когда в&amp;nbsp;мире есть BuildBot&amp;#146;ы&amp;nbsp;и&amp;nbsp;CruiseControl&amp;#146;ы?&amp;nbsp;Чтобы не&amp;nbsp;париться с&amp;nbsp;их&amp;nbsp;поддержкой. Каждая существующая система предполагает, что вы&amp;nbsp;держите настроенный клиент и&amp;nbsp;сервер, и&amp;nbsp;готовы с&amp;nbsp;ними возиться каждый раз, когда вам нужно изменить способ сборки или начать собирать новый проект.
&lt;p&gt;Мы, напротив, хотим, чтобы для поднятия билдов нового проекта было достаточно браузера.
&lt;p&gt;На любом компьютере можно запустить клиентское приложение, которое сможет собирать любые проекты, скачивая все нужные пререквизиты. У&amp;nbsp;нас каждый член команды может запросто запустить сборку любых проектов на&amp;nbsp;своем компьютере из&amp;nbsp;своих репозиториев (ибо при использовании DVCS у&amp;nbsp;каждого может быть свой репозиторий).
&lt;p&gt;На &lt;a href="https://yoursway.backpackit.com/pub/1714027"&gt;страничке в&amp;nbsp;Backpack&lt;/a&gt; есть несколько скриншотов, а&amp;nbsp;также описание нашего vision&amp;#146;а.&amp;nbsp;Повторюсь, что в&amp;nbsp;YourSway Builder&amp;#146;е&amp;nbsp;пока есть только то,&amp;nbsp;что было нам совершенно необходимо. Мы&amp;nbsp;им&amp;nbsp;пользуемся во&amp;nbsp;всех проектах, но&amp;nbsp;для публики он&amp;nbsp;еще не&amp;nbsp;готов.
&lt;p&gt;А что вы&amp;nbsp;думаете по&amp;nbsp;поводу билд-систем? Чего вам в&amp;nbsp;них не&amp;nbsp;хватает? В&amp;nbsp;каком виде YourSway Builder был&amp;nbsp;бы вам интересен?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-3406102562050486241?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/o7VV7z4sR2c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/3406102562050486241/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=3406102562050486241" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/3406102562050486241?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/3406102562050486241?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/03/sneak-peak-yoursway-builder.html" title="Sneak Peak: YourSway Builder" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;CEcMQnw-fCp7ImA9WxVVEU0.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-64555134166959355</id><published>2009-03-03T22:58:00.005+06:00</published><updated>2009-03-03T23:41:23.254+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T23:41:23.254+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="analysis and design" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="architectarium" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><title>Меньше ветвлений!</title><content type="html">&lt;p&gt;Одно из&amp;nbsp;правил Таранцова гласит: &lt;i&gt;в&amp;nbsp;программе не&amp;nbsp;должно быть большого редко исполняющегося куска кода.&lt;/i&gt;
&lt;p&gt;Пример. Вы&amp;nbsp;пишете библиотеку, которая отправляет данные об&amp;nbsp;исключениях на&amp;nbsp;сервер. Чаще всего, как только исключение возникло, можно сразу обратиться к&amp;nbsp;серверу, передать ему нужные данные и&amp;nbsp;забыть о&amp;nbsp;них. Иногда, тем не&amp;nbsp;менее, Интернет или сервер оказывается недоступен.
&lt;p&gt;&lt;b&gt;Тут есть две альтернативы.&lt;/b&gt; Вариант А:&amp;nbsp;попытаться отправить исключение, если не&amp;nbsp;удалось, записать его&amp;nbsp;в&amp;nbsp;файл, минут через десять считать и&amp;nbsp;попробовать заново. Вариант Б:&amp;nbsp;записать исключение в&amp;nbsp;файл, попробовать его&amp;nbsp;отправить через пару секунд; если не&amp;nbsp;удалось, повторить снова еще позже.
&lt;p&gt;Представьте себе, что мы&amp;nbsp;выбрали &lt;b&gt;вариант А.&lt;/b&gt;&amp;nbsp;Тогда, поскольку чаще всего сервер доступен, большой кусок кода, отвечающий за&amp;nbsp;сохранение на&amp;nbsp;диск, установку таймера, загрузку и&amp;nbsp;пр., обычно не&amp;nbsp;используется и&amp;nbsp;не&amp;nbsp;тестируется. А&amp;nbsp;значит:
&lt;blockquote&gt;&lt;p&gt;1. Увеличиваются затраты на&amp;nbsp;автоматизированные тесты и&amp;nbsp;на&amp;nbsp;QA.&lt;/p&gt;
&lt;p&gt;2. Рано или поздно вкрадется бага, не&amp;nbsp;отловленная тестами и&amp;nbsp;не&amp;nbsp;пойманная вашим QA-процессом. (Например, всё рушится только под Windows Vista x64, установленной на&amp;nbsp;FAT32-раздел.)&lt;/p&gt;
&lt;p&gt;3. Продукт с&amp;nbsp;этой багой вы&amp;nbsp;можете поставить заказчикам и&amp;nbsp;не&amp;nbsp;узнаете о&amp;nbsp;ней, пока заказчик с&amp;nbsp;ноутбуком под Windows Vista x64&amp;nbsp;на&amp;nbsp;FAT32&amp;nbsp;не запустит ваш продукт вдали от&amp;nbsp;Интернета.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Сравним с&amp;nbsp;&lt;b&gt;вариантом Б.&lt;/b&gt;&amp;nbsp;Исключение всегда сначала записывается, потом устанавливается таймер, он&amp;nbsp;срабатывает, исключение считывается и&amp;nbsp;отправляется. Нормальную (частую) и&amp;nbsp;ненормальную (редкую) ситуации обрабатывает один и&amp;nbsp;тот&amp;nbsp;же код; если он&amp;nbsp;не&amp;nbsp;работает, пользователи закричат об&amp;nbsp;этом сразу&amp;nbsp;же.&lt;/p&gt;
&lt;p&gt;Иногда такая &amp;laquo;унификация&amp;raquo; кода подсказывает дополнительные возможности. Скажем, если программа начнет генерировать тысячи исключений в&amp;nbsp;секунду, отложенная на&amp;nbsp;пару секунд отправка поможет реже обращаться к&amp;nbsp;серверу.
&lt;p&gt;Из нашего правила следуют два важных практических соображения.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Первое.&lt;/b&gt; Если вы&amp;nbsp;взвешиваете, добавлять или не&amp;nbsp;добавлять в&amp;nbsp;программу новую опцию, помимо прочего подумайте и&amp;nbsp;о&amp;nbsp;том, сколько придется написать редко исполняющегося кода.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Второе.&lt;/b&gt; Когда вы&amp;nbsp;пишете обработку ошибок или каких-то других особых ситуаций, всегда пытайтесь превратить эти особые ситуации в&amp;nbsp;нечто, что исполняется каждый день. Вместо операций &amp;laquo;начать&amp;raquo; и&amp;nbsp;&amp;laquo;продолжить&amp;raquo; делайте операцию &amp;laquo;начатьИлиПродолжить&amp;raquo;, вместо событий &amp;laquo;завершилось&amp;raquo; и&amp;nbsp;&amp;laquo;прервано из-за ошибки&amp;raquo; делайте событие &amp;laquo;остановилось&amp;raquo; и&amp;nbsp;т.&amp;nbsp;д.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-64555134166959355?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/Pgk1_dwGhfg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/64555134166959355/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=64555134166959355" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/64555134166959355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/64555134166959355?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/03/blog-post.html" title="Меньше ветвлений!" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;A0IGRXs6cCp7ImA9WxVVEEk.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-1410719444838843574</id><published>2009-03-03T08:08:00.008+06:00</published><updated>2009-03-03T09:05:24.518+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T09:05:24.518+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="yoursway" /><category scheme="http://www.blogger.com/atom/ns#" term="announcement" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="crashkit" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><title>CrashKit</title><content type="html">&lt;img src="http://crashkitapp.appspot.com/static/images/marketing/bugs.png" width="580" height="363" alt="" style="float: right;"&gt;
&lt;p&gt;Мы начинаем ограниченное бета-тестирование &lt;a href="http://crashkitapp.appspot.com"&gt;CrashKit&lt;/a&gt; — веб-приложения, собирающего и&amp;nbsp;показывающего необработанные исключения в&amp;nbsp;ваших продуктах.&lt;/p&gt;
&lt;p&gt;Преимущества очевидны: вместо того, чтобы ждать, пока о&amp;nbsp;проблемах сообщат пользователи, можно их обнаружить и&amp;nbsp;исправить сразу же после возникновения. Не&amp;nbsp;нужно больше просить прислать точное сообщение, не&amp;nbsp;нужно просматривать логи, не&amp;nbsp;нужно перебирать кучу писем от&amp;nbsp;пользователей об&amp;nbsp;одной и&amp;nbsp;той&amp;nbsp;же ошибке.&lt;/p&gt;
&lt;p&gt;CrashKit появился совсем недавно, но уже приносит нам огромную пользу, которой мы и&amp;nbsp;спешим поделиться с&amp;nbsp;вами.&lt;/p&gt;
&lt;p&gt;В ближайшее время мы введем в строй поддержку целой кучи языков, так что на&amp;nbsp;чем&amp;nbsp;бы вы ни&amp;nbsp;писали, смело шагайте на&amp;nbsp;&lt;a href="http://crashkitapp.appspot.com/"&gt;crashkitapp.appspot.com&lt;/a&gt;, оставляйте свой e-mail, и&amp;nbsp;мы в&amp;nbsp;течение месяца пригласим вас участвовать в&amp;nbsp;бета-тестировании.&lt;/p&gt;
&lt;p&gt;(Если вам интересно, CrashKit написан на&amp;nbsp;Google App Engine. Он уже некоторое время используется в&amp;nbsp;приложениях, которые мы поставляем клиентам. Хорошо работает поддержка Java/OSGi, в&amp;nbsp;разработке поддержка Java/Servlets и&amp;nbsp;Python/Django, после них будет Ruby on&amp;nbsp;Rails и&amp;nbsp;что-нибудь еще, чего захотят пользователи.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-1410719444838843574?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/LiJeg-jVilQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/1410719444838843574/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=1410719444838843574" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1410719444838843574?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1410719444838843574?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/03/crashkit.html" title="CrashKit" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;C04MSXo_fSp7ImA9WxVXFkk.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-658463008992931473</id><published>2009-02-15T01:35:00.003+06:00</published><updated>2009-02-15T02:06:28.445+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-15T02:06:28.445+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="yoursway" /><category scheme="http://www.blogger.com/atom/ns#" term="announcement" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="projectsync" /><title>ProjectSync 1.2</title><content type="html">&lt;img src="http://www.yoursway.com/images/ProjectSync/ProjectSync-menu.png" width="430" height="299" alt="" style="float: right;"&gt;
&lt;p&gt;Мы опубликовали &lt;a href="http://www.yoursway.com/free/ProjectSync/"&gt;ProjectSync&lt;/a&gt; — Eclipse-плагин, который синхронизирует папки на диске с Working Set'ами в Eclipse'е. Он автоматически импортирует недостающие проекты, а также автоматически перемещает вновь созданные проекты в нужную директорию (согласно их Working Set'у).&lt;/p&gt;
&lt;p&gt;Особенно это удобно, когда ваши проекты лежат в нескольких репозиториях: без ProjectSync при создании нового проекта приходится руками указывать, куда его положить, а при появлении нового проекта в репозитории — руками его импортировать. (Не говоря о том, что новый пустой workspace теперь заполнять в разы быстрее.)&lt;/p&gt;
&lt;p&gt;ProjectSync ничего не делает за вашей спиной и не тормозит Eclipse; синхронизация активируется пунктом в меню Project.&lt;/p&gt;
&lt;p&gt;Последнюю версию 1.2.1 можно взять со странички &lt;a href="http://www.yoursway.com/free/ProjectSync/"&gt;www.yoursway.com/free/ProjectSync/&lt;/a&gt;. Проверен на Eclipse&amp;nbsp;3.4 и Eclipse&amp;nbsp;3.5&amp;nbsp;M5. На Eclipse&amp;nbsp;3.3, скорее всего, тоже работает.&lt;/p&gt;
&lt;p&gt;Там же есть ссылки на сорцы, баг-трекер, лицензию (EPL) и способы получения техподдержки.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-658463008992931473?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/EQUeKMawnfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/658463008992931473/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=658463008992931473" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/658463008992931473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/658463008992931473?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/02/projectsync-12.html" title="ProjectSync 1.2" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D0IAQH8-eSp7ImA9WxVQF08.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-4713332969364985721</id><published>2009-02-04T11:20:00.005+06:00</published><updated>2009-02-04T11:32:21.151+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-04T11:32:21.151+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="notable" /><category scheme="http://www.blogger.com/atom/ns#" term="usability" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Совместимость</title><content type="html">&lt;p&gt;Название этой операционной системы, созданной маленькой компанией в конце 80-х и установленной сегодня на 8% компьютеров мира, программисты под Mac и iPhone регулярно вспоминают, набирая префикс NS у названий системных классов.&lt;/p&gt;

&lt;p&gt;Nextstep 1.0 появилась в 1989 году после трех лет разработки, имела полностью объектно-ориентированное API с архитектурой model-view-controller, имела ядро Mach и была Unix&amp;#8217;ом. Теперь она называется Mac OS X. За прошедшие 20 лет дизайн её API, теперь именующимся Cocoa, мало изменился: всё те же NSApplication, NSView, NSDocument успешно лежат в основе сегодняшних красивых анимированных Mac-приложений. Исходники GNUstep, реализующего Nextstep API 1993 года, можно в наши дни читать вместо (недоступных) исходников Cocoa.&lt;/p&gt;

&lt;p&gt;Пользовательский интерфейс Nextstep включал богатый drag&amp;#8217;n&amp;#8217;drop между приложениями, Dock, инспекторы, общесистемные сервисы, позволяющие приложениям пользоваться услугами друг друга, и «бандлы» — директории, выглядящие как файлы для пользователя и содержащие приложение со всеми зависимостями, которое достаточно просто скопировать на жесткий диск для установки. Всё это знают и любят сегодняшие пользователи маков.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Как относятся в Apple к совместимости?&lt;/b&gt; Плохо. Первую революцию они сделали в 2001 году с выходом Mac OS X: старые приложения теперь могли запускаться только в приложенной виртуальной машине, эмулирующей Mac OS 9 (при этом, естественно, выглядели неприглядно и медленно работали). В 2005 году эмулятор почил с выходом OS X 10.4 (итого: 4 года на портирование старых приложений).&lt;/p&gt;

&lt;p&gt;Для портирования людям был дан Carbon — C API, почти повторяющее API старой Mac OS 9. Carbon-приложения всегда оставались нежеланными гостями на компьютере: look&amp;#8217;n&amp;#8217;feel интерфейса OS X, как истинно объектно-ориентированной ОС, реализован в коде Cocoa (да, там можно изменить поведение стандартных элементов управления, просто унаследовавшись от них). Carbon представлял собой еще одну реализацию &lt;em&gt;примерно&lt;/em&gt; того же самого интерфейса.&lt;/p&gt;

&lt;p&gt;Вторую революцию Apple сделала в 2007 году: Carbon объявлен устаревшим и не будет поддерживать 64-битные приложения. Кадр года: Adobe переписывает Photoshop на Objective C. Называется, а вам слабо такое устроить?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Что приобретено взамен совместимости?&lt;/b&gt; Общий уровень приложений платформы: они все обновляются и соответствуют современным стандартам. Это работает по спирали: от более высокого качества приложений увеличиваются ожидания пользователей («никто не запустит программу без большой красивой иконки»), от высокого уровня ожиданий растет качество приложений. Apple создала платформу, в которой качество является более значимым (по сравнению с другими платформами) конкурентным преимуществом, и от этого создатели приложений больше инвестируют в качество.&lt;/p&gt;

&lt;p&gt;Вернемся к Nextstep и заметим, что Cocoa является примером архитектуры, которая работает настолько хорошо, что её не нужно менять. Совместимость — не препятствие, так что эксперимент довольно чистый.&lt;/p&gt;

&lt;p&gt;Зато NeXT/Apple серьезно относятся к преемственности навыков пользователя. Метафора пользовательского интерфейса Nextstep/OS X не меняется уже 20 лет. Внешний вид окон OS X не меняется 8 лет. Интерфейс приложений развивается эволюционно; Photoshop переписали, но выглядит и работает он так же; вышла новая версия iWork, но она только местами отличается от старой.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Что происходило всё это время в параллельном мире?&lt;/b&gt; 1989 год — релиз Nextstep 1.0 — вышла Windows 2.0 без перекрывающихся окон. 1995 год — вышла Windows 95, прощай, все старые навыки. 2001 год — вышла Window XP, теперь вы не узнаете свою панель управления. 2002 год — Microsoft выпускает .NET Framework 1.0, Desktop-приложения на котором до сих пор никто не пишет. Кстати, писать Desktop-приложения вообще не на чем: MFC — поганое уродство, всё остальное до жути низкоуровневое (Win32 API отличается от Cocoa как ассемблер от Питона).&lt;/p&gt;

&lt;p&gt;2007 год — вышла Windows Vista, прощайте, привычки, теперь всё в новом месте. Зато спиздили еще чуть-чуть гуйни мака, сделали мигающий экраном костыль для безопасности приложений (на маке privilege elevation в приложениях к этому моменту уже много лет как нормально ненавязчиво работало). Вышел Office 2007, его нужно изучать заново. 2009 год — Microsoft в Windows 7 меняет Taskbar на Dock и &lt;a href="http://blogs.msdn.com/e7/archive/2008/11/20/happy-anniversary-windows-on-the-evolution-of-the-taskbar.aspx"&gt;хвалится этим достижением в блоге&lt;/a&gt;. Кстати, Office 2007 Ribbon Bar будет доступна всем приложениям, теперь вам придется заново изучать не только офис.&lt;/p&gt;

&lt;p&gt;Зато вы всё еще можете запускать DOS-приложения на Windows Vista. Реймонд Чен в своём блоге высоко воспевает культуру совместимости в Microsoft. Но стоит ли она выпуска инвалидских продуктов? Всё дело в крупно-корпоративном рынке, которому его старые приложения ценнее качества ОС. Возможно, во времена Windows 95 совместимость была необходима и для пользователей: графические интерфейсы стали массовыми именно после Windows 95, и имей она проблемы, этого могло просто не произойти.&lt;/p&gt;

&lt;p&gt;Мораль раз: знайте, когда устранять совместимость, иначе она помешает конечному пользователю.&lt;/p&gt;

&lt;p&gt;Мораль два: нет так быстро всё меняется в ай-ти; команды под руководством великих людей создают технологии, живущие десятилетиями.&lt;/p&gt;

&lt;p&gt;Мораль три: культура качества — ценнейшая штука для любой платформы; без неё корпорации не способны выпускать хорошие продукты, даже если на рынке есть образцы для подражания.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-4713332969364985721?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/agygj_0G19U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/4713332969364985721/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=4713332969364985721" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/4713332969364985721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/4713332969364985721?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/02/compatibility.html" title="Совместимость" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;C0AMQnsyfSp7ImA9WxVQFkg.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-6027416844048245543</id><published>2009-02-03T14:52:00.005+06:00</published><updated>2009-02-03T15:03:03.595+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T15:03:03.595+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nscodernsk" /><title>NSCoderNight(Nsk)</title><content type="html">&lt;p&gt;Если вы живете в Академгородке Новосибирска и интересуетесь программированием под мак (или вы интересуетесь теми, кто интересуется программированием под мак), присоединяйтесь к хакатону NSCoder Night по вторникам в 19:00 в кофейне на ВЦ.
&lt;p&gt;Требуется: прийти и кодить под мак или iPhone. Кодить что-то своё, или найти на месте близких по духу товарищей и кодить с ними. Если нет мака, но есть желание научиться, предложите кому-нибудь парное программирование. И, разумеется, рядом будут люди, у которых всегда можно спросить совета.
&lt;p&gt;Зачинщик события в Новосибирске — сооснователь нашей компании &lt;a href="http://fourdman.blogspot.com/"&gt;Михаил Калугин&lt;/a&gt;. Я буду тоже. О других местах, где проводится NSCoder Night, читайте на &lt;a href="http://nscodernight.com/"&gt;nscodernight.com&lt;/a&gt;.
&lt;p&gt;Наконец, посты про NSCoder Night(Nsk) просьба помечать тегом nscodernsk, чтобы их можно было найти в блогосфере.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-6027416844048245543?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/q7kbHWKHHok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/6027416844048245543/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=6027416844048245543" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/6027416844048245543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/6027416844048245543?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2009/02/nscodernightnsk.html" title="NSCoderNight(Nsk)" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;Dk4ASHY7eCp7ImA9WxRUEk4.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-508965285987274937</id><published>2008-11-21T06:54:00.006+06:00</published><updated>2008-11-21T08:35:49.800+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-21T08:35:49.800+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>Лирика или музыка?</title><content type="html">&lt;p&gt;Пять альбомов в истории Pink Floyd наполнены глубоким смыслом и эмоциями, переданными потрясающей лирикой и выдающейся музыкой. Это Dark Side Of The Moon, Wish You Were Here, Animals, The Wall и The Final Cut.
&lt;p&gt;Появились они благодаря гениальности человека по имени Roger Waters, создавшего их замысел и написавшего к ним лирику. Человека такого же уровня доброты и ума, как Джон Леннон. Человека, которого &lt;a href="http://offline.computerra.ru/2001/404/11445/"&gt;можно было бы считать великим русским писателем&lt;/a&gt;, будь он русским писателем.
&lt;p&gt;Pink Floyd распалась потому, что их музыка держалась на великом гитаристе по имени David Gilmour, идеи Waters'а которому были чужды. Gilmour хотел играть просто красивую мощную музыку в стиле светлых лет Pink Floyd, а Waters всё больше подчинял музыку своей всё более немузыкальной лирике.
&lt;p&gt;&lt;b&gt;The Final Cut&lt;/b&gt; — последний альбом Pink Floyd, созданный Waters'ом. Он даже не совсем принадлежит группе; его полное название читается &amp;laquo;The Final Cut: A Requiem for the Post-War Dream by Roger Waters, performed by Pink Floyd&amp;raquo;.
&lt;p&gt;Альбом начал свою жизнь легким завершением The Wall и должен был включать песни из его экранизации, а также некоторые песни, задумывавшиеся для, но не попавшие в &amp;laquo;Стенку&amp;raquo;. Но после войны между Англией и Аргентиной 1982 года альбом стал тем, чем он есть — сложным тематическим завершением The Wall, использующим похожую эмоциональную структуру, но создающим реалистично-светлые чувства к концу.
&lt;p&gt;&lt;b&gt;The Wall&lt;/b&gt; — весьма попсовый альбом в смысле сложности его восприятия: он столь пропитан эмоциями, что его сложно не понять. Мелодическая структура Dark Side Of The Moon тоньше, Animals и Wish You Were Here значительно более спокойные. The Final Cut еще более &lt;em&gt;некричащий&lt;/em&gt;, и его прослушивание требует примерно столь же развитого вкуса и умения слушать, как классическая музыка.
&lt;p&gt;Тем временем, без Waters'а David Gilmour создал альбом The Devision Bell, название которому придумал Douglas Adams, а мусором который обозвал Waters. The Devision Bell нравится многим, что неудивительно: в нём наблюдается возврат к попсовому — легко воспринимаемому — звучанию. К сожалению, нет и глубокой лирики.
&lt;p&gt;The Devision Bell мне напоминает &lt;a href="http://letmegooglethatforyou.com/?q=%D0%BA%D1%83%D0%BB%D1%8C%D1%82+%D1%81%D0%B0%D0%BC%D0%BE%D0%BB%D1%91%D1%82%D0%BE%D0%BF%D0%BE%D0%BA%D0%BB%D0%BE%D0%BD%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2"&gt;культ самолётопоклонников&lt;/a&gt;, описанный Фейнманом. Красивая музыка, странные слова, всё сделали как надо — почему же получилось не так, как раньше? (Что мне не мешает иногда его слушать, конечно. Гилмор великий гитарист.)
&lt;p&gt;&amp;laquo;Music, when combined with a pleasurable idea, is poetry. Music without the idea is simply music.&amp;raquo; (Edgar Allan Poe).
&lt;p&gt;&lt;b&gt;Все выдающиеся исполнители,&lt;/b&gt; взрослея, уходят от легко воспринимаемого звучания независимо от того, становится ли  их музыка более простой или более сложной по структуре. Сравните ранних Beatles, поздних Beatles и сольные записи Леннона. Сравните ранних и поздних Deep Purple, и то, что они сейчас играют на концертах. Наконец, сравните раннего и позднего Waters'а. Что интересно, взросление лирики куда как менее заметно, чем взросление музыки. Быть может, потому, что писать взрослую лирику проще, чем писать немассовую музыку.
&lt;p&gt;Мораль? Breathe, breathe in the air. Don't be afraid to care. Look around, choose your own ground. Long you live and high you fly, and smiles you'll give and tears you'll cry, and all you touch and all you see is all your life will ever be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-508965285987274937?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/7tpdKiasxEs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/508965285987274937/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=508965285987274937" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/508965285987274937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/508965285987274937?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/11/lyrics-vs-music.html" title="Лирика или музыка?" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CkAHQX06fSp7ImA9WxRVFUw.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-8483176684035489681</id><published>2008-11-12T21:20:00.006+06:00</published><updated>2008-11-12T23:25:30.315+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-12T23:25:30.315+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>Всё, что нужно знать про Git</title><content type="html">&lt;p&gt;Доказано (опытом), что для успешной работы с Git требуется понимание структуры его объектной базы данных. К счастью, это очень просто. (А про то, &lt;a href="http://blog.tarantsov.com/2007/12/nine-reasons-to-use-git.html"&gt;чем Git интересен&lt;/a&gt;, я уже писал раньше.)&lt;/p&gt;
&lt;p style="color: red"&gt;&lt;b&gt;Часть первая из трёх: объекты&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Git-репозиторий состоит из набора объектов, лежащих в папке &lt;code&gt;.git/objects&lt;/code&gt;. Каждый объект хранится в файле, названном в честь SHA-1 хеша его содержимого. Например, объект &lt;code&gt;&lt;small&gt;55f6209f867f37598cfb56832adf74bee2921c3f&lt;/small&gt;&lt;/code&gt; лежит в файле &lt;code&gt;&lt;small&gt;.git/objects/55/f6209f867f37598cfb56832adf74bee2921c3f&lt;/small&gt;&lt;/code&gt;.
&lt;p&gt;Есть четыре вида объектов (blob, tree, commit и tag), о которых мы сейчас поговорим.
&lt;p&gt;1. Все файлы вашего проекта — это &lt;b&gt;blob&lt;/b&gt;'ы. Возьмём каждый файл, припишем к нему в начало тип "blob" и размер, посчитаем SHA-1 и запишем это в репозиторий. (Имя файла в blob не входит, так что одинаковые по содержимому файлы окажутся записанными только один раз.)
&lt;p&gt;2. Каждая директория проекта — это объект &lt;b&gt;tree&lt;/b&gt;. Он ссылается на другие деревья и blob'ы, а также указывает их имена и атрибуты. Вот пример содержимого объекта tree:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;small&gt;100644 blob 6fccfdcbd0a1cdbf3bf2a5960e601b369c0a921c    .gitignore
040000 tree 824b4bd4a0df733b5b5106b1b55c3630566759dc    com.yoursway.sadr.core
040000 tree 2406b80d9623067f92db7f60d6eeabfed6966a9f    com.yoursway.sadr.engine
040000 tree d1bae2405388774e484cfd3779adf7e1eda1f5d9    com.yoursway.sadr.python.core
040000 tree f3d282a4b963183fefdca6ff99a5995953a9c33e    com.yoursway.sadr.python.idioms.core
100755 blob 14cf98b8521eb27ae556d9b707290e177b337ff4    propagate-settings-from-core&lt;/small&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;3. Наконец, объекты &lt;b&gt;commit&lt;/b&gt; образуют историю проекта. Коммит ссылается на tree корневой директории проекта, а также имеет родителя или родителей (которых несколько в случае merge'а). Вот пример объекта commit:
&lt;blockquote&gt;&lt;pre&gt;&lt;small&gt;tree fdb267652d8d669e86ad0df61afc81b92a7ce680
parent b95b2ca7e9854898d62fb028f2e6135b3439240d
author Andrey Tarantsov &lt;andreyvit@gmail.com&gt; 1223355822 +0700
committer Andrey Tarantsov &lt;andreyvit@gmail.com&gt; 1223355822 +0700

Huge performance fix: findGoalStateByGoal is now DFS.

findGoalStateByGoal used to traverse every path is the graph and
thus was very slow (as slow as 500 ms travesing 3M goals on every
subgoal creation!) Changed to a real DFS.&lt;/small&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Смотрим содержимое репозитория.&lt;/b&gt; Пусть последний коммит проекта имеет, например, имя c889ffc87048cca59f908d3e48becb59a14ce950. Посмотреть его содержимое мы можем, введя команду
&lt;div style="text-align: center;"&gt;&lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-cat-file.html"&gt;cat-file&lt;/a&gt; commit c889ffc87048cca59f908d3e48becb59a14ce950&lt;/code&gt;,&lt;/div&gt;
результат которой вы только что видели выше. Далее, содержимое дерева, на которое указывает коммит, смотрится командой
&lt;div style="text-align: center;"&gt;&lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-ls-tree.html"&gt;ls-tree&lt;/a&gt; fdb267652d8d669e86ad0df61afc81b92a7ce680&lt;/code&gt;&lt;/div&gt;
(деревья хранятся в бинарном формате, поэтому &lt;code&gt;git cat-file tree&lt;/code&gt; выдала бы бинарный мусор, а вот вывод &lt;code&gt;ls-tree&lt;/code&gt; вы видели выше). Наконец, содержимое файла смотрится, опять же, командой
&lt;div style="text-align: center;"&gt;&lt;code&gt;git cat-file blob 6fccfdcbd0a1cdbf3bf2a5960e601b369c0a921c&lt;/code&gt;.&lt;/div&gt;
&lt;p&gt;Следует понимать, что вместо команды &lt;code&gt;git cat-file&lt;/code&gt; вы можете просто раззиповать нужный файл из &lt;code&gt;.git/objects&lt;/code&gt;. (Перед данными файла там окажется префикс из типа объекта и его размера.) Создать объект в репозитории можно командой &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-hash-object.html"&gt;hash-object&lt;/a&gt; -t&amp;nbsp;&lt;i&gt;тип&lt;/i&gt; -w --stdin&lt;/code&gt;.&lt;/p&gt;

&lt;p style="color: red"&gt;&lt;b&gt;Часть вторая из трёх: ссылки&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Как узнать, что коммит c889ff… является последним коммитом проекта? Для этого Git еще хранит так называемые &lt;b&gt;ссылки&lt;/b&gt; (references). Например, в файле &lt;code&gt;.git/refs/heads/master&lt;/code&gt; в текстовом виде хранится хеш последнего коммита на бранче master.&lt;/p&gt;
&lt;p&gt;Ссылки могут ссылаться друг на друга. Например, ссылка &lt;code&gt;.git/HEAD&lt;/code&gt; обычно имеет такое содержимое:
&lt;div style="text-align: center;"&gt;&lt;code&gt;ref: refs/heads/master&lt;/code&gt;&lt;/div&gt;
В этой ссылке хранится, какой коммит лежит в данный момент в вашей рабочей директории. (Напоминаю или сообщаю, что у каждой рабочей директории Git всегда есть свой собственный репозиторий.)
&lt;p&gt;Набрав команду &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html"&gt;rev-parse&lt;/a&gt; HEAD&lt;/code&gt;, можно узнать, на какой именно коммит указывает ссылка с данным именем. Ссылки можно использовать везде вместо названий коммитов, например, можно набрать &lt;code&gt;git cat-file commit refs/heads/master&lt;/code&gt;. Имена ссылок можно сокращать, отбрасывая слева куски пути, если это не вызывает неоднозначности. Например, можно написать &lt;code&gt;git cat-file commit master&lt;/code&gt;. (Кстати, в мане &lt;code&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html"&gt;rev-parse&lt;/a&gt;&lt;/code&gt; описаны все способы указания коммитов в Git.)&lt;/p&gt;

&lt;p style="color: red"&gt;&lt;b&gt;Часть третья из трёх: индекс&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Между вашей рабочей директорией и репозиторием есть промежуточное звено, называемое индексом (index). Все изменения, которые вы хотите закоммитить, вам нужно положить в индекс командой &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-add.html"&gt;add&lt;/a&gt;&lt;/code&gt;, а потом по индексу создать коммит командой &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html"&gt;commit&lt;/a&gt;&lt;/code&gt;.
&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Хозяйке на заметку.&lt;/b&gt; На практике я всегда пользуюсь командой &lt;code&gt;git commit --inter -v&lt;/code&gt;, которая запускает интерактивный add (&lt;code&gt;git add -i&lt;/code&gt;), а потом сразу делает коммит, причем (опция &lt;code&gt;-v&lt;/code&gt;) в редакторе показывает мне diff всего, что я собираюсь закоммитить.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Что такое индекс? Индекс похож на дерево (tree), но отличается от него &lt;b&gt;тремя вещами&lt;/b&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Во-первых, индекс хранит ссылки на блобы файлов всех поддиректорий проекта.&lt;/p&gt;
&lt;p&gt;Во-вторых, индекс хранит i-node'ы файлов — информацию, позволяющую быстро определять, изменился ли файл в рабочей директории по сравнению с индексом.&lt;/p&gt;
&lt;p&gt;В-третьих, при наличии конфликтов merge'а индекс может хранить ссылки на три блоба для каждого файла (базовая версия, "их" версия и "ваша" версия).&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Почему вам &lt;b&gt;нужно знать&lt;/b&gt; про индекс? Во-первых, потому, что команда &lt;code&gt;commit&lt;/code&gt; закоммит не то содержимое файлов, которое лежит в рабочей директории, а то содержимое, которое было добавлено в индекс командой &lt;code&gt;git add&lt;/code&gt;. Во-вторых, потому, что при разрешении конфликтов merge'а вам может захотеться вытащить эти альтернативные версии файлов (&lt;code&gt;git ls-files -u&lt;/code&gt; покажет вам файлы из индекса, имеющие конфликты, т.е. больше одной версии).&lt;/p&gt;

&lt;p style="color: red"&gt;&lt;b&gt;Вот и всё&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;На манипуляции с объектами, ссылками и индексом &lt;b&gt;строится весь Git&lt;/b&gt;. Чаще всего удобно полагаться на неё для выполнения нужных операций, но иногда можно вносить желаемые изменения руками.&lt;/p&gt;

&lt;p&gt;Важно понимать, что Git &lt;b&gt;не хранит&lt;/b&gt; дельты, метаинформацию о переименованиях файлов или что-либо еще, не описанное выше. Всё, что хранит Git — это копии состояния файлов проекта в разные моменты времени.&lt;/p&gt;

&lt;p&gt;Git умеет хранить объекты и ссылки компактно в одном файле (которые называются pack'ами), сжимая их чем-то вроде LZW, причем размещая данные в таком порядке, что получается еще эффективнее, чем хранить дельты. Git умеет восстанавливать данные о переименованиях файлов, перемещениях и копированиях &lt;em&gt;кусков файлов&lt;/em&gt; уже во время отображения истории.&lt;/p&gt;

&lt;p style="color: red"&gt;&lt;b&gt;Как изучать дальше?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Все команды подробно описаны в man pages, которые можно также читать на сайте. Важно понимать структуру объектной базы данных. Читайте &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html"&gt;Git tutorial&lt;/a&gt; (не забудьте прочесть &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial-2.html"&gt;вторую его часть&lt;/a&gt;) и описывающий всё-всё-всё &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html"&gt;Git user manual&lt;/a&gt;. Наконец, естественно, есть видеолекция &lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Linus Torvalds on Git&lt;/a&gt; (Линус, объясняющий, что такое мастурбация — смотреть всем!)

&lt;p&gt;Далее я попробую резюмировать то, что вам стоит узнать.&lt;/p&gt;

&lt;p&gt;Лучше всего избегать merge'ей, они делают историю версий некрасивой (и не так удобно читаемой). Вместо &lt;code&gt;git merge &lt;i&gt;somebody/somebranch&lt;/i&gt;&lt;/code&gt; старайтесь по возможности использовать &lt;code&gt;git rebase &lt;i&gt;somebody/somebranch&lt;/i&gt;&lt;/code&gt; (но требуется хорошо понимать, что при этом происходит и чем вы рискуете; никогда так не делайте, если уже залили куда-то свои изменения). Особенно важно держать историю версий линейной, если вы экспортируете коммиты в какой-нибудь svn с помощью &lt;code&gt;git-svn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Подружитесь с &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-reset.html"&gt;reset&lt;/a&gt;&lt;/code&gt;, который един в трёх лицах (soft, mixed и hard). Все три вам в жизни очень понадобятся. Еще полезная штука &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-stash.html"&gt;stash&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Git умеет импортировать историю из многих систем контроля версий (например см. &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html"&gt;cvsimport&lt;/a&gt;&lt;/code&gt;, также есть много отдельных импортировальщиков), двусторонне синхронизироваться с Subversion (см. &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"&gt;svn&lt;/a&gt;&lt;/code&gt;). Что касается импорта из CVS, Git в процессе задействует команду &lt;code&gt;cvsps&lt;/code&gt;, которая в официальной версии имеет разные баги. Пропатченная версия &lt;a href="http://ydirson.free.fr/en/software/scm/cvsps.html"&gt;имеется&lt;/a&gt; и очень рекомендуются к использованию при импорте из CVS.&lt;/p&gt;

&lt;p&gt;Git умеет &lt;b&gt;переписывать историю&lt;/b&gt;. Вообще-то, вооружившись приведенными сведениями, это можно сделать и руками (или хитрым скриптом), но намного быстрее использовать команды &lt;code&gt;git commit --amend&lt;/code&gt;, &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html"&gt;rebase&lt;/a&gt;&lt;/code&gt; (особенно &lt;code&gt;git rebase --interactive&lt;/code&gt;) и &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html"&gt;filter-branch&lt;/a&gt;&lt;/code&gt;; последний позволяет сделать буквально всё.&lt;/p&gt;

&lt;p&gt;Выше ничего не сказано про &lt;b&gt;теги&lt;/b&gt;; они есть, причем двух видов (теги можно делать просто ссылками в &lt;code&gt;refs/tags/&lt;/code&gt;, а можно дополнительно к ссылкам создавать полноценные объекты, в которые уже помещается комментарий и цифровая подпись). Не упоминался &lt;b&gt;ref log&lt;/b&gt; — локальная история изменений каждой ссылки, позволяющая ответить на вопрос, какая версия была у вас в рабочей директории два дня назад (или какой коммит был &lt;em&gt;у вас&lt;/em&gt; последним в бранче &lt;code&gt;master&lt;/code&gt; вчера). Если вы сделаете дикий rebase и вся история умрёт, ref log вас спасёт; смотрим его командой &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-log.html"&gt;log&lt;/a&gt; -g&lt;/code&gt;.

&lt;p&gt;Есть GitHub, где хостинг для open source-проектов бесплатный, а для проприетарных просто дешевый. GitHub делает управление репозиториями и отслеживание прогресса других маргинально проще, а заодно избавляет от необходимости регулярно вызывать &lt;code&gt;git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-gc.html"&gt;gc&lt;/a&gt;&lt;/code&gt; в репозиториях на сервере. (В ваших локальных репозиториях её всё равно нужно регулярно исполнять.)&lt;/p&gt;

&lt;p&gt;Наконец, Git — это не только его команды и система контроля версий. Это база данных, которую можно использовать для автоматической децентрализованной синхронизации файлов. Формат базы данных достаточно прост и позволяет работу с ней реализовать на других языках в вашем проекте. В частности, чтение и запись репозиториев Git уже реализована для Java в проекте &lt;a href="http://repo.or.cz/w/egit.git"&gt;jgit&lt;/a&gt; (и обрастает интересностями вроде &lt;a href="http://www.spearce.org/2008/07/using-jgit-to-publish-on-amazon-s3.html"&gt;встроенной поддержки Amazon S3&lt;/a&gt;). Если вам нужна распределенная база данных объектов, похожих на файлы, вам следует посмотреть в сторону Git.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-8483176684035489681?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/b7TOXpY_VlY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/8483176684035489681/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=8483176684035489681" title="Комментарии: 9" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8483176684035489681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8483176684035489681?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/11/essential-git.html" title="Всё, что нужно знать про Git" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total></entry><entry gd:etag="W/&quot;D0cERngyeyp7ImA9WxRQF0k.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-1385339601727057676</id><published>2008-10-11T23:16:00.006+07:00</published><updated>2008-10-12T00:10:07.693+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-12T00:10:07.693+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Основной налог (эссе про бизнес)</title><content type="html">&lt;p&gt;В&amp;nbsp;нашей стране есть три вида налогообложения для ООО: общая схема, упрощенная схема с&amp;nbsp;объектом &amp;laquo;доходы&amp;raquo; и&amp;nbsp;упрощенная схема с&amp;nbsp;объектом &amp;laquo;доходы минус расходы&amp;raquo;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Упрощенная схема&lt;/b&gt;, по&amp;nbsp;крайней мере на&amp;nbsp;мой непрофессиональный взгляд, намного выгоднее общей. Её,&amp;nbsp;однако, нельзя применять организациям с&amp;nbsp;оборотом более 20&amp;nbsp;000&amp;nbsp;000&amp;nbsp;руб в&amp;nbsp;год.&lt;/p&gt;

&lt;p&gt;Суть: вы&amp;nbsp;платите либо 6%&amp;nbsp;ото всех денег, которые ваша компания зарабатывает (схема &amp;laquo;доходы&amp;raquo;), либо 15%&amp;nbsp;от&amp;nbsp;денег, которые остаются после вычитания ваших расходов (схема &amp;laquo;доходы минус расходы&amp;raquo;).&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Какие траты можно отнести к&amp;nbsp;расходам?&lt;/b&gt; Увы, только те,&amp;nbsp;которые необходимы для вашей основной деятельности. Покупку техники, канцелярию, офис и&amp;nbsp;интернет можно. Еду, велосипеды для сотрудников, посиделки в&amp;nbsp;кафе и&amp;nbsp;многое другое нельзя. Это особенно актуально при 15%&amp;nbsp;схеме (ибо с&amp;nbsp;денег, потраченных на&amp;nbsp;расходы компании, вообще не&amp;nbsp;нужно платить налога), но&amp;nbsp;важно и&amp;nbsp;при 6%.&lt;/p&gt;

&lt;p&gt;Деньги, которые вы&amp;nbsp;не&amp;nbsp;отнесёте на&amp;nbsp;расходы, придётся обналичивать либо зарплатой (теряя еще около 30%&amp;nbsp;на&amp;nbsp;налоги), либо дивидендами (теряя еще 9%&amp;nbsp;подоходного налога), либо нелегально (теряя, по&amp;nbsp;слухам, 5-10% и,&amp;nbsp;по&amp;nbsp;стечению обстоятельств, от&amp;nbsp;своего морального спокойствия до&amp;nbsp;всех денег и&amp;nbsp;свободы). О&amp;nbsp;зарплате и&amp;nbsp;дивидендах мы&amp;nbsp;ещё поговорим.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;(Естественно, есть детали: например, при 6%&amp;nbsp;схеме этот налог уменьшается на&amp;nbsp;размер налога, выплаченного в&amp;nbsp;пенсионный фонд с&amp;nbsp;заработной платы сотрудников.)&lt;/small&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;small&gt;&lt;i&gt;В словарик.&lt;/i&gt; УФНС&amp;nbsp;&amp;#8212; управление федеральной налоговой службы. Её&amp;nbsp;нужно любить, иначе она полюбит вас. УСН&amp;nbsp;&amp;#8212; упрощенная схема налогообложения. Она ваш друг.&lt;/small&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;В&amp;nbsp;отличие от&amp;nbsp;упрощенной, &lt;b&gt;общая схема&lt;/b&gt; налогообложения, как следует из&amp;nbsp;разницы в&amp;nbsp;названиях, сложна. В&amp;nbsp;ней участвуют два налога: 18%&amp;nbsp;налог на&amp;nbsp;добавленную стоимость (НДС) и&amp;nbsp;24%&amp;nbsp;налог на&amp;nbsp;прибыль (аналогичный 15%-му налогу на&amp;nbsp;прибыль в&amp;nbsp;упрощенной схеме).&lt;/p&gt;

&lt;p&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;вторыми.)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;small&gt;&lt;i&gt;Хозяйке на&amp;nbsp;заметку.&lt;/i&gt; Если вы&amp;nbsp;перечисляете деньги за&amp;nbsp;какие-то услуги и&amp;nbsp;вас просят в&amp;nbsp;назначении платежа указать НДС, то&amp;nbsp;вы&amp;nbsp;встретили большую компанию на&amp;nbsp;общей схеме. Если на&amp;nbsp;НДС получателю похрен, то&amp;nbsp;он&amp;nbsp;маленькая фирмочка на&amp;nbsp;упрощёнке.&lt;/small&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Только что открытая компания находится на&amp;nbsp;общей схеме налогообложения. Для &lt;b&gt;перехода на&amp;nbsp;упрощенную схему&lt;/b&gt; нужно по-шустрому подать заявление в&amp;nbsp;налоговую, выбрав объект налогообложения (&amp;laquo;доходы&amp;raquo; или &amp;laquo;доходы минус расходы&amp;raquo;). Изменить этот выбор нельзя в&amp;nbsp;течение 3-х лет.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-1385339601727057676?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/KfHW-b1aQyY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/1385339601727057676/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=1385339601727057676" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1385339601727057676?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1385339601727057676?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/10/main-tax-business-series.html" title="Основной налог (эссе про бизнес)" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0UGRHwzfip7ImA9WxRQF0k.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-5134024471575890068</id><published>2008-10-11T22:40:00.005+07:00</published><updated>2008-10-11T23:07:05.286+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-11T23:07:05.286+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Как сосчитать подписчиков?</title><content type="html">&lt;p&gt;У &lt;del&gt;моей уютной ЖЖешечки&lt;/del&gt; этого блога 72&amp;nbsp;подписчика. Браузером ежедневно на&amp;nbsp;него заходят около 17&amp;nbsp;человек, что дает 545&amp;nbsp;посещений в&amp;nbsp;месяц от&amp;nbsp;402&amp;nbsp;уникальных посетителей; 332&amp;nbsp;посещения дают поисковики, а&amp;nbsp;125&amp;nbsp;&amp;mdash; ссылки с&amp;nbsp;других сайтов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Как узнать всю эту информацию про свой блог?&lt;/b&gt; Во-первых, нужно следить за&amp;nbsp;подписками через RSS. Для этого бог создал FeedBurner. Более того, блоггер умеет интегрироваться с&amp;nbsp;ним так, что &lt;b&gt;ваши подписчики не&amp;nbsp;заметят никаких перемен&lt;/b&gt; (я&amp;nbsp;уже говорил, что самое время перейти на&amp;nbsp;блоггер?) Итак:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Регистрируемся на&amp;nbsp;FeedBurner'е, получаем там урль вашего нового фида.&lt;/p&gt;
&lt;p&gt;Идем в&amp;nbsp;блоггер, настраиваем в нём редирект фида на&amp;nbsp;новенький урль фидбёрнера.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Во-вторых, нужно использовать &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;, чтобы отслеживать обычных посетителей вашего блога.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Регистрируемся, получаем у&amp;nbsp;гугла JavaScript-код отслеживания посетителей, кидаем этот код в&amp;nbsp;самый конец макета страниц. Блоггер позволяет добавлять произвольные фрагменты HTML/JavaScript, насчет ЖЖ не&amp;nbsp;знаю (кстати, самое время перейти на блоггер).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Дать настояться недельку-другую, статистика готова.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;А вы&amp;nbsp;знали, что Google купил FeedBurner? Как водится, про-фичи последнего стали бесплатны.&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-5134024471575890068?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/wJ1D9kt0UiM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/5134024471575890068/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=5134024471575890068" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/5134024471575890068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/5134024471575890068?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/10/counting-your-subscribers.html" title="Как сосчитать подписчиков?" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;AkIHRX4yeyp7ImA9WxRQEEs.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-4616171979642935621</id><published>2008-10-04T03:52:00.002+07:00</published><updated>2008-10-04T04:15:34.093+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-04T04:15:34.093+07:00</app:edited><title>www.yoursway.com</title><content type="html">&lt;p&gt;Мы официально открыли &lt;a href="http://www.yoursway.com/"&gt;сайт нашей компании&lt;/a&gt;. Приглашаю всех повтыкать и высказать своё мнение. Полностью сделано своими руками; профессиональный дизайн сейчас в разработке, но его ждать нескоро.
&lt;p&gt;Из интересного. &lt;b&gt;Сайт хостится на Google App Engine.&lt;/b&gt; Почему? Причины две.
&lt;p&gt;Во-первых, больше всего на свете меня бесит перезапускать lighttpd после заливания изменений на сервер. Google App Engine позволяет обойтись щелчком по кнопочке Deploy.
&lt;p&gt;Во-вторых, я уверен, что в самый ответственный момент наш сервак накроется медным тазом: кто-нибудь испортит конфигурацию lighttpd, не выдержит нагрузку скрипт, деинсталлируется апач (привет, менеджеры пакетов). В ответственные моменты все особенно спешат, а на Slashdot'е статьи появляются вообще ночью, не уследишь. В блоге любого веб-стартапа есть статья про то, как их дигнули, слэшдотнули или техкранчнули, и у них ни черта не работало два дня. Мы, правда, &lt;em&gt;ещё&lt;/em&gt; не веб-стартап.
&lt;p&gt;Кроме того, download.yoursway.com и пачка подобных статических адресов &lt;b&gt;обслуживаются напрямую с Amazon S3.&lt;/b&gt; Если вы не знали, так можно. Причины те же.
&lt;p&gt;Итого: репозитории на GitHub, багтрекинг на Lighthouse, взаимодействие с клиентами через Basecamp, чат на Campfire, веб-сайт и build-система на Google App Engine. Собственный сервер можно выключать хоть сейчас, никто не заметит. Удовольствие стоит 120 баксов в месяц, изредка нужный сервер еще 30.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-4616171979642935621?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/Y8NTlyhEWNg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/4616171979642935621/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=4616171979642935621" title="Комментарии: 8" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/4616171979642935621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/4616171979642935621?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/10/wwwyourswaycom.html" title="www.yoursway.com" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total></entry><entry gd:etag="W/&quot;Ck4CR3k9eyp7ImA9WxRRF0g.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-5931393355501465873</id><published>2008-09-30T11:53:00.001+07:00</published><updated>2008-09-30T12:02:46.763+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-30T12:02:46.763+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Регистрируем ООО (эссе про бизнес)</title><content type="html">&lt;p&gt;Предположим, вы хотите открыть свое собственное ООО.
&lt;p&gt;&lt;b&gt;Почему&lt;/b&gt;, кстати, &lt;b&gt;ООО?&lt;/b&gt; В России есть много видов юридических лиц, от банальных ООО и ИЧП до экзотических товариществ. Мне известно следующее:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;• ООО имеет минимальные требования к стартовому капиталу: нужно внести 10&amp;nbsp;000&amp;nbsp;руб, причем можно формировать уставной капитал не деньгами, а какой-нибудь техникой или другими ценностями, которые вы сами же и оцениваете;
&lt;p&gt;• учредители ООО не несут материальной ответственности за его долги; максимум, что они теряют — внесенный уставной капитал, поэтому-то его и зовут обществом с ограниченной ответственностью;
&lt;p&gt;• индивидуальный частный предприниматель, напротив, отвечает всем своим имуществом;
&lt;p&gt;• акционерные общества имеют на порядок более высокие требования к вносимому капиталу и более сложную бухгалтерию.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;С большой вероятностью для вас наиболее подходящей формой собственности также являются три о. Однако лучше с кем-нибудь посоветоваться, и здесь пришло время дать совет: &lt;b&gt;найдите хорошего бухгалтера сразу&lt;/b&gt;. Это сэкономит кучу денег, которые вы потратили бы на консультации и просто по глупости.
&lt;p&gt;По моему впечатлению, стандартная цена приходящего бухгалтера в Академгородке для маленькой фирмы — 10&amp;nbsp;000&amp;nbsp;руб в месяц; за это он берет на себя всю отчетность и все прочие бумажки. Если повезет, как нам, то еще и раздает кучу советов по организации бизнеса. Можно, видимо, найти и дешевле: как минимум одна контора, рекламирующаяся спамом в аське, предлагала аналогичные на вид услуги за 5&amp;nbsp;000 в месяц.
&lt;p&gt;&lt;b&gt;Регистрация ООО&lt;/b&gt; состоит из следующих шагов:
&lt;blockquote&gt;
&lt;p&gt;1. Создать устав и учредительный договор, распечатать в двух копиях, сшить, подписать.
&lt;p&gt;2. Написать протокол собрания учредителей №&amp;nbsp;1, главный результат которого — решение об образовании ООО и назначении директора.
&lt;p&gt;3. Заполнить заявление о регистрации (говорят, форма 13-00) и о долях учредителей (говорят,  форма 14-01).
&lt;p&gt;4. Решить, чем вы занимаетесь, и описать это кодами ОКВЭД (общероссийской классификатор видов экономической деятельности).
&lt;p&gt;5. Заверить у нотариуса… что именно, плохо помню: то ли учредительный договор, то ли заявления. Стоит порядка 1&amp;nbsp;000&amp;nbsp;руб.
&lt;p&gt;6. Оплатить госпошлину около 2&amp;nbsp;000&amp;nbsp;руб.
&lt;p&gt;7. Отдать все бумажки в налоговую.
&lt;p&gt;8. Через 5 рабочих дней получить свидетельство о регистрации и еще некоторое количество мукулатуры.
&lt;p&gt;9. Написать заявление о переходе на упрощенную систему налогообложения.
&lt;p&gt;10. Сделать печать.
&lt;p&gt;11. Снять офис.
&lt;p&gt;12. Открыть расчетный счет в банке (его могут не открыть, пока вы не покажете договор аренды офиса), сообщить о нем в налоговую в течение 10 (или 5?) рабочих дней.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Лично я бухгалтера не имел и &lt;b&gt;обратился в юридическую фирму&lt;/b&gt;. Они взяли вполне разумную сумму в 5&amp;nbsp;000&amp;nbsp;руб и выполнили за это шаги 1–4, 9 и 10 (т.е. написали документы и бесплатно сделали печать с нашим логотипом, о чем мы специально договорились). Тем не менее, оно того не стоит: вся подготовка бумажек занимает от силы час, в готовые шаблоны просто вписываются ваши данные.
&lt;p&gt;Нужно, конечно, эти &lt;b&gt;шаблоны&lt;/b&gt; где-то взять. Говорят, документы на все случаи жизни есть в Консультанте+, однако я его отродясь не видел и, дай бог, не увижу. Примеры учредительных документов можно попробовать посмотреть в любом знакомом ООО или нагуглить. Но лучше, как я уже сказал, найти бухгалтера заранее и свалить всю работу на него.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-5931393355501465873?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/bZfMzoonFaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/5931393355501465873/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=5931393355501465873" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/5931393355501465873?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/5931393355501465873?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/registering-llc-business-series.html" title="Регистрируем ООО (эссе про бизнес)" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0UNQHY8cCp7ImA9WxRRF00.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-7938939005036090127</id><published>2008-09-29T21:47:00.009+07:00</published><updated>2008-09-29T22:14:51.878+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T22:14:51.878+07:00</app:edited><title>Горбачёв</title><content type="html">&lt;p&gt;Со многими знакомыми я уже делился этим клипом, но он заслуживает даже большей аудитории. Музыка — АНЖ «Горбачёв», режиссер и автор видео — &lt;a href="http://en.wikipedia.org/wiki/Tom_Stern"&gt;Tom Stern&lt;/a&gt;, снимавший клипы для Marilyn'а Manson'а и Red Hot Chilli Peppers. (HD-вариант клипа можно найти &lt;a href="http://www.vimeo.com/1223566"&gt;на vimeo&lt;/a&gt;.)&lt;p style="text-align: center;"&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ew9YQVRSlHE&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ew9YQVRSlHE&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;Мне кажется, многие современники не осознают, за что Горбачёву дали нобелевскую премию мира. Вот, например, кусок из интервью с Ричардом Бахом (1991 г.):&lt;blockquote&gt;&lt;small&gt;&lt;p&gt;«Американские газеты раньше часто публиковали рисунок, на котором были изображены часы, стрелки которых показывали без нескольких секунд полночь. Эти часы напоминали о том, что, возможно, до полного уничтожения нам осталось несколько секунд. Но на каком-то уровне мы все наблюдали за этими часами и думали: все-таки время еще есть, можно поиграть еще, мы еще даже успеем исполнить национальный гимн. А вот когда времени совсем не будет, произойдет чудо. И чудо действительно произошло. Для нас им стал Михаил Горбачев.&lt;/p&gt;&lt;p&gt;Вы можете к нему относиться как угодно, но нами он был воспринят как самый смелый человек нашего времени. Я уверен, что именно он спас мир.&lt;/p&gt;&lt;p&gt;[...]&lt;/p&gt;&lt;p&gt;Что было потом,  не так важно.  Я знаю, что в Союзе его не любят. Но его   любят   в  США.  В  нашей  версии  истории  он  уже  заслужил замечательное место.  Кто-то  недавно даже сказал,  что если Горбачеву будет совсем  плохо  в  Союзе,  он  может  приехать в Штаты и выиграть президентские выборы.»&lt;/p&gt;&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;Возвращаясь к клипу, вот некоторые пояснения автора со странички на vimeo:&lt;blockquote&gt;&lt;small&gt;&lt;p&gt;«I did this video for a Russian Metal Band called ANJ. It is pretty crazy. When I saw the lyrics it seemed to be an earnest tribute to Mikael Gorbachov (that's how the Russians spell it), so I was a bit confounded about what the video concept should be, but then I had a brainstorm to take it way over the top and I think it was just the thing. Suffice to say it's half Russian History allegory as told through an old zombie movie made in the Soviet Union, and half animated Soviet Propaganda posters. It's in HD, so let it load a bit before you play it and then click the little "four arrows" symbol on the lower right part of the viewer to see it in true HD. BTW- the band has asked that I include their myspace address: myspace.com/anjkill&lt;p&gt;I shot this on two Panasonic HVX 200s at 720P, then edited in Final Cut Pro and composited in After Effects CS3. It took about 3 months of post work with three animators working for about 6 weeks and me finishing it myself for the rest of that time (after I ran out of money to pay animators).&lt;p&gt;The peasant girl is Irina Voronina, former Playboy Playmate and star of a television show I directed called Saul of the Molemen on Cartoon Network's Adult Swim. The Blacksmith girl is Vanessa Kaye, former Man Show Juggie Girl who I worked with when I directed over there. And the Washwoman is newcomer Kerri Sherman, who is managed by the same company as Irina.
&lt;p&gt; It was indeed a TON of work. I spent many a night hunched over my Mac Pro until the sun came up trying to get the shots right. It is very gratifying to see that it is being enjoyed by people, since I really didn't make any money doing this. The whole budget went into the video itself.»&lt;/p&gt;&lt;/small&gt;&lt;/blockquote&gt;&lt;p&gt;Лирика:&lt;/p&gt;&lt;blockquote&gt;&lt;small&gt;&lt;p&gt;Over Mother Russia&lt;br&gt;
There are moans and crys&lt;br&gt;
The convicted ones are marching&lt;br&gt;
to the never lands to die.
&lt;p&gt;The sound of birds' singing&lt;br&gt;
is a farewell song,&lt;br&gt;
But this endless plain&lt;br&gt;
is where they belong.
&lt;p&gt;But one escaped&lt;br&gt;
Out of guardman's sight&lt;br&gt;
With his only dream –&lt;br&gt;
To Let his country rise.
&lt;p&gt;Freedom was the goal&lt;br&gt;
He was dreaming of,&lt;br&gt;
And that person's name&lt;br&gt;
Is Michael Gorbachov
&lt;p&gt;Against the oppressor –&lt;br&gt;
I'm the new tsar successor!
&lt;p&gt;Hey, it's time to spill the masters' blood,&lt;br&gt;
Time for us to rise up from the mud.&lt;br&gt;
Gorbachov , a simple Cossack man,&lt;br&gt;
By his side we'll free our native land.&lt;/p&gt;&lt;/small&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-7938939005036090127?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/j1G5CJJY2No" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/7938939005036090127/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=7938939005036090127" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/7938939005036090127?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/7938939005036090127?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/gorbachev.html" title="Горбачёв" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;A0YAQX48fCp7ImA9WxRREk8.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-2857502626588578652</id><published>2008-09-24T10:40:00.005+07:00</published><updated>2008-09-24T11:05:40.074+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-24T11:05:40.074+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="predictions" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="advocacy" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>MacWorld 2009: App Store для Mac-приложений?</title><content type="html">&lt;p&gt;Позволю себе сделать прогноз на MacWorld 2009: в Mac OS X 10.6 Snow Leopard будет встроена DRM-технология, позволяющая продавать OS X-приложения через App Store наряду с iPhone-приложениями. Хотя некоторые freetards повозмущаются, для большинства это будет очередной реализованной мечтой.
&lt;p&gt;&lt;b&gt;Программистам&lt;/b&gt; — ниже барьер входа на рынок, не нужно изобретать свой веб-сайт с веб-магазином, серийники, систему лицензирования. (Страшно сказать — вообще никаких серийников. Из моего опыта с app store'ом, DRM рулит.) А &lt;b&gt;пользователям&lt;/b&gt; — единый каталог софта, объединяющий лучшее из миров Unix (репозиторий пакетов, откуда можно ставить нужные программы в несколько клавиатурных кликов) и коммерческих приложений.
&lt;p&gt;Самое приятное в этой перспективе — то, что купленные (или, для бесплатных, скаченные) программы запоминаются в iTunes App Store. Если сменить телефон, на новом тут же появятся все программы и настройки, которые были на старом. Распространение принципа на компьютеры сделает апгрейд мака полностью соответствующим известному комиксу авторства &lt;a href="http://trunks.fireball20xl.com/twats/comic/comics.php?id=96"&gt;Trunks и Soto&lt;/a&gt;:
&lt;p&gt;&lt;a href="http://trunks.fireball20xl.com/twats/comic/comics.php?id=96"&gt;&lt;img src="http://trunks.fireball20xl.com/twats/comic/comics/096.jpg" border="0" width="567" height="525"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-2857502626588578652?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/y2xFJjSjCUI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/2857502626588578652/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=2857502626588578652" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/2857502626588578652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/2857502626588578652?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/macworld-2009-app-store-for-mac-apps.html" title="MacWorld 2009: App Store для Mac-приложений?" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;Dk8NQH0yeyp7ImA9WxRREEs.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-8796652253747906329</id><published>2008-09-22T12:58:00.011+07:00</published><updated>2008-09-22T13:28:11.393+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-22T13:28:11.393+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>Смысл и внутренний мир</title><content type="html">&lt;p&gt;Сегодня ночью, читая &lt;a href="http://www.artlebedev.ru/kovodstvo/business-lynch/2008/09/16/"&gt;бизнес-линч авторства Людвига Быстроновского&lt;/a&gt; &lt;small&gt;(по ссылке можно не ходить),&lt;/small&gt; я&amp;nbsp;просветлился и&amp;nbsp;понял огромную часть закрытого мне мира. Позволю себе зацитировать:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;laquo;Чем художник отличается от&amp;nbsp;иллюстратора? Художник в&amp;nbsp;первую очередь выражает свой внутренний мир. Зачастую ему даже аудитория не&amp;nbsp;нужна. Иллюстратор&amp;nbsp;же в&amp;nbsp;первую очередь призван иллюстрировать смысл.&lt;/p&gt;
&lt;p&gt;Если вы&amp;nbsp;тут выступаете как художник, то&amp;nbsp;непонятно, нахера вам нужна рецензия любого из&amp;nbsp;дизайнеров этого мира. Пошлите всех подальше и&amp;nbsp;делайте что хотите. И&amp;nbsp;тогда все прекрасно, можете вешать рисунок на&amp;nbsp;кухне.&lt;/p&gt;
&lt;p&gt;Если&amp;nbsp;же вы&amp;nbsp;хотите выступить иллюстратором, то&amp;nbsp;я&amp;nbsp;вам скажу, что у&amp;nbsp;вас получилась стоящая на&amp;nbsp;двух ресторанных зонтах волосатая жопомясорубка с&amp;nbsp;ручками. Жестокий, жестокий мир.&amp;raquo;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Люди, пишущие и&amp;nbsp;рисующие непонятный бред, занимаются тем, что &lt;em&gt;выражают свой внутренний мир&lt;/em&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;деятельности?&lt;/p&gt;
&lt;p&gt;Уверен, что этим постом я&amp;nbsp;открою глаза и&amp;nbsp;другим людям. Нам, тем, кто всегда занимается передачей смысла, тяжело понять противоположную часть сообщества. Заодно будем знать, что профессии программиста и&amp;nbsp;иллюстратора в&amp;nbsp;&lt;nobr&gt;чем-то&lt;/nobr&gt; схожи, и&amp;nbsp;с&amp;nbsp;последними вполне можно найти общий язык.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-8796652253747906329?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/Bi8lFxBd5Mc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/8796652253747906329/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=8796652253747906329" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8796652253747906329?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8796652253747906329?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/inner-life-vs-sense.html" title="Смысл и внутренний мир" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CE4FQ3s7eyp7ImA9WxRSE04.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-915891278898404135</id><published>2008-09-13T19:18:00.005+07:00</published><updated>2008-09-14T02:08:32.503+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-14T02:08:32.503+07:00</app:edited><title>Me</title><content type="html">&lt;p&gt;Накатал «О себе» для нашего сайта. По-моему, звучит неплохо:&lt;p&gt;I'm the CTO and the lead architect of our company. 15 years have passed since I was a proud DOS user, and I've been crazy about computer programming for all this time.&lt;p&gt;My experiences range from GW-BASIC, through Assembler and standards-based C++ to Python, Ruby and Java. Among the languages I've never really used I know and appreciate Erlang, Haskell and Smalltalk, and I love Ada, which is sharing the label of my all-time favourite language with Ruby. I like writing beautiful code, and I believe that every language has its own unique style which makes the definition of "beautiful" very different for each of them.&lt;p&gt;I've lead and failed my first multiperson project at the age of 16, and I've learned a lot about managing software developments since then. It was around the same time I came to know that my favourite part of programming is called "object-oriented analysis and design".&lt;p&gt;I've switched to Mac in 2006 and never-ever-ever looked back.&lt;p&gt;Currently I'm mostly focused on Java and particularly Eclipse world, though occasionally I get involved in Python and Ruby projects or have to apply my Win32 skills to make some crazy JNIs. I've contributed the initial Ruby type inferencing code into the Eclipse Dynamic Languages Toolkit and demoed it at EclipseCon 2007. I left the DLTK team afterwards and co-founded a company which aims to create a new generation of IDEs and productivity tools for developers.
&lt;p&gt;&lt;small&gt;В паре мест сомневаюсь в английском, так что замечания принимаются с благодарностью.&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-915891278898404135?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/fauT3Rr0vz4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/915891278898404135/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=915891278898404135" title="Комментарии: 39" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/915891278898404135?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/915891278898404135?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/me.html" title="Me" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">39</thr:total></entry><entry gd:etag="W/&quot;DUQCQ3wzfyp7ImA9WxRTEk4.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-3329892863533492036</id><published>2008-09-01T09:36:00.004+07:00</published><updated>2008-09-01T09:49:22.287+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-01T09:49:22.287+07:00</app:edited><title>PC = Blue Screen</title><content type="html">&lt;p&gt;Просто факт: Любой Samba-ресурс Finder отображает как «PC Server» со знаменитой иконкой (см. ниже). Любой VNC-сервер и afp-ресурс Finder отображает как «Mac server». Если на маке поднята самба, он отобразится и как мак, и как PC.
&lt;p&gt;И маленький совет. Если Finder перестал дружить с Bonjour и не видит какие-то маки вокруг, перезапустите его (Меню «Яблоко» / Force Quit… / выберите Finder / кнопка Relaunch).
&lt;p style="text-align: center;"&gt;&lt;img src="http://files.tarantsov.com/leopard_pc_server.png" width="728" height="911"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-3329892863533492036?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/Ku27cCTBNXU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/3329892863533492036/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=3329892863533492036" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/3329892863533492036?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/3329892863533492036?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/pc-blue-screen.html" title="PC = Blue Screen" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEMGRXs_eCp7ImA9WxRTEk4.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-8229623132805457864</id><published>2008-09-01T08:55:00.004+07:00</published><updated>2008-09-01T09:33:44.540+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-01T09:33:44.540+07:00</app:edited><title>Советы про Screen Sharing на маках</title><content type="html">&lt;p&gt;Сегодня:&lt;br&gt;1. Как подключиться с мака к любому VNC-серверу?&lt;br&gt;2. Как сделать несколько удаленных сессий на маке?&lt;/p&gt;&lt;p&gt;У нас на работе все компьютеры — маки (кроме одного Linux-сервера и одной Windows-машины), так что скопились некоторые советы по их эксплуатации.
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Как подключиться с мака к любому VNC-серверу?&lt;/b&gt; Пусть, например, в вашей сети есть компьютер с именем boo.local, на порту 5800 которого стоит VNC-сервер. Чтобы подключиться к нему, достаточно на маке открыть vnc://boo.local:5800 — например, введите этот адрес в Safari (пока не нажмете Enter, можете перетащить глобус из строки адреса на рабочий стол, и будет вам значок для быстрого подключения), или же из терминала выполните «open vnc://boo.local:5800».&lt;/p&gt;&lt;p&gt;&lt;b&gt;Как сделать несколько удаленных сессий на маке?&lt;/b&gt; В отличие от Windows, при подключении к удаленному маку вы подключаетесь к его монитору и видите ровно то, что видно на мониторе — например, окошко входа в систему, или рабочий стол одного из пользователей.&lt;/p&gt;&lt;p&gt;Видеть монитор компьютера по сети — это, безусловно, хорошо, предсказуемо и является сутью понятия Screen Sharing. Тем не менее, бывают ситуации, когда нужно нечто другое: поработать на удаленном компьютере, не мешая тому, кто им сейчас пользуется (т.е. имея не один общий монитор, а два отдельных под разными пользователями).&lt;/p&gt;&lt;p&gt;Реализовать такое довольно просто. Пусть, скажем, пользователь lliypik работает за компьютером, а пользователь andreyvit хочет к этому компьютеру иногда подключаться и что-то делать на своем рабочем столе, не мешая lliypik'у. Нужно:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Первое. Под пользователем andreyvit установите какой-нибудь VNC-сервер, например, бесплатный Vine Server.&lt;/p&gt;&lt;p&gt;Второе. Удостоверьтесь, что в системных настройках разрешено переключаться между несколькими залогинеными пользователями. (Поищите в System Preferences по слову «switch», я всегда добираюсь до любой опции поиском. Или прямой путь: System Preferences -&gt; Accounts -&gt; Login Options -&gt; Enable fast user switching.) Должно быть включено.&lt;/p&gt;&lt;p&gt;Третье. Запустите под andreyvit Vine Server. В его настройках смените порт 5900 на любой другой, скажем, 5800. Заодно задайте в поле Display Name какое-нибудь имя. (Естественно, вам нужно будет, чтобы пользователь andreyvit всегда оставался залогиненным. Но ведь вы никогда не выключаете свои компьютеры, верно?)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Когда захотите поработать на удаленном компьютере, если вы находитесь в той же локальной сети, просто найдите в левой панели Finder'а имя, которое вы вводили в поле display name Vine Server'а, щелкните по этому имени, а потом — по Share Screen.&lt;/p&gt;&lt;p&gt;Если же вы не в одной локальной сети с удаленным компьютером, вам придется воспользоваться советом из пункта 1 и ввести в Safari строку вроде vnc://lliypik.local:5800 — за сим у меня все.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-8229623132805457864?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/jDestO3hD_U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/8229623132805457864/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=8229623132805457864" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8229623132805457864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8229623132805457864?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/09/mac-screen-sharing-tricks.html" title="Советы про Screen Sharing на маках" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEIFRnw6fip7ImA9WxdbFEg.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-2563174020995350186</id><published>2008-08-11T18:30:00.005+07:00</published><updated>2008-08-11T19:08:37.216+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-11T19:08:37.216+07:00</app:edited><title>Evolution of Basecamp homepage</title><content type="html">&lt;p&gt;I used an amazing tool &lt;a href="http://www.paulhammond.org/webkit2png/"&gt;webkit2png&lt;/a&gt; to capture some screenshots of &lt;a href="http://www.basecamphq.com/"&gt;Basecamp&lt;/a&gt; home page at various key moments in its history. Here's the result (click to enlarge):
&lt;div style="width: 700px; overflow: scroll;"&gt;&lt;table border="0" cellspacing="1" cellpadding="0"&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;Feb 2004&lt;/td&gt;&lt;td style="text-align: center;"&gt;Oct 2004&lt;/td&gt;&lt;td style="text-align: center;"&gt;Mar 2005&lt;/td&gt;&lt;td style="text-align: center;"&gt;Mar 2006&lt;/td&gt;&lt;td style="text-align: center;"&gt;Jan 2007&lt;/td&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;&lt;a href="http://files.tarantsov.com/basecamp-2004-02-full.png" target="_new"&gt;&lt;img src="http://files.tarantsov.com/basecamp-2004-02-thumb.png" width="200" height="738" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;&lt;a href="http://files.tarantsov.com/basecamp-2004-10-full.png" target="_new"&gt;&lt;img src="http://files.tarantsov.com/basecamp-2004-10-thumb.png" width="200" height="701" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;&lt;a href="http://files.tarantsov.com/basecamp-2005-03-full.png" target="_new"&gt;&lt;img src="http://files.tarantsov.com/basecamp-2005-03-thumb.png" width="200" height="727" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;&lt;a href="http://files.tarantsov.com/basecamp-2006-03-full.png" target="_new"&gt;&lt;img src="http://files.tarantsov.com/basecamp-2006-03-thumb.png" width="220" height="647" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;&lt;a href="http://files.tarantsov.com/basecamp-2007-01-full.png" target="_new"&gt;&lt;img src="http://files.tarantsov.com/basecamp-2007-01-thumb.png" width="210" height="443" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-2563174020995350186?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/SF2tkTZ_Fns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/2563174020995350186/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=2563174020995350186" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/2563174020995350186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/2563174020995350186?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/08/evolution-of-basecamp-homepage.html" title="Evolution of Basecamp homepage" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0AHQHs7eCp7ImA9WxdREUQ.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-1804239772834604600</id><published>2008-05-31T06:40:00.003+07:00</published><updated>2008-05-31T06:55:31.500+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-31T06:55:31.500+07:00</app:edited><title>640k достаточно для всех</title><content type="html">&lt;p&gt;Из случайно подвернувшихся новостей (под Pink Floyd, играющий на моём iPhone).
&lt;p&gt;02.05.2007
&lt;p&gt;Отдав должное действиям Apple на рынке цифровой музыки, Балмер выразил сомнение, что новый телефон Apple сможет отвоевать сколько-нибудь значительную долю рынка. 
&lt;p&gt;«У iPhone нет абсолютно никаких шансов завоевать значительную часть рынка. Никаких! Это устройство будет продаваться за $500, причем эта цена с учетом скидки за подписание долгосрочного контракта с оператором. […] глядя на 1,3 млрд. проданных во всем мире телефонов, я бы лучше предпочел, чтобы в 60 или 80% из них было установлена наше ПО, чем те 2 или 3%, которые Apple может получить, продавая iPhone», — сказал глава Microsoft. 
&lt;p&gt;06.02.2008 
&lt;p&gt;В соответствии с отчетом аналитиков агентства Canalys, доля iPhone достигла 28% и занимает второе место на американском рынке, уступая лишь Research in Motion (Blackberry) c ее 41%.
&lt;p&gt;Этот скачок, по сравнению с 19,5% охватом рынка в третьем квартале, позволил Apple обойти весь сектор устройств на базе Windows Mobile, доля которого в четвертом квартале составила 21%, по сообщению Canalys.
&lt;p&gt;P.S. А еще рекомендую послушать &lt;a href="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/"&gt;Стива Джобса и Билла Гейтса на All Things Digital&lt;/a&gt;. Много весьма любопытного о trend'ах.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-1804239772834604600?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/3sCW7xxWUh8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/1804239772834604600/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=1804239772834604600" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1804239772834604600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1804239772834604600?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/05/640k-enough-for-everyone.html" title="640k достаточно для всех" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0UCRHo4cSp7ImA9WxdREEU.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-6458993090424471072</id><published>2008-05-30T02:23:00.003+07:00</published><updated>2008-05-30T02:27:45.439+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-30T02:27:45.439+07:00</app:edited><title>Связывание и внедрение объектов не работает</title><content type="html">&lt;p&gt;Вспомним времена Windows 3.1, когда буквально в каждой книге по консумерским приложениям описывалась замечательная технология Object Linking &amp; Embedding. OLE казалась частью светлого будущего — того времени, когда отдельных приложений в мире существовать больше не будет.
&lt;p&gt;OLE и в самом деле весьма продвинутая технология. Она позволяет в документ одного приложения вставить контент, создаваемый другим приложением. Хитрые OLE-контейнеры (единственным экземпляром которых являлся Microsoft Binder) могли даже этот чужой контент разбивать на свои страницы и делать ему сквозную нумерацию.
&lt;p&gt;Теперь же я об OLE вспоминаю, только когда пытаюсь вставить диаграмму в презентацию. На маке ничего аналогичного OLE нет, поэтому приходится экспортировать диаграмму OmniGraffle в картинку и вставлять эту картинку в Keynote.
&lt;p&gt;Но и под Windows OLE почти мертво — его больше не продвигают. Причина в том, что он слишком сложен, а пользователю меньше всего на свете хочется сюрпризов.
&lt;p&gt;Вставка картинки в презентацию — совершенно понятное действие, картинка останется там и ровно такая, какая была.
&lt;p&gt;Вставка в презентацию объекта, который ведет себя как картинка, но на самом деле является сложной штукой, что проявляется только в редкие моменты, создаёт &lt;em&gt;ощущение непонимания&lt;/em&gt;. Теперь у тебя не просто документ, состоящий из того, что ты в него добавил — теперь в нем живет сложная своенравная штука.
&lt;p&gt;Своенравность штуки, кстати, не только суеверие — встроенные (embedded) объекты порой действительно ведут себя неожиданно (например, при попытке их resize'ить, что выполняется масштабированием метафайла без активации OLE-сервера), а контейнеры зачастую начинают больше глючить.
&lt;p&gt;Теперь о том, как можно сотворить более простой функциональный аналог OLE. Хитрости здесь две:
&lt;p&gt;1. Сделать в OmniGraffle опцию «при каждом сохранении экспортировать диаграмму в картинку и класть рядом».
&lt;p&gt;2. Сделать, чтобы Keynote проверял, не изменились ли на диске картинки, которые были вставлены в документ, и, если да, ненавязчиво предлагал опцию быстренько обновить их с диска.
&lt;p&gt;Эффект такой же, ощущение предсказуемости процесса в разы выше. Заодно такие возможности полезны и для других применений.
&lt;p&gt;Золотое правило: интерфейс не должен содержать сложных концепций.
&lt;p&gt;Второе золотое правило: если из-за какой-то функции программа начинает больше глючить, пользователь свяжет эту функцию с мистикой и начнет её бояться.
&lt;p&gt;Сложные функции больше подвержены ошибкам. Не пугайте ваших пользователей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-6458993090424471072?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/fzCxbZ3dRIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/6458993090424471072/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=6458993090424471072" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/6458993090424471072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/6458993090424471072?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/05/object-linking-and-embedding-does-not.html" title="Связывание и внедрение объектов не работает" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;Ck8ARXg-eip7ImA9WxZaEE0.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-867413892997518773</id><published>2008-04-24T08:25:00.006+07:00</published><updated>2008-04-24T08:34:04.652+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-24T08:34:04.652+07:00</app:edited><title>Измеряем интеллигентность</title><content type="html">&lt;p&gt;Терпимость &lt;small&gt;(как правило)&lt;/small&gt; характерна для людей средней интеллигентности. Люди менее образованные &lt;small&gt;(обычно)&lt;/small&gt; боятся отличаться, а более интеллигентные &lt;small&gt;(часто)&lt;/small&gt; считают, что те, кто от них отличается, неправы.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-867413892997518773?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/gBcuXkxiGD0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/867413892997518773/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=867413892997518773" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/867413892997518773?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/867413892997518773?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/04/measure-your-cultural-level.html" title="Измеряем интеллигентность" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CU8DR346fSp7ImA9WxZbFUk.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-1862947784612527208</id><published>2008-04-19T01:30:00.003+07:00</published><updated>2008-04-19T01:37:56.015+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-19T01:37:56.015+07:00</app:edited><title>Крокодилы — это наше всё</title><content type="html">&lt;p&gt;Спецификация дизайна, разработанного сегодня с dottedmag'ом. (Начало опущено, ибо скучное.)
&lt;p&gt;3.2. …Назовем такую последовательность Большим Красным Попугаем (Big Red Parrot, BRP), а каждый элемент ее несокращенной записи (например, bar:12) назовем Куском Мяса (Piece of Flesh, PoF).
&lt;p&gt;4. Большой красный попугай — мысленная концепция, она слишком длинная и дорогая, чтобы быть примененной в реальном анализе. Поэтому нам необходимо ввести Маленького Зеленого Крокодила (Little Green Crocodile, LGC). Но перед этим отметим важный факт.
&lt;p&gt;4.1. Большие красные попугаи линейно упорядоченны.
&lt;p&gt;4.2. Маленький зеленый крокодил — шаблон, соответствующий набору больших красных попугаев.
&lt;p&gt;4.3 Взрослый (полностью построенный) маленький зеленый крокодил всегда начинается с обрубка хвоста (да, их купируют, как у спаниелей), обозначаемого звездочкой.
&lt;p&gt;4.4. Пример крокодила — «* bar:15..21 (bar:22..bar:30 / bar:24)* foo:1..3».
&lt;p&gt;4.5. После обрубка хваста идет набор кусков мяса, и/или диапазонов кусков мяса, и/или колец (которые он позаимствовал у удава).
&lt;p&gt;4.6. Кусок мяса — это просто позиция в сорцах, например foo:5.
&lt;p&gt;4.7. Диапазон кусков мяса — это два куска мяса, путь исполнения между которыми можно по ним однозначно (и быстро) определить. Будем писать foo:n..bar:m или же сокращенно foo:n..m. Что конкретно означает фраза «путь исполнения между которыми можно по ним однозначно (и быстро) определить», предстоит еще уточнить. (Например, это может означать, что оба куска мяса находятся в одной и той же функции, так что простым проходом исходного кода можно легко перечислить, что было между ними.) Совершенно точно, что между этими двумя кусками мяса может располагаться сложный цикл, так что под «быстро определить» понимается не перечисление всех Больших Красных Попугаев, а некое концептуальное понимание того, какие инструкции входят в диапазон.
&lt;p&gt;4.8. Кольцо — это возможность неограченного числа повторений некоторой части крокодила, с остановкой на одном из кусков мяса, входящих в эту часть. Пример — «(bar:22..bar:30 / bar:24)*» (выполнено сколько угодно итераций цикла bar:22..bar:30, при этом на последней из них мы остановились на bar:24).
&lt;p&gt;4.9. По мере развития теории крокодилов мы, возможно, выведем особей с другими разновидностями частей.
&lt;p&gt;5. С маленькими зелеными крокодилами определено несколько фундаментальных операций.
&lt;p&gt;5.1. Утолщение маленького зеленого крокодила относительно гоала X. Пусть голова (голова у крокодила справа) выглядит как foo:7..8. Пусть смежные с foo:7..8 строчки foo:5, foo:6, foo:9 и foo:10 не влияют на результат X. Тогда мы расширяем голову до foo:5..10.
&lt;p&gt;5.2. Удлинение маленького зеленого крокодила. Пусть хвост (он слева) крокодила выглядит как bar:5. Тогда мы выясняем, откуда мы могли прийти к bar:5, и приписываем эту точки слева, получая что-то вроде «bar:4..5», а потом, по мере продолжения удлинения,  «boz:88 bar:1..5».
&lt;p&gt;5.3. Кормление маленького зеленого крокодила дописывает заданный кусок мяса справа, делая его новой головой.
&lt;p&gt;5.4. Заднее попугаенье (backward parrotizing) маленького зеленого крокодила получает набор маленьких зеленых крокодилов, описывающий набор больших красных попугаев, исполняемых непосредственно перед большими красными попугаями, которых описывает исходный маленький зеленый крокодил.
&lt;p&gt;5.5. Переднее попугаенье (forward parrotizing) маленького зеленого крокодила получает набор маленьких зеленых крокодилов, описывающий набор больших красных попугаев, исполняемых непосредственно после больших красных попугаев, которых описывает исходный маленький зеленый крокодил.
&lt;p&gt;5.6. Крокодильчонок — это крокодил без обрубка хвоста. Купированием крокодильчонка получают взрослого маленького зеленого крокодила. Например, из «foo:7 bar:5..10» получается «* foo:7 bar:5..10». Во всём остальном крокодильчонки ведут себя также, как и взрослые крокодилы (что естественно, они же тоже крокодилы, только еще маленькие).
&lt;p&gt;6. Крокодилы — это наше всё.
&lt;p&gt;6.1. В анализе каждому construct'у соответствует кусок мяса, например, foo:7.
&lt;p&gt;6.2. Первым делом из этого куска выращивают крокодильчонка (например, можно взять пустого крокодильчонка и накормить его этим куском). Получаем крокодильчока foo:7.
&lt;p&gt;6.3. Далее мы выясняем, есть ли в кэше крокодилы, головна которых совпадает с нашим крокодильчонком. Если есть, мы удлиняем крокодильчонка до тех пор, пока он либо не совпадет с каким-то крокодилом из кэша (за исключением обрубка хвоста, разумеется), либо пока он не перестанет быть похожим на крокодилов их кэша.
&lt;p&gt;6.4. Если крокодильчонок совпал с кем-то в кэше, то всё скучно, берем результат из кэша. Рассматриваем случай, когда он не совпал.
&lt;p&gt;6.5. Теперь у гоала зовется preRun, и мы начинаем его реально вычислять. Пусть наш goal — «значение переменной Z». У нас есть несколько стратегий вычисления, которые могут быть выражены через операции с крокодилом.
&lt;p&gt;6.6. Мы можем купировать крокодильчонка после первого же куска мяса, получив «* foo:7», выполнить поиск всех присваиваний переменной Z и соединив их результаты. Такой уровень точности анализа (grade) мы можем назвать NO_FLOW. Мы получим ответ (NO_FLOW: * foo:7 =&gt; A | B | C), который можно кэшировать.
&lt;p&gt;6.7. Мы можем выполнять заднее попугаенье, по необходимости удлинняя крокодильчонка, в поисках присваиваний Z. Например, в момент, когда крокодильчонок станет bar:25..30 foo:1..7, мы можем встретить Z=42. Тогда мы запишем ответ (EXACT: bar:25..30 foo:1..7 =&gt; 42). С другой стороны, мы могли встретить присваивание Z=Y, и тогда мы бы продолжили искать значение Y с тем же крокодильчонком, который мог стать при этом еще длиннее, и в итоге закэшировали ответ вроде (EXACT: boz:15 bar:20..30 foo:1..7 =&gt; 24). [Хитрый реализационный момент — как удлиннять крокодильчонка, при этом для Y сделав вид, что его середина — это голова.]
&lt;p&gt;6.8. Мы можем использовать эвристику, чтобы упростить  крокодила перед записью в кэш. Например, циклы (повторяющиеся последовательности) можно заменять кольцами, если они не влияют на наш гоал (или если вляют не сильно, и мы хотим немного потерять точность анализа). Ясно, что чем более общего вида получится крокодил, тем полезнее будет кэш.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-1862947784612527208?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/D9Y2AVbbkxU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/1862947784612527208/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=1862947784612527208" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1862947784612527208?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/1862947784612527208?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/04/crocodiles.html" title="Крокодилы — это наше всё" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkQARH88fCp7ImA9WxZaFk0.&quot;"><id>tag:blogger.com,1999:blog-4141529053283360832.post-8331620943187054939</id><published>2008-04-17T01:22:00.005+07:00</published><updated>2008-05-01T09:19:05.174+07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-01T09:19:05.174+07:00</app:edited><title>Scorpions в Новосибирске</title><content type="html">&lt;p&gt;Вернулся с концерта Scorpions в Новосибирске. Как всегда, понравилось, но средне (ибо я за хорошую акустику и отсутствие толпы с аплодисментами). Прозвучало:
&lt;p&gt;Hour I (Humanity: Hour I, 2007);&lt;br&gt;
Coming Home (Love at First Sting, 1984);&lt;br&gt;
The Zoo (Animal Magnetism, 1980);&lt;br&gt;
No Pain No Gain (Face The Heat, 1993);&lt;br&gt;
Deep and Dark (Unbreakable, 2004);&lt;br&gt;
Coast to Coast (Lovedrive, 1979); &lt;small&gt; — спасибо Константину за «опознание» этой мелодии&lt;/small&gt;&lt;br&gt;
Always Somewhere (Lovedrive, 1979);&lt;br&gt;
Send Me An Angel (Crazy World, 1990);&lt;br&gt;
You And I (Pure Instinct, 1996);&lt;br&gt;
Living For Tomorrow (Still Loving You, 1992);&lt;br&gt;
Hey You (Animal Magnetism, 1980);&lt;br&gt;
321 (Humanity: Hour I, 2007);&lt;br&gt;
Alien Nation (Face The Heat, 1993);&lt;br&gt;
Dynamite (Blackout, 1982);&lt;br&gt;
Blackout (Blackout, 1982);&lt;br&gt;
Соло барабанщика;&lt;br&gt;
Still Loving You (Love at First Sting, 1984);&lt;br&gt;
Humanity (Humanity: Hour I, 2007);&lt;br&gt;
Wind Of Change (Crazy World, 1990);&lt;br&gt;
Rock You Like A Hurricate (Love at First Sting, 1984);&lt;br&gt;
When The Smoke Is Going Down (Blackout, 1982);&lt;br&gt;
A Moment In A Million Years (Eye II Eye, 1999).
&lt;p&gt;Есть подозрение, что где-то в конце я пропустил Is There Anybody There (Still Loving You, 1992).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4141529053283360832-8331620943187054939?l=blog.tarantsov.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tarantsov/~4/9ZkFgWM5Cgw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tarantsov.com/feeds/8331620943187054939/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4141529053283360832&amp;postID=8331620943187054939" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8331620943187054939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4141529053283360832/posts/default/8331620943187054939?v=2" /><link rel="alternate" type="text/html" href="http://blog.tarantsov.com/2008/04/scorpions-in-novosibirsk.html" title="Scorpions в Новосибирске" /><author><name>Andrey Tarantsov</name><uri>http://www.blogger.com/profile/14705911318584620422</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16989630348453962054" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
