computo ergo sum/Recent content on computo ergo sumHugo -- gohugo.iobgWed, 03 Jun 2020 13:18:00 +0200(Отново) За паралелното програмиране/posts/otnovo-za-paralelnoto-programirane.htmlWed, 03 Jun 2020 13:18:00 +0200/posts/otnovo-za-paralelnoto-programirane.html<h2 id="вместо-увод">Вместо увод</h2> <p>По-добре късно, отколкото още по-късно. Доста вода изтече и много неща се промениха, откакто за последно <a href="/posts/shto-e-to-hpc.html">писах тук</a> за HPC. Всъщност откакто за последно писах тук изобщо. Едно от непроменимите неща, обаче, остава тенденцията на прехода от монолитни процесори с едно свръх-бързо ядро към процесори с множество относително по-бавни ядра или такива с огромен брой много прости ядра (напр. GPU). Дори <a href="https://en.wikipedia.org/wiki/Apple_S4">часовниците</a> не остават незасегнати. Силен двигател на тази тенденция е и масовото навлизане на машинното самообучение.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p>За разлика от процедурното и обектно-ориентирано програмиране, които, въпреки множествата нива на насложена абстракция, в крайна сметка запазват класическата фон Нойман парадигма на последователен набор от инструкции, опериращи върху някакъв модел на данни в паметта, програмирането на паралелните и разпределени системи изисква качествено нов начин на мислене. Класически проблеми като как най-бързо или с най-малко количество работна памет да бъде изпълнен даден алгоритъм, се допълват с често неортогонални проблеми като как да бъде декомпозиран модела така, че комуникацията и синхронизацията между отделните процесорни единици да бъде сведена до минимум. Освен това, на преден план стои и въпросът за методите на изразяване на необходимия паралелизъм. И доколкото декомпозирането на проблемите е изключително тежка задача, граничеща с изкуство, то програмното изразяване на паралелизма е значително по-проста (но в никакъв случай проста) такава, както ще се опитам да покажа в тази и последващите статии по въпроса, като ще се фокусирам върху няколко парадигми, придобили статута на де факто стандарти.</p> <h2 id="паралелни-архитектури">Паралелни архитектури</h2> <p>Не може да се говори за практическо паралелно програмиране, без това да става в контекста на хардуера, върху който ще се изпълняват крайните програми. Съществуват, най-общо казано, два ортогонални класа паралелни архитектури.</p> <p>Първият клас е този на системите със <em>споделена памет</em>, при които множество изчислителни елементи (ИЕ) имат едновременен достъп до общ блок памет, като блокът може да бъде или относително монолитен и да осигурява еднакво бърз достъп от всеки един ИЕ, известно като <em>униформен достъп до паметта</em> UMA (Uniform Memory Access), или на йерархични нива, при които някои области от паметта са по-близо до определени ИЕ и съответно осигуряват по-ниско време на достъп и по-висока пропускателна способност от други, по-далечни области, известно като <em>неуниформен достъп до паметта</em> NUMA (от Non-Uniform Memory Access). Класически пример за UMA от света на x86 са многопроцесорните системи с Front-Side Bus технология за връзка между процесорите и контролера на основната памет, т.е. всичко от времето преди AMD64 и Intel Nehalem, докато пример за NUMA са всички многопроцесорни системи, където всеки процесор има собствен контролер на паметта, което включва практически всяка съвременна многопроцесорна система.</p> <p>Вторият клас е този на системите с <em>разпределена памет</em>, при които множество ИЕ, всеки със собствен блок памет, са свързани с някакъв транспортен механизъм за обмяна на информация. Всеки ИЕ има директен достъп единствено до своя блок памет и при нужда обменя информация с останалите ИЕ под формата на съобщения, предавани по транспортния механизъм, който най-често е високоскоростна мрежа с ниско времезакъснение.</p> <p>Разделението между двата класа е предимно на ниво физическа реализация, тъй като на логическо ниво всеки един от тях прави възможно емулирането на другия. Например, процесите в съвременните операционни системи (ОС) оперират в собствено виртуално адресно пространство и обменят информация помежду си само чрез специални комуникационни механизми на ОС, въпреки че съществуват в рамките на един и същ блок физическа памет. И обратно, механизмът на виртуалната памет прави възможно автоматичното споделяне и мигриране на данни между физически отделни блокове памет, известно като <em>(виртуална) разпределена споделена памет</em> или (v)DSM (от (virtual) Distributed Shared Memory). Струва си да се отбележи, че дори многопроцесорните системи в наши дни са пример за хардуерна реализация на разпределена споделена памет, тъй като всеки един процесор автоматично препраща операциите за достъп до области памет, намиращи се извън собственото му физическо адресно пространство, към съответния процесор, където те се намират.</p> <p>Бидейки ортогонални, двата класа могат да се комбинират, като това е по-скоро норма, отколкото изключение. Например, практически всеки изчислителен клъстер в наши дни се състои от множество дву- или четирипроцесорни изчислителни възли, свързани помежду си с високоскоростна мрежа с ниско закъснение. Всеки изчислителен възел е NUMA на глобално системно ниво, докато ядрата във всеки един процесор имат UMA достъп до споделения кеш от последно ниво и до блока памет на него процесор.</p> <p>Важна характеристика на една паралелна архитектура е нейната възможност да се разраства като брой ИЕ или т.нар. <em>мащабируемост</em>. UMA е изключително ограничена в това отношение, главно поради експоненциалното нарастване на хардуерната сложност с броя на ИЕ, които имат достъп до паметта. NUMA на теория позволява неограничено йерархично разрастване, но на практика е ограничена от изискването за <em>кешова кохерентност</em>. По-голямата част от NUMA реализациите са кеш-кохерентни, т.нар. ccNUMA, което означава, че промените в локалния кеш на един ИЕ се разпространяват и автоматично отразяват в кешовете на другите ИЕ. Без подобен механизъм реализацията на NUMA би била много по-проста, но това би било за сметка на значително усложнен програмен модел. Системите с разпределена памет са принципно неограничени, тъй като обмяната на съобщения там е явна и може да се локализира в определени области, когато алгоритъмът е избран подходящо.</p> <h3 id="simd-и-vliw">SIMD и VLIW</h3> <p>Предните два класа се отнасят за паралелни системи, състоящи се от множество ИЕ, като всеки ИЕ е малко или много завършено процесорно ядро с контролна логика, АЛУ, изпълнителни блокове, конвейри и прочие. Но паралелизмът може да е на много по-ниско (или по-фино) ниво, по-специално на ниво инструкция, като това е бил пътят за постигане на изключително висока производителност през 70-те години на миналия век. Практичният паралелизм на ниво инструкция бива най-общо два вида.</p> <p>Първият вид е SIMD (Single Instruction Multiple Data), при който една инструкция действа едновременно върху вектор (няколко еднотипни единици) от данни. Дължината на вектора в различните архитектури варира от два до стотици елемента. Дългите веркторни операции са начинът, по който Cray-1 постига през 1975 г. космическата за тогава производителност от над 100 MFLOPS<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Основен недостатък на подобни системи е тяхната тясна специализираност в обработка на големи масиви от еднотипни данни. Далеч по практични са късите векторни операции, с каквито е снабден практически всеки съвременен процесор, независимо от архитектурата му.</p> <p>Вторият и значително по-рядко срещан вид е VLIW (Very Long Instruction Word), при който една инструцкия кодира множество различни операции, които се изпълняват едновременно от различни независими изпълнителни блокове в процесора. За разлика от SIMD, който е вид паралелизъм по данни, VLIW е паралелизъм по задачи (или операции). Типичен пример са повечето цифрови сигнали процесори (DSP) и по-ранните модели GPGPU на ATI. Вид VLIW е и EPIC архитектурата на Itanium.</p> <p>Следва да се отбележи, че векторизацията обикновено е единственият начин за пълно използване на изчислителните възможности на съвременните процесорни ядра.</p> <h2 id="програмни-модели">Програмни модели</h2> <p>Всеки един от двата класа паралелни архитектури може да бъде разглеждан по много различни начини на програмно ниво, като обаче някои от тези начини са по-подходящи и естествени за съответния клас, а други &ndash; не толкова. Наличието на споделена памет позволява лесна обмяна на информация между отделните ИЕ под формата на споделени променливи. И не само това &ndash; архитектурата позволява споделяне и на изпълнимите инструкции, което силно опростява модела на зареждане и изпълнение на паралелните програми. Най-удобното в случая е, че съществува готов и широкоразпространен програмен модел, който съответства директно на архитектурата &ndash; този на <em>многонишковите процеси</em>, където нишката е абстракция на независимо изпълняващ се поток инструкции. Нишките могат да бъдат както отделни контексти в рамките на един последователен поток, между които се превключва с някакъв механизъм в потребителски режим, често наричани <em>зелени нишки</em> (green threads по името на първата Java библиотека за многонишково изпълнение) или <em>фибри</em> (fibers), така и <em>олекотени процеси</em> (или LWP от Light-Weight Processes), които споделят в рамките на един процес на ОС общо адресно пространство и системни обекти като дескриптори на отворени файлове и мрежови съединения, но се изпълняват независимо един от друг. Съществуват множество приложни програмни интерфейси (API) за създаване, контрол и синхронизация на двата вида нишки, като LWP са значително по-полезни в контекста на паралелното програмиране, тъй като могат да се изпълняват върху различни ИЕ.</p> <p>Писането на многонишкови програми е като цяло трудоемко и най-вече силно платформенозависимо, поради което са разработени различни абстрактни модели, които да го облекчат. Един такъв модел е <a href="https://www.openmp.org/">OpenMP</a>, който ще бъде предмет на следващата статия от серията. OpenMP използва специални директиви на компилатора, реализирани под формата на прагми (C/C++) или коментари (Fortran), които модифицират поведението на съществуващите езикови конструкции. Това позволява не само създаването на нов паралелен софтуер, но и прагматичната постъпкова паралелизация на съществуващ последователен код. Версия 4.0 на OpenMP спецификацията добави и преносими SIMD конструкции, които да заместят различните за всеки един компилатор директиви за векторизация на кода.</p> <p>Малко по-различен модел е този на Intel <a href="https://github.com/oneapi-src/oneTBB">Threading Building Blocks</a> (Intel TBB или просто TBB), което е библиотека от контейнерни класове и алгоритми за C++. За разлика от OpenMP, TBB не изисква специален компилатор и се поддържа на практически всяка платформа, за която съществува достатъчно съвременна реализация на C++.</p> <p>Към класа на многонишковото програмиране спадат и платформите за изпълнение на операции с общо предназначение върху графичен хардуер (GPGPU от General-Purpose computing on Graphics Processing Units) като <a href="https://developer.nvidia.com/cuda-zone">CUDA</a> и <a href="https://www.khronos.org/opencl/">OpenCL</a>. OpenCL е интересен с това, че е отворен стандарт и поддържа не само различен вид графичен хардуер, но също така всякакъв вид хетерогенни изчислителни добавки, известни като <em>ускорители</em> (accelerators), включително и стандартни процесори и FPGA. Както CUDA, така и OpenCL, са платформи от сравнително ниско ниво, които оставят видими значително количество хардуерни детайли, поради което върху тях съществуват редица абстракции от по-високо ниво. Една такава е <a href="https://www.khronos.org/sycl/">SYCL</a>, продукт на организацията зад OpenCL, която е набор от класове и алгоритми на C++ и среда за изпълнение, която динамично превежда класовете и алгоритмите в OpenCL код. Друга абстракция и надстройка на SYCL е <a href="https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/dpc-compiler.html">Data-Parallel C++</a> (или DPC++) &ndash; отроче на Intel, което те искрено се надяват да се наложи като новият отворен стандарт. Дали това ще се случи наистина, единствено времето ще покаже. SYCL и DPC++ са много по-близки до TBB като структура на програмите, отколкото до OpenMP.</p> <p>Един интересен, макар и все още не особено широко приет похват за многонишково програмиране, е този на функционалните езици. Комбинацията от мързеливи функционални трансформации върху непроменими стойности и липсата на скрито вътрешно състояние (поне в чистите функционални езици) правят функционалното програмиране особено приемливо, не само заради относително естественото изразяване на най-различни паралелни операции, но и поради автоматичното елиминиране на много от проблемите, които възникват при поставяне на класическите императивни идеи в многонишков контекст, за които проблеми ще стане дума в последващите статии.</p> <p>Програмирането на архитектури със споделена памет е значително по-сложно, тъй като липсата на споделено адресно пространство води до необходимост от явен обмен на споделена информация между отделните ИЕ. Това най-често става под формата на съобщения, които представляват пакети от силно-, слабо- или напълно нетипизирана информация. Самото предаване може да бъде както функционалност на операционната система, така и функционалност на някакъв вид междинен софтуерен слой и/или среда за изпълнение (middleware). Като пример за първата може да се посочи приложният интерфейс на BSD сокетите, който направи възможно широкото приемане на TCP/IP и експлозията на мрежовите услугите и Internet. И както сокетите са де факто стандартният интерфейс за обмяна на неструктурирана информация върху множество различни мрежови протоколи в слабо свързани системи, така <em>интерфейсът за предаване на съобщения</em> <a href="https://www.mpi-forum.org/">MPI</a> (Message Passing Interface) е де факто стандартът за предаване на структурирани съобщения в силно свързани системи, каквито са повечето изчислителни архитектури с разпределена памет. MPI стъпва върху множеството съществуващи транспортни механизми и скрива редица техни детайли, като предоставя на приложенията сравнително прост метод за адресация на съобщенията, както и готова реализация на някои често срещани и относително примитивни операции.</p> <h2 id="практически-примери">Практически примери</h2> <p>Идеята ми е да покажа в рамките на няколко последователни статии най-разпространените парадигми за паралелно програмиране, като във всяка една от тях да покажа на практика процесите на декомпозиция и реализация с използването на съответната парадигма. За целта ми трябват примери, които хем да бъдат достатъчно прости, за да не се загуби паралелизацията в шума на основния код, хем да имат някакво практическо значение. Затова и се спрях на следните три:</p> <ul> <li><a href="https://en.wikipedia.org/wiki/K-means_clustering"><em>k-means клъстеризация</em></a> &ndash; широкоизползван и достатъчно прост за реализация метод от машинното самообучение;</li> <li><a href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"><em>игра Живот на Конуей</em></a> &ndash; любим пример за клетъчен автомат, също така почит към паметта на автора му, <a href="https://en.wikipedia.org/wiki/John_Horton_Conway">Джон Конуей</a>, който наскоро стана нелепа жертва на COVID-19;</li> <li><em>оцветяване на <a href="https://en.wikipedia.org/wiki/Mandelbrot_set">множеството на Манделброт</a></em> &ndash; солидна основа за дискусия на особеностите при разпределяне на работата в паралелните системи, страничен продукт на чието решение са красиви визуализации на де факто символа на фракталната математика.</li> </ul> <p>Както обясних по-рано, OpenMP представлява набор от директиви на компилатора, които позволяват постъпковата паралелизация на съществуващи последователни програми, поради което и ще започна серията именно с него, като едновременно с това ще представя всеки един от трите примера и тяхното класическо (последователно) решение. Като език ще използвам C++, защото той е най-големият общ делител на всички методи, които искам да разгледам, като ще се придържам към максимално C-подобно подмножество, т.е. нищо няма да бъде идиоматичен C++. За MPI ще дам и пример на Python, тъй като неофициалната реализация <code>mpi4py</code> продължава да набира популярност. Всички примери ще бъдат по възможност междуплатформени, с изключение на тези за &ldquo;ръчното&rdquo; многонишково програмиране, а където е възможно ще приведа и времето за изпълнение в различни конфигурации върху Intel i7-5820K под 64-битов Windows 10.</p> <section class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1" role="doc-endnote"> <p>Често представяно като <em>изкустен интелект</em>, което няма особен смисъл отвъд маркетинга. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2" role="doc-endnote"> <p>милиони операции с плаваща запетая в секунда <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </section>Реформа №2/posts/reforma-2.htmlWed, 06 May 2020 13:05:20 +0200/posts/reforma-2.html<p>Отново реформа. Този път реформа на <a href="/posts/reforma.html">реформата</a>. След малко повече от пет години, icaci.info отново шава, показвайки, че слуховете за неговата смърт са някак преувеличени.</p> <p>Всичко тече, всичко се променя, предпочитанията към статичните генератори на съдържание &ndash; също. Nikola е приятен за работа, но е архитектурно тежък и има множество проблеми, които в някакъв момент стават нещо повече от досада, затова и беше изместен от <a href="https://gohugo.io/">Hugo</a>, който от години движи англоезичния ми сайт. Hugo е светкавично бърз, тъй като е написан на Go(lang) &ndash; no-bullshit език, към който напоследък развивам бързо афинитет, след разочарованието от посоката, в която вървят езици като C++. Предпочитаният маркъп този път е Markdown, така че отново се наложи да конвертирам, което нарочно направих на ръка, като в процеса отсях някои детинщини и пооправих правописно и стилистично други. Първоначално мислех да изтрия голяма част от съдържанието, но после реших, че това е, все пак, паметник, макар и частичен, на това кой съм бил и какво ме е интересувало през годините на присъствие в Интернет, затова и оставих нещата такива, каквито си бяха. Оказа се също, че съм дал редица обещания, които никога не съм спазил, къде поради липса на време, къде на мотивация. Факт е обаче, че ми липсва писането на родния език. В последно време се усещам, че мислите ми вече не текат така свободно, както преди време, вероятно поради жонглирането с три чужди езика и постоянното бомбардиране от социалните мрежи с фрагментирана информация, затова си обещах, че ще започна да пиша по-често тук. Като за начало, намерих няколко чернови на тема паралелно програмиране, които така и не съм довършил, така че това ще е основната ми цел. Да видим, какво ще стане този път.</p>Реформа/posts/reforma.htmlFri, 03 Apr 2015 13:24:00 +0200/posts/reforma.html<p>Реформите, особено бюрократичните, не са нещо, което се случва за една нощ. След има-няма 500 дена неактивност, icaci.info се реформира в напълно статична версия, генерирана с <a href="http://getnikola.com">Nikola</a>. Повечето стари URL-и са все още валидни и пренасочват към новите местоположения на писанията, но RSS-ът се мести на <a href="http://icaci.info/rss.xml">http://icaci.info/rss.xml</a>. PixelPost галерията се трансфомира напълно в нещо не толкова красиво (все още), но концептуално малко по-различно.</p> <p>Бидейки написан на Python, Nikola предпочита маркъп езика на <a href="http://docutils.sourceforge.net/">Docutils</a> &ndash; <a href="http://docutils.sourceforge.net/docs/ref/rst/introduction.html">reStructuredText</a>, макар голяма част от функционалността да може да се ползва и от <a href="http://daringfireball.net/projects/markdown/">Markdown</a>. &ldquo;Превеждането&rdquo; от Textile (маркъп езика на Textpattern) в reStructuredText не беше особено тривиално, като <a href="http://johnmacfarlane.net/pandoc/">Pandoc</a> помогна много.</p> <p>Основното предимство на Nikola, както и на повечето подобни генератори (или по-скоро компилатори) на статично съдържание, е, че цялото текстово съдържание идва от обикновени текстови файлове, които могат да се създават с произволен редактор и да се държат (заедно с всички останали принадлежащи файлове) в система за контрол на версиите, напр. Git. Няма web интерфейс за управление, няма нужда от бази данни и няма нито един сървърен скрипт, което влияее благотворно върху сигурността на сайта. Изходният код на всяка страница (с изключение на автоматично генерираните индекси) е достъпна посредством връзката <code>Source</code> в горния десен ъгъл на заглавната лента.</p> <p>Сега остава и да започна да пиша отново.</p>22.11.2013/posts/22112013.htmlFri, 22 Nov 2013 15:31:07 +0100/posts/22112013.html<p>(Това вероятно е едно от най-добре поддържаните поизоставени местенца в световната мрежа. Редовно почиствано, архивирано, обновявано, проветрявано &ndash; като истински отглеждано е. &ndash; <em>бел. авт.</em>)</p> <p>Не знам как ми дойде да пиша. Сигурно защото е петък, а петъците не са сред най-продуктивните дни, дори в държавата на усърдно работещите от 9:00 до 18:00. Днес е 22-ри ноември, което означава две неща.</p> <p>Първо, от днес отваря Weihnachtsmarkt, или с други думи, изключително мазни <a href="http://en.wikipedia.org/wiki/Potato_pancake">Reibekuchen</a> и <a href="http://en.wikipedia.org/wiki/Gl%C3%BChwein">Glühwein</a> на корем.</p> <p>Второ, 22-ри ноември е и денят, на който германската академична култура засвидетелства по вечерному своето уважение към германската ескапистка алкохолна култура, като в три от най-големите аудитории на RWTH (включително в аулата) прожектира <a href="http://en.wikipedia.org/wiki/Die_Feuerzangenbowle_%281944_film%29">Die Feuerzangenbowle</a>. Носенето на термоси с домашно приготвено едноименно питие е задължително. Пиенето в синхрон със случките във филма &ndash; също. Всичко в името на онова усещане, че всички хора са приятели и принадлежат към нещо по-голямо от самите тях.</p>Сбогом, Twitter!/posts/farewell-twitter.htmlSun, 05 May 2013 12:20:13 +0000/posts/farewell-twitter.html<p>Всеки, който следи отблизо развитието на Twitter, знае, че 7 май 2013 г. е повратна дата във времевата линия на социалната мрежа. Това е датата, на която Twitter най-сетне ще изневери на идеала си да бъде платформата, която реализира идеята за социална мрежа по Правилния Начин™, представяйки за свободна и неограничена синдикация публичното съдържание (за разлика от оградените дворове (walled gardens) като Facebook и G+). Това е датата, на която Twitter официално ще пенсионира версия 1.0 на програмния си интерфейс, оставяйки като единствено достъпен програмен интерфейс версия 1.1. Въпреки очевидните предимства на последния, следната изключително важна функционалност няма да бъде налична повече:</p> <ul> <li><strong>неограничен и анонимен достъп до публичната информация</strong> &ndash; версия 1.1 изисква абсолютно всички извиквания към REST сървъра да бъдат автентицирани чрез OAuth, дори когато става дума за функции, свързани с достъпване на публична информация (в случая потоци, видими на сайта без необходимост от вписване с име и парола);</li> <li><strong>експорт в RSS</strong> &ndash; единственият формат на данните, поддържан във версия 1.1, е JSON.</li> </ul> <p>В резултат имаме поредния ограден двор, като за мен специално става практически невъзможно лесното извличане на съдържание от Twitter, например за вграждане като интегрална част от ежедневния информационен поток, който следя през RSS. Отделното преглеждане на нещата от Twitter през сайта им, през десктоп клиент или през услуга на трети лица не е вариант, който бих приел.</p> <p>Дълбоката ирония в случая е, че това се случва точно седмица след 20-годишнината от паметния ден, в който ръководството на CERN, под убеждението на сър Тим Бърнърс-Лий, подари безвъзмездно на човечеството технологията на World Wide Web с надеждата, че тя ще спомогне за развитието на един по-отворен и свързан свят, в основата на който стои свободната за достъп и обмяна информация.</p> <p>Не мога да скрия, че Twitter беше любимата ми социална платформа, както и че това е втората ми раздяла с него. За съжаление, желанието за пълен контрол над достъпа до информацията от страна на компанията, вероятно като следствие от желанието всичко и всеки да бъде анализиран с рекламна цел, надделя. Така че тук е мястото, където общият ни път свършва. За щастие, цялото текстово съдържание на потока ми вече може да се извади под формата на архив. Защо не включват в него и графичното съдържание от съответната услуга на Twitter не е много ясно, но, ясно или не, ще трябва да свалям снимките си на ръка. Все още обмислям дали да го налея в специална архивна секция тук или да го изпратя в кутията за спомени, като за момента везните клонят повече към втория вариант.</p> <p>Дали ще ми липсва Twitter? От една страна да, заради хора като <a href="https://twitter.com/Cmdr_Hadfield">действащия командир на МКС</a> и хапливия хумор на <a href="https://twitter.com/SarcasticRover">саркастичния марсиански ровър</a>. От друга страна, не мисля, че ще ми липсва фрагментираният информационен поток. Напоследък установявам, че съм загубил частично способността да се концентрирам върху дълги и понякога скучни текстове &ndash; способност, която всеки учен трябва да притежава и да развива до съвършенство. Частична вина за това имат и накъсаните информационни потоци, които непрекъснато се изливат от Twitter и подобните услуги за микроблогване. Така че, очаквам спирането на последните да се отрази положително на омекналия ми когнитивен мускул. И като цяло животът в Германия (или поне в Ахен) има една положителна страна, свързана с предпочитанието към общуване лице в лице на живо (на по халба бира, разбира се), към която неусетно привикнах, макар организацията на събитията да става предимно през Facebook, което до известна степен налага присъствието ми там. Факт е, обаче, че напоследък социалният ми живот започна наистина сериозно да пречи на виртуалния, така че се налагат известни консолидационни мерки спрямо последния, за да се запазят нещата управляеми (първи въпросните мерки отнесе вече покойният ми профил в G+). Да не говорим за постоянно нарастващото ми отвращение от всичкия душевно-социален ексхибиционизъм в социалната епоха, в който понякога импулсивно взимам участие и аз.</p> <p>Има и още нещо, свързано с разочароващта и донякъде очаквана (не-)активност в <a href="/posts/browser-hpc-is-it-possible.html">експеримента с браузърите</a>. Интернет просията вече не дава резултатите, които даваше едно време. Но повече за това &ndash; в следващото издание.</p> <p>В заключение, перифраза на една песен от началото на прехода:</p> <blockquote> <p>Последен твит,<br> сбогом любими!</p> </blockquote> <p>О, да, и без малко да забравя — весел Великден!</p>Изследване: Виртуален суперкомпютър от браузъри – струва ли си?/posts/browser-hpc-is-it-possible.htmlSat, 20 Apr 2013 17:37:51 +0000/posts/browser-hpc-is-it-possible.html<p>(Нетърпеливите могат директно да прескочат до частта <a href="#ако-пожелаете-да-участвате">Ако пожелаете да участвате</a>, след което да се върнат към скучните технически подробности)</p> <p>Въпреки непрекъснатото поевтиняване на изчислителните ресурси, закупуването на голяма изчислителна машина все още е проблем пред редица недобре финансирани групи. Също така не всеки може да си позволи закупуването на изчислително време от доставчици на облачни услуги. Много преди времето на облаците, проектът SETI (<strong>S</strong>earch for <strong>E</strong>xtra-<strong>T</strong>errestrial <strong>I</strong>ntelligence) популяризира изчислителен модел, при който хиляди домашни потребители можеха да дарят неизползваното изчислително време на собствените си компютри за извършване на научни изследвания. <a href="http://setiathome.berkeley.edu/">SETI@home</a>, както се наричаше първоначално проектът, стана един от най-мощните виртуални суперкомпютри в света. Идеята беше доразвита по-късно под формата на универсалната платформа <a href="http://boinc.berkeley.edu/">BOINC</a>, която позволява на всеки да създаде свой виртуален суперкомпютър, ако успее да убеди достатъчен брой потребители да инсталират платформения клиент и да се присъединят към проекта. Необходимостта от инсталиране на специален клиент донякъде се оказа пречка пред редица потребители с недостатъчни технически познания. От друга страна, сложната сървърна инфраструктура, необходима за работата на BOINC, се оказа пречка пред редица научни проекти.</p> <p>В същото време сме свидели на постепенна промяна в парадигмата за компютър. Освен неспирното навлизане на таблетите, съществува реална опасност мощните персонални компютри да се превърнат в нетбуци на стероиди, прости платформи за изпълнение на уеб браузъри. За справка: Google Chromebook Pixel.</p> <p>Съвременните браузъри на практика са малки виртуални машини, които, освен че могат да показват картинки и текст, позволяват изпълнение на изключително сложна логика, написана на JavaScript. По естествен път възниква въпроса, не може ли да се използва тази сила на браузърите за създаване на разпределени изчислителни системи, при които крайният клиент не трябва да инсталира нищо (zero setup distributed computing) – достатъчно е последният просто да посети определена страница в Интернет, за да дари изчислителните си ресурси.</p> <p>Идеята не е моя. Още преди няколко години, когато беше първоначалният бум на BitCoin, някой се беше сетил да напише JavaScript код за копаене на BitCoin, след което редица хора се опитаха да се възползват от различни XSS атаки, за да превърнат браузърите на нищо неподозиращи хора в копачи. JavaScript обаче няма целочислени типове, а представя вътрешно всичко като числа с плаваща запетая. Съответно криптографските операции, необходими за копаенето на BitCoin, бяха изключително бавни в реализация на JavaScript. Не така стоят нещата с редица научни програми, които извършват предимно изчисления с плаваща запетая.</p> <p>Това ме наведе на мисълта: колко точно по-бавен е JavaScript в сравнение с традиционните компилирани езици, използвани в научната и инженерна практика, като Fortran и C/C++? Така се роди идеята за това изследване, чиято цел е да отговори по наукообразен начин на поставения въпрос.</p> <h2 id="проблемът">Проблемът</h2> <p>Съществуват десетки браузъри и операционни системи, върху които те се изпълняват. Отделно съществуват стотици видове &ldquo;железа&rdquo;, върху които пък се изпълнява стекът от браузъри и операционни системи. Това прави трудно да се даде еднозначен и директен отговор, още повече, че браузърните технологии непрекъснато се усъвършенстват. Също така едно сериозно изчисление изисква продължителна работа на скрипта, което не се харесва на много от браузърите.</p> <p>Въпреки всички технически детайли, големият въпрос е: струва ли си? С други думи: какво количество изчислителни ресурси може да се очаква от един средностатистически потребител?</p> <h2 id="методът">Методът</h2> <p>Всеки компютър има ограничен изчислителен капацитет. Използването на интерпретиран език като JavaScript допълнително редуцира полезната част от този капацитет. Фактът, че почти никой не държи пуснат браузър 24/7 – още повече. Така че разработих един тест с две лица: първото лице е т.нар. нативен тест, който представлява компилирана и оптимизирана програма, която измерва базата (в случая – граничните възможности) на “желязото” (хардуера); второто лице е реализация на същия алгоритъм, но на JavaScript, така че да може да се изпълнява в модерни браузъри. Тъй като и двете реализации правят едно и също, времето за изпълнение на всяка от тях може директно да бъде съпоставено и така да се оцени, какъв процент от наличните ресурси могат да се оползотворят през JavaScript.</p> <p>JavaScript версията има възможност да работи в режим на непрекъснато повторение. Така може да се оцени влиянието на изпълнението на заден фон и на нормалната работа на потребителя върху скоростта на изпълнение на работните скриптове, както и обратното влияние.</p> <h2 id="призивът">Призивът</h2> <p>По съществото си това е статистическо изследване. Подобни изследвания изискват множество участници, които малко или много покриват широк спектър от потребителски профили и компютърни конфигурации. Въпреки че съм тествал стотици пъти собствения си компютър по време на разработката на софтуера, това няма абсолютно никаква статистическа тежест. Затова призовавам всичките си познати и непознати да станат участници, пък било то дори за малко, в това изследване.</p> <p>Какво се изисква от вас? Минимални усилия да изтеглите нативния клиент и да го стартирате, след което да регистрирате компютъра си и да започнете да изпълнявате браузърния тест, докато вършите нормалната си работа.</p> <p>Какво печеля аз? Анонимна статистическа информация за относителната скорост, с която различни браузъри изпълняват научни алгоритми върху различни хардуерни конфигурации. Имам някои идеи за платформа (с отворен код, разбира се) за подобни приложения, но реализацията ще изисква значително количество човешки ресурси, така че събраната информация ще позволи евентуално да се спести прахосването на ресурсите (да се чете: свободното ми време, а по-късно и свободното време на други хора). Но най-важното е, че ще спечеля спокойствие нощем, защото идеята за това изследване се върти в главата ми от доста време насам и не ми дава покой :)</p> <p>Какво печелите вие? Удовлетворение, че допринасяте за някаква мъгливо дефинирана научна и инженерна кауза. Но, ей, това все пак е наука. След време, също така, ще разберете кой браузър има най-добър JavaScript двигател, поне що се отнася до изпълнението на научни програми.</p> <h2 id="ако-пожелаете-да-участвате">Ако пожелаете да участвате</h2> <p>Прекрасно! Предварително благодаря за което. Изследването се намира тук:</p> <p><a href="http://research.hiliev.eu/jshpcstudy/">http://research.hiliev.eu/jshpcstudy/</a></p> <p>Смятам, че инструкциите там са достатъчно подробни, но, все пак, ето описание, стъпка по стъпка, какво е необходимо да направите.</p> <p>Тъй като моделът за сигурност на JavaScript не му позволява да има достъп до ключови параметри на компютъра, на който се изпълнява браузърът, а също така с цел тестване на способностите на самото &ldquo;желязо&rdquo;, е необходимо първо да свалите от страницата на изследването нативен клиент за операционната система, с която работи вашия компютър. За момента такъв е наличен само за Windows, така че инструкциите по-долу са валидни за нея ОС. Нативният клиент се разпространява като ZIP архив за максимална преносимост и няма нужда от инсталиране, т.е. може да се използва и от потребители, които нямат администраторски права. Необходимо е единствено да разархивирате сваления файл и да стартирате <code>HPCGUI.exe</code>. Ако получите съобщение за грешка при стартиране или по време на изпълнение на <code>HPCGUI</code>, моля погледнете секцията <a href="#известни-проблеми-и-разрешенията-им">Известни проблеми и разрешенията им</a> за евентуално налично решение.</p> <p><img src="/images/147.png" alt="Главен прозорец на нативния клиент" title="Главен прозорец на нативния клиент"></p> <p>Работата с програмата е изключително елементарна: необходимо е просто да натиснете <em>Run simulation(s)</em>. Клиентът ще изтегли автоматично последната версия на пакета от тестове и що го стартира:</p> <p><img src="/images/148.png" alt="Работеща симулация" title="Работеща симулация"></p> <p>Когато тестът приключи, резултатът от него, форматиран като XML, ще се появи в голямото текстово поле. Необходимо е да пренесете това съдържание в полето за регистрация на страницата на изследването. Бутонът <em>Copy output</em> е поставен за удобство – след натискането му, резултатът ще бъде поставен в клипборда на Windows:</p> <p><img src="/images/149.png" alt="Резултатът в нативния клиент" title="Резултатът в нативния клиент"></p> <p>Поставете копираното съдържание в текстовото поле във формата за регистрация на <a href="https://research.hiliev.eu/jshpcstudy/">страницата на изследването</a> и натиснете <em>Submit</em>:</p> <p><img src="/images/150.png" alt="Форма за регистрация в сайта" title="Форма за регистрация в сайта"></p> <p>При успешно изпращане на резултатите, започва същинското изследване:</p> <p><img src="/images/151.png" alt="JavaScript тест в действие" title="JavaScript тест в действие"></p> <p>Тестът може да работи в два режима: единичен и непрекъснат. Единичният режим, който е подразбиращият се в случая, е подходящ за тестване на върховната производителност на даден браузър. Непрекъснатият режим, който се активира при сложена отметка на <em>Continuously</em>, повтаря до безкрайност теста с кратки почивки от по 30 секунди между отделните изпълнения.</p> <p>За целите на експеримента е необходимо или да пуснете многократно единичен тест, или да го оставите да работи известно време в непрекъснат режим. За предпочитане е да направите и двете, като единичният тест е хубаво да бъде пуснат няколко пъти в единствения таб на единствения прозорец на току що стартиран браузър, когато никое друго &ldquo;тежко&rdquo; приложение не използва ресурсите на компютъра. Това ще даде оценка на праговите възможности на JavaScript интерпретатора на вашия браузър.</p> <p>Ядрото на изследването е непрекъснатият режим. Той е предназначен да изследва поведението на JavaScript интерпретатора на вашия браузър, когато даден скрипт се изпълнява непрекъснато на заден фон. Това е и режимът, който най-много ме интересува, тъй като в подобен режим би се изпълнявало едно типично разпределено браузърно приложение. Част от възможните сценарии са:</p> <ul> <li>единствен прозорец с единствен таб, в който работи тестът, но прозорецът не е на преден план, примерно е минимизиран или друго приложение е на преден план;</li> <li>единствен прозорец с няколко таба, като табът с теста не е на преден план;</li> <li>няколко прозореца, като тестът се изпълнява в прозорец, който не е на преден план.</li> </ul> <p>Колкото по-дълго време работи тестът и колкото повече нещата, които правите, докато той върви, се доближават до нормалната употреба на компютъра, толкова по-значим ще бъде приносът ви към изследването. Забележете, че тестът не може по никакъв начин да следи същината на вашата активност, като последната се отразява единствено под формата на различно забавяне в изпълнението на тестовия скрипт. Въпроси като колко точно време прекарвате в (а)социални мрежи и по сайтове за възрастни, както и каква музика и филми пиратствате, изобщо не попадат в кръга на интересите ми. Всъщност, шепата читатели тук са всички до един достатъчно технически грамотни и нямат нужда от подобни обяснения, но година и нещото престой в Германия вече дава някои отражения.</p> <p>Добре би било, ако разполагате с няколко инсталирани браузъра, да пуснете теста във всеки един от тях. След като регистрирате компютъра си с един от браузърите, можете да използвате малката форма в горния край на страницата на изследването, където следва да впишете т.нар. идентификатор на тествания компютър (benchmark ID), който може да получите, натискайки бутона <em>Copy benchmark ID</em> на нативния клиент.</p> <h2 id="въпроси-и-отговори">Въпроси и отговори</h2> <h3 id="какви-тестове-са-включени-в-пакета">Какви тестове са включени в пакета?</h3> <p>Към настоящия момент пакетът включва единствен тест – молекулярна динамика на симулирана система от 1000 атома, които взаимодействат помежду си посредством потенциал на <a href="http://en.wikipedia.org/wiki/Lennard-Jones_potential">Lennard-Jones</a>. Този потенциал в добро приближение описва взаимодействието между атоми на благородни газове като хелий (He), неон (Ne), аргон (Ar) и т.н. Също така потенциалът добре описва взаимодействието между атоми на благородни метали и въглеродни подложки, например при симулиране на процеса на изпарително покриване на въглеродни нанотръби със злато или платина за каталитични цели.</p> <h3 id="защо-резултатите-от-нативния-клиент-се-различават-от-тези-от-теста-в-браузъра">Защо резултатите от нативния клиент се различават от тези от теста в браузъра?</h3> <p>Поведението на системите от повече от две тела е хаотично &ndash; малките разлики в началните условия нарастват експоненциално с еволюцията на системата във времето. Също така, молекулярната динамика е метод за приближено решаване на уравненията на движение, а и компютрите работят с крайна точност на представянето на числата с плаваща запетая. По тази причина точната форма на траекториите и стойностите на различните величини на всяка стъпка нямат особен физичен смисъл, а само техните термодинамични средни стойности. Консултирайте се с произволен курс по термодинамика за по-задълбочено обяснение &ndash; ключовата дума е <em>ергодична теорема</em>.</p> <p>Различната реализация на математическите операции в различните браузъри също може да доведе до разлика в показваните стойности. Докато Firefox, Safari и Internet Explorer дават идентични резултати, то тези от Chrome се различават от останалите. Това е напълно нормално.</p> <h3 id="каква-точно-информация-изпраща-нативният-клиент">Каква точно информация изпраща нативният клиент?</h3> <p>Нативният клиент използва програмата <code>CHKCPU32.exe</code>, включена в разпространявания архив. <a href="http://web.inter.nl.net/hcc/J.Steunebrink/chkcpu.htm">CHKCPU32</a> предоставя следната информация за техническите характеристики на процесора на вашия компютър:</p> <ul> <li>модел и производител;</li> <li>брой процесори, ядра и хардуерни нишки;</li> <li>тактова честота;</li> <li>поддържано множество инструкции;</li> <li>размер на кеш паметта.</li> </ul> <p>На практика нативният клиент изпраща изхода от изпълнението на командата <code>CHKCPU32 /X</code>. Примерен резултат от моя собствен компютър:</p> <div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#75715e">&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; ?&gt;</span> <span style="color:#f92672">&lt;chkcpu32&gt;</span> <span style="color:#f92672">&lt;ident&gt;</span>CPU Identification utility<span style="color:#f92672">&lt;/ident&gt;</span> <span style="color:#f92672">&lt;version&gt;</span>v2.11 final<span style="color:#f92672">&lt;/version&gt;</span> <span style="color:#f92672">&lt;copyright&gt;</span>(c) 1997-2013 Jan Steunebrink<span style="color:#f92672">&lt;/copyright&gt;</span> <span style="color:#f92672">&lt;cpu_vendor&gt;</span>Intel <span style="color:#f92672">&lt;/cpu_vendor&gt;</span> <span style="color:#f92672">&lt;cpu_model&gt;</span>Pentium Dual-Core G600/G800 series Q0-step<span style="color:#f92672">&lt;/cpu_model&gt;</span> <span style="color:#f92672">&lt;cpu_speed&gt;</span>1700<span style="color:#f92672">&lt;/cpu_speed&gt;&lt;speed_unit&gt;</span>MHz<span style="color:#f92672">&lt;/speed_unit&gt;</span> <span style="color:#f92672">&lt;cpu_name&gt;</span>Intel(R) Core(TM) i5-2557M CPU @ 1.70GHz<span style="color:#f92672">&lt;/cpu_name&gt;</span> <span style="color:#f92672">&lt;cpuid_sign&gt;</span>0x0206A7<span style="color:#f92672">&lt;/cpuid_sign&gt;</span> <span style="color:#f92672">&lt;physical_cpus&gt;</span>1<span style="color:#f92672">&lt;/physical_cpus&gt;</span> <span style="color:#f92672">&lt;cores&gt;</span>2<span style="color:#f92672">&lt;/cores&gt;</span> <span style="color:#f92672">&lt;threads&gt;</span>4<span style="color:#f92672">&lt;/threads&gt;</span> <span style="color:#f92672">&lt;htt&gt;</span>0<span style="color:#f92672">&lt;/htt&gt;&lt;xd&gt;</span>1<span style="color:#f92672">&lt;/xd&gt;&lt;_64bit&gt;</span>1<span style="color:#f92672">&lt;/_64bit&gt;&lt;vt&gt;</span>0<span style="color:#f92672">&lt;/vt&gt;</span> <span style="color:#f92672">&lt;mmx&gt;</span>1<span style="color:#f92672">&lt;/mmx&gt;&lt;_3dnow&gt;</span>0<span style="color:#f92672">&lt;/_3dnow&gt;&lt;sse&gt;</span>1<span style="color:#f92672">&lt;/sse&gt;&lt;sse2&gt;</span>1<span style="color:#f92672">&lt;/sse2&gt;&lt;sse3&gt;</span>1<span style="color:#f92672">&lt;/sse3&gt;</span> <span style="color:#f92672">&lt;ssse3&gt;</span>1<span style="color:#f92672">&lt;/ssse3&gt;&lt;sse41&gt;</span>1<span style="color:#f92672">&lt;/sse41&gt;&lt;sse42&gt;</span>1<span style="color:#f92672">&lt;/sse42&gt;&lt;sse4a&gt;</span>0<span style="color:#f92672">&lt;/sse4a&gt;</span> <span style="color:#f92672">&lt;l1&gt;</span>64 KB<span style="color:#f92672">&lt;/l1&gt;</span> <span style="color:#f92672">&lt;l2&gt;</span>256 KB<span style="color:#f92672">&lt;/l2&gt;</span> <span style="color:#f92672">&lt;l3&gt;</span>3072 KB<span style="color:#f92672">&lt;/l3&gt;</span> <span style="color:#f92672">&lt;/chkcpu32&gt;</span> </code></pre></div><p>Тази информация се използва от сървъра, за да предостави на нативния клиент версия на пакета от тестове, която е максимално оптимизирана за конкретното &ldquo;желязо&rdquo;. Никъде в нея не се съдържа лична информация.</p> <h3 id="какво-точно-е-идентификатор-на-тествания-компютър-и-доколко-той-съдържа-лична-информация">Какво точно е &ldquo;идентификатор на тествания компютър&rdquo; и доколко той съдържа лична информация?</h3> <p>Идентификаторът (<strong>benchmark ID</strong>) позволява да бъде отличен един тестов компютър от друг, както и да бъдат свързани резултатите от нативния клиент и браузърните тестове (моделът на сигурност на браузърите не позволява скриптовете да достъпват информация извън т.нар. &ldquo;пясъчник&rdquo;, така че директен обмен между нативния клиент и браузъра е невъзможен). Технически представлява MD5 трансформация на името на компютъра, &ldquo;осолена&rdquo; със серийния номер на системния том. Комбинацията от двете е достатъчно уникална, така че не се очакват колизии по време на изследването. MD5 е еднопосочна трансформация, т.е. практически невъзможно е, дори ако използвам (нелегално) всички ресурси на суперкомпютъра на работа, да възстановя нито името на компютъра ви, нито серийния номер на системния том от идентификатора.</p> <p>На практика вашето участие в изследването е анонимно, освен ако не решите да споделите изрично кой стои зад даден идентификатор.</p> <h3 id="кои-браузъри-и-операционни-системи-се-поддържат">Кои браузъри и операционни системи се поддържат?</h3> <p>Всеки съвременен браузър следва да работи. Тествал съм с Firefox 19+, Chrome и IE 9 на Windows 7. IE 9 е значително по-бавен от останалите браузъри, особено в 64-битов режим, в който е <strong>пъти</strong> по-бавен от иначе бавния 32-битов IE 9. По данни от други хора, IE 10 на Windows 8 се държи много по-добре.</p> <p>За момента се поддържа само Windows, тъй като нативните клиенти за другите системи са още в процес на разработка. По редица причини програмата е тествана само на Windows 7 x64 с инсталирано MS Visual Studio 2010. Напълно е възможно да се появят проблеми на по-ранни или по-късни операционни системи &ndash; ако това се случи, оставете коментар с описание на проблема. Участници с Windows XP, Windows Vista, Windows 8 или сървърна версия на Windows са добре дошли.</p> <h2 id="известни-проблеми-и-разрешенията-им">Известни проблеми и разрешенията им</h2> <h3 id="стартирането-на-hpcguiexe-пропада-с-грешка-за-липсващ-msvcr100dll-или-msvcp100dll">Стартирането на <code>HPCGUI.exe</code> пропада с грешка за липсващ <code>MSVCR100.dll</code> или <code>MSVCP100.dll</code></h3> <p>Необходимо е да свалите и инсталирате (последното изисква администраторски права):</p> <p><a href="http://www.microsoft.com/en-us/download/details.aspx?id=5555">Microsoft Visual C++ 2010 Redistributable Package x86</a></p> <p>Двете динамични библиотеки са включени в архива, но е възможно да имат допълнителни зависимости. Работя за статичното им включване в изпълнимия файл.</p> <h3 id="стартирането-на-симулацията-от-нативния-клиент-пропада-с-грешка">Стартирането на симулацията от нативния клиент пропада с грешка:</h3> <p><code>Execution of command '\some\long\path\simpack_win_opt.exe \other\long\path' failed (error 193)</code></p> <p>Вероятно пътят до папката с нативния клиент е твърде дълъг. Преместете папката на друго място така, че пътят до нея да е по-къс. Това изглежда е ограничение в използваната библиотека от инструменти, което ще се опитам да премахна по-нататък.</p> <h2 id="заключителни-бележки">Заключителни бележки</h2> <p>Изследването е в ранна бета, затова и публикувам текста единствено на български език. Възможно е да има още много грешки в програмите. Възможно е и хостингът ми да не бъде особено доволен, ако това стане твърде популярно. Затова всякакви положителни и отрицателни отзиви и обратна връзка са добре дошли. Ако нещо не работи, както се очаква, или просто искате да изразите възхищението или възмущението си, пишете ми на <em>research маймуна icaci точка info</em>.</p>Последната линейка на София/posts/sofias-last-ambulance.htmlSun, 10 Mar 2013 18:17:02 +0000/posts/sofias-last-ambulance.html<p>Разбрах съвсем случайно за него днес от WDR 3 (нещо като немски еквивалент на радио &ldquo;Христо Ботев&rdquo;), което от известно време непрекъснато върви на уредбата в хола. Тъжно е, че някой би употребил точно прилагателното <em>последната</em>, когато става дума за обществена услуга, чиято мисия е точно предотвратяването на преждевременното настъпване на <em>последния</em> момент в живота на човек. Още по-тъжно е, че това лице на страната ни, в частност на столицата, печели награди от френската културна и телевизионна общественост.</p> <p>И няма как да не ти стане тъжно, когато някой по върховете смята, че проблемите се решават не с реформи, а с нов бранд <em>[sic]</em> и с ново лого на страната, и че 1,4 млн. лв. за това е нормална сума. Само където действителността е отчайващо грозна, и подобни филми, а сега и Google street view, го показват. И никакви рекламни трикове и скъпи картинки не могат да го замажат.</p> <p>Не съм гледал <a href="http://sutorkolonko.de/de/filme/sofias_letzte_ambulanz.html">Sofias letzte Ambulanz</a>, но дори публично достъпните сцени на тресящата се през дупките по улицата линейка са достатъчно потресаващи. (прощавайте за повторението)</p>За щастието/posts/to-happiness.htmlSat, 02 Mar 2013 00:05:37 +0000/posts/to-happiness.html<p>Преди почти месец разузнаването докладва, че <a href="/posts/one-year-in-germany.html">предишното писание</a> е възможно да е предизвикало известен смут сред около 33% от четящите тук (което вероятно прави един или двама души), поради което започнах да списвам някои пояснения. След това ми се струпа работа и малко поотоложих, но след годишния Mitarbeitergeschpräch днес, където отново засегнахме темата за щастието, както професионалното, така и личното, седнах да завърша това писание.</p> <p>Понякога в нещата които правя, и най-вече в тези, които пиша, прозира капка меланхолична тъга, която лесно може да се сбърка с нещастие или с някаква форма на депресия. Но истината е, че не съм нещастен и/или депресиран. Напротив, от известно време насам преоткривам личното щастие &ndash; онова, което идва отвътре. Бях позабравил този факт, но щастието всъщност е вътрешен процес, който обаче изисква известно волево усилие, за да се поддържа. Никой не може да ти даде отвън истинско щастие, ако дълбоко вътре в себе си ти не желаеш наистина да бъдеш щастлив, или дори и да може, това външно щастие е точно толкова трайно, колкото трайно е присъствието в живота ти на породилия го. Човек лесно бърка някои емоционални моменти с истинското щастие и често пада жертва на коварната грешка, допускайки външното щастие да измести вътрешното и така позволява на други да бъдат господари (съзнателни или не) на емоциите му. Още по-трагично е, когато двама души допуснат това един спрямо друг и така се породи самоподхранваща се циклична зависимост. Резултатът е, че ако връзката между двамата се прекъсне по една или друга причина, то остават за дълго две изключително нещастни и объркани човешки същества.</p> <p>Стремежът към вътрешно щастие не бива да се бърка с егоистичното търсене на хедонистично самозадоволство. Напротив, вътрешно щастливият човек е източник на радост както за себе си, така и за тези, с които общува, независимо от дълбочината на общуването и наличието или не в него на чувства. Понякога дори може да се стигне до катализиране на процеси, източници на вътрешно щастие в другите. Двама истински щастливи души не могат да изпаднат в примката на взаимното подхранване и съответно могат да градят на съвсем друго ниво помежду си, свободни от онзи страх, че най-вероятно ще останат нещастни, ако нишката между тях се прекъсне. Да, страхът е много силен свързващ инстинкт от еволюционна гледна точка, но след толкова години на развитие на Homo Sapiens, крайно време е висшата нервна дейност, в това число и онази възвишена неинстинктивна чувственост, да започне да притъпява и контролира поне частично елементарните ни животински инстинкти.</p> <p>А меланхоличната тъга &ndash; тя е моя вечна спътница. Вероятно плод на лекото ми биполярно разстройство, тя ми помага да познавам радостта и щастието. Не бива да се забравя психофизичният закон на Вебер-Фехнер: човек е устроен така, че усеща не абсолютната стойност на външното влияние, а само относителната му промяна. Едно от следствията на това е хедонистичната адаптация<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> &ndash; човек лесно свиква с хубавото и удобното, в резултат на което последното постепенно губи статуса си на нещо специално и се превръща в нещо съвсем обикновено, резултат от промяната на положението на базовото ниво<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Затова по мъничко тъга понякога (като &ldquo;понякога&rdquo; означава &ldquo;не много често&rdquo;, което пък със сигурност не означава &ldquo;всеки ден&rdquo;) е полезна, защото не позволява да бъде подложена на хедонистична адаптация радостта от живота, поради пресищане на допаминовите рецептори в мозъка.</p> <p>И така, щастието се оказа въпрос на личен избор и сега съм щастлив в положението, в което сам се насадих. Щастлив съм и това създава верига на положителна обратна връзка &ndash; нещата, които върша напоследък, ме правят още по-щастлив, което започва да се отразява обратно във всички аспекти на живота ми, включително и в нещата, които върша напоследък. И още, превантивна забележка: идва ми отвътре, така че в Холандия ходя само и единствено на гости на много скъп приятел, а не за да търся специфичните за нея държава източници на щастие <em>(намиг, намиг)</em></p> <section class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1" role="doc-endnote"> <p>Импликацията в случая е възможно да има спекулативен характер <em>(бел. авт.)</em> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2" role="doc-endnote"> <p>Други следствия са съответно измерването на силата на чалга-и-поп шума от радиото в dB и на привидната яркост на звездите в логаритмичната скала на звездните величини <em>(бел. авт.)</em> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </section>Една година в Германия/posts/one-year-in-germany.htmlFri, 01 Feb 2013 21:24:48 +0000/posts/one-year-in-germany.html<p>Още помня всеки звук, всяко движение, всяка глътка въздух него ден &ndash; 23-ти януари 2012 г. &ndash; на пръв поглед обикновен, забързан по софийски, зимен понеделник. На пръв поглед обикновен маршрут по булевард Брюксел, почти пуст както обикновено, през входа на Терминал 2, където, както обикновено, цари суматоха от пристигащи и заминаващи, посрещачи и изпращачи, през проверката за сигурност и граничния контрол, до седалките в партера на изхода, от който автобусите извозват пътниците до спрелите някъде там самолети. Най-обикновен маршрут &ndash; бях го изминавал в двете посоки поне пет пъти за предишните няколко години. Но нещо този път беше различно. Защото всяка следваща стъпка ставаше все по-трудна &ndash; краката ми като че се наливаха с олово, а светът наоколо бавно се стапяше и превръщаше в сън. Какво правя? Защо на билета ми до DUS не фигурира обратен полет?! Нима е еднопосочен? Еднопосочен?! Къде отивам? Каква Германия?! Та аз дори не знам езика и едва преживях три дена в Nürnberg по-рано! Къде ще живея? Та аз една видеокасета не мога да наема, какво остава за жилище в друга държава&hellip; Защо си го причинявам? Защо ни го причинявам? Защо им го причинявам? &hellip;</p> <hr> <p>Всяко начало е трудно. Още по-трудно е, когато наивно си въобразяваш, че всъщност не е никакво начало, а само временно отклонение от пътя, след което отклонение всичко ще се върне и ще си бъде както преди. Реалността, обаче &ndash; онова, което се случва, докато кроим съвсем други планове, &ndash; доста бързо се включва с надлежна демонстрация, че всичко това са по детски наивни бленувания, че времето и разстоянието променят безмилостно всичко и всеки, и че независимо колко се бориш, идва момент, когато отклонението никога повече не може да се върне при предишния път. Не защото се е отдалечило твърде много от него, а защото предишният път внезапно се е стопил и отклонението вече не е никакво отклонение, а новият път, по който следва да продължиш нататък. Отново сам&hellip;</p> <hr> <p>Сърдечно благодаря на колегите ми от RWTH, които ме приеха като един от тях, въпреки че не говорех езика им, дарявайки ми с онзи приятелски комфорт, който превръща всяка работа в удоволствие, разбивайки пътьом стереотипа за студените безчувствени германци. Благодаря и на онези мои близки и приятели, които бяха неотменно до мен, макар и само виртуално, и които ме насърчаваха и безукорно подкрепяха в неизмеримо трудните моменти, в които губех почвата под краката си. Безкрайни благодарности на <em>той-си-знае-кой</em> и <em>тя-си-знае-коя</em>, които, в телефонните си обаждания в тях моменти, ми припомняха, колко по-безизходни ситуации може да има и колко безсмислени са поради това терзанията ми &ndash; не знам какво щях да правя без вас.</p> <p>Да, измина една година. Това е само началото.</p>Интервал/posts/interval.htmlThu, 04 Oct 2012 23:05:03 +0000/posts/interval.html<p>Отново на 20. Преди време открих, че на всеки две години мога да ставам на 20, стига да избера подходящата бройна система. Просто ей така, от разсеяност забравям да добавя скобките с числото на основата и отново съм млад, безгрижен и необременен с рутината и необходимостите на живота като редови член на обществото. Но днешното 20 е специално, защото бройната система този път е шестнадесетична. И защото 0x20, освен че е 2<sup>5</sup> (а днес е 5-ти и 10 в двоична бройна система е 2), е и кодът на интервала във всички широко използвани компютърни азбуки, дори в недоразумението, известно като &ldquo;7-битова GSM азбука&rdquo;, с която се борих като прасе с тиква съвсем наскоро.</p> <p>Интервалът, това лишено от графично изображение празно пространство. Интервалът, използван в някои компютърни езици за пълнеж на онези излишни части от стринговете, в които няма записано нищо смислено. Интервалът, ненавиждан от старите транслатори, чиято първа работа е да премахнат всички интервали от реда, защото от тяхна гледна точка последните са излишни. Интервалът, онази празнина във формите и документите там, където се очаква някой да впише нещо, за да внесе смисъл в безсмислието на празното пространство.</p> <p>Но интервалите не са само безсмислени празнини. Те са също така жизнено необходими за нас хората, за да се спрем за миг и да си поемем глътка въздух между думите, между изреченията, между дните и годините на книгата, която наричаме наш живот. Без интервали думите се сливат, стават трудни за разделяне, появяват се дори двусмислия в интерпретацията им и от това комуникацията започва да страда, а страда ли комуникацията, страдаме и ние, които се опитваме да я осъществяваме. Защото какво сме ние, освен мравчици в огромен мравуняк &ndash; слаби в самотата си, но силни в единството, постигано чрез комуникацията.</p> <p>Затова нека новата година от моето летоброене бъде годината на така необходимата глътка въздух, на почивка от лутането в търсене на смисъла, целта, пътя и щастието, на по-малко говорене и повече слушане, на дълбока интроспекция и размисъл, на преосмисляне на миналото и осъзнаване на настоящето. Годината, в която да бъда единствено себе си и за себе си. Просто годината на нищо повече и на нищо по-малко от един обикновен интервал &ndash; интервал във времето и интервал в пространството.</p> <p>Годината на моя интервал.</p>!dead/posts/not-dead.htmlTue, 14 Aug 2012 20:40:12 +0000/posts/not-dead.html<p>icaci.info из нот дед! Само, подобно на автора си, е застинал дълбоко в безвремието на философското осъзнаване на целта и смисъла на Промяната. Промяната, която никога не е лека и която често боли, вътре и вън от нас. Промяната, която руши установеното с много труд и любов, поради което се страхуваме от нея, отпъждаме я и се пазим, заключвайки се зад дебелите плътно непроницаеми стени на страха от нея. Липсата на Промяна е удобна, сигурна. Но какъв би бил смисълът без Промяна?</p> <blockquote> <p>Immer vorwärts, Schritt um Schritt,<br> es geht kein Weg zurück.</p> </blockquote> <p>Промяна. Скоро.</p>Лекция на OpenFest 2011/posts/openfest-2011-lecture.htmlSun, 30 Oct 2011 19:24:38 +0000/posts/openfest-2011-lecture.html<p>След минутката телевизионна слава в предаването на БНТ &ldquo;Красива наука&rdquo;, вече практически нищо не ме спира да говоря пред публика от непознати хора. Затова и най-после се преборих с предразсъдъците си и реших да се включа с лекция в тазгодишното издание на <a href="http://openfest.org/archive/openfest-2011/program/">OpenFest</a>. Под заглавието &ldquo;Направи си сам суперкомпютър&rdquo; се крие доста амбициозна цел, но времето от 45 минути едва ли ще позволи да я реализирам изцяло. Все пак, ако проявявате някакъв интерес към мащабната изчислителна техника, то заповядайте идната неделя от 17:15 в зала &ldquo;София&rdquo; на Интерпред.</p> <p>Лекцията преди моята, тази на <a href="http://blog.peio.org/">Пейо Попов</a> за електронните пари, и Bitcoin в частност, също ще си струва да присъствате. Залата е същата, а началото е час по-рано &ndash; в 16:15.</p>Bitcoin - митове и легенди (част 2)/posts/bitcoin-myths-and-legends-part-2.htmlThu, 07 Jul 2011 21:29:54 +0000/posts/bitcoin-myths-and-legends-part-2.html<blockquote> <p><em>Забележка:</em> <br> Математическите формули в този текст са изписани на LaTeX, за визуализация на който се използва <a href="https://www.mathjax.org/">MathJax</a>. Ако вместо формули виждате нещо като <code>\(\Var[nonce] = \frac{1}{p^2}\)</code>, то MathJax не функционира по някаква причина, най-вероятно блокиран от NoScript.</p> </blockquote> <p>В <a href="/posts/bitcoin-myths-and-legends-part-1.html">част 1</a> дадох математическата обосновка на несъстоятелността на редица митове и легенди в света на Bitcoin, породени от субективната невъзможност за правилно възприемане на случайните събития като такива. Сега ще покажа, че процесите всъщност се описват с достатъчно добра точност от теорията и че последната не е само математическо бръщолевене.</p> <h2 id="сравнение-с-експерименталните-наблюдения">Сравнение с експерименталните наблюдения</h2> <p>Разглеждаме следната извадка от публичната статистика на басейна deepbit.net, обхващаща <strong>няколко дена на постоянна трудност</strong> \(D = 1379192\):</p> <table> <thead> <tr> <th>Период</th> <th>Блокове</th> <th>Дялове</th> <th>Средно</th> <th>Късмет</th> </tr> </thead> <tbody> <tr> <td>29.06</td> <td>57</td> <td>80389531</td> <td>1410343</td> <td>+2.3%</td> </tr> <tr> <td>30.06</td> <td>64</td> <td>79751252</td> <td>1246113</td> <td>–9.6%</td> </tr> <tr> <td>01.07</td> <td>62</td> <td>83054752</td> <td>1339593</td> <td>–2.9%</td> </tr> <tr> <td>02.07</td> <td>57</td> <td>85609229</td> <td>1501916</td> <td>+8.9%</td> </tr> <tr> <td>03.07</td> <td>55</td> <td>86255018</td> <td>1568273</td> <td>+13.7%</td> </tr> <tr> <td>04.07</td> <td>65</td> <td>89260819</td> <td>1373243</td> <td>–0.4%</td> </tr> <tr> <td>05.07</td> <td>51</td> <td>98434841</td> <td>1930095</td> <td>+39.9%</td> </tr> <tr> <td><strong>29.06&ndash;06.07</strong></td> <td><strong>411</strong></td> <td><strong>602755442</strong></td> <td><strong>1466558</strong></td> <td><strong>+6.3%</strong></td> </tr> </tbody> </table> <p>Късметът е дефиниран като относителното отклонение на средното за деня от математическото очакване. Отрицателните стойности означават късмет, а положителните &ndash; каръщина. Върху тези данни може да се приложи т.нар. Z-тест:</p> <p>$$Z = \frac{mean - \mathrm{E}[shares]}{\sigma / \sqrt{N}}\,,$$</p> <p>където \(mean\) е средното за деня на броя дялове \(N\), а \(\sigma\) е теоретичното стандартно отклонение на геометричното разпределение. 95% от всички случаи на отклонение от математическото очакване следва да попадат в рамките на \(|Z| \leq 1.96\).</p> <table> <thead> <tr> <th>Период</th> <th>Блокове</th> <th>СОСС<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></th> <th>Късмет</th> <th>Z-мярка</th> </tr> </thead> <tbody> <tr> <td>29.06</td> <td>57</td> <td>13.2%</td> <td>+2.3%</td> <td>0.171</td> </tr> <tr> <td>30.06</td> <td>64</td> <td>12.5%</td> <td>–9.6%</td> <td>–0.772</td> </tr> <tr> <td>01.07</td> <td>62</td> <td>12.7%</td> <td>–2.9%</td> <td>–0.226</td> </tr> <tr> <td>02.07</td> <td>57</td> <td>13.2%</td> <td>+8.9%</td> <td>0.672</td> </tr> <tr> <td>03.07</td> <td>55</td> <td>13.5%</td> <td>+13.7%</td> <td>1.017 (!)</td> </tr> <tr> <td>04.07</td> <td>65</td> <td>12.4%</td> <td>–0.4%</td> <td>–0.035</td> </tr> <tr> <td>05.07</td> <td>51</td> <td>14.0%</td> <td>+39.9%</td> <td>2.853 (!!)</td> </tr> <tr> <td><strong>29.06&ndash;06.07</strong></td> <td><strong>411</strong></td> <td><strong>4.9%</strong></td> <td><strong>+6.3%</strong></td> <td><strong>1.284</strong> (!)</td> </tr> </tbody> </table> <p>С (!) е маркирано попадение в горната част на 95% доверителен интервал (\(1 &lt; |Z| \leq 1.96\)). Средната стойност за 05.07 лежи извън рамките на две стандартни отклонения, но попада в рамките на три стандартни отклонения (\(|Z| \leq 3\)), което вече покрива 99.74% от възможните случаи.</p> <p>Появата на отстоящи далеч от математическото очакване стойности, като например средното за 05.07 е напълно в реда на очакванията, тъй като геометричното разпределение е силно асиметрично, а и централната гранична теорема е приложима за осредняване върху големи извадки. Важно е също така наблюдението, че <strong>едно сериозно отклонение на среднодневния брой дялове от математическото очакване може силно да повлияе на средноседмичната стойност</strong>.</p> <p>Съвпадението между теоретичното геометрично разпределение и експерименталното такова е видимо и на следната графика:</p> <p><img src="/images/139.png" alt="Разпределение на броя дялове"></p> <p>С черно е показана хистограмата на броя блокове като функция на броя дялове за откриването им, а със сините импулси &ndash; хистограма на геометричното разпределение. Съвпадението е повече от добро. Вертикалната пунктирана червена линия показва математическото очакване.</p> <p>В предишната част беше показано, че верояността за срещане на каръшки блок (с повече от средното дялове), последван от два късметлийски блока (с по-малко от средното дялове) е 14.7%, а вероятността за срещане на трите блока в произволен ред е 44.1%. Изброяването на срещането на такъв тип блокове в информацията от deepbit показва, че от общо 409 тройки 58 удовлетворяват шаблона <em>ULL</em>, а 172 тройки удовлетворяват шаблона <em>1U + 2L</em>, което дава експериментални вероятности:</p> <ul> <li>\(p_\textrm{exp}(ULL) = \frac{58}{409} = 14.2\%\) при теоретична стойност 14.7%;</li> <li>\(p_\textrm{exp}(1U + 2L) = \frac{172}{409} = 42.1\%\) при теоретична стойност 44.1%.</li> </ul> <p>Аналогично, шаблонът <em>ULLL</em> се среща 39 пъти от общо 408 четворки блокове, а шаблонът <em>1U + 3L</em> &ndash; 147 пъти, което дава експериментални вероятности:</p> <ul> <li>\(p_\textrm{exp}(ULLL) = \frac{39}{408} = 9.6\%\) при теоретична стойност 9.3%;</li> <li>\(p_\textrm{exp}(1U + 3L) = \frac{147}{408} = 36.0\%\) при теоретична стойност 37.2%.</li> </ul> <p>Вижда се, че експерименталните стойности са доста близки до теоретичните.</p> <p>По-строгата дефиниция на късметлийски (по-малко от 1/3 от математичното очакване брой дялове) и каръшки (повече от 3 пъти математичното очакване брой дялове) блокове понижава теоретичните вероятности до \(p(ULL) = 0.4\%\), \(p(1U + 2L) = 1.2\%\), \(p(ULLL) = 0.11\%\) и \(p(1U + 3L) = 0.45\%\). Броят на извадките е твърде малък за надежно наблюдаване на толкова редки събития, което се потвърждава от факта, че комбинацията <em>ULL</em> не се среща нито веднъж, докато комбинацията <em>1U + 2L</em> се среща само един път. Последното показва колко неправилно е разглеждането на поредицата от блокове само и единствено след срещането на особено каръшки блок.</p> <p>.. В следващата част ще разгледам процеса на информирано прескачане от басейн на басейн и защо басейните правят всичко възможно да му противодействат.</p> <section class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1" role="doc-endnote"> <p>СОСС &ndash; стандартно отклонение на средната стойност <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </section>Bitcoin - митове и легенди (част 1)/posts/bitcoin-myths-and-legends-part-1.htmlSun, 03 Jul 2011 22:34:03 +0000/posts/bitcoin-myths-and-legends-part-1.html<blockquote> <p><em>Забележка:</em> <br> Математическите формули в този текст са изписани на LaTeX, за визуализация на който се използва <a href="https://www.mathjax.org/">MathJax</a>. Ако вместо формули виждате нещо като <code>\(\Var[nonce] = \frac{1}{p^2}\)</code>, то MathJax не функционира по някаква причина, най-вероятно блокиран от NoScript.</p> </blockquote> <p>С нарастващата популярност на <a href="http://www.bitcoin.org/">Bitcoin</a> &ndash; базираната на случайни събития криптовалута, съвсем естествено, започва зараждането на мистицизма по отношение на функционирането на случайния елемент в нея, аналогично на тотото. Което за пореден път доказва факта, че човешкото мислене просто отказва да функционира в термините на случайни събития и е по-склонно да се впусне в дебрите на мистицизма, отколкото да приеме случващите се събития за случайни.</p> <p>Ще се опитам да анализирам някои от най-разпространените заблуди в общността на копачите на битмонети. Тъй като не разбирам от финанси, ще се концентрирам само върху техническите митове и легенди.</p> <h2 id="малко-предварителна-информация">Малко предварителна информация</h2> <p>Блоковете в Bitcoin се &ldquo;изкопават&rdquo; в резултат на криптографски процес, свеждащ се до изчисляване на двоен SHA256 хеш на съдържанието на част от блока, докато стойността на хеша стане по-малка от т.нар. <strong>цел</strong>. Хеширането се прилага върху заглавната част на блока, включваща следните полета:</p> <ul> <li>номер на версията &ndash; за момента фиксирана на <code>0x00000001</code>;</li> <li>хеш на предишния блок &ndash; двоен SHA256 хеш на заглавната част на последно открития блок;</li> <li>корен на <a href="http://en.wikipedia.org/wiki/Hash_tree">дървото на Merkle</a> за транзакциите, съдържащи се в блока;</li> <li>времеви маркер на блока &ndash; стандартен Unix времеви маркер в брой секунди от епохата (00:00:00 UTC на 01.01.1970 г.);</li> <li>компактен вид на целта &ndash; указва трудността, при която е бил генериран блока;</li> <li>т.нар. &ldquo;nonce&rdquo; &ndash; променлива част от заглавието на блока, която започва от 0x00000000 и се увеличава с единица докато стойността на хеша стане по-малка от целта; преносът при препълване се записва в специалната първа транзакция, което променя стойността на корена на дървото на Merkle.</li> </ul> <h2 id="основна-заблуда-блоковете-имат-предварително-определен-размер-има-големи-и-малки-блокове">Основна заблуда: блоковете имат предварително определен размер; има големи и малки блокове</h2> <p>Генерирането на блок в Bitcoin е като игра на рулетка. На всяка стъпка от операцията се генерира 256-битов хеш, който се сравнява с целта. Хеширащата операция е детерминистична, но хаотична &ndash; при един и същи вход винаги се получава един и същи резултатен хеш, но промяна дори на един бит от входа води до получаване на напълно различен резултатен хеш &ndash; полезни и всъщност силно желани свойства на хеш функцията. Ако всички полета в заглавната част на блока са фиксирани, то хеш със стойност по-малка от целта ще се постигне при точно определена най-малка стойност на nonce. Единственото наистина фиксирано поле е това на версията, а всички останали се променят при едни или други условия:</p> <ul> <li>хеш на предишния блок &ndash; променя се тогава, когато някой друг открие нов блок; нямаме контрол върху този процес, тъй като не контролираме изчислителните ресурси на останалите участници в мрежата (случаен процес);</li> <li>корен на дървото на Merkle &ndash; променя се, когато има нова Bitcoin транзакция, която желаем да обработим и включим в съдържанието на блока или всеки път когато полето nonce прехвърли \(2^{32}-1\); бихме могли да ограничим случайната промяна на полето, ако не приемаме нови транзакции (случаен процес);</li> <li>времеви маркер на блока &ndash; променя се на добре известни периоди от време, като Bitcoin допуска до 2 часа отклонение от средното време на мрежата, така че стойността може да се държи фиксирана в известен период от време;</li> <li>компактен вид на целта &ndash; променя се относително рядко &ndash; вендъж на всеки 2016 блока, като точният момент зависи от това кога ще бъде открит 2016-тия блок (случен процес).</li> </ul> <p>Дори и при дадени начални стойности на променящите се полета стойността на печелившия nonce да е фиксирана, случайният характер на промяната на указаните по-горе полета води до това, че текущата печеливша стойност се изменя непрекъснато и по почти случаен начин. Почти случаен е поради свойството на хеш функцията много силно да изменя стойността си при каква да е промяна на входните данни. Това прави много трудно, на практика невъзможно, евристичното познаване на търсената стойност на nonce и единственият практически приложим метод е този на изчерпващото търсене. Промяната на някое от полетата в заглавната част рестартира търсенето обратно от 0.</p> <p>Изводът до момента е: <strong>блоковете биха имали фиксирана отнапред големина, измерена като брой хеширания до откриване на печелившата стойност на nonce, но само ако в мрежата има един единствен участник, което очевидно не е така.</strong></p> <h2 id="втора-основна-заблуда-късметлии-и-каръци">Втора основна заблуда: късметлии и каръци</h2> <p>Ще започна с малко елементарна теория на вероятностите.</p> <p>На всяка стойност на \(nonce\) съответства хеш в интервала \(0 \ldots 2^{256}–1\), като вероятността той да е по-малък от търсената цел \(target\) е:</p> <p>$$ p(hash &lt; target) = \frac{target}{2^{256}}\,. $$</p> <p>Целта \(target\) е функция на трудността \(D\):</p> <p>$$ target = \frac{\mathrm{0xffff} \cdot 2^{208}}{D} $$</p> <p>или</p> <p>$$ p(hash &lt; target) = \frac{\mathrm{0xffff}}{D \cdot 2^{48}} = \frac{2.328271 \times 10^{–10}}{D} $$</p> <p>(за простота нататък ще пиша само \(p\))</p> <p>Тъй като стойностите на хеша за съседни стойности на \(nonce\) се отличават силно, то отделните събития &ldquo;хешът с дадена стойност на \(nonce\) е по-малък от \(target\)&rdquo; са на практика независими. Тогава вероятността да бъде открита печелившата стойност на \(nonce\) след \(k\) на брой хеширания (т.е. \(nonce\) да бъде равен на \(k-1\)) е:</p> <p>$$ p(nonce = k-1) = (1 - p)^{k-1} p\,. $$</p> <p>За случайните величини с подобно поведение казваме, че следват <strong>геометрично разпределение</strong> с параметър \(p\). За това рапределение е известно, че математическото очакване, т.е. средната стойност от безброй много опити, е:</p> <p>$$ \newcommand{\E}{\mathrm{E}} \E[nonce] = \frac{1}{p} - 1 = D \cdot 4295032833 - 1 \approx D \cdot 4295032833\,. $$</p> <p>На практика обаче не можем да осредним безкраен брой опити, тъй като сме ограничени от крайното време, с което разполагаме, или в рамките на което правим наблюденията. Степента на отклонение на отделните измервания от средната стойност се нарича <strong>вариация</strong> на разпределението и за геометричното разпределение тя е:</p> <p>$$ \newcommand{\Var}{\mathrm{Var}} \Var[nonce] = \frac{1 - p}{p^2} \approx \frac{1}{p^2} = D^2 \cdot 1.844731 \times 10^{19}\,. $$</p> <p>Вариацията на геометричното разпределение е обратнопропорционална на вероятността за успех и в конкретния случай нараства с квадрата на трудността. Осредняването върху броя хеширания за откриване на \(N\) (краен брой) блока дава средна стойност, която принципно се отличава от теоретичната, като нейната вариация е:</p> <p>$$ \Var[mean] = \frac{1}{N} \Var[nonce] = \frac{D^2}{N} \cdot 1.844731 \times 10^{19}\,. $$</p> <p>Средноквадратичното (стандартно) отклонение е квадратен корен от вариацията и тогава относителното средноквадратично отклонение на средната стойност на големините на \(N\) блока при трудност \(D\) е:</p> <p>$$ \sigma(N) = \frac{\sqrt{\Var[mean]}}{\E[nonce]} = \frac{N^{-1/2}\frac{1}{p}}{\frac{1}{p}-1} \approx \frac{1}{\sqrt{N}}\,. $$</p> <p>Важният извод от това е, че при един и същ брой блокове \(N\), върху които осредняваме, отклонението от средната стойност е толкова по-голямо, колкото по-голяма е стойността на трудността \(D\), но <strong>относителното отклонение зависи единствено от броя на блоковете, върху които се извършва осредняването.</strong> По централната гранична теорема самата средна стойност има разпределение, клонящо към нормално, центрирано в математическото очакване \(\E[nonce]\), т.е. в дългосрочен план всички късметлийски периоди, в които средният брой хеширания е по-малък от математическото очакване, точно се компенсират от каръшки периоди, в които средният брой хеширания е по-голям от математическото очакване.</p> <p>Голяма част от копачите групират усилията си в басейни (mining pools). Басейните работят като раздават дялове &ndash; блокове с най-ниската възможна трудност \(D^1 = 1\). Когато клиентът реши и върне на басейна такъв блок (дял), вероятността той да удовлетворява по-строгия критерий на текущата трудност е:</p> <p>$$ p(\text{share wins}) = \frac{D^1}{D} = \frac{1}{D} $$</p> <p>Т.е. броят на върнатите дялове до решаване на блока е също геометрично разпределена велична с параметър \(p = \frac{1}{D}\), като всичко написано за броя хеширания по-горе се пренася директно върху броя на дяловете за блок. Теоретичната средна стойност и вариацията на броя дялове до решаване на блок е равна на текущата трудност:</p> <p>$$ \E[shares] = \frac{1}{p(\text{share wins})} = D $$ $$ \Var(shares) = D^2 - D \approx D^2\,(\text{за големи } D)\,. $$</p> <p>Средната стойност е функция само на текущата трудност \(D\) и не зависи от броя на участниците в басейна &ndash; <strong>големите басейни имат същото разпределение и вариация на броя дялове до решаване на блок, каквото имат и малките басейни.</strong> Този факт следва да се помни, тъй като ще потрябва в разсъжденията по-нататък.</p> <p>Традиционно в копаческите Bitcoin общности се обръща специално внимание на броя дялове до решаване на блок (всичко по-надолу дословно важи и за \(nonce\)) в следните времеви интервали:</p> <ul> <li>интервал на една и съща трудност &ndash; \(N = 2016\) и относителното стандартно отклонение на средната стойност от теоретичното средно е ±2.2%;</li> <li>интервал на една и съща трудност в рамките на един голям басейн (1/3 от общата изчислителна мощност) &ndash; \(N \approx 672\) и относителното стандартно отклонение на средната стойност от теоретичното средно е ±3.9%;</li> <li>един ден &ndash; \(N \approx 144\) (средно по 2 седмици за 2016 блока) и относителното стандартно отклонение на средната стойност от теоретичното средно е ±8.3%;</li> <li>един ден в рамките на голям миньорски басейн &ndash; \(N \approx 48\) (1/3 от общата изчислителна мощност на мрежата) и относителното стандартно отклонение на средната стойност от теоретичното средно е ±14.4%;</li> <li>няколко поредни блока &ndash; \(N &lt; 4\) и относителното стандартно отклонение на средната стойност от теоретичното средно <strong>надвишава ±50%</strong>.</li> </ul> <p>Много важна особеност на геометричното разпределение е неговата силна асиметрия спрямо средната стойност. Стойностите на броя дялове и на \(nonce\) са ограничени отдолу (1 за дяловете и 0 за \(nonce\)), но не са ограничени отгоре, т.е. съществува, макар и клоняща към нула, вероятност печеливш хеш да не бъде открит дори след многократно надвишаващи средния брой хеширания. От друга страна, вероятността намалява монотонно с увеличаване на \(nonce\) и (парадоксално) е най-голяма при \(nonce\) = 0, т.е. по-вероятно е да се открие печеливш хеш още от първия опит, отколкото след <strong>точно</strong> хиляда поредни опита! Ако се постави условието обаче печеливш хеш да бъде намерен за не повече от \(N\) опита, то тогава говорим за монотонно растящата кумулативната функция на разпределение (CDF). <strong>63% от блоковете се откриват след по-малко от теоретичния среден брой дялове, а останалите 37% след повече от теоретичния среден брой.</strong> И тук именно се корени генезисът на мита за късметлиите и каръците: 2/3 от блоковете се откриват след по-малко от средния брой хеширания, но тези над средното, макар и по-рядко срещани, се откриват след (често) на порядъци по-голям брой хеширания поради силната асиметрия на разпределението. Клопката, в която мнозина попадат, е че след като текущото търсене надвиши определен брой хеширания, блокът се обявява за много &ldquo;голям&rdquo; и се търси нов копачески пул, в който блоковете са &ldquo;малки&rdquo;. Къде е основата на заблудата?</p> <h2 id="след-голям-блок-се-чакат-малки-блокове">След &ldquo;голям&rdquo; блок се чакат “малки&rdquo; блокове</h2> <p>Вероятността блок да бъде решен след пресмятане на по-малко от средния брой дялове (или хеширания) е \(p(Luck) = 63.2\%\). Вероятността да бъдат необходими повече от средния брой дялове е \(p(Unluck) = 1 - p(Luck) = 36.8\%\) (разпределението на късметлийските и каръшки блокове следва отрицателното биномно разпределение, бидейки сума от множество геометрични разпределения). Вероятността да бъде наблюдаван каръшки блок (U), следван от два късметлийски (L), при това точно в този ред, е:</p> <p>$$ p(ULL) = p(U) \cdot p(L) \cdot p(L) = 14.7\%\,. $$</p> <p>Вероятността трите блока да бъдат наблюдавани в произволен ред е:</p> <p>$$ p(1U + 2L) = p(ULL) + p(LUL) + p(LLU) = 44.1\%\,. $$</p> <p>Независимо от реда на случване, общото време за откриване на трите блока е едно и също. Затова е изключително неправилно ограничаването на наблюденията само върху тези случаи, при които е фиксирана наредбата на блоковете. Вероятността да се случи един каръшки и три късметлийски блока е:</p> <ul> <li>в точно тази наредба &ndash; \(p(ULLL) = 9.3\%\);</li> <li>в произволен ред &ndash; \(p(1U + 3L) = 37.2\%\).</li> </ul> <p>Ако се ограничим само в наблюденията на случващото се след появата на каръшкия блок, то не бихме забелязали 1/3 от случаите на късмет.</p> <p>Вероятността намалява силно, ако се засилят дефинициите на късметлийски и каръшки блокове. Нека например за късметлийски да приемем блок, който се решава след по-малко от 1/3 от средния брой дялове (или хеширания). Вероятността за такъв късметлийски блок е \(p(L) = 28.3\%\). Вероятността да бъдат необходими 3 пъти повече от средния брой дялове за решаване на каръшки блок е \(p(U) = 5.0\%\). Вероятността да бъде наблюдавана комбинацията от един каръшки и два късметлийски блока, при това точно в този ред, е:</p> <p>$$ p(ULL) = p(U) \cdot p(L) \cdot p(L) = 0.4\%\,. $$</p> <p>Вероятността трите блока да бъдат наблюдавани в какъвто и да било ред на случване е 1.2%. Изискването да се наблюдава още един късметлийски блок понижава вероятността до \(p(ULLL) = 0.11\%\) и \(p(1U + 3L) = 0.45\%\).</p> <p>Вероятността след каръшки блок да се наблюдава късметлийски по формулата за условната вероятност е:</p> <p>$$ p(L|U) = \frac{p(LU)}{p(U)} = \frac{p(L) \cdot p(U)}{p(U)} = p(L)\,. $$</p> <p>Резултатът е напълно очакван предвид статистическата независимост на случването на късметлийски и каръшки блокове. <strong>Късметлийските блокове се случват с една и съща вероятност независимо от типа на предхождащия блок.</strong> Същото важи и за каръшките блокове.</p> <h2 id="смяна-на-басейна-за-избягване-от-лош-късмет">Смяна на басейна за избягване от &ldquo;лош късмет&rdquo;</h2> <p>Важно е да се разбере следният изключително важен факт: <strong>случването на блок с определен брой дялове по никакъв начин не влияе на разпределението на късмета в следващите блокове.</strong> Също така, откриването на блокове в различните басейни е напълно независимо, поради което можем да приложим разсъжденията от предишната точка директно върху случая на прескачане от басейн на басейн в търсене на късмета, който да компенсира вече случил се каръшки блок.</p> <p>Копаенето в един басейн е също толкова резултатно, колкото и местенето в нов басейн след всеки новооткрит блок. Разликата между различните басейни е само във вариацията:</p> <ul> <li>големите басейни откриват повече блокове за даден период и следователно, осредявайки върху повече блокове, имат <strong>по-малка вариация на средното</strong> за периода, т.е. гарантират един стабилен като осцилация на количество доход в биткойни, ако индивидуалната и сумарната скорости на хеширане остават постоянни в рамките на периода;</li> <li>малките басейни откриват малък брой блокове за даден период от време и следователно имат много по-голяма вариация на средното.</li> </ul> <p>Голямата вариация в малките басейни може да изкуши някой да избяга от басейна след случване на няколко поредни късметлийски блока в голям басейн с малка вариация в очакване на нова късметлийска серия. От всичко написано по-горе вече би трябвало да е ясно, че наблюдаването на няколко поредни късметлийски блока изобщо не променя разпределението на следващите блокове и съответно няма гаранция, че следващият блок няма да се окаже силно каръшки. Възможна е печалба от случайни силно късметлисйки серии, но тяхното предсказване е практически невъзможно и всякакви опити са всъщност чист хазарт.</p> <p>В <a href="/posts/bitcoin-myths-and-legends-part-2.html">част 2</a> ще покажа с числени експерименти съвпадението на теорията със случващото се в Bitcoin системата.</p>Краят на една епоха/posts/the-end-of-an-era.htmlFri, 06 May 2011 20:16:41 +0000/posts/the-end-of-an-era.html<p>Епохалните събития в родината ни обикновено са белязани с разрушения.</p> <p><img src="/images/138.jpg" alt="&ldquo;Металната сграда&rdquo; зад ФМИ" title="&quot;Металната сграда&quot; зад ФМИ"></p> <p>Обитателите на университетския комплекс в Лозенец вероятно разпознават сградата на снимката, превърнала се в своеобразен паметник на безвремието, в което изпадна Алма Матер с настъпването на Новото време. Скелетът на никога недостроената сграда на Центъра по информатика подлежи на демонтаж, който вече започна, както се вижда.</p> <p>Скоро време ветераните във факултета ще се познават по това, че са виждали металното чудовище:</p> <blockquote> <p>Когато бях на твоите години, тук беше металният скелет на една голяма и недостроена сграда&hellip;</p> </blockquote>Наука с Physon (2011)/posts/science-on-physon-2011.htmlSat, 16 Apr 2011 21:35:56 +0000/posts/science-on-physon-2011.html<p>Днес беше второто официално представяне на клъстера ни като част от Деня на отворените врати на Физически факултет на СУ. Решихме да се изхитрим и да минем мързеливо като само обновим числата по слайдовете от <a href="/posts/science-on-physon.html">предишното</a>. Кой да се сети, че дните на отворените врати традиционно се посещават и от ученици&hellip;</p> <p>Трябваше да се импровизира, а лекцията се разтегли до над час, в това число и двете демонстрации, в които електронната ни дъска получи бойното си кръщене.</p> <p>Следва статичната версия на представянето, за който проявява интерес:</p> <p><a href="/files/Science-on-Physon-2011-odd.pdf">Наука с Physon (Ден на отворените врати 2011) (PDF)</a></p> <p>Отново с благодарности към финансиращите организации НФНИ и ЕК.</p>Обратно на линия/posts/its-back-online.htmlMon, 11 Apr 2011 15:46:23 +0000/posts/its-back-online.html<p><a href="http://physon.phys.uni-sofia.bg/">Той</a> изсъхна след наводнението и отново е на линия. Той е по-шумен отвсякога сега, когато се наложи да премахнем издулия се и изгнил паркет и балатума и да го оставим върху мозайката. Той ще бучи на живо в събота, 16 април 2011 г., когато в <a href="http://www.phys.uni-sofia.bg/doors_open_day/">Деня на отворените врати на ФзФ</a> ще бъде представен (за пореден път) от 13:00 в семинар В44.</p> <p>Ако си падате по бучащи компютри, пращящи лазери и плазми, цвърчаща електроника или се чудите как трошат парите на данъкоплатците ония във ФзФ на СУ, то заповядайте в събота и бъдете просветени (или възмутени) :)</p>Лайняната работа/posts/the-shitty-business.htmlWed, 06 Apr 2011 13:17:41 +0000/posts/the-shitty-business.html<p>Че администрирането на ИТ инфраструктура понякога е лайняна работа ми е добре известно отдавна, но никога не съм и подозирал, че изразът може да добие толкова буквално изражение&hellip;</p> <h2 id="кратката-версия">Кратката версия</h2> <p>Клъстерът ни е разглобен и складиран, а стаята, в която се помещава обикновено, смърди на кенеф и изгнил паркет.</p> <h2 id="дългата-версия">Дългата версия</h2> <p>Мивката върна вода от мръсния канал и помещението се наводни. До тук два пъти. Оказа се запушване в мръсния канал на по-долния етаж, където на мястото на мивката е включен <del>циркулационна помпа на водното на охлаждане на специална апаратура</del> водният кръг на охлаждането на дифузионна вакуумпомпа. Когато инсталацията работи през деня, <del>помпата набива вода в канала</del> водата от чешмата минава през кожуха на помпата и се набива в канализацията с налягането на водната инсталация, не може да се отича и се вдига по горните етажи. Първо се наводни стаята с инсталацията и обитателите ѝ запушиха отвора около маркуча за оточната вода с парцали. След това се наводни стаята под клъстерното и обитателите ѝ запушиха тамошната мивка с парцали и епоксидна смола. След това дойде ред на нашата мивка, която преля. Наложи се да я попиват с голи ръце и парцали. Климатиците поработиха доста усърдно за да изсушат стаята, а паркетът ще се маха. Тъкмо стаята изсъхна и днес мивката отново върна и преля. Този път на мен се падна да изгребвам от мивката и да попивам с парцали от пода лайняната вода. Добре, че намерихме първоизточника и го принудихме да изключи апаратурата и помпата, с което предотвратихме нови наводнедния&hellip; за днес.</p> <p>Крайният резултат &ndash; две наводнени стаи и една сериозно овлажнена. Три компютърни лаборатории, които не работят. Една неработеща плазмена установка.</p> <p>Може би някой ще попита какво прави мивка в стая със скъпа компютърна техника? Или защо собствениците на помпата са я включили, след като са имали подозрение, че отходният канал е запушен, понеже от него капе вода, без да проверят наличието на мивки в стаите на горните етажи? Добри въпроси, на които мога да отговоря прозаичо:</p> <blockquote> <p>СУ. ФзФ на СУ.</p> </blockquote>Another job well done!/posts/another-job-well-done.htmlSat, 26 Mar 2011 19:25:34 +0000/posts/another-job-well-done.html<p>Днес е паметен ден за историята на високопроизводителната изчислителна техника в Софийски Университет. 20 дена преди да се навърши една година от началото на последното разширение на клъстера <a href="http://physon.phys.uni-sofia.bg/">physon</a>, следвано от поредица от технически премеждия с електрозахранването и охлаждането, днес процесът официално завърши. След два големи ремонта &ndash; прекарване на нова трифазна инсталация направо от главното табло на сградата и монтаж на втори климатик (огромно таванно прасе на General), нещата като че ли най-накрая си дойдоха на мястото и машината заработи с пълна пара така, както си я представяхме. При пълно натоварване на големия дял на машината, температурата в стаята остава стабилна, а двата UPS-а поддържат температури на батериите си от 25 и 20 градуса съответно, което е с 10 градуса по-ниско от времето, когато клъстерът вървеше на 60% от проектната си мощност.</p> <p>И както казва Bender:</p> <blockquote> <p>Another job well done!</p> </blockquote> <p>Партито се отлага за след няколко седмици, когато е рожденният ден на машината :)</p>Кофите на бъдещето/posts/kofite-na-bdeshcheto.htmlWed, 02 Mar 2011 21:17:08 +0000/posts/kofite-na-bdeshcheto.html<p>500 години напред в бъдещето кофите за боклук работят под Windows XP:</p> <p><img src="/images/135.jpg" alt="Firefly, сезон 1, епизод &ldquo;Trash&rdquo;" title="Firefly, сезон 1, епизод &quot;Trash&quot;"></p>Магнитните топчета/posts/magnitnite-topcheta.htmlFri, 25 Feb 2011 21:43:42 +0000/posts/magnitnite-topcheta.html<p>Днес <a href="http://vasil.ludost.net/">ManiaX</a> си празнува рождения ден. Покрай всички неща му подариха и комплект <strong>магнитни топчета</strong> (216 на брой) и кубче на Рубик от 4-ти порядък. Беше като на ИББ, но по-шумно, а стана и задушно (кога дискриминацията ще победи и всички заведения ще станат за непушачи?). Имаше много хора, може и да е имало познати сред тях&hellip; <strong>Топчетата</strong> обаче бяха <strong>МНОГО ЯКИ!</strong> Някой да иска да ми подари такива? :)</p>PocketBook 301+ с/у Kindle 3/posts/pocketbook-301-vs-kindle-3.htmlSat, 05 Feb 2011 21:39:17 +0000/posts/pocketbook-301-vs-kindle-3.html<p>По стечение на обстоятелствата ми попадна един Kindle 3 WiFi. Както е известно, това е едно от двете 6&rdquo; устройства с екран по технологията Pearl (другото е Sony PRS650). Имах два електронни четеца, статив, DSLR фотоапарат. Остана ми само да запретна ръкави и да започна да ги снимам. Резултатите &ndash; след прекъсването.</p> <p>(ако не ти се чете всичкото, цъкай <a href="#tldr">tl;dr</a>)</p> <p>Следват снимките от сравнението на PocketBook 301+ и Kindle 3. Описанието на всяка една е в заглавието, което излиза при задържане на курсора върху нея.</p> <h2 id="спецификация-на-устройствата">Спецификация на устройствата</h2> <p><strong>PocketBook 301+:</strong></p> <ul> <li>6&rdquo; екран Vizplex, 800x600, 166 ppi, 4 нива на сивото за текст, 16 нива на сивото за картинки, контраст 6:1 (на места го дават с 16 нива на сивото и за текст, но производителят, доста неконсистентно при това, твърди ту 4/16, ту 16/16 &ndash; иди разбери)</li> <li>CPU Samsung S3C2440AL-40 (400 MHz, ARM-9)</li> <li>1000 mAh Li-Pol батерия</li> <li>тегло 174 гр.</li> </ul> <p><strong>Kindle 3:</strong></p> <ul> <li>6&rdquo; екран Pearl, 800x600, 167 ppi, 16 нива на сивото за текст и картинки, контраст 10:1</li> <li>CPU Freescale i.MX353 (532 MHz, ARM-11)</li> <li>1530 mAh Li-Pol батерия</li> <li>тегло 241 гр.</li> </ul> <h2 id="снимките">Снимките</h2> <p><strong>На първо място, двете устройства едно до друго в общ план за сравнение.</strong> Вляво е PocketBook 301+, а вдясно &ndash; Kindle 3.</p> <p><img src="/images/119.jpg" alt="PocketBook 301+ и Kindle 3 под обикновена крушка с нажежаема жичка" title="PocketBook 301+ и Kindle 3 под обикновена крушка с нажежаема жичка"></p> <p><img src="/images/120.jpg" alt="PocketBook 301+ и Kindle 3 под светлината на светкавица" title="PocketBook 301+ и Kindle 3 под светлината на светкавица"></p> <p>(епиграфът на иврит е картинка, така че не гарантирам, че и двете разбират текстове на нея азбука)</p> <p>На мен и двата ми зеленеят без светкавица, но може да е нещо от баланса на бялото в очите ми. На снимката със светкавица екраните изглеждат като под луминисцентно осветление.</p> <p>Както се вижда, и двата четеца имат приблизително еднакви размери, като екранът на Kindle 3 е малко по-високо разположен. PocketBook 301+ няма бутони за разлистване на страниците отстрани, поради което най-удобната за използване поза е в хоризонтално положение с джойстик в горния десен ъгъл (понеже съм десняк). На тези снимки шрифтът на PB301 има кегел 20 pt, но на всички следващи съм го увеличил до 21 pt, уж за да прилича повече на този на Kindle, но сега, когато гледам снимките повторно, май съм сбъркал в преценката&hellip;</p> <p><strong>Снимка отблизо.</strong> Отново PocketBook е вляво, а Kindle &ndash; вдясно.</p> <p><img src="/images/121.jpg" alt="PocketBook 301+ и Kindle 3 отблизо под обикновена крушка" title="PocketBook 301+ и Kindle 3 отблизо под обикновена крушка"></p> <p><img src="/images/122.jpg" alt="PocketBook 301+ и Kindle 3 отблизо със светкавица" title="PocketBook 301+ и Kindle 3 отблизо със светкавица"></p> <p>Шрифтът на PocketBook е свободният Gentium Plus, кегел 21 pt. Избран е механизъм за растеризиране на шрифтовете <em>Embolden</em>. На Kindle шрифтът е третият по големина, <em>Typeface - regular</em>. При това положение шрифтът на Kindle е видимо по-плътен. Имам и шрифт Droid Serif на PB, но малко ме примързя да го сложа &ndash; ще го направя през почивните дни. Черното на Kindle е определено по-черно &ndash; не може да се отрече, че технологията в Pearl е поне една идея по-добра тази във Vizplex.</p> <p><strong>Индивидуални “макро” снимки.</strong> Или поне най-макрото, което можах да постигна с наличното оборудване.</p> <p>PocketBook 301+</p> <p><img src="/images/123.jpg" alt="PocketBook 301+ отблизо под обикновена крушка" title="PocketBook 301+ отблизо под обикновена крушка"></p> <p><img src="/images/124.jpg" alt="PocketBook 301+ отблизо със светкавица" title="PocketBook 301+ отблизо със светкавица"></p> <p>Kindle 3</p> <p><img src="/images/125.jpg" alt="Kindle 3 отблизо под обикновена крушка" title="Kindle 3 отблизо под обикновена крушка"></p> <p><img src="/images/126.jpg" alt="Kindle 3 отблизо със светкавица" title="Kindle 3 отблизо със светкавица"></p> <p>Това, което не е очевидно от снимките, е, че PocketBook е целият “облечен” в нещо като гумирана пластмаса, което му пречи да се хлъзга върху гладки повърхности и което на места се е “степало” и лъщи. Снимките отблизо съм ги правил с изправени върху една кутия устройства и беше голям зор с Kindle, понеже се хлъзгаше от долната страна и можеше всеки момент да се свлече на пода.</p> <p>Kindle е несравнимо по-пъргав в отварянето и разлистването на книгите. FBReader на PocketBook работи със страници, не с положения, и при всяко отваряне на книга започва да ги изброява, което му отнема известно време, през което време обаче страниците могат да се прелистват. Промяната на кегела на шрифта или ориентацията на текста причиняват ново преброяване на страниците.</p> <p>Междувременно, в Интернет се били намирали пакети с шрифтовете на Kindle (благодарение на <strong>suren</strong> от форума на HardwareBG), така че сравненията на дневна светлина продължават с уеднаквени шрифтове.</p> <p><strong>Дифузно дневно осветление</strong></p> <p><img src="/images/127.jpg" alt="PocketBook 301+, шрифт Caecilia Cyr LT, кегел 21 pt" title="PocketBook 301+, шрифт Caecilia Cyr LT, кегел 21 pt"></p> <p><img src="/images/128.jpg" alt="Kindle 3, шрифт Caecilia Cyr LT, трети размер" title="Kindle 3, шрифт Caecilia Cyr LT, трети размер"></p> <p><strong>Растеризатор</strong></p> <p>Шрифтът изглежда по различен начин на двете устройства. И тъй като двата екрана имат една и съща плътност на пикселите и една и съща разделителна способност, то разликата явно се корени в настройките за растеризация на TrueType шрифтове.</p> <p>Успях да докарам горе-долу един и същи текст на почти една и съща позиция за по-лесно сравнение:</p> <p><img src="/images/129.jpg" alt="Kindle 3, Regular" title="Kindle 3, Regular"></p> <p><img src="/images/130.jpg" alt="PocketBook 301+, Embolded" title="PocketBook 301+, Embolded"></p> <p><img src="/images/131.jpg" alt="PocketBook 301+, Antialiased" title="PocketBook 301+, Antialiased"></p> <p>100% изрезки на думата &ldquo;light&rdquo;:</p> <p><img src="/images/132.jpg" alt="Kindle 3, Regular" title="Kindle 3, Regular"></p> <p><img src="/images/133.jpg" alt="PocketBook 301+, Embolded" title="PocketBook 301+, Embolded"></p> <p><img src="/images/134.jpg" alt="PocketBook 301+, Antialiased" title="PocketBook 301+, Antialiased"></p> <p>Растеризаторът на PocketBook видимо добавя повече сиви пиксели и излишно влошава контраста. Хубавото е, че платформеното SDK е достъпно и потребителите от MobileRead форумите са направили нови версии на FBReader180, компилирани с по-нова FreeType (2.4), с които обаче ще си поиграя някой друг път.</p> <h2 id="в-резюме">В резюме</h2> <p>Очевидно Pearl е доста по-добра технология от Vizplex по отношение на постигания контраст на електронното мастило. И двата екрана са еднакво матирани и лъщят еднакво на ярко осветление, но черното на Kindle 3 изглежда по-тъмно. Изборът на шрифт и механизмът на неговото растеризиране също са изключително важен фактор за четимостта. Очевидно е, че Amazon са се постарали много в този аспект, докато PocketBook са оставили на потребителите си свободата да настройват всеки отделен елемент. Наличието на SDK и възможността за подобряване или пълна подмяна на основни приложения в украинското устройство също е голям плюс.</p> <h2 id="post-factum">Post factum</h2> <p>Разбира се, след като всички снимки отдавна бяха направени, а постановката &ndash; развалена, се оказва, че Caecilia LT всъщност има и кондензиран вариант, който изглежда малко по-така на PocketBook-а&hellip;</p> <h2 id="tldr">tl;dr</h2> <p>Ако не те влече да програмираш и да настройваш, то взимай Kindle 3 &ndash; хем по-евтин, хем по-контрастен и с по-хубав шрифт, пък и има по-яки картинки :) После сваляй <a href="http://calibre-ebook.com/">calibre</a> и конвертирай на воля.</p>Доктори, доктори.../posts/doktori-doktori.htmlThu, 03 Feb 2011 22:14:06 +0000/posts/doktori-doktori.html<p>Понеже не спират да ме питат едно и също, а и често след това забравят и ме питат отново, смятам, че трябва да внеса известно пояснение по отношение на научните степени и званията в България.</p> <p>На най-ниското стъпало в развитието на един учен са <strong>образователните степени</strong>, които показват нивото, до което той се е изучил. Съгласно закона за висшето образовние, последното има две степени: <em>бакалвър</em> и <em>магистър</em>. Придобиването на всяка от тях става при спазване на определените държавни изисквания по отношение на изучаваните дисциплини и общия брой часове, обикновено след полагане на държавен изпит и/или защита на тезисен труд. Съответно приемът на студенти в бакалавърски или магистърски програми става с конкурсни изпити. Дипломите за бакалавър и магистър се издават от съответното учебно заведение, в което са придобити.</p> <p>След като човек се е изучил достатъчно и е решил, че науката е неговото поприще, той може да започне да придобива <strong>научни степени</strong>, които отразяват личните приноси на лицето в развитието на съответната научна област. Съгласно действащите закони научните степени също са две: <em>доктор</em> и <em>доктор на науките</em>. Степента доктор е първата научна, но в същото време и образователна степен, тъй като в хода на придобиването ѝ се получава и допълнително специализиращо образование. В дипломата за докторска степен е записано, че на лицето се присъжда образователната и научна степен &ldquo;доктор&rdquo; по определена научна специалност от класификатора на научните специалности в страната (в моя случай това е 01.03.19 &ldquo;Физика на атомите и молекулите&rdquo;). В англоезичните страни степента се нарича <em>Philosophiae Doctor</em> или PhD. Придобиването на научна степен доктор позволява на човек да постави пред името си &ldquo;д-р&rdquo; (на български) и &ldquo;Dr&rdquo; (на английски) или след името си &ldquo;PhD&rdquo; (на английски). Научната специалност обикновено не се включва и се казва само &ldquo;доктор&rdquo;, а не &ldquo;доктор по физика на атомите и молекулите&rdquo;. Когато това е необходимо, се добавя шифърът на специалността, напр. &ldquo;доктор по 01.03.19&rdquo;, което се използва за бърза оценка на пригодността на дадено лице да участва в комисия или съвет. Съгласно стария закон (вж. речника в края) за научните степени и звания, степента доктор се придобиваше след защита на дисертационен труд пред специализиран научен съвет на ВАК (Висша Атестационна Комисия) &ndash; орган на Министерски съвет, пряко подчинен на министър-председателя на Р. България. Същата издаваше дипломите за доктор, доктор на науките, доцент, професор и старши научни сътрудници, т.е. дипломата от ВАК за доктор има общодържавен характер и не е обвързана с конкретното висше учебно заведение или институт на БАН, където е придобита (името на последното дори не фигурира в документа).</p> <p>Научната степен доктор не бива да се бърка с професионалната (най-често медицинска) степен доктор. Втората се придобива след защита на професионален докторат при много по-различни условия от тези, необходими за защита на научен докторат. Преди години научната степен доктор се наричаше <em>кандидат на науките</em> и подобно объркване не възникваше. В тях времена аз щях да бъда &ldquo;кандидат на физичните науки&rdquo; или &ldquo;к.фз.н.&rdquo;.</p> <p>Следващата и най-висока научна степен, а именно доктор на науките, се придобива за особени заслуги в развитието на конкретна научна специалност, многократно надхвърлящи по обем и качество работата за придобиване на степента доктор. Степента се изписва с включване на конкретната научна област (сбор от научни специалности), в която е придобита, например &ldquo;доктор на физическите науки&rdquo; и се съкращава като &ldquo;д.фз.н.&rdquo; (за да не се бърка с доктор на философските науки), възможно е и без точки. Самата степен надгражда по-ниската доктор и втората не се изписва, т.е. няма &ldquo;д.фз.н. д-р&rdquo;, освен ако доктор в случая не обозначава професионален докторат (примерно медицински доктор, защитил и научна степен доктор на медицинските науки). В англоезичните страни съществува степен DSc, която обаче в Америка има съвсем различен смисъл, поради което някои доктори на науките предпочитат да използват &ldquo;Dr. habil&rdquo;, означаваща хабилитиран доктор. По стария закон степента се придобиваше след защита пред специализиран научен съвет на ВАК и получаване на държавна диплома от същата комисия.</p> <p>Придобиването на дадена научна степен не показва положението на човек в научната йерархия. Последното става с т.нар. <strong>научни звания</strong> (по смисъла на стария закон):</p> <ul> <li>в университетите: <em>асистент</em>, <em>доцент</em>, <em>професор</em></li> <li>в БАН: <em>научен сътрудник</em>, <em>ст.н.с. II степен</em>, <em>ст.н.с. I степен</em></li> </ul> <p>Званията асистент и научен сътрудник се даваха на лица с висше образование, като новият закон въведе допълнителното изискване за научна степен доктор за главните асистенти. Званията доцент и професор се дават на преподаващи лица с научна степен (или на високи специалисти с висше образование), като ако последната е само доктор се предоставя и хабилитационен труд. Примерен хабилитационен труд е написването на учебник или методично ръководство по дадена дисциплина. Важно изискване е лицето да покрива определена преподавателска натовареност, като при липса на възможност да се осигури такава позиция не се разкрива. Званията (без асистент и научен сътрудник) се даваха от ВАК и се получаваше държавна диплома, фиксираща званието и позволяваща на лицето да бъде доцент/професор едновременно в няколко университета.</p> <p>Званията (или академичните длъжности) се изписват отделно от научните степени. Така човек може да е доцент и доктор или доцент и доктор на науките, като в първия случай това се изписва като &ldquo;доц. д-р&rdquo;, а във втория случай - като &ldquo;доц. д.фз.н.&rdquo;. Към тях могат да се добавят и <strong>академичните звания</strong> (давани в БАН) <em>академик</em> или <em>член-кореспондент</em>, както и професионалното <em>инженер</em>, при което да се образуват неща като &ldquo;акад. проф. д.т.н. инж. Иван Иванов&rdquo;.</p> <h2 id="промени-в-новия-закон">Промени в новия закон</h2> <p>Законът за развитието на академичния състав в Р. България (ЗРАСРБ) замени стария Закон за научните степни и научните звания (ЗНСНЗ) през 2010 г. С него беше прекратено съществуването на ВАК, а задълженията ѝ по присъждане на научни степени и научни звания бяха прехвърлени на университетите и БАН. При това положение новите дипломи се издават от съответните научни учреждения след защита пред комисия, съставена от членове на учреждението и външни такива, което доближава България до англо-американския модел, при който дипломата за PhD от реномиран университет тежи много повече от аналогична диплома от слабоизвестен университет. По силата на стария закон всички кандидати, независмо от университета или института на БАН, където са се подготвяли, защитаваха пред едни и същи специализирани съвети на ВАК и при еднакви условия, при което, съвсем теоретично, кандидат от университета в Долно Нагорнище можеше да не успее да покрие изискванията и да не защити.</p> <p>ЗРАСРБ също така замени термина &ldquo;научно звание&rdquo; с <strong>академична длъжност</strong> и премахна званията (старши) научни сътрудници, приравнявайки ги на университетските съгласно схемата:</p> <ul> <li>научен сътрудник → асистент</li> <li>ст.н.с. II степен → доцент</li> <li>ст.н.с. I степен → професор</li> </ul> <p><em>Главен асистент</em> също влезе в списъка с академични длъжности. Последните се заемат по трудови отношения, т.е. след напускане на професорско място в един университет, може да се наложи на лицето да мине през конкурс за стане професор в друг университет.</p> <h2 id="и-какво-от-това">И какво от това?</h2> <p>В крайна сметка, притежаването на научна степен доктор не означава автоматично обвързаност с академичната йерархия. Както и на запад, степента доктор не гарантира, че лицето ще продължи да гради кариера във висше учебно заведение или друга държавна изследователска институция. Не е задължително всички работещи в университетите или БАН притежатели на научни степени да заемат позиция, свързана с преподавателска дейност (т.е. имат академична длъжност). Също така, част от преподавателите могат изобщо да нямат научна степен или академична длъжност. Има чисто изследователски позиции, например моята &ldquo;физик&rdquo;, която не е свързана с преподавателска дейност, макар да извършвам такава поне един семестър на година в курса по паралелно програмиране, титуляр на който е мой колега.</p> <p>Така че:</p> <ul> <li><strong>не съм длъжен да преподавам;</strong></li> <li><strong>преподавам, защото мога и имам какво да кажа;</strong></li> <li><strong>правилното формално обръщение към мен е &ldquo;д-р Илиев&rdquo;;</strong></li> <li><strong>не държа на включването на степента в неформална среда, поне докато не стана професор;</strong></li> <li><strong>не мога да лекувам болести, в това число язва, артрит, грип, синузит, главоболие, болки в кръста и ставите, венерически болести.</strong></li> </ul> <h2 id="речник-на-някои-изрази-и-термини">Речник на някои изрази и термини</h2> <ul> <li><strong>стария закон</strong><br> Закон за научните степени и научните звания (ЗНСНЗ), действал до средата на 2010 г., отменен от новия закон (ДВ бр.38 от 2010 г.)</li> <li><strong>новия закон</strong><br> Закон за развитието на академичния състав в Р. България (ЗРАСРБ), голяма част от точките в който бяха обявени за противоконституционни от Конституционния съд на Р. България с РКС №11 от 2010 г. и изменени впоследствие (ДВ бр.101 от 2010 г.).</li> <li><strong>хабилитация</strong><br> придобиване на най-висока научна квалификация</li> </ul> <h2 id="отказ-от-отговорност">Отказ от отговорност</h2> <p>Възможно е да не съм представил правилно някои от законовите аспекти &ndash; не съм адвоткат все пак, а част от другите да съм пречупил през собствената си призма. Докато четете това, аз стоя с кръстосани пръсти :)</p> <h2 id="tldr">tl;dr</h2> <blockquote> <p>Доктори, доктори&hellip; Абе, всички са маскари&hellip;</p> </blockquote>Един месец с PocketBook/posts/edin-mesets-s-pocketbook.htmlThu, 11 Nov 2010 22:51:18 +0000/posts/edin-mesets-s-pocketbook.html<p>Ето че измина малко повече от месец, откак в колекцията ми от (не-)нужни електронни джаджи се нареди и <a href="/posts/pocketbook.html">PocketBook 301+</a>. Идеята е по-долу да опиша опита от едномесечното му използване, но неминуемо ще се получи някакъв хибрид между описание и ревю.</p> <h2 id="програмно-осигуряване">Програмно осигуряване</h2> <p>Програмното осигуряване на самия PocketBook 301+ е почти безупречно, като изключим някои <a href="#забележки">забележки</a>. Съпътстващо компютърно програмно обезпечение на практика не е необходимо, тъй като взаимодействието с устройството става през USB Mass Storage интерфейс (за достъп до вътрешната памет) или посредством четец за SD карти и се свежда до просто копиране на файлове. Поддържат се толкова много <a href="#файлови-формати">файлови формати</a>, че необходимост от конвертиращи програми няма. Разбира се, хората с големи библиотеки от електронно съдържание биха могли да се възползват от някаква каталогизираща програма, като например <a href="http://calibre-ebook.com/">calibre</a>. Моят опит с calibre под OS X обаче беше направо плачевен, в контраст на доброто старо ръчно копиране, което работи безотказно.</p> <p>Съществува и една програма, PocketNews, достъпна от страниците на производителя, която може да преобразува RSS потоци във FB2 книга за четене върху PocketBook (да не се забравя, че PB301 няма мрежова свързаност). Освен че е грозна (на външен вид), програмата е само за Windows, поради което не намери абсолютно никакво приложение в живота ми.</p> <p>На два пъти имах щастието да мина и през процедурата по обновяване на фърмуера &ndash; първо от 14.2 до 15.2, след което отново до 15.2, но от друга дата (минус за производителя е липсата на допълнителна диференциация във версиите на фърмуера; от друга страна поне слагат датата на пакетиране в името на архива за разлика от Pentax&hellip;). Проблеми, за щастие, не се появиха. Любопитна особеност е, че обновяването се прави от файл, записан на SD картата или във вътрешната памет на устройството, но не започва, ако то не е свързано с външен източник на захранване, дори батерията да е заредена напълно. Самото обновяване отнема не повече от минута-две. Ефектът като цяло беше, че се появиха потребителски профили за настройките (които не ми трябват, тъй като, поне за момента, само аз използвам е-четеца) и варианти на режима на опресняване на екрана (по-подробно &ndash; в следвата секция).</p> <h2 id="екран-с-електронно-мастило">Екран с електронно мастило</h2> <p>Освен че са бавни, основен недостатък на екраните с електронно мастило е, че при частично обновяване на екрана, част от предишното изображение може да остане видима под формата на блед &ldquo;призрак&rdquo;, било то като тъмни области по белите места или като светли области по тъмните места на новата страница. По тази причина смяната на страниците се предхожда от цялостно почерняне и последващо избелване на екрана (процес, който нататък ще наричам за по-кратко само <em>избелване</em>). Екранът на PocketBook 301+ се обновява с доста малко тъмни призрачни остатъци, поради което в новите версии на фърмуера има опция избелването да се прави само през определен брой страници &ndash; 3, 5, 10 или изобщо да не се прави. При добро осветление няма проблем да се избелва и през 10 страници &ndash; така хем страниците се &ldquo;прелистват&rdquo; по-бързо, хем екранът консумира по-малко електрическа енергия. Контрастът на буквите обаче постепенно се влошава до следващото избелване, поради появата на светли точки в тях, дори при избор на получер шрифт. Поради това оставих включена опцията да се избелва преди всяка нова страница.</p> <p>Тук е моментът да вметна, че въпреки приличните шрифтове, с които идва PocketBook, съществува възможност за добавяне на допълнителни такива. По съвет на няколко потребители от форума <a href="http://www.mobileread.com/">MobileRead</a>, добавих шрифтовете Droid от комплекта свободни шрифтове в Android (достъпни в хранилището на Android <a href="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=data/fonts;hb=HEAD">тук</a>). Мога да кажа, че Droid Serif изглежда много по-приятно от подразбиращия се безсерифен шрифт на PocketBook.</p> <p>Освен вида на шрифта, може да се избира и начинът за неговото растеризиране. Опциите са: както е, с изглаждане и получер. Втората опция работи добре за безсерифни шрифтове, но аз предпочитам да чета получер серифен шрифт, което придава усещане за книга, печатана с особено внимание, отделено на типографията &ndash; нещо, което почти не се наблюдава в масово печатаните в момента български книги. Може да се променя и отстъпа на текста от краищата на екрана, а също така и междуредовото разстояние.</p> <h2 id="осветлението-е-всичко">Осветлението е всичко</h2> <p>Тъй като екраните с електронно мастило работят на принципа на отражението, то външното осветление е съществен елемент за качеството на показваното изображение. На дневна светлина e-Ink екранът на PocketBook изглежда светло сив, прилично на стар вестник. Такъв остава и на луминисцентно осветление. На светлината от крушка с нажежаема жичка обаче, особено при слаб интензитет, се появява слаб зеленикав оттенък, като четимостта на текста намалява малко. Подозирам, че последното е свързано по-скоро с особеностите на моето зрение, тъй като се проявява и при четене на книги, отпечатани върху некачествена хартия (вас гледам, Б**Д). Четенето вечер е възможно на дифузната светлина на насочена към стената нощна лампа с нажежаема жичка, но все повече се замислям за бяла светодиодна лампичка за четене (от типа на онези с щипка за закрепване върху твърди корици).</p> <p>Въпреки, че покритието на екрана е матово, много ярките светлинни източници все пак дават някакви отражения. Това съвсем не пречи да се чете на пряка светлина, като просто устройството се наклони леко на една страна, колкото да изчезне образът на източника на светлина, бил той слънцето или някоя ярка крушка.</p> <h2 id="файлови-формати">Файлови формати</h2> <p>PocketBook е кралят на неспецифичните формати за електронно съдържание. Ще започна с ePub. Въпреки, че ePub е нещо като есперантото сред форматите за електронни книги, това не е оптималният формат за PocketBook. Устройството разполага с две приложения, които визуализират ePub &ndash; <code>fbreader</code> и <code>AdobeViewer</code> (реализация под лиценз на Adobe Digital Editions). <code>fbreader</code> не се справя добре с CSS стиловете в ePub книгите, докато <code>AdobeViewer</code>, макар и да може да изобразява защитени с DRM книги, не може да показва кирилица и диакретични знаци.</p> <p>И доколкото ePub файловете все пак стават за четене, то истинският формат за PocketBook е любимият във всички рускоговорящи страни (пък и у нас) FB2, както и архивираният вариант FB2.ZIP. Удобното за този формат е, че се поддържа автоматично сричкопренасяне, дори за български текстове, което прави запълването на редовете много по-приятно.</p> <h3 id="забележки">Забележки</h3> <p>Има обаче един дразнещ елемент в реализацията на бележките под линия във FB2. В ePub бележките са подредени една след друга в края на всяка глава, а вътре в текста има номерирани препратки<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Когато на една страница има множество<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> бележки<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, то обикновено е достатъчно да се проследи само първата от тях, след което да се прочете и текста на останалите, без да е необходимо връщане и ново проследяване на следващата препратка. Не така обаче стои въпросът при FB2, където бележките са обособени в структурата на самия файл, при което се показва само текстът на избраната бележка. Достигането до бележката и връщането обратно е тежък процес: първо се натиска &ldquo;Надолу&rdquo;, с което се активира режимът за проследяване на препратки и автоматично се маркира първата от тях; ако е необходимо, с последователно натискане на &ldquo;Надолу&rdquo; се избира желаната препратка; с &ldquo;ОК&rdquo; се проследява препратката до текста на бележката; с натискане на &ldquo;Надолу&rdquo; отново се преминава в режим на проследяване на препратки, което автоматично избира новопоявилата се стрелка за връщане назад; натиска се &ldquo;ОК&rdquo;. Прочитането на страница с 5 бележки означава допълнително 15 натискания на &ldquo;Надолу&rdquo; и 10 натискания на &ldquo;ОК&rdquo;. Тежко и горко на четящите Умберто Еко :)</p> <p>Поддръжа се и DjVu, което е направо безценно поради изобилието на сканирана научна литература, която в наши дни се намира много трудно като хартиени издания. Например 10-те тома на курса по теоретична физика на Ландау и Лифшиц изглеждат на PocketBook досущ като печатните оригинали. Форматът поддържа текстов слой, даващ възможности за търсене, както и вътрешни препратки, но все още не съм имал възможността да изпробвам тази функционалност поради липса на файлове с подобна организация на съдържанието.</p> <p>PDF файловете се четат без проблеми, като при тях най-съществена е възможността да се игнорира положението и големината на текстовите елементи и текстът да запълни цялата страница &ndash; т.нар. Reflow режим. Не е подходящ за богати на графични елементи документи (напр. ръководството на потребителя на Pentax K-x), но върши работа за статии и книги с много тесни колони текст и широки полета.</p> <h2 id="издръжливост-на-батерията">Издръжливост на батерията</h2> <p>Времето за автономна работа е това, което силно отличава четците с електронно мастило от останалите видове устройства с матрични екрани, били те LCD (с LED или CFL подсветка), LED или OLED. След първоначалното 12-часово зареждане на батерията (с твърде спорен кондициониращ ефект), допълнителни зареждания от по 2-3 минути съм правил само по време на обновяване на фърмуера. След като изчетох над 1500 страници и си играх многократно с менютата за настройка, индикаторът на заряда на батерията е по средата. Екстраполацията на пръсти показва, че ако само се чете, то капацитетът стига за поне 4000 страници (а производителят обещава 8000). За справка: &ldquo;Името на розата&rdquo; е 856 страници при най-удобния за мен размер на буквите.</p> <h2 id="удобство-при-използване">Удобство при използване</h2> <p>Удобството е силно субективно усещано качество. Мога да кажа, че PocketBook 301+ е достатъчно удобен, поне за мен. Има трески за дялане &ndash; все пак, това е един от първите модели на производителя му. Може да се ползва както със, така и без предпазен калъф. Корпусът е пластмасов, със солидна изработка и нещо като гумирано покритие. Изглежда удобно, че не се хлъзга, но на мен ми е някак странно на пипане &ndash; като топче от мишка е (помните ли времената, когато мишките не бяха оптични?). Затова не вадя четеца от предпазния калъф, което, освен всичко друго, придава и усещането, че държа тефтер с кожена подвързия. В различните окомплектовки има различни типове калъфи, като моят е с нещо като кожен джоб с изрязано лице. Малко грозно е ушит, но пък е функционален и с магнитно затваряне. Предната корица може да се прилепи за задната (с вградените магнитчета) и се получава достатъчно твърда основа с удобна за хващане ширина.</p> <p>Навигацията се осъществява с джойстик, подобен на Navi клавиша в повечето модели Nokia. Функцията на всеки един от контактите на джойстика, както и на бутоните отстрани на корпуса, може да се променя в настройките на устройството, което позволява на всеки да го направи максимално удобно за себе си. Наличието на потребителски профили във версия 15.x на фърумера пък позволява избягване на ситуации от вида &ldquo;Ама защо си ми разбърникал настройките!!&rdquo;. Джойстикът за навигация отнася доста щракания, особено ако в текста има множество препратки, както вече споменах. Конструкцията му изглежда достатъчно стабилна и за момента не очаквам да се счупи в скоро време.</p> <h2 id="заключение">Заключение</h2> <p>В заключение мога да кажа, че въпреки че PocketBook 301+ няма дизайна на четците на Sony, нито безжичните мрежови възможности на Kindle и Nook, то той лека полека се превръща в неизбежен инструмент от ежедневието ми.</p> <p>Както е типично за повечето ми покупки на изчислителна техника до момента, цената на PB301 падна значително, дни след като го взех. Все пак не съжалявам за вложените средства и смятам, че това е един от най-добрите подаръци, които съм си правил в чест на годишнина от появата ми този свят.</p> <section class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1" role="doc-endnote"> <p>Нещо такова. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2" role="doc-endnote"> <p>И такова. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:3" role="doc-endnote"> <p>Ето ни в края. <a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </section>Петък вечер/posts/friday-evening.htmlFri, 29 Oct 2010 20:56:39 +0000/posts/friday-evening.html<p>Дяволът намира работа за geek-овете, които си нямат друга такава:</p> <pre><code>Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE Many salts: 229334K c/s real, 229587K c/s virtual Only one salt: 196838K c/s real, 196838K c/s virtual Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE Many salts: 7469K c/s real, 7469K c/s virtual Only one salt: 7261K c/s real, 7261K c/s virtual Benchmarking: FreeBSD MD5 [32/64 X2]... DONE Raw: 1032K c/s real, 1032K c/s virtual Benchmarking: OpenBSD Blowfish (x32) [32/64 X2]... DONE Raw: 62009 c/s real, 62016 c/s virtual Benchmarking: Kerberos AFS DES [48/64 4K]... DONE Short: 34259K c/s real, 34259K c/s virtual Long: 107373K c/s real, 107373K c/s virtual Benchmarking: LM DES [128/128 BS SSE2-16]... DONE Raw: 1162647K c/s real, 1162649K c/s virtual </code></pre>ДжобнаКнига/posts/pocketbook.htmlSat, 16 Oct 2010 22:19:45 +0000/posts/pocketbook.html<p>Той е дебел само 8.5 мм и тежи едва 174 грама. Има 6&rdquo; Vizplex екран с контраст на стар вестник от рециклирана хартия. С гъстота от 166 dpi и цели 16 нива на сивото буквите изглеждат като напечатани върху него. Литиево-полимерната му батерия обещава безпроблемно прелистване на няколко хиляди страници, при което той не се превръща в безформена дрипа. Ако буквите му ви се струват малки, просто натискате бутона <strong>+</strong>. Ако не ви харесва нечетливият едър шрифт в стил и.к. Б*РД (чиито книги биха станали двойно по-тънки и дори биха ставали за четене, ако заложат на типогрфията, а не на количеството страници), просто качвате нов в <code>/system/fonts</code> и го избирате от настройките. Той поддържа PDF (с Reflow), ePub, DjVu, FB2, CHM и някои други, които дори не знам къде се ползват. И не, той няма лъщящо сензорно стъкло, разположено над E-Ink пакета, нито WiFi, нито СинЗъб, нито пряка 3G връзка към Amazon или Barnes &amp; Noble. Той има просто слот за SD карти с обем до 32 GB. И не изисква iTunes-подобна програма &ndash; просто записвате файловете на картата или във вътрешната памет през mini-USB порта. Той е идеален за четене в тоалетната на поредната купчина научни статии в PDF или на &ldquo;онази безобразно напечатана книга, дето не става за четене, но пък в читанката я има на ePub&rdquo;. Той разбира и от DjVu, така че &ldquo;ония дискове от Колхоза&rdquo; могат да влязат в употреба и човек да се поизучи малко, па макар и не особено законно (но пък законно ли е, че държавата задушава най-реномираните си университети, след което главният пожарникар, пардон, министър-председателят, ги <a href="http://www.struma.com/obshtestvo/premierut-b-borisov-otkri-evropeiskiya-politehnicheski-institut-v-pernik_12373/">упреква, че чакали на бюджета</a>). Слушат ви се аудио-книги? Няма проблем &ndash; той просвирва и MP3.</p> <p>А като ви писне да четете, може да да поиграете шах, или судоку, макар управлението с джойстика да е малко терсене. Ако знаете някоя друга игра и ви влече писането на програми под Linux, то той си има и SDK.</p> <p>Дразни ви темата? Няма проблем &ndash; редактирате един няколкостотинредов файл, слагате свои картинки, компилирате темата с достъпната от сайта програма и той изглежда точно така, както вие го искате.</p> <p>Той се произвежда в Китай (но и iPad се произвежда там, мм?), а се програмира в Украйна. Затова няма проблеми с кирилицата в нито един от поддържаните формати. И с китайските йероглифи няма, стига да си качите допълнителните шрифтове. А наличието на Adobe Reader му позвлява да чете дори книги с DRM защита, макар AR да се вълнува до извъпросителняване от кирилицата в ePub книгите.</p> <p>Той не е Kindle. Той не е Nook. Той дори не е на Sony. Той е просто PocketBook 301+ &ndash; (само-)подарък за поредната обиколка на Земята около Слънцето от онзи фиксиран момент в миналото&hellip;</p> <p><img src="/images/101.jpg" alt="PocketBook 301+" title="PocketBook 301+"></p> <p>(източникът на снимката е недвусмислено отбелязан върху нея)</p> <p>Поставен в калъфчето, придобива размерите на нормален тефтер. И от него се чете прекрасно в междуградския автобус, особено ако човек е близо до светлината на прозореца.</p> <p>За впечатленията от устройството и последствията от продължителното четене от електронната хартия ще напиша след време.</p> <p>П.п. Няма да обяснявам защо се сдобих точно него, след като останалата ми техника, без телефона е на Apple. Феновете няма да ме разберат, а другите просто няма да попитат&hellip;</p>Ода за некомпетентността/posts/oda-za-nekompetentnostta.htmlWed, 11 Aug 2010 08:38:08 +0000/posts/oda-za-nekompetentnostta.html<blockquote> <p>Internet &ndash; it doesn’t make you stupid, it just makes your stupidity more accessible to others.</p> </blockquote> <p>Не знам с какви други думи да опиша възмущението си от ширещите се от известно време в родната Мрежа некомпетентност и графомания, които напоследък достигат такива застрашителни размери, че мисълта да добавя <code>*.bg</code> към списъка от филтри на AdBlock започва да се материализира със страшна сила.</p> <p>Капката, която преля чашата, е умопомрачителното графоманско <a href="http://www.webcafe.bg/id_416905584_Sinopticheski_Diliyt">творение</a>, в което лицето VaGro открито защитава посегателството върху един от най-важните за бедната ни <del>бананова</del> аграрна република институт на БАН с позицията, че метеорологията в България е излишно пилеене на средства. И наистина, за какво им е на земеделците у нас прогноза за възможни градушки, след като противоградовите комплекси вече ги няма и градушката така или иначе ще се изсипе с цялата си сила? За какво ѝ е на държавата да знае кога реките ще прелеят, след като и без това пътищата и мостовете ще пропаднат, а хората все някак ще се оправят с унищожените си домове и покъщнина? На държава, която <del>замазва</del> решава всичките си проблеми <em>post factum</em>, превантивни мерки не ѝ трябват.</p> <p>Според въпросния господин, нужда от метеорологичен институт в България няма, тъй като той се бил осланял на прогнозите на weather.com, пък и съседните държави си имали прогнози за времето. Повърхностното мислене и липсата на елементарна компетентност в областта, характерно за графоманите с пренадуто его, обаче му пречат да осмисли факта, че метеорологията е многомащабна наука, която използва както глобални, така и силно локални източници на информация, благодарение на които се формират т.нар. гранични условия на моделите. Пречи му да осмисли, че едромащабните глобални и континентални прогнози се рафинират с дребномащабни локални модели, използвайки данни от стотиците метеорологични станции във всяка една страна. А всички метеорологични модели са хаотични по природата си динамични системи и малките отклонения в граничните условия могат да скрият ураганите в правилните предсказанията, превръщайки ги в прекрасни слънчеви дни. И да, съседните ни държави наистина са умрели за данните, които НИМХ им подава, защото без тях метеорологичните им прогнози струват толкова, колкото и тези на ТВ шаманите, гадаещи на кафе, боб, кости и зарчета. А без пари за поддръжката на станциите у нас, драги ми VaGro, единственото, което ще гледаш във weather.com, ще бъде надписа &ldquo;No data/No weather station&rdquo;.</p> <p>Чукча обаче писател, чукча не читател. Чукча мрази да мисли &ndash; по-лесно е да действа първосигнално, а в оставащото свободно време да залива Мрежата с помията си. Поне не излиза скъпо &ndash; дисковото пространство и мрежовият обмен са вече почти без пари&hellip;</p>Ах тези префикси/posts/ah-tezi-prefiksi.htmlSat, 10 Jul 2010 22:15:29 +0000/posts/ah-tezi-prefiksi.html<p>Имаше един такъв виц за студентите от ФМИ, че на влизане там мислели, че един килобайт е 1000 байта, а на излизане били убедени, че един килограм е 1024 грама. Изглежда същото важи с пълна сила и за възпитаниците на един от най-реномираните американски университети, разработили софтуера за наблюдение на големи компютърни системи <a href="http://ganglia.sourceforge.net/">Ganglia</a>.</p> <p>Преобразуване на мегахерци в гигахерци, в стил Berkeley.edu:</p> <p><img src="/images/98.png" alt="Само в Berkeley: 1 GHz = 1024 MHz" title="Само в Berkeley: 1 GHz = 1024 MHz"></p> <p>От доста време ми правеше впечатление, че уеб частта на Ganglia систематично подценява работната честота на процесорите на наблюдаваните машини, но, честно казано, дори не ми е минавало през ума, че е възможно причината да бъде в погрешна интерпретация на префикса на честотата. Още по-изумителното е, че за толкова години никой не е забелязал грешката!</p>