<?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/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-8622169542119587655</id><updated>2012-05-25T03:21:01.054+03:00</updated><category term="linux" /><category term="web" /><category term="fluxbox" /><category term="tips'n'tricks" /><category term="mcabber" /><category term="programming" /><category term="zsh" /><category term="debian" /><category term="holiday" /><category term="mirror" /><category term="windows" /><category term="irssi" /><category term="vim" /><category term="Eee PC" /><category term="review" /><category term="blog" /><category term="hardware" /><category term="EULA" /><title type="text">Debiania: просто ещё один блог о Debian</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://debiania.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://debiania.blogspot.com/search/label/programming" /><author><name>Minoru</name><uri>http://www.blogger.com/profile/15979236009981641914</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp3.blogger.com/_Nb6QYFUvBjY/SI9jSOVKAxI/AAAAAAAAAAU/rxcSy_1qiGY/S220/Programmaster_80x80.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DebianiaProgramming" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="debianiaprogramming" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-8622169542119587655.post-508920541663002674</id><published>2011-07-05T13:01:00.007+03:00</published><updated>2011-07-15T21:31:35.348+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="debian" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">gtk-vector-screenshot: теперь в Debian sid!</title><content type="html">&lt;a href="http://www.joachim-breitner.de/various/pdf_screenshot_epiphany.pdf"&gt;&lt;img style="margin-right: 0.5em; float:left; width: 108px; height: 300px;" src="http://3.bp.blogspot.com/-zLJ1ityhhqA/Th8R4ObpEkI/AAAAAAAAAgw/Nv2Ih3CKHrQ/s400/pdf_screenshot_epiphany_thumbnail.png" border="0" /&gt;&lt;/a&gt;Вчера автор &lt;code&gt;gtk-vector-screenshot&lt;/code&gt;, Joachim Breitner, сообщил о том, что его разработка успешно создаёт скриншоты окна Epiphany (об этом ему в свою очередь сообщил Martin Borgert). Так что те, кто читал &lt;a href="http://debiania.blogspot.com/2011/06/pdf-gtk-3.html"&gt;мой предыдущий пост&lt;/a&gt; и заинтересовался идеей, могут подключать репозитории sid и ставить себе вкусняшку — она уже работает ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.joachim-breitner.de/blog/archives/508-gtk-vector-screenshot-works-with-epiphany.html"&gt;Оригинальный пост&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD 14.07.2011:&lt;/b&gt; по просьбам трудящихся своро^Wскопировал из оригинального поста превьюшку PDF'ки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-508920541663002674?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://debiania.blogspot.com/feeds/508920541663002674/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://debiania.blogspot.com/2011/07/gtk-vector-screenshot-debian-sid.html#comment-form" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/508920541663002674" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/508920541663002674" /><link rel="alternate" type="text/html" href="http://debiania.blogspot.com/2011/07/gtk-vector-screenshot-debian-sid.html" title="gtk-vector-screenshot: теперь в Debian sid!" /><author><name>Minoru</name><uri>http://www.blogger.com/profile/15979236009981641914</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp3.blogger.com/_Nb6QYFUvBjY/SI9jSOVKAxI/AAAAAAAAAAU/rxcSy_1qiGY/S220/Programmaster_80x80.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zLJ1ityhhqA/Th8R4ObpEkI/AAAAAAAAAgw/Nv2Ih3CKHrQ/s72-c/pdf_screenshot_epiphany_thumbnail.png" height="72" width="72" /><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8622169542119587655.post-8047322577414699553</id><published>2011-06-21T01:01:00.004+03:00</published><updated>2011-07-15T21:32:10.828+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Скриншоты в PDF с GTK 3</title><content type="html">Для тех, кто не читает &lt;a href='http://planet.debian.org/'&gt;Planet Debian&lt;/a&gt;, маленький итог из двух тамошних постов.&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.joachim-breitner.de/'&gt;Joachim Breitner&lt;/a&gt; разработал небольшой модуль, который, будучи загруженным вместе с GTK3-приложением, отображает кнопку, с помощью которой можно создать скриншот окна и сохранить его в PDF, SVG, PostScript или даже PNG. Преимуществом таких скриншотов является то, что они представляют собой векторную графику, а значит:&lt;ul&gt;&lt;li&gt;текст на них индексируем и по нему можно производить поиск&lt;/li&gt;&lt;li&gt;они идеально масштабируются, а значит, электронные мануалы с их использованием выглядят привлекательно вне зависимости от разрешения экрана и размеров окна вьювера&lt;/li&gt;&lt;/ul&gt;На пример такого скриншота можно поглядеть в &lt;a href='http://www.joachim-breitner.de/various/pdf_screenshot_3.pdf'&gt;этой pdf'ке&lt;/a&gt;, а &lt;a href='http://www.joachim-breitner.de/various/pdf_screenshot_3.ogv'&gt;здесь&lt;/a&gt; можно скачать скринкаст (Ogg Theora, 2Mb), в котором показан процесс её создания. Архивы с исходниками можно скачать &lt;a href='http://www.joachim-breitner.de/archive/gtk-vector-screenshot/'&gt;здесь&lt;/a&gt;, а репозиторий — &lt;a href='https://gitorious.org/gtk-vector-screenshot'&gt;найти на gitorious.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Собственно, те самые два поста, в которых Joachim описывает свой модуль:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.joachim-breitner.de/blog/archives/494-Better-PDF-screenshots-with-gtk-3.html'&gt;Better PDF screenshots with gtk 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='https://www.joachim-breitner.de/blog/archives/502-gtk-vector-screenshot-code-published.html'&gt;gtk-vector-screenshot code published&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-8047322577414699553?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://debiania.blogspot.com/feeds/8047322577414699553/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://debiania.blogspot.com/2011/06/pdf-gtk-3.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/8047322577414699553" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/8047322577414699553" /><link rel="alternate" type="text/html" href="http://debiania.blogspot.com/2011/06/pdf-gtk-3.html" title="Скриншоты в PDF с GTK 3" /><author><name>Minoru</name><uri>http://www.blogger.com/profile/15979236009981641914</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp3.blogger.com/_Nb6QYFUvBjY/SI9jSOVKAxI/AAAAAAAAAAU/rxcSy_1qiGY/S220/Programmaster_80x80.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8622169542119587655.post-4064161237548737763</id><published>2010-02-24T17:49:00.007+02:00</published><updated>2010-02-24T23:09:31.709+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Занимательное JavaScript программирование</title><content type="html">Привет!&lt;br /&gt;&lt;br /&gt;Недавно мой сосед показал мне главную страничку ВКонтакта со счётчиком &lt;strike&gt;идиотов&lt;/strike&gt;зарегистрированных пользователей и обратил внимание на то, что инет отключен, а счётчик работает дальше. Ясен пень, что реализовано сиё счастье с помощью JavaScript, потому и работает в оффлайне. Сосед получил разъяснения и успокоился, а у меня зачесались руки — стало интересно, как же работают такие счётчики.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Я взял код &lt;a href="http://vkontakte.ru/"&gt;главной ВКонтакта&lt;/a&gt;, а также &lt;a href="http://gmail.com/"&gt;login-страницы GMail&lt;/a&gt;, на которой присутствует счётчик предоставляемого пользователям места, и проанализировал используемый там код. Если вам всё ещё интересен весь этот бред — читайте дальше :)&lt;br /&gt;&lt;br /&gt;Начнём с гугла.&lt;br /&gt;Код:&lt;br /&gt;&lt;div class="code"&gt;&lt;font color="#0000c0"&gt;// Estimates of nanite storage generation over time.&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;CP = &lt;font color="#008080"&gt;[&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#008080"&gt;[&lt;/font&gt;&amp;nbsp;1199433600000, 6283&amp;nbsp;&lt;font color="#008080"&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color="#008080"&gt;[&lt;/font&gt;&amp;nbsp;1224486000000, 7254&amp;nbsp;&lt;font color="#008080"&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color="#008080"&gt;[&lt;/font&gt;&amp;nbsp;2144908800000, 10996&amp;nbsp;&lt;font color="#008080"&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color="#008080"&gt;[&lt;/font&gt;&amp;nbsp;2147328000000, 43008&amp;nbsp;&lt;font color="#008080"&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color="#008080"&gt;[&lt;/font&gt;&amp;nbsp;46893711600000, &lt;font color="#008000"&gt;Number&lt;/font&gt;.MAX_VALUE &lt;font color="#008080"&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;updateQuota()&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(!quota_elem)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;return&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;now = (&lt;font color="#8b0000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;Date&lt;/font&gt;()).getTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&lt;/font&gt;&amp;nbsp;(i = 0; i &amp;lt; CP.length; i++)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(now &amp;lt; CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;break&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(i == 0)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(updateQuota, 1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(i == CP.length)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;ts = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;bs = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = format(((now-ts)&amp;nbsp;/ (CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;-ts)&amp;nbsp;* (CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;-bs))&amp;nbsp;+ bs); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(updateQuota, 1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;/div&gt;Теперь пошагово разберём процесс получения надписи вроде “Over 2757.272164 megabytes (and counting) of free storage”.&lt;br /&gt;&lt;br /&gt;Итак, часть первая — массив CP. Комментарий любезно подсказывает, что в массиве этом содержится ничто иное, как прикидки на количество места, которое Гугл будет предоставлять в определённый момент времени. Дальше идёт несколько пар значений вида «таймштамп UNIX (в миллисекундах)»—«мегабайты».&lt;br /&gt;&lt;br /&gt;Часть вторая — собственно функция, которая обновляет элемент с мегабайтами. Вот код, но уже с моими комментариями:&lt;br /&gt;&lt;div class="code"&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;updateQuota()&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// существует ли элемент, в который надо выводить мегабайты?&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(!quota_elem)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// элемента нет — закругляемся&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;return&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// получаем текущее время в виде UNIX timestamp в миллисекундах&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;now = (&lt;font color="#8b0000"&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color="#008000"&gt;Date&lt;/font&gt;()).getTime();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// объявляем переменную для цикла&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// перебираем все записи в CP&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;for&lt;/font&gt;&amp;nbsp;(i = 0; i &amp;lt; CP.length; i++)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// если текущий таймштамп меньше того, что в массиве — прерываем цикл&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(now &amp;lt; CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;break&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(i == 0)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// если таймштамп, на котором прервались — первый в массиве, то…&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// вызвать данную функцию снова через секунду&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(updateQuota, 1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// по-русски это звучит как «ждать наступления февраля 2008-го года»&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;if&lt;/font&gt;&amp;nbsp;(i == CP.length)&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// если вышеприведённое условие не сработало и&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// если все таймштампы в массиве меньше текущего времени, то&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// записать количество мегабайт из последней записи в массиве&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// это на случай, если код долго не будут апдейтить — тогда в качестве мегабайт будет принято&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// самое большое число, допустимое в JavaScript — это около 1.7976931348623157e+308&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color="#8b0000"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// если ни одно из вышеприведённых условий не сработало, то&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// переменной ts присвоить таймштамп последней записи,&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// а переменной bs — кол-во мегабайт, соответствующих этому таймштампу&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;ts = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;bs = CP&lt;font color="#008080"&gt;[&lt;/font&gt;i - 1&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// обновить запись с помощью нехитрой математики:&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// now-ts — разность между текущим временем и используемым таймштампом&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// CP[i][0]-ts — это разность во времени между текущим и следующим таймштампами&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// CP[i][1]-bs — разность в мегабайтах между текущим и следующим таймштампами&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// ((now-ts) / (CP[i][0]-ts) * (CP[i][1]-bs)) — сколько дополнительного места начал&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; давать Гугл относительно текущего таймштампа&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// +bs — относительную величину (прирост мегабайт) превращаем в абсолютную (сколько же&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; мегабайт выдают теперь)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = format(((now-ts)&amp;nbsp;/ (CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;0&lt;font color="#008080"&gt;]&lt;/font&gt;-ts)&amp;nbsp;* (CP&lt;font color="#008080"&gt;[&lt;/font&gt;i&lt;font color="#008080"&gt;][&lt;/font&gt;1&lt;font color="#008080"&gt;]&lt;/font&gt;-bs))&amp;nbsp;+ bs); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000c0"&gt;// выставляем таймер — через секунду опять обновить значение&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(updateQuota, 1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#008080"&gt;}&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Так-то. Теперь перейдём к ВКонтакту. Программисты Дурова, очевидно, очень любят математику, в особенности статистику и генерацию случайных чисел. Вот их код:&lt;br /&gt;&lt;div class="code"&gt;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;memCount = 63301534;&lt;br /&gt;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;memPerSec = 2.16273601705;&lt;br /&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;updateCount()&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;next = -(1000&amp;nbsp;/ memPerSec)*Math.log(Math.random());&lt;br /&gt;&amp;nbsp;memCountString = &lt;font color="#c00000"&gt;''&lt;/font&gt;&amp;nbsp;+ memCount;&lt;br /&gt;&amp;nbsp;len = memCountString.length;&lt;br /&gt;&amp;nbsp;memCountString = memCountString.substr(0,len-6)+&lt;font color="#c00000"&gt;'&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;'&lt;/font&gt;+memCountString.substr(len-6,3)+&lt;font color="#c00000"&gt;'&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;'&lt;/font&gt;+memCountString.substr(len-3,3);&lt;br /&gt;&amp;nbsp;ge(&lt;font color="#c00000"&gt;'memCount'&lt;/font&gt;).innerHTML = memCountString;&lt;br /&gt;&amp;nbsp;memCount = memCount + 1;&lt;br /&gt;&amp;nbsp;setTimeout(updateCount, next);&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;/div&gt;Как видите, всё очень лаконично: сейчас насчитывается &lt;code&gt;memCount&lt;/code&gt; пиплов, каждую секунду к ним присоединяется ещё &lt;code&gt;memPerSec&lt;/code&gt; тел. Вот только незадача: каждую секунду добавлять по чуть более чем два человека некрасиво. Лучше уж почаще, но по одному целому. Т.к. люди несовершенны, они не регистрируются каждые, скажем, 500 милисекунд — это тоже надо учесть. Короче, пришлось им придумать специальную формулу, которую я подробно рассматриваю в коде ниже:&lt;br /&gt;&lt;div class="code"&gt;&lt;font color="#0000c0"&gt;// текущее количество пользователей Вконтакта&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;memCount = 63301534;&lt;br /&gt;&lt;font color="#0000c0"&gt;// примерное количество регистрирующихся в секунду&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;var&lt;/font&gt;&amp;nbsp;memPerSec = 2.16273601705;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000c0"&gt;// собственно функция, обновляющая счётчик&lt;/font&gt;&lt;br /&gt;&lt;font color="#008080"&gt;function&lt;/font&gt;&amp;nbsp;updateCount()&amp;nbsp;&lt;font color="#008080"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// хитрая математическая формула, вычисляющая длинну промежутков между&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; регистрациями&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// 1000 / memPerSec — среднее время между регистрациями&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// random возвращает дробное число от 0 до 1&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// логарифм используется для того, чтобы хотя бы иногда получать время&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_больше_ среднего&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// минус перед формулой компенсирует тот факт, что логарифм числа из&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;диапазона 0..1 отрицателен&lt;/font&gt;&lt;br /&gt;&amp;nbsp;next = -(1000&amp;nbsp;/ memPerSec)*Math.log(Math.random());&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// конвертируем число в строку&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCountString = &lt;font color="#c00000"&gt;''&lt;/font&gt;&amp;nbsp;+ memCount;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// вычисляем длинну строки, чтобы потом красиво разбить его на разряды&lt;/font&gt;&lt;br /&gt;&amp;nbsp;len = memCountString.length;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// собственно разбивка на разряды&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// жду миллиардного пользователя, на котором эта конструкция обломается и выдаст «1000 000 000»&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCountString = memCountString.substr(0,len-6)+&lt;font color="#c00000"&gt;'&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;'&lt;/font&gt;+memCountString.substr(len-6,3)+&lt;font color="#c00000"&gt;'&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;'&lt;/font&gt;+memCountString.substr(len-3,3);&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// выводим данные&lt;/font&gt;&lt;br /&gt;&amp;nbsp;ge(&lt;font color="#c00000"&gt;'memCount'&lt;/font&gt;).innerHTML = memCountString;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// наконец, добавляем к счётчику свежезарегистрировавшегося пользователя&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCount = memCount + 1;&lt;br /&gt;&amp;nbsp;&lt;font color="#0000c0"&gt;// выставляем таймер, чтобы через next миллисекунд обновить счётчик&lt;/font&gt;&lt;br /&gt;&amp;nbsp;setTimeout(updateCount, next);&lt;br /&gt;&lt;font color="#008080"&gt;}&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Не знаю, насколько полезно такое вот спонтанное и бессистемное ковыряние в коде, но мне это нравится. Надеюсь, я не один такой, и этот пост будет интересен кому-то ещё ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8622169542119587655-4064161237548737763?l=debiania.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://debiania.blogspot.com/feeds/4064161237548737763/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://debiania.blogspot.com/2010/02/javascript.html#comment-form" title="Комментарии: 8" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/4064161237548737763" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8622169542119587655/posts/default/4064161237548737763" /><link rel="alternate" type="text/html" href="http://debiania.blogspot.com/2010/02/javascript.html" title="Занимательное JavaScript программирование" /><author><name>Minoru</name><uri>http://www.blogger.com/profile/15979236009981641914</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp3.blogger.com/_Nb6QYFUvBjY/SI9jSOVKAxI/AAAAAAAAAAU/rxcSy_1qiGY/S220/Programmaster_80x80.jpg" /></author><thr:total>8</thr:total></entry></feed>

