<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8622169542119587655</id><updated>2024-11-01T12:36:59.610+02:00</updated><category term="linux"/><category term="tips&#39;n&#39;tricks"/><category term="debian"/><category term="web"/><category term="blog"/><category term="holiday"/><category term="hardware"/><category term="EULA"/><category term="mirror"/><category term="review"/><category term="fluxbox"/><category term="programming"/><category term="vim"/><category term="windows"/><category term="zsh"/><category term="Eee PC"/><category term="irssi"/><category term="mcabber"/><title type='text'>Debiania: просто ещё один блог о Debian</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://debiania.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8622169542119587655/posts/default/-/programming'/><link rel='alternate' type='text/html' href='http://debiania.blogspot.com/search/label/programming'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnpS7iexawQTsD6YwsC1Mo-E2nzK3txn-2kNpOnk2Pug-SYRp_MeISN2UW2_SZqZAUEXcHYq3XU3z7MD4-M20Cz3rBiujw79Yya3zJTq5guC6P6_X-wQkLKXT84FuV9g/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><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="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><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=&quot;http://www.joachim-breitner.de/various/pdf_screenshot_epiphany.pdf&quot;&gt;&lt;img style=&quot;margin-right: 0.5em; float:left; width: 108px; height: 300px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjoAv5TKtDU7Mqpp3q5f2L0chvA8fmXF8pfj8LMG5OR_QRfjiy8A6D6e-3W3C_H7KJoSjSGW3NVj-YRB28ZgkuZm9eXDsg8nY5HHwwM-RB0nI015_dNzw-GUK8IfSC9V1lk6CX6XiSIo/s400/pdf_screenshot_epiphany_thumbnail.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Вчера автор &lt;code&gt;gtk-vector-screenshot&lt;/code&gt;, Joachim Breitner, сообщил о том, что его разработка успешно создаёт скриншоты окна Epiphany (об этом ему в свою очередь сообщил Martin Borgert). Так что те, кто читал &lt;a href=&quot;http://debiania.blogspot.com/2011/06/pdf-gtk-3.html&quot;&gt;мой предыдущий пост&lt;/a&gt; и заинтересовался идеей, могут подключать репозитории sid и ставить себе вкусняшку — она уже работает ;)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/508-gtk-vector-screenshot-works-with-epiphany.html&quot;&gt;Оригинальный пост&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD 14.07.2011:&lt;/b&gt; по просьбам трудящихся своро^Wскопировал из оригинального поста превьюшку PDF&#39;ки.</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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnpS7iexawQTsD6YwsC1Mo-E2nzK3txn-2kNpOnk2Pug-SYRp_MeISN2UW2_SZqZAUEXcHYq3XU3z7MD4-M20Cz3rBiujw79Yya3zJTq5guC6P6_X-wQkLKXT84FuV9g/s220/Programmaster_80x80.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHjoAv5TKtDU7Mqpp3q5f2L0chvA8fmXF8pfj8LMG5OR_QRfjiy8A6D6e-3W3C_H7KJoSjSGW3NVj-YRB28ZgkuZm9eXDsg8nY5HHwwM-RB0nI015_dNzw-GUK8IfSC9V1lk6CX6XiSIo/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=&#39;http://planet.debian.org/&#39;&gt;Planet Debian&lt;/a&gt;, маленький итог из двух тамошних постов.&lt;br /&gt;&lt;br /&gt;&lt;a href=&#39;http://www.joachim-breitner.de/&#39;&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=&#39;http://www.joachim-breitner.de/various/pdf_screenshot_3.pdf&#39;&gt;этой pdf&#39;ке&lt;/a&gt;, а &lt;a href=&#39;http://www.joachim-breitner.de/various/pdf_screenshot_3.ogv&#39;&gt;здесь&lt;/a&gt; можно скачать скринкаст (Ogg Theora, 2Mb), в котором показан процесс её создания. Архивы с исходниками можно скачать &lt;a href=&#39;http://www.joachim-breitner.de/archive/gtk-vector-screenshot/&#39;&gt;здесь&lt;/a&gt;, а репозиторий — &lt;a href=&#39;https://gitorious.org/gtk-vector-screenshot&#39;&gt;найти на gitorious.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Собственно, те самые два поста, в которых Joachim описывает свой модуль:&lt;ol&gt;&lt;li&gt;&lt;a href=&#39;http://www.joachim-breitner.de/blog/archives/494-Better-PDF-screenshots-with-gtk-3.html&#39;&gt;Better PDF screenshots with gtk 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#39;https://www.joachim-breitner.de/blog/archives/502-gtk-vector-screenshot-code-published.html&#39;&gt;gtk-vector-screenshot code published&lt;/a&gt;&lt;/li&gt;&lt;/ol&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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnpS7iexawQTsD6YwsC1Mo-E2nzK3txn-2kNpOnk2Pug-SYRp_MeISN2UW2_SZqZAUEXcHYq3XU3z7MD4-M20Cz3rBiujw79Yya3zJTq5guC6P6_X-wQkLKXT84FuV9g/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=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;Я взял код &lt;a href=&quot;http://vkontakte.ru/&quot;&gt;главной ВКонтакта&lt;/a&gt;, а также &lt;a href=&quot;http://gmail.com/&quot;&gt;login-страницы GMail&lt;/a&gt;, на которой присутствует счётчик предоставляемого пользователям места, и проанализировал используемый там код. Если вам всё ещё интересен весь этот бред — читайте дальше :)&lt;br /&gt;&lt;br /&gt;Начнём с гугла.&lt;br /&gt;Код:&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;#0000c0&quot;&gt;// Estimates of nanite storage generation over time.&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;CP = &lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&amp;nbsp;1199433600000, 6283&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&amp;nbsp;1224486000000, 7254&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&amp;nbsp;2144908800000, 10996&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&amp;nbsp;2147328000000, 43008&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;&amp;nbsp;46893711600000, &lt;font color=&quot;#008000&quot;&gt;Number&lt;/font&gt;.MAX_VALUE &lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;function&lt;/font&gt;&amp;nbsp;updateQuota()&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(!quota_elem)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;return&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;now = (&lt;font color=&quot;#8b0000&quot;&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;Date&lt;/font&gt;()).getTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;for&lt;/font&gt;&amp;nbsp;(i = 0; i &amp;lt; CP.length; i++)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(now &amp;lt; CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;break&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(i == 0)&amp;nbsp;&lt;font color=&quot;#008080&quot;&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=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(i == CP.length)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;ts = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;bs = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&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=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;-ts)&amp;nbsp;* (CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&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=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&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=&quot;code&quot;&gt;&lt;font color=&quot;#008080&quot;&gt;function&lt;/font&gt;&amp;nbsp;updateQuota()&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// существует ли элемент, в который надо выводить мегабайты?&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(!quota_elem)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// элемента нет — закругляемся&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;return&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// получаем текущее время в виде UNIX timestamp в миллисекундах&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;now = (&lt;font color=&quot;#8b0000&quot;&gt;new&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;Date&lt;/font&gt;()).getTime();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// объявляем переменную для цикла&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// перебираем все записи в CP&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;for&lt;/font&gt;&amp;nbsp;(i = 0; i &amp;lt; CP.length; i++)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// если текущий таймштамп меньше того, что в массиве — прерываем цикл&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(now &amp;lt; CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;break&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(i == 0)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// если таймштамп, на котором прервались — первый в массиве, то…&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&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=&quot;#0000c0&quot;&gt;// по-русски это звучит как «ждать наступления февраля 2008-го года»&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;if&lt;/font&gt;&amp;nbsp;(i == CP.length)&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// если вышеприведённое условие не сработало и&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// если все таймштампы в массиве меньше текущего времени, то&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// записать количество мегабайт из последней записи в массиве&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quota_elem.innerHTML = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// это на случай, если код долго не будут апдейтить — тогда в качестве мегабайт будет принято&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// самое большое число, допустимое в JavaScript — это около 1.7976931348623157e+308&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#8b0000&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// если ни одно из вышеприведённых условий не сработало, то&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// переменной ts присвоить таймштамп последней записи,&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// а переменной bs — кол-во мегабайт, соответствующих этому таймштампу&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;ts = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;bs = CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i - 1&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// обновить запись с помощью нехитрой математики:&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// now-ts — разность между текущим временем и используемым таймштампом&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// CP[i][0]-ts — это разность во времени между текущим и следующим таймштампами&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// CP[i][1]-bs — разность в мегабайтах между текущим и следующим таймштампами&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&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=&quot;#0000c0&quot;&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=&quot;#0000c0&quot;&gt;// +bs — относительную величину (прирост мегабайт) превращаем в абсолютную (сколько же&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&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=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;0&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;-ts)&amp;nbsp;* (CP&lt;font color=&quot;#008080&quot;&gt;[&lt;/font&gt;i&lt;font color=&quot;#008080&quot;&gt;][&lt;/font&gt;1&lt;font color=&quot;#008080&quot;&gt;]&lt;/font&gt;-bs))&amp;nbsp;+ bs); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&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=&quot;#008080&quot;&gt;}&lt;/font&gt;&amp;nbsp;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Так-то. Теперь перейдём к ВКонтакту. Программисты Дурова, очевидно, очень любят математику, в особенности статистику и генерацию случайных чисел. Вот их код:&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;memCount = 63301534;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;memPerSec = 2.16273601705;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;function&lt;/font&gt;&amp;nbsp;updateCount()&amp;nbsp;&lt;font color=&quot;#008080&quot;&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=&quot;#c00000&quot;&gt;&#39;&#39;&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=&quot;#c00000&quot;&gt;&#39;&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&#39;&lt;/font&gt;+memCountString.substr(len-6,3)+&lt;font color=&quot;#c00000&quot;&gt;&#39;&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&#39;&lt;/font&gt;+memCountString.substr(len-3,3);&lt;br /&gt;&amp;nbsp;ge(&lt;font color=&quot;#c00000&quot;&gt;&#39;memCount&#39;&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=&quot;#008080&quot;&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=&quot;code&quot;&gt;&lt;font color=&quot;#0000c0&quot;&gt;// текущее количество пользователей Вконтакта&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;memCount = 63301534;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;// примерное количество регистрирующихся в секунду&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;var&lt;/font&gt;&amp;nbsp;memPerSec = 2.16273601705;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;// собственно функция, обновляющая счётчик&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;function&lt;/font&gt;&amp;nbsp;updateCount()&amp;nbsp;&lt;font color=&quot;#008080&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// хитрая математическая формула, вычисляющая длинну промежутков между&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; регистрациями&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// 1000 / memPerSec — среднее время между регистрациями&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// random возвращает дробное число от 0 до 1&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// логарифм используется для того, чтобы хотя бы иногда получать время&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_больше_ среднего&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// минус перед формулой компенсирует тот факт, что логарифм числа из&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&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=&quot;#0000c0&quot;&gt;// конвертируем число в строку&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCountString = &lt;font color=&quot;#c00000&quot;&gt;&#39;&#39;&lt;/font&gt;&amp;nbsp;+ memCount;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// вычисляем длинну строки, чтобы потом красиво разбить его на разряды&lt;/font&gt;&lt;br /&gt;&amp;nbsp;len = memCountString.length;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// собственно разбивка на разряды&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// жду миллиардного пользователя, на котором эта конструкция обломается и выдаст «1000 000 000»&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCountString = memCountString.substr(0,len-6)+&lt;font color=&quot;#c00000&quot;&gt;&#39;&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&#39;&lt;/font&gt;+memCountString.substr(len-6,3)+&lt;font color=&quot;#c00000&quot;&gt;&#39;&amp;lt;span style=&amp;quot;font-size:8px&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&#39;&lt;/font&gt;+memCountString.substr(len-3,3);&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// выводим данные&lt;/font&gt;&lt;br /&gt;&amp;nbsp;ge(&lt;font color=&quot;#c00000&quot;&gt;&#39;memCount&#39;&lt;/font&gt;).innerHTML = memCountString;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// наконец, добавляем к счётчику свежезарегистрировавшегося пользователя&lt;/font&gt;&lt;br /&gt;&amp;nbsp;memCount = memCount + 1;&lt;br /&gt;&amp;nbsp;&lt;font color=&quot;#0000c0&quot;&gt;// выставляем таймер, чтобы через next миллисекунд обновить счётчик&lt;/font&gt;&lt;br /&gt;&amp;nbsp;setTimeout(updateCount, next);&lt;br /&gt;&lt;font color=&quot;#008080&quot;&gt;}&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnpS7iexawQTsD6YwsC1Mo-E2nzK3txn-2kNpOnk2Pug-SYRp_MeISN2UW2_SZqZAUEXcHYq3XU3z7MD4-M20Cz3rBiujw79Yya3zJTq5guC6P6_X-wQkLKXT84FuV9g/s220/Programmaster_80x80.jpg'/></author><thr:total>8</thr:total></entry></feed>