<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-567383993398357391</id><updated>2011-09-22T11:36:17.437-07:00</updated><category term='const correctness'/><category term='logging'/><category term='assert'/><category term='ц'/><category term='QNX'/><category term='java'/><category term='вим'/><category term='ц++'/><category term='spawn'/><category term='Neutrino'/><category term='конст'/><category term='c'/><category term='оперативни систем'/><category term='јава'/><category term='exec'/><category term='sudoku'/><category term='posix'/><category term='убунту'/><category term='линукс'/><category term='microsoft'/><category term='асерт'/><category term='gcc'/><category term='судоку'/><category term='c++'/><category term='конст коректност'/><category term='Scheme'/><category term='дијагностика'/><title type='text'>програмирање</title><subtitle type='html'>Случајне мисли о програмирању.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-7884467747349647972</id><published>2011-09-22T11:36:00.000-07:00</published><updated>2011-09-22T11:36:17.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='вим'/><title type='text'>vim - форматирање изворног кода</title><content type='html'>"Открио" сам још један начин за генерисање синаксно обојеног ХТМЛ кода за бебник.&lt;br /&gt;&lt;br /&gt;Онај тежи начин сам описао овде: http://aleksandarristovski.blogspot.com/2009/04/blog-post.html&lt;br /&gt;&lt;br /&gt;А далеко лакши је једноставно генерисати код из Вим едитора командом ":TOhtml".&lt;br /&gt;&lt;br /&gt;Пример: &lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!--pre { font-family: monospace; color: #000000; background-color: #ffffff; }body { font-family: monospace; color: #000000; background-color: #ffffff; }.Statement { color: #ffff00; }.Constant { color: #ff6060; }.Type { color: #00ff00; }--&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Type"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;    &lt;span class="Type"&gt;int&lt;/span&gt; bar = &lt;span class="Constant"&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span class="Type"&gt;char&lt;/span&gt; foo;&lt;br /&gt;&lt;br /&gt;    &lt;span class="Statement"&gt;for&lt;/span&gt; (foo = &lt;span class="Constant"&gt;7&lt;/span&gt;; foo &amp;gt;= &lt;span class="Constant"&gt;0&lt;/span&gt;; foo--) {&lt;br /&gt;        bar++;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; bar;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Невероватно једноставно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-7884467747349647972?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/7884467747349647972/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/09/vim.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7884467747349647972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7884467747349647972'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/09/vim.html' title='vim - форматирање изворног кода'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-7901252397588017050</id><published>2011-09-17T10:43:00.000-07:00</published><updated>2011-09-17T10:43:42.174-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='убунту'/><category scheme='http://www.blogger.com/atom/ns#' term='линукс'/><title type='text'>Ubuntu 11.04 - io scheduler</title><content type='html'>Недавно сам прешао на новији компјутер и са тим и новији Убунту 11.04. Приметио сам да је одзив апликација катастрофалан ако у позадини имам операцију која интензивно користи диск. На пример, урадим&lt;br /&gt;&lt;br /&gt;svn up&lt;br /&gt;&lt;br /&gt;и већина апликација које су активне блокирају по неколико секунди. Буквално онемогућује рад.&lt;br /&gt;&lt;br /&gt;Тражећи решење, изгледа да је узрок нови "scheduler" у линукс кернелу: "CFP". Преправио сам почетне аргументе кернела у груб конфигурацији и додао &lt;br /&gt;&lt;br /&gt;"elevation=deadline"&lt;br /&gt;&lt;br /&gt;у линији&lt;br /&gt;&lt;br /&gt;GRUB_CMDLINE_LINUX_DEFAULT="quiet splash reboot=pci elevator=deadline"&lt;br /&gt;&lt;br /&gt;фајла /etc/default/grub&lt;br /&gt;&lt;br /&gt;затим sudo update-grub &lt;br /&gt;&lt;br /&gt;Чини ми се да је разлика очигледна. За тест сам копирао фајл од неколико гигабајта и истовремено користио интернет претраживач - иако има веома краткотрајних застоја, може нормално да се користи.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-7901252397588017050?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/7901252397588017050/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/09/ubuntu-1104-io-scheduler.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7901252397588017050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7901252397588017050'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/09/ubuntu-1104-io-scheduler.html' title='Ubuntu 11.04 - io scheduler'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-9143087033468971139</id><published>2011-02-26T19:17:00.000-08:00</published><updated>2011-02-26T19:17:03.457-08:00</updated><title type='text'>позивање виртуелне функције из деструктора базне класе</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Данас сам имао краткотрајно помрачење ума. Покушао сам нешто што не може да ради. Чак сам се и збунио, а волим да верујем да познајем Ц++. Све је релативно, а знање нарочито.&lt;br /&gt;&lt;br /&gt;Ради се о следећем:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;Base&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="symbol"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;~&lt;/span&gt;&lt;span class="function"&gt;Base&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;Derived&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="symbol"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"Derived::foo"&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Солидан компајлер ће дати упозорење. У зависности од верзије gcc и binutils прављење извршне датотеке може да успе, можда не. У сваком случају, ово је погрешно из простог разлога што у тренутку када деструктор класе Base позове функцију foo, изведена класа Derived је већ извршила свој деструктор и подаци у тој класи су већ уништени. Ако би компјалер дозволио позив виртуелне фунције из деструктора Base, довео би до ситуације да виртуелна функција изведене класе барата са подацима који су већ били уништени.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-9143087033468971139?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/9143087033468971139/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/02/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/9143087033468971139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/9143087033468971139'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2011/02/blog-post.html' title='позивање виртуелне функције из деструктора базне класе'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-5498744009126548119</id><published>2010-05-03T11:07:00.000-07:00</published><updated>2010-05-03T11:07:42.779-07:00</updated><title type='text'>byobu</title><content type='html'>Већ неколико година користим "GNU screen" и веома ми је користан. Тек данас сам сазнао за "byobu". &lt;br /&gt;&lt;br /&gt;Програм byobu даје могућност конфигурисања screen програма и приказ интересантних података у додатној статусној линији.&lt;br /&gt;&lt;br /&gt;Ипак, оно што ми се нарочито свиђа је да вертикална подела екрана сада ради без грешке. Када сам пре неког времена то покушао са screen није све радило како треба па то нисам ни користио.&lt;br /&gt;&lt;br /&gt;Дакле, од сада - byobu!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-5498744009126548119?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/5498744009126548119/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/05/byobu.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/5498744009126548119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/5498744009126548119'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/05/byobu.html' title='byobu'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-6353943486063793384</id><published>2010-04-15T08:11:00.000-07:00</published><updated>2010-04-15T08:12:25.893-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ц'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Занимљиво питање</title><content type='html'>Питање је стигло од корисника:&lt;br /&gt;&lt;br /&gt;Зашто на powerpc платформи овај код завршава у бесконачној петљи:&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 3.1.3by Lorenzo Bettinihttp://www.lorenzobettini.ithttp://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;main&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; bar &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; foo&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;foo &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;span class="normal"&gt; foo &lt;/span&gt;&lt;span class="symbol"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;span class="normal"&gt; foo&lt;/span&gt;&lt;span class="symbol"&gt;--)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;       bar&lt;/span&gt;&lt;span class="symbol"&gt;++;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; bar&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Одговор:&lt;br /&gt;зато што је на powerpc платформи &lt;span class="type"&gt;char&lt;/span&gt; не-негативан целобројни тип (&lt;span class="type"&gt;unsigned char&lt;/span&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-6353943486063793384?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/6353943486063793384/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/04/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6353943486063793384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6353943486063793384'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/04/blog-post.html' title='Занимљиво питање'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-8522655721701201013</id><published>2010-03-31T10:58:00.000-07:00</published><updated>2010-03-31T11:00:03.692-07:00</updated><title type='text'>C++0x</title><content type='html'>Данас коначно узмем мало времена да прочитам о новом Ц++ стандарду:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B0x"&gt;http://en.wikipedia.org/wiki/C%2B%2B0x&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Оно што ми је нарочито привукло пажњу јесте увођење кључне речи &lt;span class="keyword"&gt;auto&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Мотивација ми је потпуно јасна, и свакако је јасна свакоме ко је користио &lt;span class="type"&gt;bind&lt;/span&gt; шаблоне. Оно чега се бојим, међутим, је могућност коришћења &lt;span class="keyword"&gt;auto&lt;/span&gt; за било који тип података.&lt;br /&gt;&lt;br /&gt;Питам се колико ће времена проћи док се не појаве "нови" пројекти који користе &lt;span class="keyword"&gt;auto&lt;/span&gt; свуда (вероватно ће личити на бејзик програм).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-8522655721701201013?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/8522655721701201013/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/c0x.html#comment-form' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/8522655721701201013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/8522655721701201013'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/c0x.html' title='C++0x'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-9073694362187156829</id><published>2010-03-15T05:37:00.000-07:00</published><updated>2010-03-15T05:37:58.396-07:00</updated><title type='text'>Убунту</title><content type='html'>Прошле недеље сам инсталирао Убунту 9.10 на лаптоп. Изабрао Српски језик и инсталирао. Инталација је прошла без проблема, скоро сви периферијски уређаји су били препознати "из прве" или је требало учинити два клика мишем да би прорадили.&lt;br /&gt;&lt;br /&gt;Брзина је завидна у односу на Висту коју сам имао пре тога, али оно што ми се нарочито свиђа је то да је подршка различитим језицима урађена изненађујуће добро. Преводи на Српски су, колико могу да видим, такође прилично добри.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-9073694362187156829?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/9073694362187156829/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/9073694362187156829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/9073694362187156829'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/blog-post.html' title='Убунту'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-2385432598880996201</id><published>2010-03-01T12:22:00.000-08:00</published><updated>2010-03-01T12:31:58.904-08:00</updated><title type='text'>sizeof(void)</title><content type='html'>Интересантно питање које ми је данас поставио колега. Стварно, колики је sizeof(void)?&lt;br /&gt;&lt;br /&gt;Знам да може да се користи као аргумент шаблона, па сам претпоставио да је то легалан израз. Међутим, преварио сам се у величини: претпоставио сам 0, али је стварно 1. Барем како то Гну-ов компајлер каже. У стандарду "C99", брзо тражење речи "void" није дало одговор, тако да сада нисам сигуран да ли је 1 према стандарду или је то Гну-ова имплементација.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--- 5 минута касније ---&lt;br /&gt;&lt;br /&gt;Дакле, пажљивије читање стандарда даје одговор: ово није легалан c99 израз и ради се о нестандардној имплементацији Гну-овог компајлера. Уколико користим "-std=c99 -pedantic" компајлер пријављује упозорење.&lt;br /&gt;&lt;br /&gt;Конкретан текст стандарда који ово јасно показује се налази у поглављу 6.5.3.4 ИСО Ц стандарда 9899:1999 где каже да оператор sizeof не може да се користи на изразе који имају тип функције или некомплетни тип, итд. Како је void некомплетан тип података, sizeof(void) није легалан израз.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-2385432598880996201?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/2385432598880996201/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/sizeofvoid.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2385432598880996201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2385432598880996201'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/03/sizeofvoid.html' title='sizeof(void)'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-1998345824838444307</id><published>2010-02-03T06:39:00.000-08:00</published><updated>2010-02-20T11:09:15.331-08:00</updated><title type='text'>Проблем</title><content type='html'>Управо сам суочен са интересантним проблемом који још увек не знам да решим. Ради се о седећем:&lt;br /&gt;&lt;br /&gt;Имам блок меморије, унутар њега елементе са заглављем и слободним простором. Уколико је задато поравнање поинтера, треба да нађем поинтер у једном од слободних простора који је поравнан на дату вредност. Другим речима, уколико имам поинтер p, и величину елемента (заглавље + слободни простор), да ли је могуће доказати да постоји такав цели број N за који ће следећа једначина да важи:&lt;br /&gt;&lt;br /&gt;p + N * dist = M * alignment&lt;br /&gt;&lt;br /&gt;где су&lt;br /&gt;p - поинтер на први слободни простор блока&lt;br /&gt;N - произвољни цели број&lt;br /&gt;dist - величина елемента (заглавље + слободни простор)&lt;br /&gt;M - произвољни цели број&lt;br /&gt;alignment - поравнање, мора бити 2 на целобројни експонент.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;После мало размишљања, математика би могла да буде ово:&lt;br /&gt;&lt;br /&gt;Формулу поделим са alignment:&lt;br /&gt;&lt;br /&gt;p / alignment + N * dist / alignment = M&lt;br /&gt;&lt;br /&gt;Резултат дељења би могао бити:&lt;br /&gt;&lt;br /&gt;P + Mp / alignment + N * dist / alignment = M&lt;br /&gt;&lt;br /&gt;С обзиром да доказујем само да ли постоје такви целобројни N и M, није битно која је њихова вредност, па онда целобројну вредност P стапам са M i dobijam neki novi celobrojni broj R.&lt;br /&gt;&lt;br /&gt;Mp / alignment + N * dist / alignment = R&lt;br /&gt;&lt;br /&gt;Да би горња једначина била задовољена, рационални број треба да нестане, а то може само ако:&lt;br /&gt;&lt;br /&gt;N * dist = alignment - Mp&lt;br /&gt;&lt;br /&gt;односно&lt;br /&gt;&lt;br /&gt;N = (alignment - Mp) / dist&lt;br /&gt;&lt;br /&gt;Дакле уколико је остатак овог дељења 0, такви бројеви постоје:&lt;br /&gt;&lt;br /&gt;if (mod((alignment - mod(p / alignment))/dist) == 0)  -&gt; Da&lt;br /&gt;else -&gt; NE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;После пуно размишљања, и дискусије са Страхињом, мој закључак је да таква општа формула не постоји. На крају сам променио алгоритам за испитивање подобности датог блока и сада је овакав.&lt;br /&gt;&lt;br /&gt;Ако су сви следећи услови испуњени, блок је подобан:&lt;br /&gt;&lt;br /&gt;1. Све корисничке алокације унутар блока су поравнате на 2^k адресе (другим речима, првa корисничка адреса унутар блока је 2^k)&lt;br /&gt;2. Тражено поравање је такође 2^k&lt;br /&gt;3. Величина алокационог елемнта (кориснички простор + контролна структура) мора бити такође 2^k&lt;br /&gt;4. Тражено поравање мора бити мање или једнако величини алокационог елемента.&lt;br /&gt;&lt;br /&gt;Тако се алокација врши само ако су задовољени горе наведени услови, а све остало се одбацује и алокација се врши од општег "list allocator".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-1998345824838444307?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/1998345824838444307/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/02/blog-post.html#comment-form' title='11 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1998345824838444307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1998345824838444307'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/02/blog-post.html' title='Проблем'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-1551229399814348901</id><published>2010-02-02T09:41:00.000-08:00</published><updated>2010-02-02T09:41:10.170-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='posix'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='exec'/><category scheme='http://www.blogger.com/atom/ns#' term='spawn'/><title type='text'>"exec" на виндовсу</title><content type='html'>Једна стара белешка:&lt;br /&gt;&lt;br /&gt;"еxec" у мајкрософтовој "C" библиотеци не ради исто као на посикс системима. У мајкрософтовој имплементацији ова функција креира нови процес који наслеђује "handles", oтворене фајл дескрипторе и слично, али добија нови број процеса (process id).&lt;br /&gt;&lt;br /&gt;Тако програм који "рачуна" на нормално понашање ове функције може да мисли да је процес који је креирао већ завршио иако се то није стварно догодило. На пример, грешка која се десила у пракси је да је један скрипт стартовао апликацију која је користећи "exec" требало да направи нови процес, а скипт је у међувремену чекао да се оригинални процес који је креирао заврши. Међутим, виндовс би вратио контролу скипрти тако да изгледа као да се креирани програм завршио, али у стварности нови процес са новим бројем процеса би наставио да ради.&lt;br /&gt;&lt;br /&gt;Поправка се састојала у замени "exec" позива у поменутој апликацији са "spawn" и затим чекања новокреираног процеса из саме апликације, па тек онда изласка како би скрипт могао да настави да чека само на апликацију.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-1551229399814348901?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/1551229399814348901/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/02/exec.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1551229399814348901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1551229399814348901'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2010/02/exec.html' title='&quot;exec&quot; на виндовсу'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-7014685239437902781</id><published>2009-11-28T07:52:00.000-08:00</published><updated>2009-11-28T07:56:06.648-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>elif евалуација</title><content type='html'>Интересантна промена се десила у gcc Ц препроцесору. Евалуација elif гране препроцесорске директиве "if" се извршава чак и ако је услов дат у if задовољен.&lt;br /&gt;&lt;br /&gt;Конкретан пример:&lt;br /&gt;&lt;pre class="code-body"&gt;&lt;tt&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#ifdef&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#ifndef&lt;/span&gt; FOO_BAR&lt;br /&gt;&lt;span class="preproc"&gt;#define&lt;/span&gt; FOO_BAR&lt;br /&gt;&lt;span class="preproc"&gt;#elif&lt;/span&gt; FOO_BAR == 0&lt;br /&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;Ово ради без проблема на претходним верзијама, на пример 4.3.3 али не и на 4.4.1. Не знам у којој тачно верзији је дошло до промене, али ево извештаја проблема: &lt;a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36320"&gt;http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36320&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Исправна конструкција горе наведеног примера би била:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code-body"&gt;&lt;tt&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#ifdef&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#ifndef&lt;/span&gt; FOO_BAR&lt;br /&gt;&lt;span class="preproc"&gt;#define&lt;/span&gt; FOO_BAR 1&lt;br /&gt;&lt;span class="preproc"&gt;#elif&lt;/span&gt; FOO_BAR == 0&lt;br /&gt;&lt;span class="preproc"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-7014685239437902781?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/7014685239437902781/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/11/elif.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7014685239437902781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/7014685239437902781'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/11/elif.html' title='elif евалуација'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-2608258822710362297</id><published>2009-11-27T12:42:00.000-08:00</published><updated>2009-11-28T07:47:37.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Секвентна тачка</title><content type='html'>Односно "Sequence point".&lt;br /&gt;&lt;br /&gt;Питање у вези секвентне тачке (ако сам превео добро) често долази на разговорима за посао. Многи нису свесни шта је то иако је у суштини проста ствар. Пре неки дан ме на то потсетио бивши колега, а и ја сам то питање добио на мом разговору.&lt;br /&gt;&lt;br /&gt;Секвентна тачка је синтаксни елемент дефинисан језиком који гарантује да ће споредни ефекти евалуације израза са леве стране таквог елемента гарантовано бити завршени пре него што започне евалуација израза са десне стране.&lt;br /&gt;&lt;br /&gt;На пример, у Цеу и Це++ то је оператор зарез ',' али не и аримтетички оператори. Осим зареза, има још секвентних тачака као што су '?' и логички оператори.&lt;br /&gt;&lt;br /&gt;Кратак, али добар текст се може наћи на википедији.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-2608258822710362297?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/2608258822710362297/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/11/blog-post.html#comment-form' title='5 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2608258822710362297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2608258822710362297'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/11/blog-post.html' title='Секвентна тачка'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-8935534111347022964</id><published>2009-10-27T10:25:00.000-07:00</published><updated>2009-10-27T10:25:46.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='судоку'/><title type='text'>Решавање судоку</title><content type='html'>Прошле године су нам у посети били моји родитељи и при том сам сазнао да је мој отац постао пасионирани играч судоку. Мало сам играо и ја, врло интересантна мозгалица. Природно, дошао сам на идеју да решавање "аутоматизујем". У то време сам учио "Scheme" језик - шема ме још занима али се нема времена.&lt;br /&gt;&lt;br /&gt;Ипак, склепао сам некакав програмчић а ових дана га пречистио и проверио. Програм следи у целини.&lt;br /&gt;&lt;br /&gt;Програм је развијан и тестиран коришћењем "Petite Chez Scheme" &lt;a href="http://www.scheme.com/petitechezscheme.html"&gt;http://www.scheme.com/petitechezscheme.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;br /&gt;; Решавање судоку матрице.&lt;br /&gt;; Функција за решавање је:&lt;br /&gt;; (solve sudo azbuka)&lt;br /&gt;; где је sudo низ који описује почетно&lt;br /&gt;; стање судоку, а azbuka низ који дефинише&lt;br /&gt;; могуће елементе. Класичан судоку ће&lt;br /&gt;; у азбуци имати цифре 1 до 9.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Дефиниција примера судоку проблема&lt;br /&gt;; Судоку таблица се задаје као низ&lt;br /&gt;; по редовима.&lt;br /&gt;;&lt;br /&gt;; Редови и колоне су нумерисане&lt;br /&gt;; бројевима 1 до 9.&lt;br /&gt;;&lt;br /&gt;; Непознати елементи су задати елементом&lt;br /&gt;; који није садржан у азбуци. У примеру&lt;br /&gt;; који следи, елементе које сам хтео да&lt;br /&gt;; прогласим непознатим сам обележио подвлаком.&lt;br /&gt;;&lt;br /&gt;; Резултат обележава решене елементе&lt;br /&gt;; заградом (под листа). Уколико&lt;br /&gt;; једнозначно решење није нађено,&lt;br /&gt;; у загради ће бити изслитана могућа&lt;br /&gt;; решења.&lt;br /&gt;;&lt;br /&gt;(define sudo '(  _1  2 _3  4  5  6 _7 _8 _9&lt;br /&gt;                  4 _5  6  7 _8 _9  1  2  3&lt;br /&gt;                 _7 _8 _9 _1  2  3 _4 _5  6&lt;br /&gt;                  2  3 _4  5  6  7 _8 _9  1&lt;br /&gt;                 _5  6  7 _8 _9  1  2  3  4&lt;br /&gt;                 _8 _9  1  2  3  4  5  6  7&lt;br /&gt;                 _3  4  5  6 _7 _8 _9  1  2&lt;br /&gt;                 _6  7 _8 _9  1  2  3  4  5&lt;br /&gt;                 _9 _1  2  3 _4  5  6 _7  8   ))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Азбука.&lt;br /&gt;; Азбука може бити произвољна све док задовољава&lt;br /&gt;; услов да је број елемената једнак квадрату&lt;br /&gt;; целобројног позитивног броја.&lt;br /&gt;;       &lt;br /&gt;(define azbuka '(1 2 3 4 5 6 7 8 9))&lt;br /&gt;&lt;br /&gt;(define a2 '(0 1 2 3))&lt;br /&gt;(define s2 '( ? 1 2 3&lt;br /&gt;              3 2 1 ?&lt;br /&gt;              1 3 0 2&lt;br /&gt;              2 0 ? 1))&lt;br /&gt;              &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Основна функција за решавање судоку.&lt;br /&gt;;&lt;br /&gt;(define (solve sudo azbuka)&lt;br /&gt;    (solve1 sudo azbuka 0))&lt;br /&gt;&lt;br /&gt;; &lt;br /&gt;; Помоћна функција за решавање&lt;br /&gt;;&lt;br /&gt;(define (solve1 sudo azbuka rc)&lt;br /&gt;    (cond&lt;br /&gt;   ((&gt;= rc (* (list-len azbuka) (list-len azbuka))) sudo)&lt;br /&gt;      (else&lt;br /&gt;        (solve1&lt;br /&gt;          (append &lt;br /&gt;            (front (reduce sudo azbuka) rc)&lt;br /&gt;            (cons&lt;br /&gt;              (possible (reduce sudo azbuka) azbuka (row-idx azbuka rc) (col-idx azbuka rc))&lt;br /&gt;              (skip-n (reduce sudo azbuka) (1+ rc))))&lt;br /&gt;          azbuka&lt;br /&gt;          (1+ rc)))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Редукуј све непознате чланове на листе могућих&lt;br /&gt;; решења&lt;br /&gt;;&lt;br /&gt;(define (reduce sudo azbuka)&lt;br /&gt; (reduce1 sudo azbuka 0))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција.&lt;br /&gt;; Редукуј све непознате чланове на листе могућих&lt;br /&gt;;&lt;br /&gt;(define (reduce1 sudo azbuka rc)&lt;br /&gt; (cond&lt;br /&gt;  ((&gt; (1+ rc) (* (list-len azbuka) (list-len azbuka))) '())&lt;br /&gt;  (else&lt;br /&gt;   (cons&lt;br /&gt;    (possible sudo azbuka (row-idx azbuka rc) (col-idx azbuka rc))&lt;br /&gt;    (reduce1 sudo azbuka (1+ rc))))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција - број елемената у &lt;br /&gt;; датој листи.&lt;br /&gt;;&lt;br /&gt;(define (list-len lst)&lt;br /&gt;    (cond&lt;br /&gt;      ((or (null? lst) (is-atom? lst)) 0)&lt;br /&gt;      (else&lt;br /&gt;        (1+ (list-len (cdr lst))))))&lt;br /&gt;        &lt;br /&gt;; &lt;br /&gt;; Помоћна функција - израчунава димензију под-судоку&lt;br /&gt;; матрице.&lt;br /&gt;;&lt;br /&gt;(define (koren azbuka) (sqrt (list-len azbuka)))&lt;br /&gt;                                                                     &lt;br /&gt;;                                                                    &lt;br /&gt;; Одређивање природе вредности aorl&lt;br /&gt;; Враћа #f уколико дата вредност није&lt;br /&gt;; атом.&lt;br /&gt;;&lt;br /&gt;(define is-atom? atom?)&lt;br /&gt;&lt;br /&gt;;(define (is-atom? aorl)&lt;br /&gt;;    (cond&lt;br /&gt;;      ((or &lt;br /&gt;;           (list? aorl)&lt;br /&gt;;           (not (number? aorl))) #f)&lt;br /&gt;;      (else (atom? aorl))))&lt;br /&gt;&lt;br /&gt;; &lt;br /&gt;; Да ли је дати елемент слово азбуке&lt;br /&gt;;&lt;br /&gt;(define (member? at lst)&lt;br /&gt; (cond&lt;br /&gt;  ((null? lst) #f)&lt;br /&gt;  (else&lt;br /&gt;   (or (eq? at (car lst))&lt;br /&gt;    (member? at (cdr lst))))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Да ли је дата вредност задата?&lt;br /&gt;;&lt;br /&gt;(define (is-given? aorl azbuka)&lt;br /&gt;    (and (is-atom? aorl) (member? aorl azbuka)))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Да ли је вредност решена?&lt;br /&gt;;&lt;br /&gt;; Решена је само онда када је представљена&lt;br /&gt;; листом са тачно једним елементом који&lt;br /&gt;; није 0.&lt;br /&gt;;&lt;br /&gt;(define (is-solved? lat azbuka)&lt;br /&gt;    (cond&lt;br /&gt;      ((eq? 1 (list-len lat)) #t)&lt;br /&gt;      (else (is-given? lat azbuka))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција - број елемената у &lt;br /&gt;; датој листи.&lt;br /&gt;;&lt;br /&gt;(define (list-len lst)&lt;br /&gt;    (cond&lt;br /&gt;      ((or (null? lst) (is-atom? lst)) 0)&lt;br /&gt;      (else&lt;br /&gt;        (1+ (list-len (cdr lst))))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Прескочи n елемената и врати&lt;br /&gt;; n-ти елемент.&lt;br /&gt;;&lt;br /&gt;(define (skip-n sudo n)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? sudo) '())&lt;br /&gt;      ((eq? 0 n) sudo)&lt;br /&gt;      (else&lt;br /&gt;        (skip-n (cdr sudo) (1- n)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Врати листу од n елемената почев од&lt;br /&gt;; датог елемента sudo&lt;br /&gt;;&lt;br /&gt;(define (front sudo n)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? sudo) '())&lt;br /&gt;      ((eq? 0 n) '())&lt;br /&gt;      (else&lt;br /&gt;        (cons (car sudo) (front (cdr sudo) (1- n))))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Издвој ред n&lt;br /&gt;; &lt;br /&gt;(define (row sudo azbuka n)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? sudo) '())&lt;br /&gt;      (else&lt;br /&gt;        (front (skip-n sudo (* (1- n) (list-len azbuka))) (list-len azbuka)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција за издвајање колоне&lt;br /&gt;;&lt;br /&gt;(define (getcol sudo azbuka n)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? sudo) '())&lt;br /&gt;      ((eq? 0 n) '())&lt;br /&gt;      (else&lt;br /&gt;        (cons (car sudo) (getcol (skip-n sudo (list-len azbuka)) azbuka (1- n))))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Издвоји колону n&lt;br /&gt;;&lt;br /&gt;(define (col sudo azbuka n)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? sudo) '())&lt;br /&gt;      (else&lt;br /&gt;        (getcol (skip-n sudo (1- n)) azbuka (list-len azbuka)))))&lt;br /&gt;       &lt;br /&gt;;&lt;br /&gt;; помоћна функција - врати ред (почев од 1)&lt;br /&gt;; на основу датог индекса листе која дефинише&lt;br /&gt;; судоку. Индекс почиње са 0.&lt;br /&gt;; &lt;br /&gt;(define (row-idx azbuka idx)&lt;br /&gt; (1+ (floor (/ idx (list-len azbuka)))))&lt;br /&gt; &lt;br /&gt;;&lt;br /&gt;; помоћна функција - врати колону (почев од 1)&lt;br /&gt;; на основу датог индекса листе која дефинише&lt;br /&gt;; судоку. Индекс почиње са 0.&lt;br /&gt;; &lt;br /&gt;(define (col-idx azbuka idx)&lt;br /&gt; (1+ (- idx (* (1- (row-idx azbuka idx)) (list-len azbuka)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција за издвајање "мини судоку" односно&lt;br /&gt;; подматрице&lt;br /&gt;;&lt;br /&gt;(define (sub-sudo-row sudo azbuka r c rn koren)&lt;br /&gt; (cond &lt;br /&gt;  ((&gt; rn koren) '())&lt;br /&gt;  ((null? sudo) '())&lt;br /&gt; (else&lt;br /&gt;  (append&lt;br /&gt;   (front (skip-n (row sudo azbuka (+ rn (* (1- r) koren))) (* (1- c) koren)) koren)&lt;br /&gt;   (sub-sudo-row sudo azbuka r c (1+ rn) koren)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Издвој мини судоку (a пута a, где је а корен&lt;br /&gt;; броја елемената у азбуци) са задате позиције.&lt;br /&gt;; Позиције мини судоку су нумерисане 1 до (list-len azbuka).&lt;br /&gt;;&lt;br /&gt;(define (sub-sudo sudo azbuka r c)&lt;br /&gt; (sub-sudo-row sudo azbuka r c 1 (koren azbuka)))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; &lt;br /&gt;;&lt;br /&gt;(define (extract-solved su azbuka)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? su) '())&lt;br /&gt;      ((is-solved? (car su) azbuka) &lt;br /&gt;    (cons &lt;br /&gt;  (cond&lt;br /&gt;    ((list? (car su)) (caar su))&lt;br /&gt;    (else&lt;br /&gt;    (car su)))&lt;br /&gt;    (extract-solved (cdr su) azbuka)))&lt;br /&gt;      (else&lt;br /&gt;        (extract-solved (cdr su) azbuka))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Разлика две судоку&lt;br /&gt;;&lt;br /&gt;(define (diff su lat)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? su) '())&lt;br /&gt;      ((null? lat) su)&lt;br /&gt;      ((member? (car su) lat) (diff (cdr su) lat))&lt;br /&gt;      (else&lt;br /&gt;        (cons (car su) (diff (cdr su) lat)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Да ли је вредност at члан низа lat?&lt;br /&gt;;&lt;br /&gt;(define (member? at lat)&lt;br /&gt;    (cond&lt;br /&gt;      ((null? lat) #f)&lt;br /&gt;      ((eq? at (car lat)) #t)&lt;br /&gt;      (else&lt;br /&gt;        (member? at (cdr lat)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Врати сва немогућа решења за дату позицију.&lt;br /&gt;; (сви елементи азбуке који су већ дати или&lt;br /&gt;; нађени у датом реду, колони и под судоку).&lt;br /&gt;;&lt;br /&gt;(define (allsolved sudo azbuka r c)&lt;br /&gt;    (append&lt;br /&gt;      (extract-solved (row sudo azbuka r) azbuka)&lt;br /&gt;      (extract-solved (col sudo azbuka c) azbuka)&lt;br /&gt;      (extract-solved &lt;br /&gt;  (sub-sudo &lt;br /&gt;   sudo azbuka (ceiling (/ r (koren azbuka))) (ceiling (/ c (koren azbuka))))&lt;br /&gt;  azbuka)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Врати листу могућих решења за дати елемент.&lt;br /&gt;; &lt;br /&gt;(define (possible sudo azbuka r c)&lt;br /&gt;    (cond&lt;br /&gt;      ((is-solved? (element sudo azbuka r c) azbuka)&lt;br /&gt;       (element sudo azbuka r c))&lt;br /&gt;      (else&lt;br /&gt;        (diff azbuka (allsolved sudo azbuka r c)))))&lt;br /&gt;&lt;br /&gt;;&lt;br /&gt;; Помоћна функција. Врати дати елемент.&lt;br /&gt;; Ред и колона почињу од 1&lt;br /&gt;;&lt;br /&gt;(define (element sudo azbuka r c)&lt;br /&gt;    (car (skip-n sudo (+ (* (list-len azbuka) (1- r)) (1- c)))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-8935534111347022964?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/8935534111347022964/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/blog-post.html#comment-form' title='3 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/8935534111347022964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/8935534111347022964'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/blog-post.html' title='Решавање судоку'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-6975909080026153485</id><published>2009-10-27T07:09:00.000-07:00</published><updated>2009-11-28T07:46:53.430-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>gcc и груписање функција</title><content type='html'>У неким ретким случајевима, потребно је оптимизовати програм тако да се смањи растојање између функција које се често позивају. Могући добитак од овакве оптимизације је смањење "TLB misses" односно потребе да процесор учитава податке за превођење виртуелне у физичку адресу за дати блок. Друга могућа добит је искоришћење различитих нивоа кеширања: уколико су функције физички близу, велика је вероватноћа да ће, док се прва извршава, друга бити учитана у кеш.&lt;br /&gt;&lt;br /&gt;Конкретан пример који имам је оптимизација кода за "лењо разрешавање" адреса симбола у динамички повезаним програмима (lazy binding).&lt;br /&gt;&lt;br /&gt;Наш оперативни систем (QNX Neutrino) има динамичко повезивање, али не "уме" да то уради "лењо" односно на захтев. Како сада ради, наш динамички повезивач разрешава све адресе симбола на самом почетку, пре него што програм стигне у "main". Последњих неколико дана сам радио на имплементацији која већ постоји на већини јуникс система, а која подразумева разрешавање симбола функција у тренутку првог позива.&lt;br /&gt;&lt;br /&gt;Како између два разрешења може доста кода да се изврши, велика је вероватноћа да ће функције потребне за лењо разрешење већ бити избачене из кеша, а такође из процесорске табеле за превођење адреса (TLB) избачене ставке које се односе на физичке странице меморије у којима су те функције. Груписањем функција тако да буду близу једна другој, идеално у једној физичкој страници меморије, ће смањити број промашаја.&lt;br /&gt;&lt;br /&gt;Приликом прве компилације установио сам да су функције на приличном растојању једна од друге. Конкретно, приликом дисасемблирања објектног фајла, добио сам ово:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bind_func     0x000000cc&lt;br /&gt; resolve_func  0x000029e0&lt;br /&gt; resolve_rels  0x00001010&lt;br /&gt; lookup_global 0x00000c68&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Види се да би фунције биле распоређене у бар 3 меморијске странице (под условом да је страница 4KiB).&lt;br /&gt;&lt;br /&gt;Да бих груписао исте, искористио сам атрибут фунције "hot" уведен са gcc верзијом 4.3. Горе наведеним функцијама сам у декларацију додао: &lt;b&gt;__attribute__((hot))&lt;/b&gt;. Gcc тако означене функције оптимизује агресивније али и групише у посебну секцију ".text.hot". На крају процеса повезивања, функције су распоређене једна до друге:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bind_func    0x0003f3f8&lt;br /&gt; resolve_rels 0x0003f418&lt;br /&gt; resolve_func 0x0003f88c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Интересантно је да је lookup_global "нестала" односно апсорбована у функције које је позивају.&lt;br /&gt;&lt;br /&gt;У сваком случају, уместо 4 физичке странице сада функције могу да стану у само једну и распоређене су једна уз другу чиме се повећава шанса да у тренутку позива већ буду у кешу.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Тек треба да упоредим да ли се овиме добија нешто што може да се измери. Вероватно ће доста зависити од процесора па и самог уређаја.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-6975909080026153485?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/6975909080026153485/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/gcc.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6975909080026153485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6975909080026153485'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/gcc.html' title='gcc и груписање функција'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-1783749685424312467</id><published>2009-10-24T20:40:00.000-07:00</published><updated>2009-10-24T20:40:34.137-07:00</updated><title type='text'>7-zip</title><content type='html'>Коначно сам инсталирао 7-zip (http://www.7-zip.org/) и код куће. Већ неколико месеци га користим на послу. 7-zip "разуме" различите формате архива, између осталих .zip, .rar, .bz2...&lt;br /&gt;&lt;br /&gt;WinZip ми стварно неће недостајати.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-1783749685424312467?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/1783749685424312467/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/7-zip.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1783749685424312467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1783749685424312467'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/10/7-zip.html' title='7-zip'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-4390396599839640231</id><published>2009-09-29T09:45:00.000-07:00</published><updated>2009-09-29T09:45:09.110-07:00</updated><title type='text'>"Безбедне" Ц функције за манипулацију текста</title><content type='html'>Често се нађем у ситуацији да нисам сигуран да ли одређена ц функција за манипулацију текста (snprintf, strncpy, strncat, ...) исписује тачно "n" карактера, да ли резултирајући стринг завршава нулом итд.&lt;br /&gt;&lt;br /&gt;Ради лакшег потсећања, ево примера за сваку од функција:&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9by Lorenzo Bettinihttp://www.lorenzobettini.ithttp://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="preproc"&gt;#include&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#include&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;koristi_snprintf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="symbol"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;snprintf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;)/&lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;]),&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"%s"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="comment"&gt;/* Текст који смо добили у buf је можда скраћен, али је коректан са&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * нулом на крају. */&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;printf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"%s&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; buf&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;koristi_strncpy&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; iz&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; u&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="symbol"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;unsigned&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;u&lt;/span&gt;&lt;span class="symbol"&gt;)/&lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;u&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;strncpy&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;u&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; iz&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    u&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="normal"&gt;s &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;]&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="specialchar"&gt;\0&lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="comment"&gt;/* Морамо ручно да завршимо стринг. */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;printf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"%s&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; u&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;koristi_strncat&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="symbol"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;unsigned&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;)/&lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;strncpy&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"12345"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="normal"&gt;s &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="symbol"&gt;]&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="specialchar"&gt;\0&lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="comment"&gt;/* Број карактера који функција може да дода је мања за један&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * због завршне нуле и мања за дужину стринга који је већ у&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * баферу. */&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;strncat&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;strlen&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;printf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"%s&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; buf&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;koristi_strncmp&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; buf &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"12345"&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;unsigned&lt;/span&gt;&lt;span class="normal"&gt; s &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;)/&lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="function"&gt;strncmp&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;buf&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;==&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;printf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Prvih %d karaktera su isti&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;printf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Razlika postoji u prvih %d karaktera&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; s&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;main&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;koristi_snprintf&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Zdravo. Ovaj tekst je predugacak."&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;koristi_strncpy&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Zdravo. Ovaj tekst je predugacak."&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;koristi_strncat&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Zdravo. Ovaj tekst je predugacak."&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="function"&gt;koristi_strncmp&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"12345678"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-4390396599839640231?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/4390396599839640231/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/09/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4390396599839640231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4390396599839640231'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/09/blog-post.html' title='&quot;Безбедне&quot; Ц функције за манипулацију текста'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-4125875590144173639</id><published>2009-05-28T09:21:00.001-07:00</published><updated>2009-05-28T10:23:48.529-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='дијагностика'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='јава'/><title type='text'>Условна дијагностика у јави</title><content type='html'>&lt;div&gt;Постоји неколико широко распрострањених библиотека за исписивање дијагностичких порука (енгл. logging). На пример, &lt;span class="type"&gt;java.util.logging&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;У својим програмима користим ово, али ми недостаје условна компилација. Оно што у Ц/Ц++ могу да урадим са &lt;span class="preproc"&gt;#ifdef  . . .&lt;/span&gt; не могу у јави. Тако сам приморан да дијагностику коју користим искључиво за време развоја, и не желим да буде присутна у крајњем производу морам да пишем овако: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; bar&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;DEBUG&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    logger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;trace&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"U foo("&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;+&lt;/span&gt;&lt;span class="normal"&gt; bar &lt;/span&gt;&lt;span class="symbol"&gt;+&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;")"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Међутим, са јавом 1.5, дошла је и кључна реч &lt;span class="keyword"&gt;assert&lt;/span&gt;. Ово је добродошло јер омогућава убацивање провера у сам код, а да то не ремети перформансе крајњег производа. Као посебан бонус, који није доступан у Ц/Ц++, асерти се могу укључити по потреби једноставним давањем аргумента -ea јавиној виртуелној машини.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;То ме је подстакло да направим једноставан систем за условну дијагностику сличан &lt;span class="preproc"&gt;#ifdef&lt;/span&gt; приступу у Ц/Ц++. Користим постојеће пакете (на пример &lt;span class="type"&gt;java.util.logging&lt;/span&gt;) али унутар асерта. Наравно, ово није могуће урадити директно јер, на жалост, интерфејси дефинисани у овим пакетима не враћају никакву вредност. Мени је било потребно да сваки метод враћа вредност &lt;span class="number"&gt;true&lt;/span&gt; да бих исти могао да користим унутар &lt;span class="keyword"&gt;assert&lt;/span&gt; исказа:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; bar&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="keyword"&gt;assert&lt;/span&gt;&lt;span class="normal"&gt; logger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;trace&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"U foo("&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;+&lt;/span&gt;&lt;span class="normal"&gt; bar &lt;/span&gt;&lt;span class="symbol"&gt;+&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;")"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Ово ми даје управо оно што сам желео: условну дијагностику која је у нормалном режиму рада потпуно избачена оптимизацијом. То је чак и боље од Ц/Ц++ условне компилације јер се са јавом коначна компилација врши на рачунару корисника: уколико је јава виртуелна машина стартована са опцијом -ea онда ће дијагностика бити исписивана, у супротном не.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Моја имплементација се састоји у дефинисању интерфејса:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="comment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Copyright (c) 2007 Aleksandar Ristovski.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * All rights reserved. This program and the accompanying&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * materials are made available under the terms of the&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Eclipse Public License v1.0 which accompanies this&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * distribution, and is available at&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="url"&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Contributors:&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *    Aleksandar Ristovski - initial API and implementation&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;package&lt;/span&gt;&lt;span class="normal"&gt; org&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;java3declipse&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logger&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/** ILogger interface.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * This interface is very similar to existing logger&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * interfaces, with one significant difference: the&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * implementation should always return true.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;Rationale:&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; Logging is a nice feature but can have performance&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * impact.  If we simply call logger's log method, even if&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * the logging level is lower than stated, arguments get&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * evaluated. We typically have string concatenations in our&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * log message which can have significant impact on memory&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * fragmentation and speed.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; Some approaches use conditional which is much better&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * performance-wise.  I don't like this approach as the&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * statement is still there.  &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; This approach suggests&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * using &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;assert&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;.  When program is started with&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * '-ea', logging is 'on'. When program is started without&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * assertions enabled, the logging statements are completely&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * optimized out.  &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; Typical example:&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;pre&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * import org.java3declipse.logger.ILogger;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * import org.java3declipse.logger.Logger;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * public class MyClass {&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *   private static ILogger logger =&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *       Logger.getLogger(MyClass.class.getSimpleName());&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *     &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *   public MyClass() { &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *     assert logger.info("MyClass constructor"); &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *   } &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * }&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="type"&gt;@author&lt;/span&gt;&lt;span class="comment"&gt; Aleksandar Ristovski&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;ILogger&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;warning&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;И имплементацији истог:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="comment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Copyright (c) 2007 Aleksandar Ristovski.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * All rights reserved. This program and the accompanying&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * materials are made available under the terms of the&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Eclipse Public License v1.0 which accompanies this&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * distribution, and is available at&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="url"&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Contributors:&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *    Aleksandar Ristovski - initial API and implementation&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;package&lt;/span&gt;&lt;span class="normal"&gt; org&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;java3declipse&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logger&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;io&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;ByteArrayOutputStream&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;io&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;PrintStream&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;ConsoleHandler&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Formatter&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Handler&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Level&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;import&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;LogRecord&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Logger class - default implementation of ILogger interface.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * Wrapper for a generic logger. This class provides default&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * implementation for ILogger interface. &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="type"&gt;@see&lt;/span&gt;&lt;span class="comment"&gt; ILogger&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; * &lt;/span&gt;&lt;span class="type"&gt;@author&lt;/span&gt;&lt;span class="comment"&gt; Aleksandar Ristovski&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;Logger&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;implements&lt;/span&gt;&lt;span class="normal"&gt; ILogger &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span class="normal"&gt; ILogger logger_&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="comment"&gt;/** Constructor, using initialized&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;java.util.logging.Logger&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="type"&gt;@param&lt;/span&gt;&lt;span class="comment"&gt; logger - initialized&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;java.util.logging.Logger&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     */&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;Logger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Logger logger&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        logger_ &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;JavaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;logger&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="comment"&gt;/** Constructor - using user implementation of ILogger.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * This constructor can be used if logger other than&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;java.util.logging.Logger&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; is desired.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="type"&gt;@param&lt;/span&gt;&lt;span class="comment"&gt; logger - initialized object that&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * implements &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;ILogger&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt; interface&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     */&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;Logger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;ILogger logger&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        logger_ &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; logger&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;warning&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;warning&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; logger_&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;JavaUtilLogger&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;implements&lt;/span&gt;&lt;span class="normal"&gt; ILogger &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;final&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Logger javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;JavaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Logger logger&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; logger&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;warning&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;warning&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;severe&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;error&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;log&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;SEVERE&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;info&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String string&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable e&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;log&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;INFO&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; string&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; e&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;log&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;FINE&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; msg&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;debug&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; Throwable t&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            javaUtilLogger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;log&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;FINE&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; msg&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; t&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="classname"&gt;SimpleFormatter&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;extends&lt;/span&gt;&lt;span class="normal"&gt; Formatter &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        @Override&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; String &lt;/span&gt;&lt;span class="function"&gt;format&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;LogRecord record&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            StringBuffer sb &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;StringBuffer&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;80&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;final&lt;/span&gt;&lt;span class="normal"&gt; String ln &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getLoggerName&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;final&lt;/span&gt;&lt;span class="normal"&gt; String msg &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getMessage&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; level &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getLevel&lt;/span&gt;&lt;span class="symbol"&gt;().&lt;/span&gt;&lt;span class="function"&gt;intValue&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;level &lt;/span&gt;&lt;span class="symbol"&gt;==&lt;/span&gt;&lt;span class="normal"&gt; Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;INFO&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;intValue&lt;/span&gt;&lt;span class="symbol"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"[INFO] "&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;level &lt;/span&gt;&lt;span class="symbol"&gt;==&lt;/span&gt;&lt;span class="normal"&gt; Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;WARNING&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;intValue&lt;/span&gt;&lt;span class="symbol"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"[WARNING] "&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;level &lt;/span&gt;&lt;span class="symbol"&gt;==&lt;/span&gt;&lt;span class="normal"&gt; Level&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;SEVERE&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;intValue&lt;/span&gt;&lt;span class="symbol"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"[SEVERE] "&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;!=&lt;/span&gt;&lt;span class="normal"&gt; ln&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;              sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getLoggerName&lt;/span&gt;&lt;span class="symbol"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;              &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;ln&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;length&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;+&lt;/span&gt;&lt;span class="normal"&gt; msg&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;length&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;gt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;75&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                  sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;              &lt;/span&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                  sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="specialchar"&gt;\t&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getMessage&lt;/span&gt;&lt;span class="symbol"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;final&lt;/span&gt;&lt;span class="normal"&gt; Throwable thr &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; record&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getThrown&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;!=&lt;/span&gt;&lt;span class="normal"&gt; thr&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                ByteArrayOutputStream btbuff &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                    &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;ByteArrayOutputStream&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="number"&gt;80&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Exception: "&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                thr&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;printStackTrace&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;PrintStream&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;btbuff&lt;/span&gt;&lt;span class="symbol"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;btbuff&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;toString&lt;/span&gt;&lt;span class="symbol"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;                sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;append&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="specialchar"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; sb&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;toString&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="comment"&gt;/** Convenience routine. &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * Creates logger based on java.util.logging.Logger&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * class.&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="type"&gt;@param&lt;/span&gt;&lt;span class="comment"&gt; ID - logger id. Typically&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;Classname.class.getSimpleName()&lt;/span&gt;&lt;span class="keyword"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     * &lt;/span&gt;&lt;span class="type"&gt;@return&lt;/span&gt;&lt;span class="comment"&gt; logger &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;     */&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; ILogger &lt;/span&gt;&lt;span class="function"&gt;getLogger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;String ID&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Logger logger &lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;            &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; java&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;util&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;logging&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="normal"&gt;Logger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;getLogger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;ID&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        Handler h &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;ConsoleHandler&lt;/span&gt;&lt;span class="symbol"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        h&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;setFormatter&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;SimpleFormatter&lt;/span&gt;&lt;span class="symbol"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        logger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;setUseParentHandlers&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        logger&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;addHandler&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;h&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;Logger&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;logger&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-4125875590144173639?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/4125875590144173639/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/05/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4125875590144173639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4125875590144173639'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/05/blog-post.html' title='Условна дијагностика у јави'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-5130783947407931371</id><published>2009-04-25T17:50:00.000-07:00</published><updated>2009-04-25T18:01:16.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QNX'/><category scheme='http://www.blogger.com/atom/ns#' term='оперативни систем'/><category scheme='http://www.blogger.com/atom/ns#' term='Neutrino'/><title type='text'>QNX operativni sistem - tekst objavljen u PCPress</title><content type='html'>Ово је оригинални текст који је са неким мањим изменама објављен у часопису PCPress, у летњем двоброју 2008 (број 146).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QNX Operativni Sistem&lt;br /&gt;&lt;br /&gt;Ugrađeni računarski sistemi1) su danas u najširoj primeni: od digitalnih foto aparata, mobilnih telefona pa do upravljačkih sistema na avionima i satelitima. Ovi sistemi su u proteklih nekoliko decenija, od jednostavnih kontrolera sa specifičnim softverom za određen upravljački zadatak prerasli u kompleksne sisteme na kojima se izvršava mnoštvo aplikacija – od kritičnih upravljačkih aplikacija do grafičkog korisničkog interfejsa. Porast broja aplikacija koje takvi uređaji istovremeno izvršavaju je neizbežno postavio zahtev za operativnim sistemom koji bi to omogućio a da pri tome ne kompromituje stabilnost i odziv sistema u realnom vremenu za sve vremenski kritične zadatke. U ovom tekstu će biti predstavljen jedan takav operativni sistem, Neutrino RTOS2) kanadske firme QNX Software Systems.&lt;br /&gt;&lt;br /&gt;Autor: Aleksandar Ristovski&lt;br /&gt;&lt;br /&gt;O QNX Software Systems&lt;br /&gt;&lt;br /&gt;QNX [1] je kanadska firma osnovana početkom 80-tih godina, kada su njeni osnivači Gordon Bel i Den Dodž primenili stečeno znanje sa fakulteta o RTOS i napravili komercijalan proizvod. Sa vremenom je kompanija rasla i u periodu od oko 27 godina od firme sa dva zaposlena prerasla u kompaniju od nekih 300 zaposlenih i mrežom kancelarija za podršku i prodaju na više kontinenata.&lt;br /&gt;&lt;br /&gt;Evolucija&lt;br /&gt;&lt;br /&gt;QNX-ov prvi ozbiljan komercijalan uspeh je bio napravljen operativnim sistemom koji se zvao „QNX4“. Već sa QNX4 QNX je nudio dobru podršku za različite vrste perifernih uređaja, ali još uvek bio ograničen na Intelove 32-bitne x86 procesore i platforme bazirane na njima. Podrška multiprocesorskim sistemima nije postojala, a programski interfejs je bio specifičan za QNX4. Ipak, veliki uspeh ovog operativnog sistema je obezbedio važno mesto QNX kompanije u svetu ugrađenih računarskih sistema i utabao put za sledeći veoma uspešan operativni sistem za rad u realnom vremenu nazvan Neutrino.&lt;br /&gt;&lt;br /&gt;Neutrino operativni sistem je bio prirodna evolucija QNX4 operativnog sistema. Stratezi QNX kompanije su pravilno procenili da su osnovni sputavajući faktori za dalji rast bili ograničena podrška savremenih procesora i nestandardni programski interfejs. Tako je odlučeno da osnovne novine u Neutrino operativnom sistemu budu podrška za još četiri procesorske familije: SuperHitachi (SH4), Mips32, PowerPC i Arm, kao i standardizacija programskog interfejsa na osnovu POSIKS3) standarda.&lt;br /&gt;&lt;br /&gt;Arhitektura jezgra&lt;br /&gt;&lt;br /&gt;QNX operativni sistemi spadaju u red mikro-jezgarnih operativnih sistema. Svi procesi se izvršavaju u zasebnim zaštićenim korsničkim adresnim prostorima što je obezbeđeno hardverskim menadžmentom memorije (MMU). Komunikacija izmedju procesa se vrši razmenom poruka4).&lt;br /&gt;&lt;br /&gt;Mikro-jezgarna arhitektura je u QNX operativnim sistemima implementirana veoma rigorozno: u zaštićenom režimu rada se izvršava samo mikro-jezgro, dok sve drugo, uključujući drajvere, fajl sistem, protokole, pa čak i proces menadžer radi svaki u svom zasebnom korisničkom adresnom prostoru. To praktično znači da svaka od tih komponenti može da se zaustavi, zameni i ponovo startuje bez zaustavljanja rada mikro jezgra - mogućnost kojom malo drugih mikro-jezgarnih operativnih sistema mogu da se pohvale.&lt;br /&gt;&lt;br /&gt;Jedna od najvažnijih karakteristika operativnog sistema jeste strategija raspoređivanja niti izvšavanja5). QNX jezgro nudi raznovrsne strategije raspoređivanja izvršavanja programskih niti što je takođe jedna od karakteristika Neutrina. Osim uobičajenih, postoje i patentirane strategije kao što je adaptivno raspoređivanje po particijama6) koji obezbeđuje visoku odzivnost sistema čak i u slučajevima u kojima jedna od niti visokog prioriteta greškom uzima preveliki procenat procesorskog vremena [3].&lt;br /&gt;Danas takođe veoma važna je i podrška višeprocesorskim sistemima a Neutrino RTOS tu podršku nudi na bazi simetričnih multiprocesorskih sistema (SMP) [5].&lt;br /&gt;Podrška razvoju aplikacija&lt;br /&gt;&lt;br /&gt;Pored jezgra, QNX nudi i čitav niz softverskih paketa za podršku različitim platformama8). Tu je i niz programa za POSIKS kompatibilno okruženje, kao i razvojni alati. Razvojni alati su bazirani na GNU kompajleru (gcc) [4] i debageru (gdb) [5] čije prilagođene varijante dolaze sa razvojnim alatima. Grafičko razvojno okruženje za razvoj aplikacija "Momentics" bazriano je na Eclipse platformi  i njenoj CDT ekstenziji [7]. Iako je teoretski moguće programirati u različitim programskim jezicima, najčešće se aplikacije razvijaju u C i C++. Java virtuelna mašina je takođe dostupna.&lt;br /&gt;&lt;br /&gt;Ugrađeni računarski sistemi često nemaju nikakav prikaz (tzv. "bezglavi" uređaji) ali nisu retki sistemi od kojih se traži bogata grafika. Za takve primene QNX nudi Foton9), svoju grafičku platformu, a odskora i grafički sistem baziran na Adobe Flash. Foton je dosta siromašan u poređenju sa uobičajenim desktop grafičkim okruženjima na koje ste navikli, ali je svejedno simpatičan i zadovoljava većinu potreba u ugrađenom računarskom svetu. Nova inicijativa sa Adobe Flash je veoma interesantna: umesto da nudi grafičku platformu opšte namene po ugledu na desktop računare (Foton), QNX je odlučio da ponudi mogućnost razvoja kompletnog grafičkog okruženja u Adobe Flash-u [8]. Ovo ima i te kako smisla ako se pogleda u kakve uređaje Neutrino ide: na primer, mobilnom telefonu verovatno ne treba standardna grafička komponenta prozorskog okvira, paleta aplikacija i slično. Mnogo je verovatnije da će dizajner uređaja želeti da napravi svoju sopstvenu varijantu korisničkog interfejsa sa lepim animacijama i jedinstvenim izgledom, a Adobe Flash upravo to omogućava. Da stvar bude bolja, znanje koje su programeri stekli programirajući "action script" za veb stranice mogu gotovo direktno da primene i ovde.&lt;br /&gt;&lt;br /&gt;Otvoren izvorni kod i otvoreni razvoj&lt;br /&gt;&lt;br /&gt;Prošle godine, krajem 2007-me, QNX je napravio interesntan potez. Otvorio je svoj izvorni kod koji se sada može pregledati i skinuti preko Interneta. Za nekomercijalne primene je besplatan što znači da ga može koristiti svako za učenje i evaluaciju. Ova činjenica se rado koristi po fakultetima širom sveta gde se Neutrino koristi u raznim istraživačkim projektima.&lt;br /&gt;&lt;br /&gt;Osim otvorenog izvornog koda, QNX je takođe "otvorio" svoj razvoj. Tako na interesnim grupama [2] možete uživo pratiti šta se događa, koji bagovi su ispravljeni, o kakvim novinama se razmišlja i slično. Možete čak i da učestvujete u diskusijama ukoliko ste zaintersovani.&lt;br /&gt;&lt;br /&gt;Ipak, primena u komercijalnim proizvodima nije besplatna i podleže uobičajenim poslovnim obavezama a u skladu sa licencom. Cena za komercijalne proizvode varira u velikom rasponu, plaća se po isporučenom uređaju6) a obavezna je i kupovina razvojnog okruženja. Ovo razvojno okruženje se takođe može skinuti sa Interneta i podleže sličnoj licenci kao i izvorni kod, odnosno za nekomercijalnu upoterbu i u akademske svrhe je besplatan.&lt;br /&gt;&lt;br /&gt;Za entuzijaste&lt;br /&gt;Za one zainteresovane da se bliže upoznaju sa Neutrinom, sve što je potrebno za početak je brza Internet konekcija. Na stranicama interesnih grupa možete naći veze na potrebne fajlove za instalaciju [11]. Registracija korisničkog naloga je obavezna, ali besplatna. Uobičajeno je da se za razvoj ("host") koriste Windows ili Linux mašine, ali je moguće raditi i direktno na Neutrinu. Ja, konkretno, koristim uglavnom Windows ili Linux za razvoj a kao ciljnu mašinu koristim ili VirtualPC [9] ili VMWare [10] virtuelnu mašinu. Za uputstvo za instalaciji i brzi početak, pogledajte [12].&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Korisne Internet adrese&lt;br /&gt;&lt;br /&gt;[1] QNX početna stranica &lt;a href="http://www.qnx.com"&gt;http://www.qnx.com&lt;/a&gt;&lt;br /&gt;[2] QNX stranica za intersnu grupu &lt;a href="http://community.qnx.com"&gt;http://community.qnx.com&lt;/a&gt; (besplatna registracija potrebna za pristup izvornom kodu)&lt;br /&gt;[3] POSIKS standard &lt;a href="http://www.unix.org/single_unix_specification/"&gt;http://www.unix.org/single_unix_specification/&lt;/a&gt; (besplatna registracija obavezna), &lt;a href="http://en.wikipedia.org/wiki/POSIX"&gt;http://en.wikipedia.org/wiki/POSIX&lt;/a&gt;&lt;br /&gt;[4] GCC - kompajler &lt;a href="http://gcc.gnu.org/"&gt;http://gcc.gnu.org/&lt;/a&gt;&lt;br /&gt;[5] GDB - debager &lt;a href="http://sourceware.org/gdb/"&gt;http://sourceware.org/gdb/&lt;/a&gt;&lt;br /&gt;[6] Eclipse platforma &lt;a href="http://www.eclipse.org/"&gt;http://www.eclipse.org/&lt;/a&gt;&lt;br /&gt;[7] QNX SMP TDK: &lt;a href="http://photon.qnx.com/download/download/9421/smp_tdk.pdf"&gt;http://photon.qnx.com/download/download/9421/smp_tdk.pdf&lt;/a&gt;&lt;br /&gt;[8] QNX i Adobe Flash: &lt;a href="http://www.qnx.com/news/pr_2609_1.html"&gt;http://www.qnx.com/news/pr_2609_1.html&lt;/a&gt;&lt;br /&gt;[9] Virtual PC - besplatan ali dostupan samo za Windows &lt;a href="http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx"&gt;http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx&lt;/a&gt;&lt;br /&gt;[10] VMWare - &lt;a href="http://www.vmware.com/"&gt;http://www.vmware.com/&lt;/a&gt;&lt;br /&gt;[11] QNX Momentics - &lt;a href="http://www.qnx.com/products/getmomentics/"&gt;http://www.qnx.com/products/getmomentics/&lt;/a&gt;&lt;br /&gt;[12] Uputstvo za instalaciju i početak: &lt;a href="http://www.qnx.com/developers/docs/6.3.2/momentics/quickstart/about.html"&gt;http://www.qnx.com/developers/docs/6.3.2/momentics/quickstart/about.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fusnote&lt;br /&gt;&lt;br /&gt;1) engl. Embedded systems&lt;br /&gt;2) engl. Real Time Operating System - operativni sistem za rad u realnom vremenu&lt;br /&gt;3) eng. POSIX - Portable Operating System Interface&lt;br /&gt;4) engl. Message Passing&lt;br /&gt;5) engl. Thread Scheduling&lt;br /&gt;6) engl. Adaptive Partition Scheduling&lt;br /&gt;7) engl. Runtime&lt;br /&gt;8) engl. Board Support Package&lt;br /&gt;9) engl. Photon&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-5130783947407931371?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/5130783947407931371/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/qnx-operativni-sistem-ugraeni.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/5130783947407931371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/5130783947407931371'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/qnx-operativni-sistem-ugraeni.html' title='QNX operativni sistem - tekst objavljen u PCPress'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-6602659276780752064</id><published>2009-04-23T18:35:00.000-07:00</published><updated>2009-04-24T04:01:03.696-07:00</updated><title type='text'>LaTeX и ћирилица</title><content type='html'>Коначно сам, уз помоћ &lt;a href="http://alas.matf.bg.ac.rs/~mr99164/index.php"&gt;Страхиње Радића&lt;/a&gt;, успео да генеришем ћирилични текст из латекса.&lt;br /&gt;&lt;br /&gt;Још увек није савршено јер немам "babel" модул (не знам тачно из ког разлога), па сам морао да искоментаришем ту линију.&lt;br /&gt;&lt;br /&gt;\documentclass{article}&lt;br /&gt;\usepackage[utf8x]{inputenc}&lt;br /&gt;\usepackage[T2A]{fontenc}&lt;br /&gt;% \usapackage{babel}&lt;br /&gt;\begin{document}&lt;br /&gt;АБВГДЂ % наравно, сачувано као УТФ-8&lt;br /&gt;\end{document}&lt;br /&gt;&lt;br /&gt;Следећи корак, генерисање хтмл-а из латекса. Постоји програм, latex2html који на жалост не ради код мене, али верујем да могу да га оспособим. Крајњи циљ је да пишем ове чланке за вебник (блог) у латексу а онда генеришем одговарајући хтмл. Треба "потрефити" стилове како бих могао да користим ".css".&lt;br /&gt;&lt;br /&gt;О том у неком следећем издању.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-6602659276780752064?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/6602659276780752064/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/latex.html#comment-form' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6602659276780752064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6602659276780752064'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/latex.html' title='LaTeX и ћирилица'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-6028925783236626864</id><published>2009-04-14T20:28:00.001-07:00</published><updated>2009-04-14T20:34:16.277-07:00</updated><title type='text'>Форматирање изворног кода за вебник</title><content type='html'>После дужег тражења одговарајућег алата за форматирање изворног кода који се појављује у вебнику, коначно сам нашао задовољавајуће решење.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Користим "GNU source-highlight" &lt;a href="http://www.gnu.org/software/src-highlite/"&gt;http://www.gnu.org/software/src-highlite/&lt;/a&gt; .&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Са командне линије радим ово:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;$ source-highlight --no-doc --css=code.css test.c&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;где је садржај code.css овакав:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9 by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="normal"&gt;body &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="property"&gt;background-color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;white&lt;/span&gt;&lt;span class="normal"&gt;;  &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* the color for context lines (when specified with line ranges) */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.context&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;gray&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="selector"&gt;.keyword&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.type&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.usertype&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="selector"&gt;.classname&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;teal&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.string&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;red&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-family:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;monospace&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.regexp&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;orange&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.specialchar&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;pink&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-family:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;monospace&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.comment&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;brown&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-style:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;italic&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.number&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;purple&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.preproc&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkblue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.symbol&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkred&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.function&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;black&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.cbracket&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;red&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.todo&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;background-color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;cyan&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* line numbers */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.linenum&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;black&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-family:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;monospace&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Internet related */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.url&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;text-decoration:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;underline&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-family:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;monospace&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* other elements for ChangeLog and Log files */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.date&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.time&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="selector"&gt;.file&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkblue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.ip&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="selector"&gt;.name&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* for Prolog, Perl */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.variable&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.italics&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-style:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;italic&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.bold&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-weight:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;bold&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* for LaTeX */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.underline&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;text-decoration:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;underline&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.fixed&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;green&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-family:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;monospace&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.argument&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="selector"&gt;.optionalargument&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.math&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;orange&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.bibtex&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* for diffs */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.oldfile&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;orange&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.newfile&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.difflines&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* for css */&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.selector&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;purple&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.property&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;blue&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="selector"&gt;.value&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="property"&gt;color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;darkgreen&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="property"&gt;font-style:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="value"&gt;italic&lt;/span&gt;&lt;span class="normal"&gt;; &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Затим сам исти садржај додао у шаблон блога, али без "body" линије. Уместо ње сам додао:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="normal"&gt;pre &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="property"&gt;background-color:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;#EEEEFF&lt;/span&gt;&lt;span class="normal"&gt;;  &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;И то је све.  Још увек има простора за убрзавање овог процеса, али елементи су ту.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-6028925783236626864?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/6028925783236626864/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6028925783236626864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/6028925783236626864'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/blog-post.html' title='Форматирање изворног кода за вебник'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-2684822809429966415</id><published>2009-04-14T06:42:00.000-07:00</published><updated>2009-04-15T10:36:59.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assert'/><category scheme='http://www.blogger.com/atom/ns#' term='асерт'/><category scheme='http://www.blogger.com/atom/ns#' term='ц'/><title type='text'>Assert</title><content type='html'>Волим да користим асерте. Корисни су као само документујући код али и као помоћ при развоју.&lt;br /&gt;&lt;br /&gt;Асерти су провере истинитости одређеног израза. Уколико евалуација израза који се прослеђује макроу „assert” за резултат даје нулу, програм се прекида уз поруку о изразу, имену фајла и линији. Порука може да се разликује у зависности од компајлера и система на коме се програмира, али ће све мање-више имати одређену информацију о томе где се асерт десио.&lt;br /&gt;&lt;br /&gt;Када се програм искомпајлира са дефинисаним макроом „NDEBUG”, асерти нестају (макро assert бива дефинисан као ((void)0) и избачен као линија без ефекта).&lt;br /&gt;&lt;br /&gt;Током развоја, важно је користити програм компајлиран без овог макроа (односно са укљученим асертима).&lt;br /&gt;&lt;br /&gt;Један тривијалан пример:&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre class="code-body"&gt;&lt;tt&gt;&lt;b&gt;&lt;font color="#000080"&gt;#include&lt;/font&gt;&lt;/b&gt; &lt;font color="#FF0000"&gt;&amp;lt;assert.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#000080"&gt;#include&lt;/font&gt;&lt;/b&gt; &lt;font color="#FF0000"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#009900"&gt;int&lt;/font&gt; &lt;b&gt;&lt;font color="#000000"&gt;mojstrlen&lt;/font&gt;&lt;/b&gt;&lt;font color="#990000"&gt;(&lt;/font&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;char&lt;/font&gt; &lt;font color="#990000"&gt;*&lt;/font&gt; &lt;b&gt;&lt;font color="#0000FF"&gt;const&lt;/font&gt;&lt;/b&gt; p&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF0000"&gt;{&lt;/font&gt;&lt;br /&gt;   &lt;b&gt;&lt;font color="#000000"&gt;assert&lt;/font&gt;&lt;/b&gt;&lt;font color="#990000"&gt;(&lt;/font&gt;p &lt;font color="#990000"&gt;!=&lt;/font&gt; NULL&lt;font color="#990000"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   &lt;b&gt;&lt;font color="#0000FF"&gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color="#000000"&gt;strlen&lt;/font&gt;&lt;/b&gt;&lt;font color="#990000"&gt;(&lt;/font&gt;p&lt;font color="#990000"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF0000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;У примеру се види предност (и мана) овог приступа. Иако не можемо да забранимо кориснику функције да проследи NULL вредност, омогућујемо му да открије своју грешку у току развоја. Такође, само кратким погледом на функцију кориснику (програмеру) ће бити јасно да треба да обезбеди не-нул вредност.&lt;br /&gt;&lt;br /&gt;Сама чињеница да асерти не постоје у коначном програму који се испоручује их чини адекватним само за оне случајеве који не смеју да се десе на терену, али истовремено их чине идеалним за време тестирања.&lt;br /&gt;&lt;br /&gt;Рецимо да хоћемо да направимо робусну библиотеку и затим је дистрибуирамо корисницима од којих не можемо да очекујемо да знају да вредност показивача не сме да буде нула, онда асерт није довољан, а можда ни адекватан. У том случају би било примереније урадити нешто овако:&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;mojstrlen&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; p&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;p &lt;/span&gt;&lt;span class="symbol"&gt;==&lt;/span&gt;&lt;span class="normal"&gt; NULL&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;strlen&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;p&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Као правило, ја користим асерте на функцијама које нису експортоване из библиотека, него су намењене за коришћење унутар једног програма. Како често није очигледно шта одређен логички исказ проверава, онда уз исказ додам и текст који описује проверу. У примеру горе, то би изгледало овако:&lt;br /&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;mojstrlen&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; p&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="function"&gt;assert&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;p &lt;/span&gt;&lt;span class="symbol"&gt;!=&lt;/span&gt;&lt;span class="normal"&gt; NULL &lt;/span&gt;&lt;span class="symbol"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;!!&lt;/span&gt;&lt;span class="string"&gt;"Pokazivac 'p' ne sme biti NULL"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;   &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;strlen&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;p&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-2684822809429966415?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/2684822809429966415/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/assert.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2684822809429966415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/2684822809429966415'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/assert.html' title='Assert'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-1145769411949272763</id><published>2009-04-08T18:39:00.001-07:00</published><updated>2009-04-15T08:36:50.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ц++'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='конст'/><category scheme='http://www.blogger.com/atom/ns#' term='const correctness'/><title type='text'>конст коректност 2</title><content type='html'>&lt;div&gt;&lt;br /&gt;Интересантност о којој до данас нисам мислио. Колега ми је отворио очи. Наиме, ради се овоме: колега је послао фајл са Ц кодом на преглед. Његов код је имао функције које су изгледале отприлико овако:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.9&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="comment"&gt;/* Primer const argumenta u definiciji. */&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;foo&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; bar&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;bar &lt;/span&gt;&lt;span class="symbol"&gt;&amp;gt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;          global_bar &lt;/span&gt;&lt;span class="symbol"&gt;=&lt;/span&gt;&lt;span class="normal"&gt; bar &lt;/span&gt;&lt;span class="symbol"&gt;-&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;На то сам ја коментарисао да обично не "губим" време декларишући формални аргумент конст, на шта ми је одговорио (потпуно исправно) да је у дефиницији конст врло корисна, за разлику од декларације.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Конст формални аргумент у декларацији сам коментарисао, али ја лично никада нисам размишљао о томе да дефиниција може да дода модификатор конст формалном аргументу, а да тиме не дефинише неку нову функцију.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;На пример, нека је у заглављу оваква декларација:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Deklaracija funkcije.  */&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;funkcija&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;А имплементација може овако:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Definicija funkcije.  */&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;funkcija&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; ime&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;// ...&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Заиста, овако се кориснику функције (који обично гледа прототип декларисан у заглављу) не намеће имплементациони детаљ за њега (корисника) небитан, док се читаоцу имплементације одмах даје до знања да се вредност формалног аргумента "ime" неће мењати у телу функције. Дакле, даје читаоцу сличну информацију као и конст модификатор на локалној варијабли.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Даље је интересантно приметити да додавање конст модификатора формалном аргументу у декларацији у суштини не мења декларацију. На пример, ове две декларације декларишу исту функцију.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Ekvivalentne deklaracije funkcije.  */&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;funkcija&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*);&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;funkcija&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Oва друга је очигледно рогобатнија и представља једну од оних декларација у којима сам причао и у претходном чланку.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-1145769411949272763?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/1145769411949272763/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/2.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1145769411949272763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/1145769411949272763'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/04/2.html' title='конст коректност 2'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-567383993398357391.post-4586774368779621</id><published>2009-03-22T09:43:00.000-07:00</published><updated>2009-04-15T08:34:55.006-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ц++'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='конст коректност'/><category scheme='http://www.blogger.com/atom/ns#' term='ц'/><category scheme='http://www.blogger.com/atom/ns#' term='const correctness'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>конст коректност</title><content type='html'>&lt;div&gt;Kључна реч "const" у језицима це и це плус плус.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;У пројектима често срећем код у којима се ова кључна реч не користи или се не користи доследно. То је штета јер доприноси не само читљивости него и преношењу идеје о томе шта се дешава у одговарајућој функцији ономе који је чита, док компајлер обезбеђује да коректност буде примењена.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Уместо много речи, ево неколико примера. Рецимо да имамо функцију која треба да као аргумент прими показивач на низ карактера. За пример приказујем три функције од којих свака као аргумент има показивач на низ карактера:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Deklaracije. */&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;f1&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt;tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;f2&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt;tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;f3&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt;tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;f4&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;f5&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; tekst&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;У чему је разлика између ових декларација? Наравно, у коришћењу речи конст.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Прва нам каже да ће низ на који показује формални параметар "tekst" можда бити мењан у функцији; друга функција нам каже да низ на који показује текст сигурно неће бити мењан унутар функције (али не говори ништа о томе да ли ће вредност аргумента "tekst" бити мењана, што са тачке гледишта корисника функције није ни битно).&lt;div&gt;&lt;br /&gt;&lt;div&gt;Трећа функција има идентично значенје као и функција "f2". Неко више воли такав запис, неко као у другој функији - све једно је. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Четврта функција поред тога што "обећава" да неће мењати низ на који показује формални аргумент, још казује да неће мењати ни вредност тог аргумента. Са тачке гледишта корисника функције, ово додатно конст је ирелевантно - позивној функцији је свеједно шта ће се са аргументом десити. Иако није неправилна, ова декларација можда мало непотребно оптерећује декларацију и ја је обично не користим. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Пета функција је дата само ради комплетности, ни овакву декларацију функције не користим јер, као што сам раније рекао, говори о нечему што онога ко користи функцију не занима. Семантички, идентична је функцији "f1", дакле низ на који показује аргумент може да буде мењан унутар функције.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Слично је са декларацијама променљивих, само што овде често има смисла користити и варијанте "char *const tekst;" и "const char * const tekst" у зависности од контекста.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;У це-плус-плусу постоји и коршћење речи конст у својству модификатора метода класе. Ево примера:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="comment"&gt;/* Jednostavan primer const kao &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;   modifikatora metoda.  */&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#include&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="preproc"&gt;#include&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;using std&lt;/span&gt;&lt;span class="symbol"&gt;::&lt;/span&gt;&lt;span class="normal"&gt;string&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;using std&lt;/span&gt;&lt;span class="symbol"&gt;::&lt;/span&gt;&lt;span class="normal"&gt;cout&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;using std&lt;/span&gt;&lt;span class="symbol"&gt;::&lt;/span&gt;&lt;span class="normal"&gt;endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;class Zaposleni&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;public&lt;/span&gt;&lt;span class="symbol"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="function"&gt;Zaposleni&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; string &lt;/span&gt;&lt;span class="symbol"&gt;&amp;amp;&lt;/span&gt;&lt;span class="normal"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="symbol"&gt;:&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;_ime&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;  virtual &lt;/span&gt;&lt;span class="symbol"&gt;~&lt;/span&gt;&lt;span class="function"&gt;Zaposleni&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="cbracket"&gt;{}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;  string &lt;/span&gt;&lt;span class="function"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"Pozvana ne-konst metoda."&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; _ime&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;  string &lt;/span&gt;&lt;span class="function"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"Pozvana konst metoda."&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; _ime&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="normal"&gt;private&lt;/span&gt;&lt;span class="symbol"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  string _ime&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;stampajZaposleni&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt;&lt;span class="normal"&gt; Zaposleni &lt;/span&gt;&lt;span class="symbol"&gt;&amp;amp;&lt;/span&gt;&lt;span class="normal"&gt;zap&lt;/span&gt;&lt;span class="symbol"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"U funkciji stampajZaposleni"&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; zap&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="function"&gt;main&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt;&lt;span class="normal"&gt; argc&lt;/span&gt;&lt;span class="symbol"&gt;,&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="type"&gt;char&lt;/span&gt;&lt;span class="symbol"&gt;*&lt;/span&gt;&lt;span class="normal"&gt; argv&lt;/span&gt;&lt;span class="symbol"&gt;[])&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  Zaposleni &lt;/span&gt;&lt;span class="function"&gt;zap&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"Mika"&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"Poziv preko konst deklarisane promenljive."&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="function"&gt;stampajZaposleni&lt;/span&gt;&lt;span class="symbol"&gt;(&lt;/span&gt;&lt;span class="normal"&gt;zap&lt;/span&gt;&lt;span class="symbol"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="string"&gt;"Sada poziv preko ne-konst deklarisane promenljive: "&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  cout &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; zap&lt;/span&gt;&lt;span class="symbol"&gt;.&lt;/span&gt;&lt;span class="function"&gt;ime&lt;/span&gt;&lt;span class="symbol"&gt;()&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="normal"&gt; endl&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="normal"&gt;  &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span class="normal"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="symbol"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="cbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Пример је тривијалан, али има једну интересантну тачку: који од два метода за име ће бити позван у функцији stampajZaposleni? Наравно, биће позване методе које су означене са конст јер смо и формални аргумент "zap" у функцији stampajZaposleni означили са конст у декларацији функције. Уколико искоментаришемо конст декларације метода "ime", откирћемо да програм више не може да се искомпајлира јер не-конст метода "ime" не "обећава" да неће мењати унутрашње стање објекта.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;За разлику од тога, у самој функцији "main" ће бити позвана не-конст метода јер је таква и декларација локалне променљиве "zap".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Закључак: конст коректност није претерано компликована за разумевање. Па ипак, уколико се добро не разуме и не користи правилно, брзо доводи до пројеката чија се конст коректност више не може поправити. Зато је важно од самог почетка пројекта правилно користити ову интересанту и веома корисну особину програмског језика.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/567383993398357391-4586774368779621?l=aleksandarristovski.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aleksandarristovski.blogspot.com/feeds/4586774368779621/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/03/blog-post.html#comment-form' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4586774368779621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/567383993398357391/posts/default/4586774368779621'/><link rel='alternate' type='text/html' href='http://aleksandarristovski.blogspot.com/2009/03/blog-post.html' title='конст коректност'/><author><name>Александар</name><uri>http://www.blogger.com/profile/07591709848278325246</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
