<?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-29226980</id><updated>2011-11-28T02:05:06.734+01:00</updated><category term='aplikacioni sloj'/><category term='Mockito'/><category term='flash'/><category term='projektni obrasci'/><category term='IT događaji'/><category term='baza znanja'/><category term='jdbc'/><category term='SQL'/><category term='connection pooling'/><category term='actioscript'/><category term='operaciona istraživanja'/><category term='maven'/><category term='dokuwiki'/><category term='algoritam'/><category term='sloj persistencije'/><category term='skalabilnost'/><category term='ibm'/><category term='tupljenje'/><category term='AI'/><category term='map reduce'/><category term='jetty'/><category term='spring'/><category term='Tomcate'/><category term='časopisi'/><category term='windows'/><category term='sloj korisničkog interfejsa'/><category term='jpa2'/><category term='humor'/><category term='linux'/><category term='hibernate'/><category term='dependency injection'/><category term='veštačka inteligencija'/><category term='cassandra'/><category term='fontovi'/><category term='java EE'/><category term='java'/><category term='LVM'/><category term='arch'/><category term='zanimljivosti'/><category term='IT vesti'/><category term='flex'/><category term='lotus notes'/><category term='regex'/><category term='free software'/><category term='android'/><category term='jpa'/><category term='projektni principi'/><category term='spring mail'/><category term='ubuntu'/><category term='machine learning'/><category term='domenski sloj'/><category term='baze'/><title type='text'>Zlatno ćoše</title><subtitle type='html'>Blog o informacionim tehnologijama uopšte. Od projektovanja, paterna i programiranja do operativnih sistema i mreža. Da ne bi bilo dosadno biće i zanimljivosti i vesti iz IT.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29226980.post-866325959971412628</id><published>2011-10-29T16:31:00.000+02:00</published><updated>2011-10-29T16:31:57.825+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring mail'/><title type='text'>Spring: how to send a mail</title><content type='html'>Spring has module for email sending. First one need to configure mail sender bean. Actually there are two mail sender implementations. The first one is MailSender that can be used for simple mails. For advanced mails (MIME support) JavaMailSender must be used. It is good practice to divide your configuration into several files, so we'll put mailing configuration into service-mail.xml (or you can choose your own name) and then include that file into main config file. Just for example we'll use gmail as SMTP server  so configuration looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; wrap-lines: false;"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"&gt;&lt;br /&gt; &lt;br /&gt;    &lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;&lt;br /&gt;        &lt;property name="host" value="smtp.gmail.com" /&gt;&lt;br /&gt;        &lt;property name="port" value="587" /&gt;&lt;br /&gt;        &lt;property name="username" value="test.mail" /&gt;&lt;br /&gt;        &lt;property name="password" value="foobarbuz" /&gt;&lt;br /&gt; &lt;br /&gt;        &lt;property name="javaMailProperties"&gt;&lt;br /&gt;           &lt;props&gt;&lt;br /&gt;                  &lt;prop key="mail.smtp.auth"&gt;true&lt;/prop&gt;&lt;br /&gt;                  &lt;prop key="mail.smtp.starttls.enable"&gt;true&lt;/prop&gt;&lt;br /&gt;               &lt;/props&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt; &lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Spring needs two additional libraries: javax.mail and javax.activation. For maven users: simply add dependency for javax.mail (groupId: javax.mail, artifactId: mail) into your projects pom.xml.&lt;br /&gt;&lt;br /&gt;Now we can implement our mailing service:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;@Service("mailService")&lt;br /&gt;public class MailServiceImpl implements MailService {&lt;br /&gt; &lt;br /&gt;    @Autowired&lt;br /&gt;    private JavaMailSender mailSender;&lt;br /&gt; &lt;br /&gt;    public final void setMailSender(final JavaMailSender p_mailSender) {&lt;br /&gt;        this.mailSender = p_mailSender;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public final JavaMailSender getMailSender() {&lt;br /&gt;        return mailSender;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    @Override&lt;br /&gt;    public final void sendMail(final String p_from, final String p_to, final String p_subject, final String p_msg) {&lt;br /&gt;        final MimeMessagePreparator preparator = new MimeMessagePreparator() {&lt;br /&gt;            @Override&lt;br /&gt;            public void prepare(final MimeMessage p_mimeMessage) throws Exception {&lt;br /&gt;                final MimeMessageHelper message = new MimeMessageHelper(p_mimeMessage);&lt;br /&gt;                message.setTo(p_to);&lt;br /&gt;                message.setFrom(p_from);&lt;br /&gt;                message.setSubject(p_subject);&lt;br /&gt;                message.setText(p_msg, true); // true means that our text is actually HTML!!!&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        mailSender.send(preparator);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we can use our service like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;mailService.sendMail(fromEmail, toEmail, subject, msg);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-866325959971412628?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/866325959971412628/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=866325959971412628&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/866325959971412628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/866325959971412628'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/10/spring-how-to-send-mail_29.html' title='Spring: how to send a mail'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-21142164520832691</id><published>2011-09-21T00:26:00.000+02:00</published><updated>2011-09-21T00:26:39.706+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arch'/><category scheme='http://www.blogger.com/atom/ns#' term='LVM'/><title type='text'>Instalacija Arch Linux-a na LVM i obratno</title><content type='html'>U prošlom postu opisao sam šta je to LVM i kako se pravi. Ali da bi LVM radio na Arch Linux-u mora se izvršiti određeno podešavanje i o teme će biti reči u ovom tekstu.&lt;br /&gt;&lt;br /&gt;Treba obratiti pažnju na 2 fajla. &lt;br /&gt;&lt;br /&gt; U rc.conf treba postaviti &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;USELVM="yes"&lt;/pre&gt;&lt;br /&gt; U mkinitcpio.conf treba da stoji: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;MODULES="dm_mod"&lt;br /&gt;. . .&lt;br /&gt;HOOKS="base udev autodetect pata scsi sata usb lvm2 filesystems usbinput"&lt;/pre&gt;&lt;br /&gt; Zatim traba ponovo naraviti initramfs: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;cd /boot&lt;br /&gt;mkinitcpion -p linux&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Manuelno mountovanje LVM particije&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; Ponekad je nužno ručno mountovati particiju, sa običnim je to lako: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;mount /dev/sda4 /mnt/arch&lt;/pre&gt;&lt;br /&gt; Ali to ne pali kod LVM particija. &lt;br /&gt;&lt;br /&gt; sa &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;pvs&lt;/pre&gt;&lt;br /&gt; saznajemo ime VG i na koje PV su u VG &lt;br /&gt;&lt;br /&gt; Recimo sa se VG zove VolGroup00, zatim sa: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;lvdisplay /dev/VolGroup00&lt;/pre&gt;&lt;br /&gt; izlistamo LV na VG &lt;br /&gt;&lt;br /&gt; Kad smo se odlučili koju LV (LogVol00 u primeru) ćemo mountovati radimo: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;vgscan --mknodes&lt;br /&gt;lvchange -a y /dev/VolGroup00/LogVol00&lt;br /&gt;mount /dev/VolGroup00/LogVol00 /mnt/lvm&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-21142164520832691?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/21142164520832691/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=21142164520832691&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/21142164520832691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/21142164520832691'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/09/instalacija-arch-linux-na-lvm-i-obratno.html' title='Instalacija Arch Linux-a na LVM i obratno'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-7565148016086869839</id><published>2011-09-18T14:02:00.001+02:00</published><updated>2011-09-21T00:26:48.964+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arch'/><category scheme='http://www.blogger.com/atom/ns#' term='LVM'/><title type='text'>Logical volume manager - LVM</title><content type='html'>LVM je način da linux dobije particije koje se mogu lako širiti i skupljati. Osim toga moguće je raditi apstrakciju diskova i particija, zgodno za sistem sa puno diskova. Nad LVM se često kombinuje sa softverskim RAID-om i enkripcijom.&lt;br /&gt;&lt;br /&gt;Pre nego što nastavimo dalje moramo defisati osnovne pojmove.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Physical volume - PV&lt;/b&gt;&lt;br /&gt;Disk ili particija diska koja je određena da se priključi u LVM. Particija treba da je tipa 8e Odnosno Linux/LVM. Pravi se npr. preko disk partition alata cfdisk ili fdisk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Volume groupe - VG&lt;/b&gt;&lt;br /&gt;VG je apstrakcija između PV i LV (niže opisano). VG je nešto kao disk van LVM rečnika. Razlika je što se VG može sastojati od više diskova/particija tj. phisical volume-a. VG se potom deli na logical volume-e. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Logical volume - LV&lt;/b&gt;&lt;br /&gt;Predstavlja ono što se u van LVM zove particijom. VG se izdeli na više LV. Pri tom se veličina LV odredi tako da se ne iskoristi čitava veličina VG, zato što se kasnije kad se ukaže potreba lako LV poveća ili smanji.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pravljenje LVM PV, VG i LV&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ovde ću prikazati način na koji se LVM pravi na Arch Linux-u. Na drugim distribucijama ne bi trebalo da se postupak mnogo razlikuje, komande za LVM su svuda iste.&lt;br /&gt;&lt;br /&gt;Pretpostavka je da smo prethodno napravili LVM particiju i da je ona na /dev/sda4&lt;br /&gt;&lt;br /&gt;Prvo treba proveriti da li je modul za LVM učitan u kernel: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;modprobe dm-mod&lt;/pre&gt;&lt;br /&gt;zatim na particiju koju smo napravili i koja je tipa 8e (LVM) napravimo PV: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;pvcreate /dev/sda4&lt;br /&gt;pvdisplay # prikazuje rezultat&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Zatim pravimo VG: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;vgcreate VolGroup00 /dev/sda4 # ime izabrati po želji&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Da imamo još PV da dodajemo u VG (osim ovog jednog sa /dev/sda4) radili bi ovo: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;vgextend VolGroup00 /dev/sdb1&lt;/pre&gt;&lt;br /&gt;A zatim na VG pravimo LV po izboru za sve particije koje nam trebaju: &lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;lvcreate -L 10G VolGroup00 -n lvroot # veličina, pripadajuca VG, ime LV&lt;br /&gt;..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dalje ukoliko se instalira početi sa instalacijom i tamo stvoriti filesysteme, ako je linux već instaliran onda mora ručno da se prave FS i da se mount-uju. Particije se sad vide preko device mappera pa mesto uobičajenog pristupa sa /dev/sda[x] referišemo se na njih u obliku:&lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;/dev/mapper/VG00-lvroot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Za file system na LV preporučujem EXT4 eventualno EXT3. Ta dva sistema se mogu povećavati a da ih nije potrebno umount-ovati nego je direktno - online moguće promeniti veličinu naviše. ReiserFS nije moguće smanjivati.&lt;br /&gt;&lt;br /&gt;Napomena: na LVM je moguće staviti sve linux particije. Ali ukoliko se koristi Grub 1 nije moguće imati boot particiju na LVM, osim ako nije Grub patchovan da to podrži (takav je Red Hatov). Grub 2 trebalo bi da podržava boot particiju na LVM. Swap particija zahteva drugačiju komandu za kreiranje LV da se prostor tog LV-a ne bi raspršio po disku/diskovima već da bi bio iz jednog dela. Pri tom se mnogi žale da kad dođe do popunjavanja swap-a LVM se zaglavi pa se preporučuje da swap bude van LVM. Mada, kad se swap popuni i na običnoj particiji linux se zaglupi...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-7565148016086869839?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/7565148016086869839/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=7565148016086869839&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7565148016086869839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7565148016086869839'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/09/logical-volume-manager-lvm.html' title='Logical volume manager - LVM'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-5769794885232227017</id><published>2011-09-02T08:01:00.002+02:00</published><updated>2011-09-02T09:50:51.425+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lotus notes'/><category scheme='http://www.blogger.com/atom/ns#' term='ibm'/><title type='text'>IBM Lotus Notes on Ubuntu: invalid character in revision number</title><content type='html'>Few days ago I needed to upgrade Lotus Notes 8.5.1 to 8.5.2 fixpack 2. IBM provides .deb packages and .sh scripts for smart upgrade.&lt;br /&gt;&lt;br /&gt;Upgrading to 8.5.2 version passed without any problem, but installing fixpack was problematic. I was getting:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;error in Version string '8.5.2-20110323.0837_FP2': invalid character in revision number&lt;/pre&gt;&lt;br /&gt;I have found a solution reading this &lt;a href="http://www-10.lotus.com/ldd/nd85forum.nsf/c6054cf2ea498b338525733900559bd1/4864ef72b45dd6108525785b000c7662?OpenDocument"&gt;post&lt;/a&gt; at Lotus forum but that post is too much bare. So I am giving a full explanation on how to solve this problem.&lt;br /&gt;&lt;br /&gt;The problem is in "_" character in control file that is part of .deb package. Also file paths with that character in .deb package makes a problem. So we need to unpack .deb file, edit control file, change file paths and pack it again in .deb file:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: shell; wrap-lines: false;"&gt;# make directory wiht same name as package but without extension&lt;br /&gt;mkdir ibm_lotus_notes_fixpack-8.5.2.i586&lt;br /&gt;&lt;br /&gt;# unpack .deb file in that directory&lt;br /&gt;cp ibm_lotus_notes_fixpack-8.5.2.i586.deb ibm_lotus_notes_fixpack-8.5.2.i586&lt;br /&gt;cd ibm_lotus_notes_fixpack-8.5.2.i586 &lt;br /&gt;ar x ibm_lotus_notes_fixpack-8.5.2.i586.deb &lt;br /&gt;rm ibm_lotus_notes_fixpack-8.5.2.i586.deb&lt;br /&gt; &lt;br /&gt;# we need to put content of control.tar.gz into DEBIAN directory which is subdirectory of ibm_lotus_notes_fixpack-8.5.2.i586&lt;br /&gt;mkdir DEBIAN&lt;br /&gt;mv control.tar.gz DEBIAN&lt;br /&gt;cd DEBIAN&lt;br /&gt;tar -xvf control.tar.gz&lt;br /&gt;rm control.tar.gz&lt;br /&gt;&lt;br /&gt;# now we need to edit control file end delete "_" character from Version: using favorite editor&lt;br /&gt;nano control&lt;br /&gt; &lt;br /&gt;# now we should extract data.tar.gz and remove "_" from file path&lt;br /&gt;cd ..&lt;br /&gt;tar xvf data.tar.gz&lt;br /&gt;rm data.tar.gz&lt;br /&gt;cd opt/ibm/lotus/notes&lt;br /&gt;mv fixpack_20110323.0837_FP2/ fixpack_20110323.0837FP2/&lt;br /&gt;&lt;br /&gt;# set root owner to the files and pack files into .deb package&lt;br /&gt;cd ../../../../&lt;br /&gt;sudo chown -R root.root .&lt;br /&gt;cd ..&lt;br /&gt;dpkg-deb -b ibm_lotus_notes_fixpack-8.5.2.i586/&lt;br /&gt;&lt;/pre&gt;IBM has tradition of braking fixpacks for Ubuntu. This explanation works on any fixpack you just need to adjust file names, but logic is the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-5769794885232227017?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/5769794885232227017/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=5769794885232227017&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5769794885232227017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5769794885232227017'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/09/ibm-lotus-notes-on-ubuntu-invalid.html' title='IBM Lotus Notes on Ubuntu: invalid character in revision number'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-5689087182369274400</id><published>2011-08-24T21:55:00.000+02:00</published><updated>2011-08-24T21:55:03.315+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='baze'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='machine learning'/><title type='text'>Учиться, учиться и еще раз учиться!</title><content type='html'>Stanford je objavio nekoliko programa učenja na koja se možete besplatno prijaviti.&lt;br /&gt;&lt;br /&gt;Machine Learning:&lt;br /&gt;&lt;a href="http://www.ml-class.com/"&gt;http://www.ml-class.com/&lt;/a&gt;&lt;br /&gt;Artificial intelligence: &lt;br /&gt;&lt;a href="http://www.ai-class.com/"&gt;http://www.ai-class.com/&lt;/a&gt;&lt;br /&gt;DB:&lt;br /&gt;&lt;a href="http://www.db-class.com/"&gt;http://www.db-class.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I za kraj par finih webinara za JPA i Spring:&lt;br /&gt;&lt;a href="http://javapassion.com/portal/webinar/webinar"&gt;http://javapassion.com/portal/webinar/webinar&lt;/a&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/29226980-5689087182369274400?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/5689087182369274400/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=5689087182369274400&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5689087182369274400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5689087182369274400'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/08/blog-post.html' title='Учиться, учиться и еще раз учиться!'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-2523467919789023470</id><published>2011-06-25T11:48:00.004+02:00</published><updated>2011-09-12T09:59:27.616+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='časopisi'/><title type='text'>Besplatni časopisi</title><content type='html'>Izbor 8 besplatnih online časopisa koji zavređuju pažnju, ukoliko znate neki koji nije na spisku oplemenite me :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BSD magazine&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://bsdmag.org/system/editions/photo1s/1741/medium/NanoBSD_and_ALIX_BSD_06_201.jpg?1306937677" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://bsdmag.org/system/editions/photo1s/1741/medium/NanoBSD_and_ALIX_BSD_06_201.jpg?1306937677" width="230" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;za sve BSD-ovce uključujući i MAC OSX-ovce. Deluje zanimljivo jer se dosta tekstova može primeniti i na linux. Imaju i napredne tekstove npr. o GIS-ovima i Cloud computing-u.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://bsdmag.org/"&gt;http://bsdmag.org/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PCLinuxOS Magazine&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.pclosmag.com/images/2011/June/June2011-452x350.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://www.pclosmag.com/images/2011/June/June2011-452x350.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Magazin koji pokriva jednu od boljih i laganijih distribucija linux sistema. Ima tesktove o linux softveru.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://pclosmag.com/"&gt;http://pclosmag.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FullCircle Magazine&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dl.fullcirclemagazine.org/cover/50/en.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://dl.fullcirclemagazine.org/cover/50/en.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Slično ko prethodni samo za najpolularnijji distro sadašnjice: Ubuntu&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://fullcirclemagazine.org/"&gt;http://fullcirclemagazine.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open Source Journal&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Žestoki softverski časopis za koji pišu svetske face, vrlo ozbiljan i kvalitetan&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://opensource-central.com/downloads.php"&gt;http://opensource-central.com/downloads.php&lt;/a&gt; (za 3. broj treba ručno dodati .pdf)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FYI&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://croz.net/var/corporate_site/storage/images/o_nama/fyi_by_croz/fyi_by_croz_broj_10_svibanj_2011/9373-1-cro-HR/fyi_by_croz_broj_10_svibanj_2011_fyi_left.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://croz.net/var/corporate_site/storage/images/o_nama/fyi_by_croz/fyi_by_croz_broj_10_svibanj_2011/9373-1-cro-HR/fyi_by_croz_broj_10_svibanj_2011_fyi_left.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ovo je for your information domaći časopis koji izlazi 2 put godšnje. Ima šarene teme iz enterprise programiranja i sistema, novosti sa tržišta itd. Vezan je za kompaniju koja ga izdaje ali uglavnom ne zamara s tim previše pa je zgodan i za šire narodne mase.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://croz.net/index.php/hrv/download"&gt;http://croz.net/index.php/hrv/download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Overload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Časopis koji je preporučio Vlada Stanković. Radi se o ozbiljnom časopisu za softverske inženjere i programere, najsličniji je Open Source Journal-u.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://accu.org/index.php/journals/c78/"&gt;http://accu.org/index.php/journals/c78/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Methods &amp;amp; Tools - Software development magazine&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Programming, Software Testing, Project Management, Jobs. Časopis koji dosta piše o alatima koji pomažu razvoj kao i o metodologijama i testiranju. Vrlo je praktičan, izlazi na 3 meseca a postoji još od '99.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://www.methodsandtools.com/mt/download.php"&gt;http://www.methodsandtools.com/mt/download.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PragPub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Časopis koji izlazi mesečno od The Pragmatic Bookshelf-a čije knjige obožavam jer su zabavne i sveže. Tako je i ovaj časopis namenjen cutting edge tehnologijama. Nema tu nekih starig i teških tema, nema tu nekog enterprise kenjanja, već Scala, Ruby, Clojure, Cloud... Savršen časopis za studente IT-a koji treba da gledaju u budućnost i sve one koji žele da ostanu na valu IT napretka.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://pragprog.com/magazines/"&gt;http://pragprog.com/magazines/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-2523467919789023470?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/2523467919789023470/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=2523467919789023470&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2523467919789023470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2523467919789023470'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2011/06/besplatni-casopisi.html' title='Besplatni časopisi'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-2033396683033495976</id><published>2010-12-30T21:28:00.001+01:00</published><updated>2011-01-01T16:30:36.321+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>K/Ubuntu i Windows 7 poređenje</title><content type='html'>Ovih dana sam dobio laptop sa instaliranim Win7. Bio je to povratak korenima (sad će me prozivati win ovisnici) jer je ipak 3.11 moj prvi OS :) Ali isto tako XP je bio poslednji a sa njima nisam imao dodir od 2007. godine.&lt;br /&gt;&lt;br /&gt;Utisci su pomešani. Win nije ružan OS. Task bar je promenjen, više nije tako lako primetiti program koji vam treba jer se ne ispisuju imena, ali bar deluje preglednije, no samo dok se ne otvori više instanci istog programa jer tad radi grupisanje. Očigledno je takav pristup iznuđen nepostojanjem više desktopa.&lt;br /&gt;&lt;br /&gt;Tako dođosmo do prve stvari za koju mi se čini da je Linux bolji: postojanje više desktopa. Mislio sam da je moguće srediti problem instalacijom dodataka. Čini mi se da je čak u XP postojao Power Toys dotatak za to... No više ga nema, a programe iz drugih izvora nisam stavljao jer sam u komentarima viđao da uzrokuju nestabilnost.&lt;br /&gt;&lt;br /&gt;Druga stvar koja me je nervirala a koju sam rešio je zamena z i y u layoutu za naš jezik. Kubuntu ima za svaki jezik više layouta. Npr. za našu latinicu ima postavka koja imitira ćirilicu tj. jednom tipkom se dobijaju digrafi nj, lj i dž. Takođe ima i layout u kojem su y i z na istom mestu kao i na US layoutu. Takvu postavku koristim i u latinici i u ćirilici. Srećom uz probanje 2 programčića problem je rešen.&lt;br /&gt;&lt;br /&gt;Windows je bolji kod instalacije nekih IBM programa. Neke od njih nije ni moguće koristiti na linux-u, neke je moguće ali treba da se čovek pomuči... &lt;strike&gt;VMWare Player je takođe lakše instalirati, s obzirom na to da je za najnoviji kernel potrebno patchovati distribuciju.&lt;/strike&gt; Problem sa Playerom je ispravljen u verziji 3.1.3 :D. No sve su to vlasnički programi, ili se moraju kupiti ili se moraš pomučiti da se prijaviš i ručno skidaš instalaciju (što je u linuxu krajnje neobično) za razliku od npr. VirtualBox-a koji radi savršeno. &lt;br /&gt;&lt;br /&gt;Po pitanju resursa... Linux tu dere Win-a. Prvo Win ne vidi više od 3 giga rama. Nešto sam tražio po netu, znam da ima PAE (physical address extension) za win, mislio sam da je to ugrađeno podrazumevano. Ipak komp koji imam je došao sa licenciranim win-om i to najnovijim i to Professional verzijom. Očekivao sam da vidi svu memoriju sa kojom je komp isporučen... Toliko sam verovao da nije do win-a da sam čačkao po netu, video neke 3 opcije koje se dodaju prosleđuju kernelu kod boot-a na MS sajtu. Ali su objašnjenja bila štura. Osim toga pročitao sam da je moguće da grafička uzima giga rama, te sam ne želeći da krivim win okrivio grafičku.&lt;br /&gt;&lt;br /&gt;Međutim kad sam na isti komp stavio Ubuntu videlo se da nije do grafičke. I dalje mi nije jasno kako je Linux toliko "pametniji" da sam instalira PAE kernel i vidi svih 4 giga a win ne? Koji je smisao da neko prodaje komp sa 4 giga a da se sa jednim možeš slikati?&lt;br /&gt;&lt;br /&gt;I to nije kraj. Na win-u sam terao VMWare image, a image ima gomilu servisa na sebi (uključujući 3 klastera). Image sam pojede preko 3 giga. Zato sam morao da u winu skrešem sve što se skresati da: uključim max performance u Advanced System Settings (i time dobijem win95 lnf), pogasim sve što čuči u SysTray-u, pogasim sve programe osim VMWare Player-a, čak i neke servise koji su mi nepotrebni sam gasio. I opet Win posle boot-a uzme oko 900 MB! Toliku memoriju a ne radi ništa...&lt;br /&gt;&lt;br /&gt;Za poređenje: &lt;br /&gt;1) moj Kubuntu uzme 814 MB pri tome: u pitanju je 64-bitna verzija koja inače troši više, podignut je KDE4 najglomazniji GUI od svih GUI-a u lin svetu, radi Akregator (rss čitač), radi Okular (učitana 2 pdf file), pokrenuto 3 deskopa, pokrenut twitter klijent, pokrenut clipboard menadžer, otvoren command prompt, otvoren file menadžer, podignut PostgresSQL ORDMS, DynamicDNS client, apache http server, ssh server, peerguardian ;), applet koji pokazuje vremensku prognozu i mnoge druge stvari kojih klot win nema. &lt;br /&gt;2) Ubuntu 32-bit: troši 360 MB sa upaljenim chat i twitter klijentom, 4 desktopa i Firefoxom u kojem pišem ovaj tekst :) On sam troši preko 60 MB. &lt;br /&gt;&lt;br /&gt;Dakle račun je jasan: 300MB od 4GB &gt;&gt;  900MB od 3GB. Na ovu informaciju treba dodati i činjenicu da linux mnogo bolje upravlja memorijom i procesima (nema zakovanu poziciju u fizičkoj memoriji u koju učitava biblioteke, duplo manji mu je deo memorije rezervisan za kernel) da bi priča bila potpuna.&lt;br /&gt;&lt;br /&gt;Na kraju mogu reći da mi je drago što sam ponovo došao u kontakt sa Win-om i uvideo sve njegove prednosti i mane. Imao sam priliku da direktno i merljivo uporedim 2 sistema i izvučem koliko-toliko nepristrasne zaključke. Eto da me ne bi zvali linux zilotom. A upravo me tako zovu MS ziloti. Kažem MS a ne win jer su svi oni profesionalno upleteni u win i njegovo okruženje: razni MS Office korisnici, VB i C# programeri, SQL server admini... Nikad nisam čuo java programera da toliko brani win jer java programer ničim nije vezan za MS okruženje, naprotiv što više napreduje u java mastera to se više druži sa unixoidima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-2033396683033495976?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/2033396683033495976/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=2033396683033495976&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2033396683033495976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2033396683033495976'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/12/kubuntu-i-windows-7-poreenje.html' title='K/Ubuntu i Windows 7 poređenje'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-7605730419516165467</id><published>2010-10-13T09:40:00.000+02:00</published><updated>2010-10-13T09:40:26.560+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>If Operating Systems Ran The Airlines...</title><content type='html'>If Operating Systems Ran The Airlines...&lt;br /&gt;&lt;br /&gt;UNIX Airways&lt;br /&gt;&lt;br /&gt;Everyone brings one piece of the plane along when they come to the airport. They all go out on the runway and put the plane together piece by piece, arguing non-stop about what kind of plane they are supposed to be building.&lt;br /&gt;&lt;br /&gt;Air DOS&lt;br /&gt;&lt;br /&gt;Everybody pushes the airplane until it glides, then they jump on and let the plane coast until it hits the ground again. Then they push again, jump on again, and so on...&lt;br /&gt;&lt;br /&gt;Mac Airlines&lt;br /&gt;&lt;br /&gt;All the stewards, captains, baggage handlers, and ticket agents look and act exactly the same. Every time you ask questions about details, you are gently but firmly told that you don't need to know, don't want to know, and everything will be done for you without your ever having to know, so just shut up.&lt;br /&gt;&lt;br /&gt;Windows Air&lt;br /&gt;&lt;br /&gt;The terminal is pretty and colourful, with friendly stewards, easy baggage check and boarding, and a smooth take-off. After about 10 minutes in the air, the plane explodes with no warning whatsoever.&lt;br /&gt;&lt;br /&gt;Windows NT Air&lt;br /&gt;&lt;br /&gt;Just like Windows Air, but costs more, uses much bigger planes, and takes out all the other aircraft within a 40-mile radius when it explodes.&lt;br /&gt;&lt;br /&gt;Windows XP Air&lt;br /&gt;&lt;br /&gt;You turn up at the airport,which is under contract to only allow XP Air planes. All the aircraft are identical, brightly coloured and three times as big as they need to be. The signs are huge and all point the same way. Whichever way you go, someone pops up dressed in a cloak and pointed hat insisting you follow him. Your luggage and clothes are taken off you and replaced with an XP Air suit and suitcase identical to everyone around you as this is included in the exorbitant ticket cost. The aircraft will not take off until you have signed a contract. The inflight entertainment promised turns out to be the same Mickey Mouse cartoon repeated over and over again. You have to phone your travel agent before you can have a meal or drink. You are searched regularly throughout the flight. If you go to the toilet twice or more you get charged for a new ticket. No matter what destination you booked you will always end up crash landing at Whistler in Canada.&lt;br /&gt;&lt;br /&gt;Linux Air&lt;br /&gt;&lt;br /&gt;Disgruntled employees of all the other OS airlines decide to start their own airline. They build the planes, ticket counters, and pave the runways themselves. They charge a small fee to cover the cost of printing the ticket, but you can also download and print the ticket yourself.&lt;br /&gt;&lt;br /&gt;When you board the plane, you are given a seat, four bolts, a wrench and a copy of the seat-HOWTO.html. Once settled, the fully adjustable seat is very comfortable, the plane leaves and arrives on time without a single problem, the in-flight meal is wonderful. You try to tell customers of the other airlines about the great trip, but all they can say is, "You had to do what with the seat?"&lt;br /&gt;&lt;br /&gt;Izvor: &lt;a href="http://ubuntuforums.org/"&gt;UbuntuForums&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-7605730419516165467?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/7605730419516165467/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=7605730419516165467&amp;isPopup=true' title='3 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7605730419516165467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7605730419516165467'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/10/if-operating-systems-ran-airlines.html' title='If Operating Systems Ran The Airlines...'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-3127580259458470126</id><published>2010-10-12T13:15:00.002+02:00</published><updated>2010-10-13T10:20:46.674+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zanimljivosti'/><title type='text'>#ubuntu channel dijalog :)</title><content type='html'>Danas sam radio upgrade KUbunta 10.04 na 10.10 pa sam napravio par grešaka i trebala mi je pomoć. Najlakše je do pomoći stići preko irc.freenode.net na #ubuntu kanalu. Pomoć sam dobio :) Ali ono što mi je bilo zanimljivo je sledeći dijalog:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[12:21] malicai: Thanks, I'll go there and never use ubuntu again, it deleted most of my porn anyways, cya all, thanks again!&lt;br /&gt;[12:22] liquid: Malici, porn means little in the grand scheme&lt;/blockquote&gt;&lt;br /&gt;:))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-3127580259458470126?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/3127580259458470126/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=3127580259458470126&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3127580259458470126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3127580259458470126'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/10/ubuntu-channel-dijalog.html' title='#ubuntu channel dijalog :)'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6397574734689186572</id><published>2010-10-09T16:59:00.001+02:00</published><updated>2010-10-09T17:03:41.797+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='map reduce'/><category scheme='http://www.blogger.com/atom/ns#' term='IT vesti'/><category scheme='http://www.blogger.com/atom/ns#' term='cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='Mockito'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu, scalability, java i baze</title><content type='html'>Nisam pisao duže vreme pa se nakupilo dosta dobrog materijala kojeg bi podelio sa vama.&lt;br /&gt;&lt;br /&gt;Sutra je veliki dan za linux jer izlazi xUbuntu 10.10, već godinama najpopularnija distribucija linuxa. Zato vam predstavljem &lt;a href="http://www.pcworld.com/businesscenter/article/207283/12_reasons_to_try_ubuntu_1010_now.html?tk=mod_rel"&gt;12 razloga zašto da ga instalirate&lt;/a&gt;. A ime sledećeg izdanja (11.04) će biti  Natty Narwhal &lt;br /&gt;&lt;br /&gt;Ako ste se odlučili za instaliranje novog Ubuntu-a tekst &lt;a href="http://www.unixmen.com/linux-distributions/4-ubuntu/1158-top-things-to-do-after-installing-ubuntu-1010-marevick-meerkat"&gt;Top things to do after installing Ubuntu 10.10 Maverick Meerkat&lt;/a&gt; će vam biti od pomoći&lt;br /&gt;&lt;br /&gt;&lt;a href="http://net.tutsplus.com/articles/general/9-ways-to-instantly-code-faster/"&gt;9 Ways to Instantly Code Faster&lt;/a&gt;, kako poraditi na svojoj produktivnosti u IT poslovima&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webspeaks.in/2010/09/7-most-useful-regular-expression.html  "&gt;7 Most Useful Regular Expression Snippets&lt;/a&gt;, gotovi regexi za različite prilike&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ksat.me/map-reduce-a-really-simple-introduction-kloudo/"&gt;Map Reduce: A really simple introduction&lt;/a&gt;, bez linije koda na vrlo lak način objašnjen algoritam koji se danas koristi svuda gde je potrena skalabilnost &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.juhonkoti.net/2010/09/25/example-how-to-model-your-data-into-nosql-with-cassandra"&gt;Example how to model your data into nosql with cassandra&lt;/a&gt;, za one koji su bili na predavanju koje je organizovala Scalability grupa i kojima se dopalo Dedino predavanje o Cassandra-i. Prikazan je način na koji bi se modelovali podaci za chat aplikaciju. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jasonwhaley.com/an_array_of_reasons_to_not_use_arrays_in_java  "&gt;An Array of Reasons to not use Arrays in Java&lt;/a&gt;, koji su problemi sa Array klasom i zašto dati prednost Collection implementacijama&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hamletdarcy.blogspot.com/2010/09/mockito-pros-cons-and-best-practices.html"&gt;Mockito - Pros, Cons, and Best Practices&lt;/a&gt;, tekst o alatu za pravljenje Mock objekata pri testiranju sistema&lt;br /&gt;&lt;br /&gt;&lt;a href="http://viralpatel.net/blogs/2010/06/tutorial-spring-3-mvc-introduction-spring-mvc-framework.html  "&gt;Spring 3 MVC&lt;/a&gt;, tutorijal o Spring-ovim klasama za web programiranje&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.dzone.com/articles/android-101-basics  "&gt;Android 101: The Basics&lt;/a&gt;, serija tekstova o programiranju za Android. Trenutno je izašlo 2 nastavka&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.turnleafdesign.com/log4j-4-enterprise  "&gt;Log4j Enterprise&lt;/a&gt;, tekst o upotrebi najpoznatije biblioteke za logovanje u java svetu&lt;br /&gt;&lt;br /&gt;DB blok:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codeutopia.net/blog/2010/10/07/optimizing-sql-removing-queries-inside-loops/"&gt;Optimizing SQL: Removing queries inside loops Hibernate hard facts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/hibernate_tuning"&gt;Revving Up Your Hibernate Engine&lt;/a&gt;, fino podešavanja hibernate-a&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sql-tutorial.ru/en/content.html"&gt;SQL Problems and solutions&lt;/a&gt;, SQl napredni tutorijal&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.frankel.ch/hibernate-hard-facts-part-1"&gt;Hibernate hard facts&lt;/a&gt;, najčešče greške u radu sa Hibernate-om&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6397574734689186572?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6397574734689186572/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6397574734689186572&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6397574734689186572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6397574734689186572'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/10/ubuntu-scalability-java-i-baze.html' title='Ubuntu, scalability, java i baze'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-8763398488733273872</id><published>2010-09-30T20:52:00.001+02:00</published><updated>2010-09-30T20:56:02.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='IT vesti'/><title type='text'>Vreme je za Linux</title><content type='html'>Godinama ranije su izlazili tekstovi koji su se pitali da li je ovo godina&lt;br /&gt;linux-a ili predviđali da će naredna to biti. I svi su omašili :) Iako&lt;br /&gt;isključivo koristim linux već godinama mogu reći da je pitanje godine linux-a&lt;br /&gt;stvar prošlosti. Linux je tu među nama i više nije nikakav stranac kog čekamo da&lt;br /&gt;se pojavi. Pogledajte IT oglase. Uopšte nije neuobičajeno da se u njima kao&lt;br /&gt;jedna od stavki pominje i linux. Web programiranje je usko vezano s njim. Uz&lt;br /&gt;programiranje na java platformi često ide linux. Android se ne može zamisliti&lt;br /&gt;bez njega. Kad se doda iPhone i Mac OSX, deca Unix-a nikad nisu bila bliža nama.&lt;br /&gt;&lt;br /&gt;U narednih mesec dana očekuju nas dve velike premijere. Prvo  10.10.'10.&lt;br /&gt;izlazili Ubuntu i drugari u verziji 10.10 :) I ne samo da se igra na foru&lt;br /&gt;poklapanja datuma i verzije, nego kad se verzija pročita binarno dobija se čista&lt;br /&gt;desetka! Taman kad se uhodamo sa Ubuntom a ono već početkom novembra pojaviće se&lt;br /&gt;drugi linux div: Fedora 14.&lt;br /&gt;&lt;br /&gt;Šta nam donosi novi Ubuntu pročitajte u izveštaju: &lt;a href="http://www.linux.com/learn/tutorials/366627-ubuntu-1010-preview-steady-progress-for-maverick"&gt;Ubuntu 10.10 Preview: Steady Progress for Maverick&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Par linkova za linux početnike:&lt;br /&gt;&lt;a href="http://www.fortystones.com/40-linux-related-terminologies/"&gt;40 Must Know Linux Terminologies&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fortystones.com/40-basic-linux-command-line-tips-tricks/"&gt;40 Basic Linux Command-line Tips and Tricks&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fortystones.com/40-linux-shell-commands-beginners/"&gt;40 Linux Shell Commands for Beginners&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Hm, moram priznati da ni sam ne znam sve ove komande i trikove :)&lt;br /&gt;&lt;br /&gt;Za napredne pingvine prilažem tekst o 6 one linera:  &lt;a href="http://www.thegeekstuff.com/2010/09/linux-one-liners/"&gt;http://www.thegeekstuff.com/2010/09/linux-one-liners/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kako da instalirate sopstveni DNS i time smanjite tromost interneta: &lt;a href="http://codefui.com/system/setting-up-and-using-bind-part-one "&gt;Setting up and Using Bind&lt;/a&gt;. Ja sam probao i mogu odmah da vam kažem da nije sve kao u tekstu. Fajlovi se na Ubuntu nalaze na drugoj lokaciji i ne postoji jedan conf fajl za BIND već je on podeljen. Ali da se sve srediti :)&lt;br /&gt;&lt;br /&gt;Izašao je Ubuntu 10.10 RC i njegovi drugari pa ih testirajte dok ne izađu finalne verzije: &lt;a href="https://wiki.ubuntu.com/MaverickMeerkat/TechnicalOverview  "&gt;https://wiki.ubuntu.com/MaverickMeerkat/TechnicalOverview&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;A za one koji razmišljaju da instaliraju Linux od nule nek pogledaju &lt;a href="http://www.ubuntugeek.com/pinguy-os-10-04-1-2-released-and-review-included.html"&gt;PinguyOS&lt;/a&gt;, Ubuntu koji je fino ispoliran.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-8763398488733273872?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/8763398488733273872/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=8763398488733273872&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8763398488733273872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8763398488733273872'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/vreme-je-za-linux.html' title='Vreme je za Linux'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6486040425726024866</id><published>2010-09-29T14:26:00.001+02:00</published><updated>2010-09-29T17:28:27.038+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='java EE'/><category scheme='http://www.blogger.com/atom/ns#' term='IT vesti'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>The state of Java</title><content type='html'>Stephen Colebourne je u tekstu &lt;a href="http://www.jroller.com/scolebourne/entry/the_next_big_jvm_language1"&gt;The next big JVM language&lt;/a&gt; izneo nekoliko vrlo zanimljivih opaski i ideja. Prvo se kritički osvrće na javu i nabraja šta u njoj ne valja i na osnovu toga postavlja kriterijume za savršeni JVM jezik. Potom prolazi kroz sve nove JVM jezike i ocenjuje ih na osnovu postavljenih kriterijuma. Na kraju zaključuje da ni jedan jezik ne zadovoljava sve kriterijume.&lt;br /&gt;&lt;br /&gt;To ga dovodi do ideje da ne treba tražiti novi jezik već popraviti samu javu. Tolika popravka bi svakako značila raskid kompatibilnosti sa ranijim kodom. Ali Colebourne predlaže upotrebu konvertora koda, nešto što je već primenjeno u Pythonu :)&lt;br /&gt;&lt;br /&gt;Jedna od njegovih kritka jave su Exception klase koje ne nasleđuju RuntimeException (tzv. checked exceptions). U tekstu &lt;a href="http://www.jroller.com/scolebourne/entry/checked_exceptions_bijava"&gt;Checked exceptions&lt;/a&gt; dalje razrađuje tezu&lt;br /&gt;&lt;br /&gt;U vezi sa ovim je i tekst &lt;a href="http://www.skill-guru.com/blog/2010/09/26/foir-those-naysayers-who-say-java-will-be-dead/"&gt;For those naysayers who say Java will be dead…&lt;/a&gt;, u kojem se tvrdi&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Java will be the money-maker for cloud computing over the next few years.&lt;/blockquote&gt;&lt;br /&gt;i to pokazuje najnovijom pohvalom Oracle-a da je oborio rekord u performansama na svom Exalogic Elastic Cloud. Takođe se pominje i VMWare koji se sve više fokusira na javu i javine tehnologije kupovinom Spring frameworka. Izgleda da će to biti dobro i za Groovy i Grails. Oba su vlasništvo VMWara preko Springa, a Grail za razliku od sličnih projekata (Rails, Django) koristi JVM i Spring tehnologiju. Spring već sad nudi svoj framework spakovan sa Tomcate-om napucanim do nivoa app servera i sve to cloud ready! &lt;br /&gt;&lt;br /&gt;Side by side poređenje Jave EE 6 i Springa 3.0. Java EE se tek u poslednje 2 verzije pronalazi i kreće putem koji je Spring utabao mnogo, mnogo pre. Zato se procenjuje da broj korisnika Springa mnogostruko nadmašuje broj korisnika EE: &lt;a href="http://javafootsteps.blogspot.com/p/java-ee-6-and-spring-30.html  "&gt;Java EE 6 and Spring 3.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoworld.com/d/developer-world/infoworld-review-top-java-programming-tools-191?page=0,0"&gt;Top Java programming tools&lt;/a&gt;, pregled 4 razvojna okruženja za javu, njihova ocena i poređenje    &lt;br /&gt;&lt;br /&gt;&lt;a href="http://solitarygeek.com/java/netbeans-and-maven-a-quick-start-guide"&gt;NetBeans and Maven – A quick start guide&lt;/a&gt;, u slici i reči, autor je čitajući istu knjigu kao i ja prošao kroz isto iskustvo :)&lt;br /&gt;&lt;br /&gt;Oracle je usvojio plan B za Javu 7. Dakle odustaje se od nekih ranije najavljivanih dodataka za Javu 7 ali se zato ne pomera njen izlazak: &lt;a href="http://www.baptiste-wicht.com/2010/09/jdk-7-features-updated-plan-b-is-apparently-here/"&gt;http://www.baptiste-wicht.com/2010/09/jdk-7-features-updated-plan-b-is-apparently-here/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Takođe i za Javu ME se predstavljaju planovi. Tu je Java najviše ugrožena od strane Googlovog Androida, pa sve sevaju varnice između ove 2 kompanije, sa sve tužbom Oracla i Googlovim bojkotovanjem JavaOne konferencije: &lt;a href="http://www.theregister.co.uk/2010/09/26/mobile_java_oracle/"&gt;Oracle finally outlines roadmap for mobile Java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6486040425726024866?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6486040425726024866/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6486040425726024866&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6486040425726024866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6486040425726024866'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/state-of-java.html' title='The state of Java'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-2267405834415249695</id><published>2010-09-28T18:05:00.000+02:00</published><updated>2010-09-28T18:05:09.260+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='jetty'/><category scheme='http://www.blogger.com/atom/ns#' term='baze'/><category scheme='http://www.blogger.com/atom/ns#' term='connection pooling'/><title type='text'>Bazno o bazama</title><content type='html'>Objašnjenje u slici, reči i tabelama šta su indeksi, čemu služe i kako da znamo na koju kolonu da ih postavimo u tekstu: &lt;a href="http://www.kylescousin.com/2010/09/an-absolute-beginners-introduction-to-database-indexes/  "&gt;An Absolute Beginner’s Introduction to Database Indexes&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Na istom blogu se nalazi i objašnjenje šta je B-tree indeks pomenut u prethodnom postu: &lt;a href="http://www.kylescousin.com/2010/09/a-simple-explanation-on-how-b-tree-database-indexes-work/"&gt;A Simple Explanation on How B-Tree Database Indexes Work&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pisao sam o korišćenju connection pool-a u Tomcat-u. U toku razvoja se vrlo često mesto Tomcat-a koristi Jetty, a kako se u njemu koristi connection pool i kako se podešava možete pročitati na: &lt;a href="http://docs.codehaus.org/display/JETTY/DataSource+Examples"&gt;http://docs.codehaus.org/display/JETTY/DataSource+Examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pošto se Jetty uglavnom korisiti u Maven-u preko plugin-a, pročitajte kako da podesite DataSource za tu priliku: &lt;a href="http://java.dzone.com/articles/jetty-maven-plugin-running"&gt;http://java.dzone.com/articles/jetty-maven-plugin-running&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Šta se dešava sa db transakcijama ako se bazi ne pristupa direktno JDBC-om već preko JPA u tekstu &lt;a href="http://blog.dynatrace.com/2010/09/14/week-38-transactions-in-a-jpa-world/"&gt;Transactions in a JPA World&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-2267405834415249695?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/2267405834415249695/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=2267405834415249695&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2267405834415249695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/2267405834415249695'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/bazno-o-bazama.html' title='Bazno o bazama'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6733461570007216807</id><published>2010-09-27T17:25:00.002+02:00</published><updated>2010-09-27T17:34:49.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tupljenje'/><title type='text'>U slavu naše profesije</title><content type='html'>Peter Denning u tekstu &lt;a href="http://www.americanscientist.org/issues/id.10402,y.2010,no.5,content.true,page.1,css.print/issue.aspx"&gt;The Great Principles of Computing&lt;/a&gt; koji je napisan za American Scientist razmatra mesto i ulogu računarstva i infromatike. Njegova misao je da infromatika i računarstvo može predstavljati jednu od četiri osnovne oblasti nauke: &lt;blockquote&gt;Computing may be the fourth great domain of science along with the physical, life and social sciences&lt;/blockquote&gt;Zato budimo ponosni na našu profesiju :)&lt;br /&gt;&lt;br /&gt;12 stvari koje svaki programer treba da zna, brzo, kratko i tačno:&lt;br /&gt;&lt;div style="width:425px" id="__ss_5284200"&gt;&lt;object id="__sse5284200" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&amp;stripped_title=12-things-every-programmer-should-know&amp;userName=samnang.chhun" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5284200" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&amp;stripped_title=12-things-every-programmer-should-know&amp;userName=samnang.chhun" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Ovo pokazuje kako naša profesija nije ni malo naivna ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6733461570007216807?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6733461570007216807/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6733461570007216807&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6733461570007216807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6733461570007216807'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/u-slavu-nase-profesije.html' title='U slavu naše profesije'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-1940563966148136964</id><published>2010-09-27T16:46:00.001+02:00</published><updated>2010-09-27T16:48:15.860+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projektni principi'/><category scheme='http://www.blogger.com/atom/ns#' term='projektni obrasci'/><title type='text'>Projektni obrasci i principi</title><content type='html'>John Lindquist je došao na genijalnu ideju kako da objasni projeknte obrasce (design patterns) preko screencasta. Upotrebio je analogiju sa igricom StarCraft da pokaže razlog za upotrebu obrazaca. Potom je u screencastu krenuo da rešava razlog na klasičan način i time ukaže na problem, a potom nudi rešenje u obrascu. Fantastično očigledno. Ovo bi trebalo emitovati na Projektovanju softvera na FON-u :) Za sada je opisao 5 obrazaca: &lt;a href="http://johnlindquist.com/category/patterncraft/"&gt;http://johnlindquist.com/category/patterncraft/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kad smo kod obrazaca, evo jednog prostog a vrlo korisnog, pri tom nije toliko poznat jer ne pripada grupi GOF pattern-a: &lt;a href="http://thoughts.inphina.com/2010/09/13/duplicate-code-introduce-null-object/"&gt;Null object pattern&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Dobar sajt sa opisom GOF obrazaca kao i projektnih principa na kojima svi obrasci počivaju: &lt;a href="http://www.oodesign.com/"&gt;http://www.oodesign.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-1940563966148136964?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/1940563966148136964/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=1940563966148136964&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/1940563966148136964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/1940563966148136964'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/projektni-obrasci-i-principi.html' title='Projektni obrasci i principi'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-7630159354649191182</id><published>2010-09-26T20:05:00.002+02:00</published><updated>2010-10-09T00:22:36.771+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tupljenje'/><title type='text'>Vim - imperator</title><content type='html'>Pročitao sam jedan izuzetan tekst o Vim editoru. Do tada sam razmišljao o njemu kao arhaičnom editoru iz doba monohromatskih monitora i rada iz konzole, te da je za editovanje bolje koristiti editor sa GUI-om (moja višegodišnja pretraga za dobrim editorom se završila sa &lt;a href="http://www.jedit.org"&gt;jEdit-om&lt;/a&gt;). A ako je potrebno nešto editovati iz konzole tu je MC, nano i joe editor.&lt;br /&gt;&lt;br /&gt;Izgleda da je uz vežbu moguće jako produktivno koristiti vim editor, daleko produktivnije nego druge koji se koriste mišom, eventualno sa par shortcutova i prolaskom kroz menije preko mnemonika sa tastature. Podešavanjem i instaliranjem dodataka može se svašta uraditi sa Vim-om. Pri tom se troši malo resursa (za razliku od jEdita :)) a stabilnost garantuje to što se Vim razvija skoro 20 godina! &lt;br /&gt;&lt;br /&gt;Naravno, editor je samo editor. IDE će za neke zadatke ipak biti daleko lakše za korišćenje. No znanje rada sa Vim-om i tu se može iskoristiti. Jer svaki dobri IDE i editor mora da ima Vim mode. Tako je u Eclipse, NetBeans, IDEA, čak i jEdit ima vi plugin :)&lt;br /&gt;&lt;br /&gt;Tekst koji me je potakao na sve ovo: &lt;a href="http://stevelosh.com/blog/2010/09/coming-home-to-vim/"&gt;Coming Home to Vim&lt;/a&gt;&lt;br /&gt;Još dobirh tekstova o Vimu:&lt;br /&gt;&lt;a href="http://nvie.com/posts/how-i-boosted-my-vim/"&gt;How I boosted my Vim&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pixelbeat.org/vim.tips.html"&gt;Essential Vim&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html"&gt;Graphical vi-vim Cheat Sheet and Tutorial&lt;/a&gt;&lt;br /&gt;&lt;a href="http://naleid.com/blog/2010/10/04/vim-movement-shortcuts-wallpaper/"&gt;Vim Movement Shortcuts Wallpaper&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-7630159354649191182?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/7630159354649191182/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=7630159354649191182&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7630159354649191182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7630159354649191182'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/vim-imperator.html' title='Vim - imperator'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-9189411575864240656</id><published>2010-09-23T14:18:00.002+02:00</published><updated>2010-09-23T14:27:41.135+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fontovi'/><title type='text'>Ćirilični slobodni fontovi</title><content type='html'>Ako vam se čini da nema dovoljno lepih ćiriličnih fontova ili vam je dosadilo da se naša slova p i t u kurzivu ćirilicom ispisuju kao ruska, postoji rešenje! Poslužite se sa 4 naša ćirilična fonta koja su potpuno slobodna za korišćenje:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tipometar.org/aktuelno/akcija!/ResavskaBG/Index.html"&gt;Resavska BG&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tipometar.org/aktuelno/akcija!/ResavskaBGSans/Index.html"&gt;Resavska BG Sans&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tipometar.org/aktuelno/akcija!/AdamantBG/Index.html"&gt;Adamant BG&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tipometar.org/aktuelno/akcija!/NeoplantaBG/Index.html"&gt;Neoplanta BG&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-9189411575864240656?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/9189411575864240656/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=9189411575864240656&amp;isPopup=true' title='1 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/9189411575864240656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/9189411575864240656'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/cirilicni-slobodni-fontovi.html' title='Ćirilični slobodni fontovi'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-7438419573087471094</id><published>2010-09-22T20:44:00.003+02:00</published><updated>2010-09-22T20:52:18.273+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skalabilnost'/><title type='text'>Tekstovi o skalabilnosti</title><content type='html'>Stonebraker pionir u razvoju relacionih sistema za upravljanje bazama podataka priča o novinama u polju njegovog rada i o svom novom sistemu kojeg predstavlja kao postrelacioni. Želja mu je da dobije prednosti NoSQL baza a da ne žrtvuje ACID. &lt;a href="http://www.theregister.co.uk/2010/09/13/michael_stonebraker_interview/"&gt;SciDB: Relational daddy answers Google, Hadoop, NoSQL&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Malo NoSQL igrarija:&lt;br /&gt;&lt;a href="http://silicoholic.com/2010/09/14/cluster-cassandra-ubuntu-virtualbox/"&gt;Cassandra cluster in a single machine with Ubuntu and VirtualBox&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://devcentral.f5.com/weblogs/macvittie/archive/2010/09/13/applying-scalability-patterns-to-infrastructure-architecture.aspx  "&gt;Applying Scalability Patterns to Infrastructure Architecture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nešto iz Google kuhinje: &lt;a href="http://www.dzone.com/links/r/sibyl_a_system_for_large_scale_machine_learning.html"&gt;Sibyl - Lage scale machine learning&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;NoSQL sistem za upravljanje bazama dokumenata. &lt;a href="http://www.gridshore.nl/2010/09/20/learning-mongodb/"&gt;Learning Mongodb&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-7438419573087471094?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/7438419573087471094/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=7438419573087471094&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7438419573087471094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/7438419573087471094'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/tekstovi-o-skalabilnosti.html' title='Tekstovi o skalabilnosti'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-8715959473022974835</id><published>2010-09-14T13:40:00.002+02:00</published><updated>2010-09-14T13:50:04.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT događaji'/><title type='text'>Blogeri studentima</title><content type='html'>Predavanja koja povezuje maksima „Open source pristup znanju“ održaće se u oktobru, novembru i decembru.  Predavaće Dragan Varagić, Bogdan Kecman, Goran Rakić, Milan Stojanov, Nebojša Radović - Eniac, Stefan Jocić i Istok Pavlović. &lt;br /&gt;&lt;br /&gt;Organizator ovog događaja je &lt;a href="http://www.fonis.rs/"&gt;FONIS – udruženje studenata informatike FON-a&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Više o predavačima i rasporedu predavanja na: &lt;a href="http://b2s.fonis.rs/#b2shome"&gt;http://b2s.fonis.rs/#b2shome&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-8715959473022974835?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/8715959473022974835/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=8715959473022974835&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8715959473022974835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8715959473022974835'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/blogeri-studentima.html' title='Blogeri studentima'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6533167653024967794</id><published>2010-09-14T13:13:00.004+02:00</published><updated>2010-09-14T13:37:21.572+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT vesti'/><title type='text'>IT vestii</title><content type='html'>&lt;a href="http://www.misterj2ee.com/2010/09/j2ee-transactions-explained/"&gt;J2EE transactions explained&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.networkworld.com/news/2010/021810-oracle-set-to-merge-java.html"&gt;Oracle set to merge Java virtual machines&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pcworld.com/businesscenter/article/204956/why_android_is_stealing_share_from_ios.html?tk=hp_new"&gt;Why Android Is Stealing Share from iOS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.packtpub.com/article/drools-jboss-rules-50complex-event-processing"&gt;Drools JBoss Rules 5.0: Complex Event Processing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.jot.fm/2010/08/26/ten-things-i-hate-about-object-oriented-programming/"&gt;Ten Things I Hate About Object-Oriented Programming&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bilo je i komentara ovih linkova, ali je glupi blogspot to pojeo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6533167653024967794?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6533167653024967794/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6533167653024967794&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6533167653024967794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6533167653024967794'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/it-vestii.html' title='IT vestii'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6771887298357886615</id><published>2010-09-11T18:09:00.003+02:00</published><updated>2010-09-11T22:06:57.357+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT vesti'/><title type='text'>IT vesti</title><content type='html'>PostgreSQL korača krupnim koracima napred. Posle verzije 8.3 u kojoj je značajno unapređena brzina, verzije 8.4 koja je donela windowing funkcije i neke uobičajene operacije na tabelama pretvorene u izraze, predstojeće verzije 9.0 sa Straming Replication i Hot Standby već je krenulo da se radi na verziji 9.1: &lt;a href="http://www.dzone.com/links/r/postgresql_91_alpha_arrives_ahead_of_90_ga.html"&gt;PostgreSQL 9.1 Alpha Arrives Ahead of 9.0 GA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nadam se da će ove promene i poboljšanja uz Oracle-ovo preuzimanje MySQL-a doprineti većoj popularnosti ovog sjajnog rdbms.&lt;br /&gt;&lt;br /&gt;Tekst iz oblasti IT menadžmenta, napisan iz teorije i prakse, a zanimljiv u pristupu i povezivanju sa radovima japanskih stručnjaka iz organizacije u Toyota fabrici (čuveni Šigeo Šingo koji je jednom gostovao na Fakultetu organizocionh nauka): &lt;a href="http://agile.dzone.com/articles/seven-wastes-software"&gt;The Seven Wastes of Software Development&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mark Reinhold, glavnokomandujući razvojnog tima java platforme u Oracle, objavio je na svom &lt;a href="http://blogs.sun.com/mr/entry/rethinking_jdk7"&gt;blogu&lt;/a&gt; da će doći do odlaganja u planovima za izdavanje JDK u verziji 7. U tekstu se navode 2 mogućnosti: prva da se izdavanje 7. verzije pomeri za sa sredine 2011. na sredinu 2011. i druga da se deo planiranih dodataka za verziju 7 u JDK objavi sredinom 2011. kao JDK 7 a ostatak za kraj 2012. kao JDK 8.&lt;br /&gt;&lt;br /&gt;Jedna od ozbiljnijih reakcija na ovu vest u tekstu &lt;a href="http://weblogs.java.net/blog/opinali/archive/2010/09/08/jdk-7-delayed-again-how-bad"&gt;JDK 7 delayed again... how bad is that?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6771887298357886615?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6771887298357886615/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6771887298357886615&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6771887298357886615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6771887298357886615'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/it-vesti.html' title='IT vesti'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6201126362342402382</id><published>2010-09-11T14:54:00.003+02:00</published><updated>2010-09-11T15:07:10.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skalabilnost'/><category scheme='http://www.blogger.com/atom/ns#' term='IT događaji'/><title type='text'>Scalability udruženje</title><content type='html'>Grupa entuzijasta, koji vole da rešavaju aktuelne probleme u softverskoj industriji, okupila se na sajtu &lt;a href="http://scalability.rs/"&gt;http://scalability.rs/&lt;/a&gt;. Kao što se iz imena može pretpostaviti najveći deo tema kojim se bave proizilazi iz rešavanja problema obrade ogromne količine podataka u uslovima ograničenih resursa: vremena, procesora, memorije...&lt;br /&gt;&lt;br /&gt;Scalability grupa je već održala 3 susreta. Možete na blog sekciji sajta videti šta ste propustili, a da se to ne bi više dešavalo prijavite se na &lt;a href="http://groups.google.com/group/software-scalability--belgrade"&gt;mailing listu&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6201126362342402382?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6201126362342402382/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6201126362342402382&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6201126362342402382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6201126362342402382'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/scalability-udruzenje.html' title='Scalability udruženje'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-6477329753278544164</id><published>2010-09-10T12:09:00.002+02:00</published><updated>2010-09-10T12:38:28.217+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zanimljivosti'/><title type='text'>Reddit oglas sa zagonetkom :)</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Reddit"&gt;Reddit&lt;/a&gt;, sajt za postavljanje linkova ka zanimljivim vestima (vrsta social bookmarking Web 2.0 aplikacije), je objavio vrlo zanimljiv oglas za prijem novih stručnjaka. &lt;br /&gt;&lt;br /&gt;U oglasu se traži da kandidat za posao reši par izuzetnih mozgalica od kojih je najveća dokaz P = ili != NP. Više o problemu na &lt;a href="http://en.wikipedia.org/wiki/P%3DNP"&gt;http://en.wikipedia.org/wiki/P%3DNP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A kao šlag na tortu dolazi mail na koji treba poslati CV. On je zadat u vidu zadatka! Pa hajmo ga rešiti :)&lt;br /&gt;&lt;br /&gt;Adresa konkursa: &lt;a href="http://blog.reddit.com/2010/08/reddit-is-hiring.html"&gt;http://blog.reddit.com/2010/08/reddit-is-hiring.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6477329753278544164?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6477329753278544164/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6477329753278544164&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6477329753278544164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6477329753278544164'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/reddit-oglas-sa-zagonetkom.html' title='Reddit oglas sa zagonetkom :)'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-3943057847035239250</id><published>2010-09-10T11:59:00.003+02:00</published><updated>2010-09-10T12:09:07.616+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT događaji'/><title type='text'>DevProTalk roštilj - IT professionals meets[sic] BBQ</title><content type='html'>Internet forum DevProTalk organizuje susret (čitaj roštilj i pivo) ove subote (11. sep.) od 10 sati na Adi Ciganliji mesto za roštilj kod restorana Oaza.&lt;br /&gt;&lt;br /&gt;Više o susretu na: &lt;a href="http://www.devprotalk.com/t9082-devprotalk-rotilj--it-professionals-meets-bbq.html"&gt;http://www.devprotalk.com/t9082-devprotalk-rotilj--it-professionals-meets-bbq.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-3943057847035239250?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/3943057847035239250/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=3943057847035239250&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3943057847035239250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3943057847035239250'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/devprotalk-rostilj-it-professionals.html' title='DevProTalk roštilj - IT professionals meets[sic] BBQ'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-3631996023843621633</id><published>2010-09-08T14:51:00.007+02:00</published><updated>2010-09-09T20:58:36.386+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='baze'/><category scheme='http://www.blogger.com/atom/ns#' term='connection pooling'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcate'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><title type='text'>Tomcat connection pooling</title><content type='html'>Dobavljanje konekcije je skupo. Pravljenje globalne konekcije je loše rešenje u uslovima kad postoji više niti (npr. u web aplikaciji) jer se po jednoj konekciji obavlja jedna transakcija, što znači da ako više niti deli istu konekciju one će sa conn.commit() i conn.rollback() da smetaju međusobno. Rešenje je da se ima Connection Pool da kad se zahteva konekcija da se ne prvi novi objekat, a kad se povozove conn.close() da se konekcija ne zatvori već se vrati u pool i reciklira.&lt;br /&gt;&lt;br /&gt;Tomcat ima ugrađenu podršku za poolove. U webapp/WEB-INF/web.xml (webapp ako je projekat pravljen pomoću &lt;a href="http://en.wikipedia.org/wiki/Apache_Maven"&gt;Maven&lt;/a&gt;-a) fajlu se definiše resurs preko sledećeg taga:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; wrap-lines: false;"&gt;&lt;br /&gt;&amp;lt;resource-ref&gt;&lt;br /&gt;     &amp;lt;res-ref-name&gt;jdbc/bankDataSource&amp;lt;/res-ref-name&gt;&lt;br /&gt;     &amp;lt;res-type&gt;javax.sql.DataSource&amp;lt;/res-type&gt;&lt;br /&gt;     &amp;lt;res-auth&gt;Container&amp;lt;/res-auth&gt;&lt;br /&gt;&amp;lt;/resource-ref&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ovde se definiše ime resursa, njegov tip i da će autentifikaciju obaviti servlet container (tomcat)&lt;br /&gt;&lt;br /&gt;Zatim se u webapp/META-INF/context.xml daje definicija resursa:&lt;br /&gt;&lt;pre class="brush: xml; wrap-lines: false;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&amp;lt;Context antiJARLocking="true" path="/MyApp-1.0-SNAPSHOT"&gt;&lt;br /&gt;    &amp;lt;Resource&lt;br /&gt;        name="jdbc/bankDataSource"&lt;br /&gt;        type="javax.sql.DataSource"&lt;br /&gt;        auth="Container"&lt;br /&gt;        driverClassName="org.h2.Driver"&lt;br /&gt;        url="jdbc:h2://home/zlatan/test.h2;MODE=PostgreSQL"&lt;br /&gt;        username="sa"&lt;br /&gt;        password="sa"&lt;br /&gt;        maxActive="1"&lt;br /&gt;        maxIdle="1"&lt;br /&gt;        defaultAutoCommit="false"&lt;br /&gt;        testOnBorrow="true"&lt;br /&gt;        validationQuery="select 1"/&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Context&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Prva 3 atributa Resource elementa su prepisana iz web.xml fajla. Zatim ide ime drajvera, url, uname, pass kao i kod ručnog pravljenja konekcije na bazu. Zatim se postavlja maksimalni broj konekcija u pool-u i maksimalan broj besposlenih konekcija. Isključuje se autoCommit za konekcije u pool-u. Poslednje 2 opcije uključuju ispitivanje da li je konekcija živa. Ispitivanje se radi pri pribavljanju konekcije iz pool-a a poslednja opcija je upit kojim se testira konekcija.&lt;br /&gt;&lt;br /&gt;Postoje mnoge &lt;a href="http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html"&gt;druge opcije&lt;/a&gt; koje nisam prikazao a među njima su najkorisnije removeAbandoned sa podešavanjima removeAbandonedTimeOut i logAbandoned, zatim opcija defaultTransactionIsolation i defaultTransactionIsolation.&lt;br /&gt;&lt;br /&gt;U kodu se konekcija pribavlja na sledeći način:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;&lt;br /&gt;Context context = new InitialContext();&lt;br /&gt;DataSource ds = (DataSource) context.lookup(&lt;br /&gt;        "java:comp/env/jdbc/bankDataSource");&lt;br /&gt;Connection conn = ds.getConnection();&lt;br /&gt;// jer se u prethodnoj liniji konekcijaproverava pozivom select 1&lt;br /&gt;// pa ako bi posle select 1 pozvali setTransactionIsolation() dobili&lt;br /&gt;// bi gresku da se izolacija ne moze postaviti u sred transakcije&lt;br /&gt;conn.commit();&lt;br /&gt;conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);&lt;br /&gt;// . . .&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Napomena: za više o context.xml pogledati &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/config/context.html"&gt;Tomcat dokumentaciju&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Iako je ovde predstavljen Tomcatov način za definisanje connection pool-a on se može definisati i na aplikacionim serverima (Glassfish, IBM WebSphere...) no svaki od njih ima drugačiji način za definisanje poolova.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-3631996023843621633?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/3631996023843621633/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=3631996023843621633&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3631996023843621633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3631996023843621633'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/tomcate-connection-pooling.html' title='Tomcat connection pooling'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-9021212080995182504</id><published>2010-09-07T20:24:00.018+02:00</published><updated>2010-09-26T19:22:21.821+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='dependency injection'/><category scheme='http://www.blogger.com/atom/ns#' term='sloj persistencije'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa2'/><title type='text'>JPA2/Hibernate kao fil na torti ili kao temelj kuće</title><content type='html'>JPA je Java persistence API, zvanični standard (ili kako ga oni zovu specifikacija) za &lt;a href="http://searchwindevelopment.techtarget.com/sDefinition/0,,sid8_gci1299664,00.html"&gt;objektno-relaciono mapiranje&lt;/a&gt; u Javi. Deo je JEE 5 specifikacije iako se može koristiti i u običnoj javi (JSE). Kao svaki standard JPA je tu da uvede red među različitim specifičnim ORM bibliotekama i pruži jedinstven način za rad s njima na dobrobit programera koji sad mogu na isti način da rade sa Hibernate i sa TopLink ORM biblotekama.&lt;br /&gt;&lt;br /&gt;Prva JPA verzija kao deo JEE 5 je bila prilično siromašna u mogućnostima. Od svih velikih ORM biblioteka uzeto je samo ono što je zajedničko, najveći zajednički sadržalac. Uz JEE6 6 je izašlo drugo izdanje JPA standarda a već je implementiran u &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; 3.5+ i &lt;a href="http://www.eclipse.org/eclipselink/jpa.php"&gt;EclipseLink&lt;/a&gt; 2.0+ (bivšem TopLinku). Nova verzija je donela dosta novina ali i par razočarenja (o tome više u nekom drugom postu).&lt;br /&gt;&lt;br /&gt;E sad da pokažemo kako nam JPA preko Hibernate (JPA/Hibernate) može pomoći. Nastavljam se na prethodni post. Pokazao sam kako se treba aplikacija podeliti u slojeve i kako se sa &lt;a href="http://www.springsource.org/"&gt;Springom&lt;/a&gt; pojednostavljuje sistem. Uvođenje JPA/Hiberate u takav sistem ima vrlo mali uticaj na arhitekturu. Ako je sve urađeno po JUS-u prelazak sa JDBC na JPA način rada sa bazom će uticati samo na sloj perzistencije. Eventualno će uticati ali minimalno na domenski sloj ako se podaci o tome kako se klase povezuju sa tabelama stave u kod u vidu anotacija. Drugi pristup je da se ti podaci smeste u xml fajl a kod ostavi netaknut. Ovolika izmena sa tako fino lociranim mestom menjanja pokazuje kvalitet višeslojnosti. Da je aplikacija loše podeljena preomena bi se prenosila u gomilu klasa.&lt;br /&gt;&lt;br /&gt;Pošto smo u prošlom primeri imali samo jednu klasu u sloju perzistencije dajem njen izgled kad se radi preko JDBC-a:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.PreparedStatement;&lt;br /&gt;import java.sql.ResultSet;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import javax.sql.DataSource;&lt;br /&gt;import org.springframework.jdbc.datasource.DataSourceUtils;&lt;br /&gt;&lt;br /&gt;public class CustomersInDB implements Customers {&lt;br /&gt;  private DataSource dataSource;&lt;br /&gt;&lt;br /&gt;  public void setDataSource(DataSource dataSource) {&lt;br /&gt;    this.dataSource = dataSource;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private Connection getConnection() {&lt;br /&gt;    return DataSourceUtils.getConnection(dataSource);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Customer loadCustomer(String customerId) {&lt;br /&gt;    try {&lt;br /&gt;      PreparedStatement st = getConnection()&lt;br /&gt;          .prepareStatement("select * from customers where id=?");&lt;br /&gt;      try {&lt;br /&gt;        st.setString(1, customerId);&lt;br /&gt;        ResultSet rs = st.executeQuery();&lt;br /&gt;        if (!rs.next()) {&lt;br /&gt;          throw new RuntimeException("Customer has been deleted");&lt;br /&gt;        }&lt;br /&gt;        return new Customer(&lt;br /&gt;            customerId,&lt;br /&gt;            rs.getString("name"),&lt;br /&gt;            rs.getString("address"));&lt;br /&gt;      } finally {&lt;br /&gt;        st.close();&lt;br /&gt;      }&lt;br /&gt;    } catch (SQLException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void saveCustomer(Customer customer) {&lt;br /&gt;    try {&lt;br /&gt;      PreparedStatement st =&lt;br /&gt;          getConnection().prepareStatement(&lt;br /&gt;              "update customers set name=?, address=? where id=?");&lt;br /&gt;      try {&lt;br /&gt;        st.setString(1, customer.getName());&lt;br /&gt;        st.setString(2, customer.getAddress());&lt;br /&gt;        st.setString(3, customer.getId());&lt;br /&gt;        st.executeUpdate();&lt;br /&gt;      } finally {&lt;br /&gt;        st.close();&lt;br /&gt;      }&lt;br /&gt;    } catch (SQLException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Prelaskom na JPA dobija se sledeći izgled klase:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;import javax.persistence.EntityManager;&lt;br /&gt;import javax.persistence.PersistenceContext;&lt;br /&gt;import javax.persistence.TypedQuery;&lt;br /&gt;&lt;br /&gt;public class CustomersInDB implements Customers {&lt;br /&gt;  @PersistenceContext&lt;br /&gt;  private EntityManager entityManager; // Spring će uraditi dependency injection&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Customer loadCustomer(String customerId) {&lt;br /&gt;    TypedQuery&amp;lt;Customer&amp;gt; q = entityManager&lt;br /&gt;        .createQuery("select c from Customer as c where c.id=:id",&lt;br /&gt;            Customer.class);&lt;br /&gt;    q.setParameter("id", customerId);&lt;br /&gt;&lt;br /&gt;    return q.getSingleResult();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void saveCustomer(Customer customer) {&lt;br /&gt;    entityManager.merge(customer);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;U ovom kodu samo je &lt;tt&gt;TypedQuery&lt;/tt&gt; deo JPA2. U JPA1 bi koristili &lt;tt&gt;Query&lt;/tt&gt; interface koji nije generički pa bi morali &lt;tt&gt;Object&lt;/tt&gt; referencu da pretvorimo u &lt;tt&gt;Customer&lt;/tt&gt; prilikom poziva &lt;tt&gt;getSingleResult&lt;/tt&gt; metode.&lt;br /&gt;&lt;br /&gt;A da bi sve ovo radilo potrebo je u klasi u domenskoj klasi &lt;tt&gt;Customer&lt;/tt&gt; ili u persistence.xml datoteci opisati povezivanje klasa i tabeli. Primer za opisivanje u domenskoj klasi preko antotacije:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java; wrap-lines: false;"&gt;@Entity&lt;br /&gt;public class Customer implements Serializable, Cloneable {&lt;br /&gt;&lt;br /&gt;  @Id&lt;br /&gt;  @GeneratedValue&lt;br /&gt;  private long internId;&lt;br /&gt;  private String id;&lt;br /&gt;  private String name;&lt;br /&gt;  private String address;&lt;br /&gt;&lt;br /&gt;  public Customer() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Customer(String id, String name, String address) {&lt;br /&gt;    this.id = id;&lt;br /&gt;    this.name = name;&lt;br /&gt;    this.address = address;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // getters, setters, equals, hash, clone kao i ranije&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tabela sličnosti pojmova u JDBC i JPA:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" class="inline"&gt;&lt;tbody&gt;&lt;tr class="row0"&gt; &lt;th class="col0"&gt;JDBC &lt;/th&gt;&lt;th class="col1"&gt;JPA &lt;/th&gt;&lt;/tr&gt;&lt;tr class="row1"&gt;&lt;td class="col0"&gt;database &lt;/td&gt;&lt;td class="col1"&gt;persistence unit&lt;/td&gt;&lt;/tr&gt;&lt;tr class="row2"&gt;&lt;td class="col0"&gt;DataSource&lt;/td&gt;&lt;td class="col1"&gt;EntityManagerFactory &lt;/td&gt;&lt;/tr&gt;&lt;tr class="row3"&gt;&lt;td class="col0"&gt;Connection &lt;/td&gt;&lt;td class="col1"&gt;EntityManager &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Mogli smo promene da izvedemo i na drugi način. Mogli smo da uopšte ne menjamo &lt;tt&gt;CustomersInDB&lt;/tt&gt; klasu nego napravimo novu implementaciju &lt;tt&gt;Cusotmers&lt;/tt&gt; interfejsa, recimo &lt;tt&gt;JPACustomersInDB&lt;/tt&gt; i da u xml config datoteci za Spring &lt;tt&gt;DefaultCusotmersService&lt;/tt&gt; beanu podmtnemo preko dependency injectiona tu novu implementaciju. To pokazuje kako je dependenci injection moćna stvar. Možemo izmeniti sistem a da ne menjamo postojeći kod!&lt;br /&gt;&lt;br /&gt;Ako ste zainteresovani za JPA pogledajte tutorijal na &lt;a href="http://www.vogella.de/articles/JavaPersistenceAPI/article.html"&gt;http://www.vogella.de/articles/JavaPersistenceAPI/article.html&lt;/a&gt; Iako se tu obrađuje JPA 1 i to u Java SE, mislim da je za početak sasvim odgovarajuć i pošto se radi o običnoj javi nema dependency injection-a, Springa, aplikacionog servera, web programiranja i ostalih zbunjujućih stvari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-9021212080995182504?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/9021212080995182504/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=9021212080995182504&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/9021212080995182504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/9021212080995182504'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/jpa2hibernate-kao-fil-na-torti-ili-kao.html' title='JPA2/Hibernate kao fil na torti ili kao temelj kuće'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-8350433370212378179</id><published>2010-09-07T15:16:00.016+02:00</published><updated>2010-09-08T14:35:26.741+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aplikacioni sloj'/><category scheme='http://www.blogger.com/atom/ns#' term='sloj korisničkog interfejsa'/><category scheme='http://www.blogger.com/atom/ns#' term='dependency injection'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='sloj persistencije'/><category scheme='http://www.blogger.com/atom/ns#' term='domenski sloj'/><title type='text'>Staleži u java svetu</title><content type='html'>&lt;p&gt;Htedoh dati naslov Klasne podele u java svetu u smislu podele na slojeve kako smo učili iz istorije da je svako društvo bilo podeljeno, ali reč klasa ima posebno značenje u programiranju.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Čitajući jednu dobru knjigu po prvi put sam video kako se na moderan način vrši raslojavanje programa u nivoe i čime se programeri pomažu da bi to raslojavanje uradili na najbolji način. Svi smo učili da savremena softverska arhitektura podrazumeva najmanje 3 sloja: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;korisnički interfejs &lt;/li&gt;&lt;li&gt;sloj poslovne logike &lt;/li&gt;&lt;li&gt;DB orijentisani sloj&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;U praksi se sve klase sistema dele u 4 kategorije:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Klase &lt;span style="font-weight: bold;"&gt;domenskog&lt;/span&gt; sloja koje predstavljaju objekte i veze izmađu objekate u poslovnom domenu (npr. u bankarstvu bi to bili računi, korisnici...). Te klase ne treba da znaju ništa o klasama drugih slojeva. Tako da npr. klasa Kupac ne treba da zna ništa o tome kako će se ona predstaviti korisniku sistema (kao web, swing, konzolno i kako u okviru tih mogućnosti). Takođe ne treba da zna kako će se čuvati u bazi niti kako će se koristiti transakcije za kontrolu paralelnog izvršavanja. Svaka klasa iz ovog domena se preslikava u jednu ili više tabela u bazi.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Aplikacioni&lt;/span&gt; sloj (naziva se i &lt;span style="font-weight: bold;"&gt;business transaction&lt;/span&gt; layer ili &lt;span style="font-weight: bold;"&gt;service&lt;/span&gt; layer) modeluje ponašanje sistema. Koristi sistemske transakcije da bi mogao omogućiti ispravan paralelni pristup. Klase ovog sloja treba da znaju samo za domenski sloj zato što manipulišu domenskim objektima (npr. klasa koja vrši novčane transfere mora imati pristup Račun objektu).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sloj &lt;span style="font-weight: bold;"&gt;perzistentnosti&lt;/span&gt; čuva objekte u nekim trajnim skladištima (bazi uglavnom, ali može to biti i fajl ili EJB) i na zahtev ih uzima iz skladišta. Takođe omogućava sistemske transakcije za pristup skladištu (commit, rollback, transaciton isolation). Treba da zna samo za domenski sloj jer npr. mora da sačuva i pronađe Kupac objekat, i za aplikacioni sloj. Dozvoljeno je da se ima veza sa aplikacionim slojem ali je boljne izbeći takve veze. Upravo nam pomoć aplikacionih frameworkova omogućava da izbegnemo te veze.&lt;/li&gt;&lt;li&gt;Sloj &lt;span style="font-weight: bold;"&gt;korisničkog interfejsa&lt;/span&gt; treba da zna samo za domenski sloj jer treba da prikaže korisniku domenske objekte (prikaže Račun) i aplikacioni sloj jer taj sloj dobavlja i prihvata domenske objekte od interfejsa.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Primetite da se sloj poslovne logike podelio na aplikacioni i domenski.&lt;/p&gt;&lt;p&gt;Kako ovo funkcioniše pokazaću na primeru proste &lt;a href="http://en.wikipedia.org/wiki/Apache_Wicket"&gt;Wicket&lt;/a&gt; aplikacije koja omogućava izmenu podataka o korisniku. Sastoji se iz 3 stranice: prva prikaže formu za unos šifre korisnika, druga koja prikaže podatke korisnika čija je šifra uneta i treća koja prikaže da je izmena uspešno obavljena. Sva logika se nalazi iza 2. stranice jer ona mora da pronađe i prikaže korisnika za unetu šifru a da zatim snimi izmenu podataka o korisniku.&lt;/p&gt;&lt;p&gt;Ako bismo radili u čistom Wicket-u i &lt;a href="http://en.wikipedia.org/wiki/Java_Database_Connectivity"&gt;JDBC-u&lt;/a&gt; dijagram klasa za ovaj primer bi izgledao ovako:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rQI3KHRDvs4/TIZLXXME5xI/AAAAAAAAAKE/tZlVZ33Y5kU/s1600/bankclassdiagram.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 217px;" src="http://2.bp.blogspot.com/_rQI3KHRDvs4/TIZLXXME5xI/AAAAAAAAAKE/tZlVZ33Y5kU/s400/bankclassdiagram.png" alt="" id="BLOGGER_PHOTO_ID_5514177658495493906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ovde su korišćeni projektni obrasci: service pattern za Business transacition sloj i Data Access object (dobar opis DAO patterna: &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html"&gt;Core J2EE Pattern Catalog&lt;/a&gt;) za perzistenciju (klase: &lt;span style="font-family:courier new;"&gt;Customers&lt;/span&gt; i &lt;span style="font-family:courier new;"&gt;CustomersInDB&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Kao što se vidi krše se neka pravila razdvajanja sloja. Klasa &lt;span style="font-family:courier new;"&gt;DefaultEditCustomerService&lt;/span&gt; iz service sloja ima vezu sa &lt;span style="font-family:courier new;"&gt;DBTranasactionFactory&lt;/span&gt; i &lt;span style="font-family:courier new;"&gt;CustomersInDB&lt;/span&gt; iz peristence sloja. Osim toga i na drugim mestima postoji direktna veza sa implementacijom. Npr. &lt;span style="font-family:courier new;"&gt;EditCustomer&lt;/span&gt; bi trebalo samo da komunicira sa &lt;span style="font-family:courier new;"&gt;EditCustomerService&lt;/span&gt; interfejsom i da ne zna koja je implementacija u pitanju, međutim postoji direktna veza sa &lt;span style="font-family:courier new;"&gt;DefaultEditCustomerService&lt;/span&gt; implementacijom.&lt;br /&gt;&lt;br /&gt;Ovaj problem se rešava preko Dependency injection-a recimo korišćenjem &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; frameworka. Dijagram klasa za to rešenje izgleda ovako:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rQI3KHRDvs4/TIZqxDW8K3I/AAAAAAAAAKU/SFfTX4DVK0s/s1600/springbankclassdiagram.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 178px;" src="http://1.bp.blogspot.com/_rQI3KHRDvs4/TIZqxDW8K3I/AAAAAAAAAKU/SFfTX4DVK0s/s400/springbankclassdiagram.png" alt="" id="BLOGGER_PHOTO_ID_5514212184709409650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na dijagramu primećujete da su ostale samo veze ka interfejsima što znači da klase ne znaju sa kim komuniciraju, nestala je jaka spregnutost među njima upotrebom Springove podrške za dependency injection. Ali nestale su i klase koje se tiču transakcija jer smo upotrebili Springov transakcioni bean i na njega preusmerili metode iz aplikacionog sloja.&lt;br /&gt;&lt;br /&gt;Kada se uporede ova dva dijagrama jasno se vidi koji je prostiji i lakši za razumevanje i održavanje.&lt;br /&gt;&lt;br /&gt;Više o Dependenci Injectionu: &lt;a href="http://martinfowler.com/articles/injection.html"&gt;članak Martina Fowlera&lt;/a&gt; i sažetiji članak na &lt;a href="http://en.wikipedia.org/wiki/Dependency_Injection"&gt;Wikipediji&lt;/a&gt;&lt;br /&gt;Wikipedija o Springu: &lt;a href="http://en.wikipedia.org/wiki/Spring_Framework"&gt;Spring Framework&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-8350433370212378179?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/8350433370212378179/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=8350433370212378179&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8350433370212378179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8350433370212378179'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/09/stalezi-u-java-svetu.html' title='Staleži u java svetu'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rQI3KHRDvs4/TIZLXXME5xI/AAAAAAAAAKE/tZlVZ33Y5kU/s72-c/bankclassdiagram.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-39255123143518840</id><published>2010-07-06T12:56:00.005+02:00</published><updated>2010-07-06T14:29:57.848+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='baza znanja'/><category scheme='http://www.blogger.com/atom/ns#' term='dokuwiki'/><title type='text'>Baza znanja</title><content type='html'>Ova tema mi se nametnula od kad sam počeo da radim, Gomila je novih stvari koje treba naučiti, Pamćenje je najbolja baza, ali količina novih informacija i gustina B/s je prevelika.&lt;br /&gt;&lt;br /&gt;U prvoj firmi smo koristili trac project management alat. Wiki stranice su sastavni deo tog alata i u njima smo pisali dokumentaciju, pravila itd. U drugoj je korišćena MediaWiki aplikacija, ista ona koja pokreće Wikipediju. &lt;br /&gt;&lt;br /&gt;To mi je dalo ideju da probam sa nekim desktop ili ličnim wiki aplikacijama. Probao sam neku gnomovu ali mi nije išlo, pa sam instalirao &lt;a href="http://www.dokuwiki.org/"&gt;DokuWiki&lt;/a&gt;, wiki za dokumentovanje. To je aplikacija koja se vrti na Apache serveru, Podatke organizuje u fajlove te za razliku od MediaWiki ne mora da se instalira baza. DokuWiki nije lični wiki ali može i tako da se koristi, a može da se omogući pristup mnoštvu ljudi. Ima opcije pretrage, zna da farba primere koda (syntax highlighting), moguće je kod zakačiti kao datoteku a da se sadržaj ipak prikaže uz dodatno dugme za skidanje datoteke, prati korake kojima se došlo do određene stranice... Može se instalirati preko apt-get-a na Ubuntu.&lt;br /&gt;&lt;br /&gt;Eksperimentisao sam sa aplikacijama za hvatanje beleški (note taking). Najviše sa Basket-om. Dobar je za neke prostije beleške, ali za nešto trajnije i organizovanije wiki se pokazao kao uspešniji. &lt;br /&gt;&lt;br /&gt;Uvek imam instalirano 2-3 programa za pravljenje mapa uma, ali priznajem da iako mi se sviđa ideja, nisam se upuštao u eksperiment. Nameravam to ispraviti. &lt;br /&gt;&lt;br /&gt;UML dijagrame koristim da objasnim neke složene stvari. Slika nosi najgušću informaciju. &lt;br /&gt;&lt;br /&gt;Sad mi padoše na pamet i programi za organizovanje ebookova, video treninga, audio predavanja. Probaću da ispitam čega ima. &lt;br /&gt;&lt;br /&gt;Od eknjiga najviše volim pdf format. U Okularu postoji alat za komentarisanje, označavanje stranica. Koristim ga da zapišem neke napomene, da ispravim uočene greške ili zastarele podatke, da označim ono što je važno... &lt;br /&gt;&lt;br /&gt;Možda bi mogao i da iskoristim sistem tagovanja, pa da preko Nepomuka lakše nalazim ono što mi treba...&lt;br /&gt;&lt;br /&gt;Kako organizujete svoje znanje? Šta koristite od alata?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-39255123143518840?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/39255123143518840/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=39255123143518840&amp;isPopup=true' title='3 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/39255123143518840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/39255123143518840'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2010/07/baza-znanja.html' title='Baza znanja'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-5663883033074654150</id><published>2009-07-01T16:43:00.008+02:00</published><updated>2010-09-09T16:57:20.172+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='veštačka inteligencija'/><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritam'/><category scheme='http://www.blogger.com/atom/ns#' term='operaciona istraživanja'/><title type='text'>Optimizacija mravlje kolonije</title><content type='html'>&lt;p&gt;Sad prelazimo sa analogije metalurških procesa na biologiju :) E ta veštačka inteligencija, uvek traže inspiraciju u nečemu postojećem. Ideja je nastala na osnovu proučavanja konunikacije i upravljanja koji se dešava među insektima. Mravi kad traže neki izvor ispuštaju feromone. Feromoni vremenom isparavaju a količina feromona na nekoj stazi zavisi i od dužine staze. Mrav koji nađe kraći put na tom putu će ostaviti veću količinu feromona koji će drugim mravima poslužiti za navođenje na bolju putanju.&lt;/p&gt;&lt;p&gt;Pomoću ove ideje moguće je napisati heuristiku za rešavanje problema trgovačkog putnika (nalaženje što kraće Hamiltonove konture). &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Dovoljno je imati 3 proste formule, toliko proste da su matematičari morali da ih zakomplikuju lupanjem nekih čudnih oznaka, samo im rusko slovo Я fali. To me podseti na epizodu kad sam polagao statistiku kod jedne nemaštovite asistentkinje kojoj je bilo čudno što formulu uslovne verovatnoće nisam izveo identično kao u knjizi, tj. što nisam bubao već pravio delikt mišljenja. Pa sam joj rekao da dok god je formula ispravna mogu da koristim i Э kao oznaku :D Matematičar su uvek najveći problem matematike.&lt;/p&gt;&lt;p&gt;Zato ću ja formule prikazati uprošteno (a i ne znam kako bih napisao sve one indekse, stepene, klince, palce). Prva formula služi da se izračuna količina feromona za neku ivicu (direktnu vezu dva grada). Formula je rekurentna (programerski rečeno rekurzivna) jer se nova količina feromona izračunava preko stare prostim dodavanjem:&lt;/p&gt;&lt;p&gt;kolicina_feromona = kolicina_feromona + Q/duzina_Hamiltonove_konture *RO&lt;/p&gt;&lt;p&gt;Ili uprošćeno:&lt;/p&gt;&lt;p&gt;kolicina_feromona +=  Q/duzina_Hamiltonove_konture *RO&lt;/p&gt;&lt;p&gt;Q je neka konstanta koja označava količinu feromona kojom svaki mrav raspolaže. Pa mrav koji nađe kraću putanju ima ivicama da doda više feromona jer je Q/mala_vrednost veći broj nego Q/velika_vrednost. Konstanta RO je između 0 i 1 i služi da odredi koliko novog feromona treba dodati. Pošto je formula rekurentna mora postojati početna vrednost pa se uzima da je kolicina_feromona = 1 / broj_gradova &lt;/p&gt;&lt;p&gt;Druga formula simulira isparavanje feromona:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;kolicina_feromona = kolicina_feromona * (1 - RO)&lt;/p&gt;&lt;p&gt;ili:&lt;/p&gt;&lt;p&gt;kolicina_feromona *= (1 - RO)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RO je ista konstanta kao iz prethodne formule. Npr. ako je RO = 0,7 to znači da će se na putanju kojom je mrav prošao staviti 70% vrednosti Q/duzina_Hamiltonove_konture, a od stare količine feromona 70% će ispariti.&lt;/p&gt;&lt;p&gt;I treća formula izračunava verovatnoću da se krene nekom ivicom tj. da se obiđe neki neposećeni grad iz tekućeg grada. Za svaku moguću ivicu (tj. za svaku direktnu vezu tekućeg i neposećenih gradova) se izračunava poželjnost. Poželjnost je proporcionalna količini feromona na ivici i njenoj kratkoći. Kratkoću definišemo kao 1 / duzina_ivice a količinu feromona čitamo direktno. Udeo pozeljnosti i-te moguće ivice u zbiru pozeljnosti svih mogućih ivica je upravo verovatnoća da se mrav zaputi tom ivicom. Količinu feromona matematičari označavaju ubercool slovom Tau, a kratkoću slovom Eta. Formula je (** je operator stepenovanja):&lt;/p&gt;&lt;p&gt;P = (Tau**ALFA * Eta**BETA) / SUM(Tau**ALFA * Eta**BETA)&lt;/p&gt;&lt;p&gt;Da bi se kontrolisao značaj kratkoće i feromona uvode se ALFA i BETA parametri kojim se stepenuju količine feromona (Tau) i kratkoće (Eta). Pošto su i Tau i Eta manji od 0 znači da što je stepen veći to se umanjuje značaj te karakteristike u poželjnosti. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;I konačno kod:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;import random, copy, math, time&lt;br /&gt;&lt;br /&gt;class Grad(object):     &lt;br /&gt;    def __init__(self, x, y, ime):&lt;br /&gt;        self.x = x&lt;br /&gt;        self.y = y&lt;br /&gt;        self.ime = ime&lt;br /&gt;        &lt;br /&gt;    def rastojanje(self, grad):&lt;br /&gt;        """ &lt;br /&gt;        rastojanje ovog grada od grada primljenog kao prarametar&lt;br /&gt;        preko euklidske metrike (odnosno funkcije hypot).&lt;br /&gt;        """&lt;br /&gt;        return math.hypot(self.x - grad.x, self.y - grad.y)&lt;br /&gt;        &lt;br /&gt;    def __str__(self):&lt;br /&gt;        return "%s(%d, %d)" % (self.ime, self.x, self.y)&lt;br /&gt; &lt;br /&gt;class Ivica(object):&lt;br /&gt;    def __init__(self, feromoni, duzina):&lt;br /&gt;        self.feromoni = feromoni&lt;br /&gt;        self.duzina = duzina&lt;br /&gt;&lt;br /&gt;class Mrav(object):&lt;br /&gt;    # atribut klase u kojem se cuva broj svih stvorenih mrava&lt;br /&gt;    brojac = -1&lt;br /&gt;    gradovi = None&lt;br /&gt;    ivice = None&lt;br /&gt;    &lt;br /&gt;    def inicijalizuj_atribute(self):&lt;br /&gt;        self.tek_grad = self.pocetni_grad&lt;br /&gt;        self.putanja = [self.tek_grad]  &lt;br /&gt;        self.duzina_putanje = 0.0&lt;br /&gt;        &lt;br /&gt;    def __init__(self, gradovi, alfa, beta, ro, q):&lt;br /&gt;        Mrav.ALFA = alfa&lt;br /&gt;        Mrav.BETA = beta&lt;br /&gt;        Mrav.RO = ro&lt;br /&gt;        Mrav.Q = q&lt;br /&gt;        &lt;br /&gt;        if not Mrav.gradovi: &lt;br /&gt;            Mrav.gradovi = gradovi&lt;br /&gt;            &lt;br /&gt;        if not Mrav.ivice:&lt;br /&gt;            Mrav.ivice = {}&lt;br /&gt;            init_feromoni = 1.0 / len(Mrav.gradovi)&lt;br /&gt;            for i in Mrav.gradovi:&lt;br /&gt;                for j in Mrav.gradovi:&lt;br /&gt;                    if i != j :&lt;br /&gt;                        rastojanje = i.rastojanje(j)&lt;br /&gt;                        Mrav.ivice[i, j] = Ivica(init_feromoni, rastojanje)&lt;br /&gt;                        &lt;br /&gt;        Mrav.brojac += 1&lt;br /&gt;        self.pocetni_grad = Mrav.gradovi[Mrav.brojac % len(Mrav.gradovi)]&lt;br /&gt;        &lt;br /&gt;        self.inicijalizuj_atribute()&lt;br /&gt;       &lt;br /&gt;    def _tau_x_eta(self, do_grad):&lt;br /&gt;        # izracunava vrednost pozeljnosti ivice od tekuceg grada do grada&lt;br /&gt;        # primljenog kao parametar. Pozeljnost ivice je direktno proporcionalna &lt;br /&gt;        # kolicini feromona na njoj (sto se oznacava sa tau), a obratni proporcionalna &lt;br /&gt;        # njenoj duzini (eta). Stepenovanjem tau i eta sa parametrima ALFA i BETA &lt;br /&gt;        # omogucava nam da dajemo prednost jednom ili drugom kriterijumu pozeljnosti&lt;br /&gt;        # i to tako sto BETA oznacava koliko umanjujemo znacaj blizine a ALFA&lt;br /&gt;        # koliko umanjujemo znacaj feromona. Npr. za ALFA: 1 i BETA: 5 znaci da&lt;br /&gt;        # nam je vaznija kolicina feromona od blizine&lt;br /&gt;        ivica = Mrav.ivice[self.tek_grad, do_grad]&lt;br /&gt;        tau = ivica.feromoni&lt;br /&gt;        eta = 1.0 / ivica.duzina&lt;br /&gt;        &lt;br /&gt;        return tau**Mrav.ALFA * eta**Mrav.BETA&lt;br /&gt;        &lt;br /&gt;    def _odaberi_sledeci_grad(self):&lt;br /&gt;        imenilac = 0.0&lt;br /&gt;        &lt;br /&gt;        # svi gradovi razlika poseceni = neposeceni, skupovna operacija&lt;br /&gt;        neposeceni_gradovi = set(Mrav.gradovi).difference(self.putanja)&lt;br /&gt;        &lt;br /&gt;        # ako nema neposecenih vrati None&lt;br /&gt;        if not neposeceni_gradovi:        &lt;br /&gt;            return None&lt;br /&gt;        &lt;br /&gt;        # za svaki neposeceni grad izracunaj _tau_x_eta i saberi&lt;br /&gt;        # tj. racunamo zbir svih pozeljnosti posete neposecenim gradovima&lt;br /&gt;        for grad in neposeceni_gradovi:&lt;br /&gt;            imenilac += self._tau_x_eta(grad)&lt;br /&gt;        &lt;br /&gt;        # za svaki neposecen grad izracunaj verovatnocu posete p&lt;br /&gt;        # i pokusaj da je ostvaris, ako je ne ostvaris probaj&lt;br /&gt;        # ponovo sve iz pocetka dok konacno ne uspes u tome.&lt;br /&gt;        # Verovatnoca posete se izravunava tako sto podelimo pozeljnost posete&lt;br /&gt;        # neposecenog grada sa zbirom svih pozeljnosti posete neposecenim gradovima&lt;br /&gt;        while True:&lt;br /&gt;            for grad in neposeceni_gradovi:&lt;br /&gt;                p = self._tau_x_eta(grad) / imenilac&lt;br /&gt;                &lt;br /&gt;                if random.random() &lt; p:&lt;br /&gt;                    return grad&lt;br /&gt;&lt;br /&gt;    def pusti_mrava(self):&lt;br /&gt;        sled_grad = self._odaberi_sledeci_grad()&lt;br /&gt;        &lt;br /&gt;        # dok postoji sledeci grad za obilazak stavi ga u putanju obishenih&lt;br /&gt;        # azuriraj duzinu putanje mrava i tekuci grad a zatim nadji sledeci grad&lt;br /&gt;        while sled_grad:&lt;br /&gt;            self.putanja.append(sled_grad)&lt;br /&gt;            self.duzina_putanje += Mrav.ivice[self.tek_grad, sled_grad].duzina&lt;br /&gt;            self.tek_grad = sled_grad&lt;br /&gt;            sled_grad = self._odaberi_sledeci_grad()&lt;br /&gt;        &lt;br /&gt;        # sad je sled_grad None znaci da smo prosli sve gradove&lt;br /&gt;        # a Hamiltonovu konturu zatvaramo vezujuci 1. i poslednji &lt;br /&gt;        # poseceni grad koji se cuvaju u self.putanja (0. i -1. poziciju)&lt;br /&gt;        self.duzina_putanje += Mrav.ivice[self.putanja[0], self.putanja[-1]].duzina&lt;br /&gt;        &lt;br /&gt;    def pospi_feromone(self):&lt;br /&gt;        br_gradova = len(self.putanja)&lt;br /&gt;        &lt;br /&gt;        # svakoj ivici putanje mrava (Hamiltonove konture) u oba smera dodaj &lt;br /&gt;        # odgovarajucu kolicinu feromona po formuli Q / duzina_putanje * RO&lt;br /&gt;        for i in xrange(br_gradova):&lt;br /&gt;            od_grada = self.putanja[i]&lt;br /&gt;            do_grada = self.putanja[(i + 1) % br_gradova]&lt;br /&gt;            &lt;br /&gt;            Mrav.ivice[od_grada, do_grada].feromoni += Mrav.Q / self.duzina_putanje * Mrav.RO&lt;br /&gt;            Mrav.ivice[do_grada, od_grada].feromoni = Mrav.ivice[od_grada, do_grada].feromoni&lt;br /&gt;            &lt;br /&gt;    @staticmethod&lt;br /&gt;    def ispari_feromone():&lt;br /&gt;        # smanji kolicinu feromona na svakoj ivici po rekurentnoj formuli feromoni *= 1 / RO&lt;br /&gt;        for ivica in Mrav.ivice.itervalues():&lt;br /&gt;            ivica.feromoni *= (1.0 - Mrav.RO)&lt;br /&gt;            &lt;br /&gt;    def koordinate(self):&lt;br /&gt;        x, y = [], []&lt;br /&gt;        &lt;br /&gt;        for grad in self.putanja:&lt;br /&gt;            x.append(grad.x)&lt;br /&gt;            y.append(grad.y)&lt;br /&gt;        &lt;br /&gt;        return x, y&lt;br /&gt;    &lt;br /&gt;    # toString u javi        &lt;br /&gt;    def __str__(self):&lt;br /&gt;        return "duzina puta: %f" % self.duzina_putanje&lt;br /&gt;    &lt;br /&gt;    # compare u javi&lt;br /&gt;    def __cmp__(self, drugi):&lt;br /&gt;        return cmp(self.duzina_putanje, drugi.duzina_putanje)&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;class MravljiSimulator(object):&lt;br /&gt;    def __init__(self, gradovi, ALFA = 1.0, BETA = 5.0, RO = 0.5, Q = 100.0):&lt;br /&gt;        self.mravi = []&lt;br /&gt;        for i in xrange(len(gradovi)):&lt;br /&gt;            self.mravi.append(Mrav(gradovi, ALFA, BETA, RO, Q))&lt;br /&gt;        self.najbolji_mrav = self.mravi[0] # proizvoljnog mrava proglasimo najboljim&lt;br /&gt;        &lt;br /&gt;    def start(self, ponavljanja=20):&lt;br /&gt;        # za svako ponavljanje&lt;br /&gt;        for i in xrange(ponavljanja):&lt;br /&gt;            # pusti svakog mrava da napravi Hamiltonovu konturu&lt;br /&gt;            for mrav in self.mravi:&lt;br /&gt;                mrav.pusti_mrava()&lt;br /&gt;                &lt;br /&gt;            Mrav.ispari_feromone()&lt;br /&gt;                &lt;br /&gt;            # svaki mrav nek pospe feromone na svojoj konturi&lt;br /&gt;            for mrav in self.mravi:&lt;br /&gt;                mrav.pospi_feromone()&lt;br /&gt;                &lt;br /&gt;            najuspesniji_mrav_generacije = min(self.mravi)&lt;br /&gt;            &lt;br /&gt;            # pamtimo sveukupno najuspesnijeg mrava&lt;br /&gt;            self.najbolji_mrav = copy.deepcopy(&lt;br /&gt;                    min(self.najbolji_mrav, najuspesniji_mrav_generacije))&lt;br /&gt;            &lt;br /&gt;            # pripremamo mrave za ponavljanje tako sto ih resetujemo&lt;br /&gt;            for mrav in self.mravi:&lt;br /&gt;                mrav.inicijalizuj_atribute()&lt;br /&gt;                &lt;br /&gt;    def stampaj_resenje(self):  &lt;br /&gt;        if self.najbolji_mrav:&lt;br /&gt;            try:&lt;br /&gt;                # ako je instalirana matplot biblioteka koristi je za graficki prikaz&lt;br /&gt;                import matplotlib.pyplot as plt &lt;br /&gt;                &lt;br /&gt;                x, y = self.najbolji_mrav.koordinate()&lt;br /&gt;                                &lt;br /&gt;                # 1. tacku dodajemo ponovo da bi zatvorili konturu od poslednje ka 1. tacki&lt;br /&gt;                x.append(x[0])&lt;br /&gt;                y.append(y[0])&lt;br /&gt;                &lt;br /&gt;                plt.title('prikaz nadjenog resenja')&lt;br /&gt;                plt.plot(x, y, 'g', marker='.', markerfacecolor='r', markersize=20, label='najbolje r.')&lt;br /&gt;                plt.xlabel('x koordinata')&lt;br /&gt;                plt.ylabel('y koordinata')&lt;br /&gt;                plt.text(2, 95, 'najbolja duzina: %f.2' % self.najbolji_mrav.duzina_putanje)&lt;br /&gt;                plt.legend()&lt;br /&gt;                &lt;br /&gt;                for grad in self.najbolji_mrav.putanja:&lt;br /&gt;                    plt.text(grad.x, grad.y - 2.5, grad.ime)&lt;br /&gt;                &lt;br /&gt;                plt.axis([min(x) -1, max(x) + 1, min(y) -1, max(y) +1])             &lt;br /&gt;             &lt;br /&gt;                plt.show()&lt;br /&gt;            except ImportError:&lt;br /&gt;                # nema matplot biblioteke stampaj resenje rucno&lt;br /&gt;                print "Resenje"&lt;br /&gt;                print self.najbolji_mrav.putanja&lt;br /&gt;                print "duzina puta je: ", self.najbolji_mrav.duzina_putanje&lt;br /&gt;                &lt;br /&gt;        &lt;br /&gt;def main():&lt;br /&gt;    try:&lt;br /&gt;        import psyco # ako je instalirana biblioteka koristi je (ubrzava izvsenje koda)&lt;br /&gt;        psyco.full()&lt;br /&gt;    except ImportError:&lt;br /&gt;        pass    &lt;br /&gt;    &lt;br /&gt;    gradovi = [Grad(1, 2, 'a'), Grad(29, 21, 'b'),Grad(100, 60, 'c'), Grad(12, 86, 'd'), &lt;br /&gt;            Grad(92, 46, 'e'), Grad(83, 38, 'f'), Grad(55, 36, 'g'), Grad(71, 99, 'h'),&lt;br /&gt;            Grad(12, 41, 'i'), Grad(34, 48, 'j'), Grad(69, 33, 'k'), Grad(78, 10, 'l'),&lt;br /&gt;            Grad(86, 68, 'm'), Grad(79, 27, 'n'), Grad(22, 69, 'o'), Grad(75, 55, 'p'),&lt;br /&gt;            Grad(51, 68, 'r'), Grad(91, 23, 's'), Grad(22, 42, 't'), Grad(47, 80, 'u'), &lt;br /&gt;            Grad(60, 10, 'w'), Grad(91, 79, 'v'), Grad(5, 66, 'x'), Grad(42, 90, 'y'),&lt;br /&gt;            Grad(23, 59, '1'), Grad(46, 83, '2'), Grad(93, 63, '3'), Grad(47, 17, '4'),&lt;br /&gt;            Grad(53, 79, '5'), Grad(76, 23, '6'), Grad(91, 62, '7'), Grad(44, 97, '8'),&lt;br /&gt;            ]&lt;br /&gt;            &lt;br /&gt;    simulator = MravljiSimulator(gradovi, ALFA=1.0, BETA = 2.0, RO=0.5)&lt;br /&gt;    &lt;br /&gt;    t0 = time.time()&lt;br /&gt;    simulator.start(ponavljanja=50)&lt;br /&gt;    print "Izvrsenje trajalo", time.time() - t0, "sekundi"&lt;br /&gt;    &lt;br /&gt;    simulator.stampaj_resenje()&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    main()    &lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rQI3KHRDvs4/SkuBNkTwMZI/AAAAAAAAABE/pC3Mxrxqgrs/s1600-h/image_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 316px;" src="http://4.bp.blogspot.com/_rQI3KHRDvs4/SkuBNkTwMZI/AAAAAAAAABE/pC3Mxrxqgrs/s400/image_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353514652144775570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Gradovi koje sam ovde koristio su isti oni koje sam korisitio sa Simuliranim kaljenjem. Rastojanja gradova se unapred izračunaju da bi se program brže izvršavao. Brzo se dobijaju dobra rešenja. Otprilike da je putanja koju pronađe u proseku dugačka oko 530. A svaki 15-20 put ubode se i rešenje čiju sam sliku postavio. Za razliku od Simuliranog kaljena ovde ima mnoštvo parametara sa kojima se treba igrati da se nađe njihova dobra vrednost.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-5663883033074654150?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/5663883033074654150/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=5663883033074654150&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5663883033074654150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/5663883033074654150'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2009/07/optimizacija-mravlje-kolonije.html' title='Optimizacija mravlje kolonije'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rQI3KHRDvs4/SkuBNkTwMZI/AAAAAAAAABE/pC3Mxrxqgrs/s72-c/image_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-6859795113911547327</id><published>2009-06-23T20:44:00.017+02:00</published><updated>2009-06-23T23:52:25.142+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='veštačka inteligencija'/><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritam'/><category scheme='http://www.blogger.com/atom/ns#' term='operaciona istraživanja'/><title type='text'>Kako se kale kraljice</title><content type='html'>Još jedan problem s kojim se ljudi koji se bave umetnošću programiraju vaćaju u koštac je problem N kraljica. Na tabli N x N treba postaviti N kraljca a da jedna drugu ne jedu.&lt;br /&gt;&lt;br /&gt;I ovaj problem se može rešiti Simuliranim kaljenjem. Funkcija cilja je u ovom slučaju broj sukoba, samo za razliku od prošlog primera sa trgovcem ovde se zna da je optimalno rešenje kad je f. cilja = 0.&lt;br /&gt;&lt;br /&gt;Počentno rešenje se lako nalazi. Prvo ne sme se desti da više od jedne kraljce bude u bilo kom redu i bilo kojoj koloni. Dakle najprostije je da se poređaju po dijagonali. U mom rešenju se takvo rešenje tvikuje par puta i dobija se početno rešenje.&lt;br /&gt;&lt;br /&gt;Tvikovanje se sastoji u nasumičnoj zameni 2 kolone.&lt;br /&gt;&lt;br /&gt;Implementacija je takva da se u klasi Resenje u nizu koji se zove kraljice čuva pozicija kraljice u redu za svaku kolonu. Npr. niz [1, 0, 2] znači da se u 1. koloni kraljica nalazi u 2. redu, 2. koloni u redu 1, a u 3. koloni u redu 3 (i u Pythonu su prvi elementi niza na poziciji 0). Dakle u početnom rešenju ćemo pre tvikovanja imati ovakav niz: [0, 1, 2, 3, ...] jer kraljice postavljamo po dijagonali.&lt;br /&gt;&lt;br /&gt;Dalje formiramo tabelu N x N i koja se puni None objektima (u pythonu je sve objekat pa i Null vrednost ) osim što se na dijagonalama postavi string K kao oznaka da je tu kraljica.&lt;br /&gt;&lt;br /&gt;Samo simulirano kaljenje je slično kao u prošlom primeru. Jedino se manje vrši resetovanje tekućeg rešenja jer je takav zadatak da se tvikovanje može obaviti na već tvikovano rešenje bez većeg problema.&lt;br /&gt;&lt;br /&gt;A pošto znamo koje je optimalno rešenje, kaljenje se ponavlja iznova sve dok ne dođemo do tog rešenja kad se štampa optimalni raspored na tabli.&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;import random, copy, math, time&lt;br /&gt;&lt;br /&gt;class Resenje(object):&lt;br /&gt;    def __init__(self, br_kraljica):&lt;br /&gt;        self.br_kraljica = br_kraljica&lt;br /&gt;        # resenje: pozicija kraljice u koloni 0 do len - 1&lt;br /&gt;        self.kraljice = range(br_kraljica)  &lt;br /&gt;        # energija: treba da je  0 &lt;br /&gt;        self.__broj_sukoba = None&lt;br /&gt;        &lt;br /&gt;        ## postavljamo pocetno resenje&lt;br /&gt;        # generisemo tabelu br_kraljica X br_kraljica popunjenu None elementima&lt;br /&gt;        self.tabla = [[None for i in range(br_kraljica)] for j in range(br_kraljica)]&lt;br /&gt;        &lt;br /&gt;        # postavimo kraljice po dijagonali&lt;br /&gt;        for i in xrange(br_kraljica):&lt;br /&gt;            self.tabla[i][i] = 'K'&lt;br /&gt;        &lt;br /&gt;        # promesamo kolone    &lt;br /&gt;        for i in xrange(br_kraljica):&lt;br /&gt;            self.tvikuj_resenje()&lt;br /&gt;        &lt;br /&gt;    # f-ja cilja, optimalno resenje ima 0 sukoba   &lt;br /&gt;    def get_broj_sukoba(self):&lt;br /&gt;        # Ovo je optimizacija da se broj sukoba racuna samo ako vec nije izrazcunat&lt;br /&gt;        if not self.__broj_sukoba:&lt;br /&gt;            self.__broj_sukoba = self.__racunaj_broj_sukoba()&lt;br /&gt;        return self.__broj_sukoba&lt;br /&gt;    &lt;br /&gt;    # racuna energiju resenja, prakticno funkciju cilja koja se minimizuje&lt;br /&gt;    # a je ovde broj sukoba svih kraljica na tabli&lt;br /&gt;    def __racunaj_broj_sukoba(self):&lt;br /&gt;        # povratna vr. &lt;br /&gt;        # zato sto se sukobljava sam sa sobom i to pri proveri svake od 4 &lt;br /&gt;        # dijagonala a to se ne racuna&lt;br /&gt;        br_sukoba = -4 * self.br_kraljica &lt;br /&gt;        &lt;br /&gt;        dx = (-1, 1, -1, 1) # pomeraj koordinate x za kretanje po dijagonalama&lt;br /&gt;        dy = (-1, 1, 1, -1) # pomeraj koordinate y -//-&lt;br /&gt;        &lt;br /&gt;        # provera dijagonala&lt;br /&gt;        for x, y in enumerate(self.kraljice): # (x,y) koord. kraljica&lt;br /&gt;            for i in xrange(4): # za sva 4 kraka dijagonala&lt;br /&gt;                pomx, pomy = x, y # pretraga krece od koordinata kraljice&lt;br /&gt;                # dok se pomeranjem po dijagonali nalazimo na tabli ispitujemo &lt;br /&gt;                # da li smo nabasali na kraljicu. Svaki od 4 ciklusa za 4 dijagonale&lt;br /&gt;                # nailazi na sopstvenu kraljicu pa je zato br_sukoba inicijalizovan &lt;br /&gt;                # na -4 * self.br_kraljica &lt;br /&gt;                while (0 &lt;= pomx &lt; self.br_kraljica) and (0 &lt;= pomy &lt; self.br_kraljica): &lt;br /&gt;                    if self.tabla[pomx][pomy] == 'K':&lt;br /&gt;                        br_sukoba += 1&lt;br /&gt;                    pomx += dx[i]&lt;br /&gt;                    pomy += dy[i]&lt;br /&gt;            &lt;br /&gt;        return br_sukoba&lt;br /&gt;    &lt;br /&gt;    broj_sukoba = property(get_broj_sukoba)&lt;br /&gt;    &lt;br /&gt;    # zamenjuje 2 kolone&lt;br /&gt;    def tvikuj_resenje(self):&lt;br /&gt;        r1 = random.randrange(self.br_kraljica)&lt;br /&gt;        r2 = random.randrange(self.br_kraljica)&lt;br /&gt;        &lt;br /&gt;        # kolone moraju biti razlicite&lt;br /&gt;        while r2 == r1:&lt;br /&gt;            r2 = random.randrange(self.br_kraljica)&lt;br /&gt;            &lt;br /&gt;        # zameni redove r1 i r2&lt;br /&gt;        self.tabla[r1], self.tabla[r2] = self.tabla[r2], self.tabla[r1]&lt;br /&gt;        &lt;br /&gt;        # zameni elemente&lt;br /&gt;        self.kraljice[r1], self.kraljice[r2] = self.kraljice[r2], self.kraljice[r1]&lt;br /&gt;        &lt;br /&gt;        # prethodno izracunata duzina puta vise ne vazi pa se setuje na None&lt;br /&gt;        self.__broj_sukoba = None&lt;br /&gt;    &lt;br /&gt;    def __str__(self):&lt;br /&gt;        rez = ''&lt;br /&gt;        for red in self.tabla:&lt;br /&gt;            s = ''&lt;br /&gt;            for element in red:&lt;br /&gt;                if element: s += element&lt;br /&gt;                else: s += '.'&lt;br /&gt;            rez += s &lt;br /&gt;            rez += '\n'&lt;br /&gt;        return rez&lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;class SimulatorKaljenja(object):&lt;br /&gt;    def __init__(self, br_kraljica):&lt;br /&gt;        self.br_kraljica = br_kraljica&lt;br /&gt;        self.resenje = None&lt;br /&gt;        &lt;br /&gt;    def start(self, pocetna_temperatura=90.0, alpha=0.997, ponavljanja=None):&lt;br /&gt;        najbolje_resenje = Resenje(self.br_kraljica)&lt;br /&gt;        tekuca_temp = pocetna_temperatura&lt;br /&gt;        if not ponavljanja: ponavljanja = self.br_kraljica / 2&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        while tekuca_temp &gt; 0.10 and najbolje_resenje.broj_sukoba &gt; 0:&lt;br /&gt;            privremeno_resenje = copy.deepcopy(najbolje_resenje)&lt;br /&gt;            &lt;br /&gt;            # Monte Carlo na tekucoj temperaturi&lt;br /&gt;            for i in xrange(ponavljanja):&lt;br /&gt;                privremeno_resenje.tvikuj_resenje()&lt;br /&gt;                &lt;br /&gt;                delta_e = privremeno_resenje.broj_sukoba - najbolje_resenje.broj_sukoba&lt;br /&gt;                &lt;br /&gt;                # ako je resenje bolje uzimamo ga a ako nije tada uz &lt;br /&gt;                # odredjenu verovatnocu odabiramo losije resenje kao tekuce&lt;br /&gt;                if delta_e &lt; 0.0 or (math.exp(-delta_e / tekuca_temp) &gt; random.random()):&lt;br /&gt;                    if  privremeno_resenje.broj_sukoba &lt; najbolje_resenje.broj_sukoba:&lt;br /&gt;                        najbolje_resenje = copy.deepcopy(privremeno_resenje)&lt;br /&gt;                else:&lt;br /&gt;                    privremeno_resenje = copy.deepcopy(najbolje_resenje)&lt;br /&gt;                &lt;br /&gt;            tekuca_temp *= alpha&lt;br /&gt;        &lt;br /&gt;        self.resenje = najbolje_resenje&lt;br /&gt;    &lt;br /&gt;def main():&lt;br /&gt;    try:&lt;br /&gt;        import psyco&lt;br /&gt;        psyco.full()&lt;br /&gt;    except ImportError:&lt;br /&gt;        pass&lt;br /&gt;        &lt;br /&gt;    simulator = SimulatorKaljenja(32)    &lt;br /&gt;    &lt;br /&gt;    t0 = time.time()&lt;br /&gt;&lt;br /&gt;    i = 1&lt;br /&gt;    while True:&lt;br /&gt;        print 'ciklus', i&lt;br /&gt;        i += 1&lt;br /&gt;        simulator.start()&lt;br /&gt;        print 'najbolje resenje', simulator.resenje.broj_sukoba&lt;br /&gt;        if simulator.resenje.broj_sukoba == 0:&lt;br /&gt;            break&lt;br /&gt;       &lt;br /&gt;    print simulator.resenje&lt;br /&gt;    print "Izvrsenje trajalo", time.time() - t0, "sekundi"&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    main()&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;span&gt;Primer rezultat ovoga koda je:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: text; gutter: false"&gt;ciklus 1 &lt;br /&gt;najbolje resenje 2 &lt;br /&gt;ciklus 2 &lt;br /&gt;najbolje resenje 0 &lt;br /&gt;.K.............................. &lt;br /&gt;....................K........... &lt;br /&gt;..................K............. &lt;br /&gt;............K................... &lt;br /&gt;..K............................. &lt;br /&gt;...........................K.... &lt;br /&gt;.................K.............. &lt;br /&gt;K............................... &lt;br /&gt;..........K..................... &lt;br /&gt;.....K.......................... &lt;br /&gt;...............................K &lt;br /&gt;...................K............ &lt;br /&gt;..........................K..... &lt;br /&gt;.............K.................. &lt;br /&gt;.....................K.......... &lt;br /&gt;............................K... &lt;br /&gt;...............K................ &lt;br /&gt;.............................K.. &lt;br /&gt;......................K......... &lt;br /&gt;......K......................... &lt;br /&gt;.........................K...... &lt;br /&gt;.......K........................ &lt;br /&gt;..............K................. &lt;br /&gt;...........K.................... &lt;br /&gt;..............................K. &lt;br /&gt;....K........................... &lt;br /&gt;................K............... &lt;br /&gt;........................K....... &lt;br /&gt;.........K...................... &lt;br /&gt;.......................K........ &lt;br /&gt;...K............................ &lt;br /&gt;........K....................... &lt;br /&gt;&lt;br /&gt;Izvrsenje trajalo 35.1647040844 sekundi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-6859795113911547327?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/6859795113911547327/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=6859795113911547327&amp;isPopup=true' title='0 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6859795113911547327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/6859795113911547327'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2009/06/kako-se-kale-kraljice.html' title='Kako se kale kraljice'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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-29226980.post-8254974421493502859</id><published>2009-06-22T20:03:00.014+02:00</published><updated>2010-09-10T15:12:42.774+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='veštačka inteligencija'/><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritam'/><category scheme='http://www.blogger.com/atom/ns#' term='operaciona istraživanja'/><title type='text'>Kako se kalio čelik</title><content type='html'>Nešto mi je ovijeh dana dosadno bilo, a dokon um đavolje dvorište. Te se dovatim jedne knjige o AI algoritmima. U pa tu ima svakakve 'euristike, ovi iz Operacionih bi zinuli. Ovde ću kako budem stizao da postavljam neke algoritme. Knjiga ima neke C kodove, sad malo ko parla C, a i ti kodovi su tako odvratni i u knjizi dati iz delova i nepotpuno. Pa sam ih ja sredio u mom omiljenom prog. jeziku.&lt;br /&gt;&lt;br /&gt;Prvi algoritam je Simulirano kaljenje. Ima nešto o tome u knjizi iz Operacionih, ali to su pisali matematičari (čitaj: dosadni tipovi). Ideja je da se podražava proces kaljenja. To smo valjda učili iz Teknologije, eto neke koristi i od toga  Pa kako se kali? Podigne se temperatura pa se čuka metalni predmet i izvaja u neki oblik, pa se polako 'ladi a i dalje čuka.&lt;br /&gt;U ovom algoritmu se prvo nađe neko najobičnije rešenje, zatim se to rešenje tvikuje (malo se promeni) i gleda kakvo je u odnosu na prethodno. Ako je bolje super, usvajamo ga, ako nije onda po nekoj verovatnoći usvaja. Jer lošije rešenje može u nekoj sledećoj iteraciji voditi u bolje. Usvajanjem ponekog lošijeg rešenja se izbegava nalaženje nekog lokalnog minimuma koji je daleko od globalnog.&lt;br /&gt;&lt;br /&gt;E sad da se ne bi mlogo lutalo ta verovatnoća da se usvoji lošije rešenje se iz ciklusa u ciklus smanjuje. To podražava smanjenje se temperatura metala pri kaljenju, što je metal ladniji teže ga je oblikovati. A verovatnoća usvajanja lošijeg rešenja zavisi i od toga koliko je to rešenje lošije. Ako je mlogo loše onda je mala verovatnoća da ga usvojimo.&lt;br /&gt;Znam da vam ništa nije jasno  Evo primer primene algoritma. Setite se problema trgovačkog putnika. Postoje algoritmi ali su oni NP-kompletni (u prevodu, teški u p.m za više od 30 čvorova). E sad Simuliranim kaljenjem se dobija rešenje blisko optimalnom ako ne i optimalno (ako vas baš ukenja).&lt;br /&gt;&lt;br /&gt;I kako to radi? Pa uzme se neka putanja. Može nasumična može sistemom najbližih čvorova (ovo je bolje početno rešenje). Pa se onda u tom rešenju zamene mesta nekih čvorova i izračuna nova dužina i poredi sa prethodnom. Ako je bolja usvaja se rešenje, ako nije ide po onoj verovatnoći. I tako se iz ciklusa u ciklus smanjuje temperatura sve dok ne padne na neku zaustavnu a pamti se najbolje rešenje. Prosto ko pasulj!&lt;br /&gt;&lt;br /&gt;Nemojte da vas uplaši kod, to je prost jezik, a najveći deo koda odlazi na štampanje, što vam nije potrebno da razumete jer je to pythonizovan matlab. Prvo pravimo klasu Grad koja će predstavljati jedan čvor u grafu (__init__ metoda je konstruktor u Pythonu) i definišemo funkciju koja za dati grad iz liste gradova nalazi najbliži:&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;class Grad(object):&lt;br /&gt;    def __init__(self, x, y, label):&lt;br /&gt;    self.x = x&lt;br /&gt;    self.y = y&lt;br /&gt;    self.label = label&lt;br /&gt;&lt;br /&gt;    def rastojanje(self, grad):&lt;br /&gt;    """&lt;br /&gt;    rastojanje ovog grada od grada primljenog kao prarametar&lt;br /&gt;    preko euklidske metrike (odnosno funkcije hypot).&lt;br /&gt;    """&lt;br /&gt;    return math.hypot(self.x - grad.x, self.y - grad.y)&lt;br /&gt;&lt;br /&gt;    def __str__(self):&lt;br /&gt;    return "%s(%d, %d)" % (self.label, self.x, self.y)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    def _najblizi(pivot, gradovi):&lt;br /&gt;    rez = None&lt;br /&gt;    min_rastojanje = sys.maxint&lt;br /&gt;    for grad in gradovi:&lt;br /&gt;    rastojanje = grad.rastojanje(pivot)&lt;br /&gt;    if rastojanje &amp;lt; min_rastojanje:&lt;br /&gt;        min_rastojanje = rastojanje&lt;br /&gt;        rez = grad&lt;br /&gt;    return rez&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Potom prvimo klasu za rešenje koje se sastoji od redosleda gradova koje treba obići.  Ima metodu za dužinu rešenja (vrednost funkcije cija što bi rekli ćelavi matematičari), metodu za tvikovanja i jednu pomoćnu za grafike. Objekat u konstruktoru automatski nalazi početno rešenje obilaska po metodu idem od čvora do prvog najbližeg dok ne prođem kroz sve:&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;class Resenje(object):&lt;br /&gt;    def __init__(self, gradovi=[]):&lt;br /&gt;        self.gradovi = []           # gradovi&lt;br /&gt;        self.__duzina_puta = None   # energija resenja&lt;br /&gt;&lt;br /&gt;        tek = gradovi.pop(0)        # ukloni se prvi od primenljenih&lt;br /&gt;        self.gradovi.append(tek)    # i stavi kao pocetni&lt;br /&gt;&lt;br /&gt;        while gradovi:&lt;br /&gt;            tek = _najblizi(tek, gradovi)       # nadje se najblizi tekucem&lt;br /&gt;            gradovi.remove(tek)                 # on se ukloni iz primeljenih&lt;br /&gt;            self.gradovi.append(tek)            # i stavi kao sledeci u putanji&lt;br /&gt;&lt;br /&gt;    def get_duzina_puta(self):&lt;br /&gt;        # ako je duzina puta izracunata (prethodno je pozivana grad.duzina_puta)&lt;br /&gt;        # i ako u medjuvremenu nije bilo zamene tada je ta duzina i dalje postoji&lt;br /&gt;        # i ispravna je. Ovo je jedna optimizacija.&lt;br /&gt;        if not self.__duzina_puta:&lt;br /&gt;            self.__duzina_puta = self.__racunaj_put()&lt;br /&gt;        return self.__duzina_puta&lt;br /&gt;&lt;br /&gt;        def __racunaj_put(self):&lt;br /&gt;        duzina = 0.0&lt;br /&gt;&lt;br /&gt;        for i in range(len(self.gradovi)):&lt;br /&gt;            tek_grad = self.gradovi[i]&lt;br /&gt;            sledeci_grad = self.gradovi[(i+1) % len(self.gradovi)]&lt;br /&gt;            duzina += tek_grad.rastojanje(sledeci_grad)&lt;br /&gt;&lt;br /&gt;        return duzina&lt;br /&gt;&lt;br /&gt;    # duzina_puta je property kao u C#, get metoda je get_duzina_puta&lt;br /&gt;    # set metoda ne postoji (read-only property)&lt;br /&gt;    duzina_puta = property(get_duzina_puta)&lt;br /&gt;&lt;br /&gt;    def zameni_put(self):&lt;br /&gt;        g1 = random.randrange(len(self.gradovi))&lt;br /&gt;        g2 = random.randrange(len(self.gradovi))&lt;br /&gt;&lt;br /&gt;        while g2 == g1: # obezbedjivanje da g2 != g1&lt;br /&gt;            g2 = random.randrange(len(self.gradovi))&lt;br /&gt;&lt;br /&gt;        # zamena u jednoj liniji bez pomocne promenjive&lt;br /&gt;        self.gradovi[g1], self.gradovi[g2] = self.gradovi[g2], self.gradovi[g1]&lt;br /&gt;&lt;br /&gt;        # prethodno izracunata duzina puta vise ne vazi pa se setuje na None&lt;br /&gt;        self.__duzina_puta = None&lt;br /&gt;&lt;br /&gt;    # pomocna metoda za stampanje resenja&lt;br /&gt;    def koordinate(self):&lt;br /&gt;        x, y = [], []&lt;br /&gt;&lt;br /&gt;        for grad in self.gradovi:&lt;br /&gt;            x.append(grad.x)&lt;br /&gt;            y.append(grad.y)&lt;br /&gt;&lt;br /&gt;        return x, y&lt;br /&gt;&lt;/pre&gt;I konačno klasa u kojoj se simulirano kaljenje obavlja. U konstruktoru se prihvata početno rešenje a u metodi start() se dešava ćudo, sa namernim ć :) :&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;class SimulatorKaljenja(object):&lt;br /&gt;    def __init__(self, pocetno_resenje):&lt;br /&gt;        self.pocetno_resenje = copy.deepcopy(pocetno_resenje)&lt;br /&gt;        self.resenje = None&lt;br /&gt;        self.najbolje_resenje = None&lt;br /&gt;        self.duzine = []&lt;br /&gt;        self.temperature = []&lt;br /&gt;&lt;br /&gt;    def start(self, pocetna_temperatura=100, alpha=0.999, ponavljanja=10):&lt;br /&gt;        tekuce_resenje = copy.deepcopy(self.pocetno_resenje)&lt;br /&gt;        privremeno_resenje = copy.deepcopy(self.pocetno_resenje)&lt;br /&gt;        najbolje_resenje = copy.deepcopy(self.pocetno_resenje)&lt;br /&gt;        tek_temperatura = pocetna_temperatura&lt;br /&gt;        ZAUSTAVNA_TEMPERATURA = 0.4&lt;br /&gt;&lt;br /&gt;        while tek_temperatura &gt; ZAUSTAVNA_TEMPERATURA:&lt;br /&gt;&lt;br /&gt;            # pamtimo kretanje duzine i temperature kroz iteracije&lt;br /&gt;            # da bismo ih kasnije prikazali na grafikonu&lt;br /&gt;            self.duzine.append(tekuce_resenje.duzina_puta)&lt;br /&gt;            self.temperature.append(tek_temperatura)&lt;br /&gt;&lt;br /&gt;            for i in xrange(ponavljanja):&lt;br /&gt;                privremeno_resenje.zameni_put()&lt;br /&gt;&lt;br /&gt;                delta_e = privremeno_resenje.duzina_puta - tekuce_resenje.duzina_puta&lt;br /&gt;&lt;br /&gt;                # ako je privremeno_resenje bolje (delta_e &amp;lt; 0) uzimamo ga&lt;br /&gt;                # a ako nije tada uz odredjenu verovatnocu po formuli:&lt;br /&gt;                # e^(-delta_e / tek_temperatura) odabiramo losije resenje kao tekuce&lt;br /&gt;                # ta verovatnoca je obrnuto srazmerna tek_temperaturi i sto je to novo&lt;br /&gt;                # resenje losije (sto je delta_e vece) ono se teze usvaja&lt;br /&gt;                if delta_e &gt; 0: print delta_e, tek_temperatura, math.exp(-delta_e / tek_temperatura)&lt;br /&gt;                if delta_e &amp;lt; 0.0 or ( math.exp(-delta_e / tek_temperatura) &gt; random.random() ):&lt;br /&gt;                    tekuce_resenje = copy.deepcopy(privremeno_resenje)&lt;br /&gt;                    if tekuce_resenje.duzina_puta &amp;lt; najbolje_resenje.duzina_puta:&lt;br /&gt;                        najbolje_resenje = copy.deepcopy(tekuce_resenje)&lt;br /&gt;                else:&lt;br /&gt;                    # resetujemo privremeno resenje i probamo dalje&lt;br /&gt;                    privremeno_resenje = copy.deepcopy(tekuce_resenje)&lt;br /&gt;&lt;br /&gt;            tek_temperatura *= alpha&lt;br /&gt;&lt;br /&gt;        self.resenje = tekuce_resenje&lt;br /&gt;        self.najbolje_resenje = najbolje_resenje&lt;br /&gt;&lt;br /&gt;        return tekuce_resenje&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ovoj se klasi dodaje i metoda za prikaz rešenja u grafičkom obliku preko matplot biblioteke (i sve to besplatno i slobodno):&lt;br /&gt;&lt;pre class="brush: py; wrap-lines: false;"&gt;&lt;br /&gt;def stampaj_resenje(self):&lt;br /&gt;  if self.resenje:&lt;br /&gt;      try:&lt;br /&gt;          # ako je instalirana matplot biblioteka koristi je za graficki prikaz&lt;br /&gt;          import matplotlib.pyplot as plt&lt;br /&gt;&lt;br /&gt;          x1, y1 = self.pocetno_resenje.koordinate()&lt;br /&gt;          x2, y2 = self.resenje.koordinate()&lt;br /&gt;          x3, y3 = self.najbolje_resenje.koordinate()&lt;br /&gt;&lt;br /&gt;          # 1. tacku dodajemo ponovo da bi zatvorili konturu od poslednje ka 1. tacki&lt;br /&gt;          x1.append(x1[0])&lt;br /&gt;          y1.append(y1[0])&lt;br /&gt;          x3.append(x3[0])&lt;br /&gt;          y3.append(y3[0])&lt;br /&gt;&lt;br /&gt;          # prvi grafikon&lt;br /&gt;          plt.figure(1)&lt;br /&gt;          plt.title('prikaz pocetnog i nadjenog resenja')&lt;br /&gt;          plt.plot(x1, y1, 'k--', label='pocetno r.')&lt;br /&gt;          plt.plot(x3, y3, 'g', marker='.', markerfacecolor='r', markersize=20, label='najbolje r.')&lt;br /&gt;          plt.text(2, 95, 'pocetna duzina: %f.2' % self.pocetno_resenje.duzina_puta)&lt;br /&gt;          plt.xlabel('x koordinata')&lt;br /&gt;          plt.ylabel('y koordinata')&lt;br /&gt;          plt.text(2, 87, 'najbolja duzina: %f.2' % self.najbolje_resenje.duzina_puta)&lt;br /&gt;          plt.legend()&lt;br /&gt;&lt;br /&gt;          for grad in self.resenje.gradovi:&lt;br /&gt;              plt.text(grad.x, grad.y - 2.5, grad.label)&lt;br /&gt;&lt;br /&gt;          plt.axis([min(x1) -1, max(x1) + 1, min(y1) -1, max(y1) +1])&lt;br /&gt;&lt;br /&gt;          # drugi grafikon&lt;br /&gt;          plt.figure(2)&lt;br /&gt;&lt;br /&gt;          # 1. subplot&lt;br /&gt;          plt.subplot(2, 1, 1)&lt;br /&gt;          plt.title('kretanje temperature po iteracijama')&lt;br /&gt;          plt.plot(self.temperature, 'r')&lt;br /&gt;          plt.xlabel('iteracija')&lt;br /&gt;          plt.ylabel('temperatura')&lt;br /&gt;&lt;br /&gt;          # 2. subplot&lt;br /&gt;          plt.subplot(2, 1, 2)&lt;br /&gt;          plt.title('vrednost f. cilja po iteracijama (duzina puta)')&lt;br /&gt;          plt.plot(self.duzine)&lt;br /&gt;          plt.xlabel('iteracija')&lt;br /&gt;          plt.ylabel('duzina puta')&lt;br /&gt;&lt;br /&gt;          plt.show()&lt;br /&gt;      except ImportError:&lt;br /&gt;          # nema matplot biblioteke stampaj resenje&lt;br /&gt;          print "Pocetno resenje"&lt;br /&gt;          print self.pocetno_resenje.gradovi&lt;br /&gt;          print "duzina puta je: ", self.pocetno_resenje.duzina_puta&lt;br /&gt;          print "\nResenje"&lt;br /&gt;          print self.najbolje_resenje.gradovi&lt;br /&gt;          print "duzina puta je: ", self.najbolje_resenje.duzina_puta&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I na kraju puštamo u pogon ovu skalameriju koja uz to i radi :)&lt;br /&gt;&lt;pre class="brush: py; wrap-lines : false"&gt;&lt;br /&gt;def main():&lt;br /&gt;    try:&lt;br /&gt;    import psyco # ako je instalirana biblioteka koristi je (ubrzava izvsenje koda)&lt;br /&gt;    psyco.full()&lt;br /&gt;    except ImportError:&lt;br /&gt;    pass&lt;br /&gt;&lt;br /&gt;    gradovi = [Grad(1, 2, 'a'), Grad(29, 21, 'b'),Grad(100, 60, 'c'), Grad(12, 86, 'd'),&lt;br /&gt;        Grad(92, 46, 'e'), Grad(83, 38, 'f'), Grad(55, 36, 'g'), Grad(71, 99, 'h'),&lt;br /&gt;        Grad(12, 41, 'i'), Grad(34, 48, 'j'), Grad(69, 33, 'k'), Grad(78, 10, 'l'),&lt;br /&gt;        Grad(86, 68, 'm'), Grad(79, 27, 'n'), Grad(22, 69, 'o'), Grad(75, 55, 'p'),&lt;br /&gt;        Grad(51, 68, 'r'), Grad(91, 23, 's'), Grad(22, 42, 't'), Grad(47, 80, 'u'),&lt;br /&gt;        Grad(60, 10, 'w'), Grad(91, 79, 'v'), Grad(5, 66, 'x'), Grad(42, 90, 'y'),&lt;br /&gt;        Grad(23, 59, '1'), Grad(46, 83, '2'), Grad(93, 63, '3'), Grad(47, 17, '4'),&lt;br /&gt;        Grad(53, 79, '5'), Grad(76, 23, '6'), Grad(91, 62, '7'), Grad(44, 97, '8'),]&lt;br /&gt;&lt;br /&gt;    proizvoljno_resenje = Resenje(gradovi)&lt;br /&gt;&lt;br /&gt;    simulator = SimulatorKaljenja(proizvoljno_resenje)&lt;br /&gt;&lt;br /&gt;    t0 = time.time()&lt;br /&gt;    simulator.start(ponavljanja=10, alpha=0.999, pocetna_temperatura=90)&lt;br /&gt;    print "Izvrsenje trajalo", time.time() - t0, "sekundi"&lt;br /&gt;&lt;br /&gt;    simulator.stampaj_resenje()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if __name__ == "__main__":&lt;br /&gt;        main()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I jedan od rezultata može se prikazati graficima (rezultat metode stampaj_resenje):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rQI3KHRDvs4/TIoukxyAWkI/AAAAAAAAAKk/hxD4Vt0iwd8/s1600/resenje_fig2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 378px;" src="http://4.bp.blogspot.com/_rQI3KHRDvs4/TIoukxyAWkI/AAAAAAAAAKk/hxD4Vt0iwd8/s400/resenje_fig2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5515271903041837634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rQI3KHRDvs4/TIoukREIAFI/AAAAAAAAAKc/4VsxTwH71DY/s1600/resenje_fig1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 298px;" src="http://2.bp.blogspot.com/_rQI3KHRDvs4/TIoukREIAFI/AAAAAAAAAKc/4VsxTwH71DY/s400/resenje_fig1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5515271894259466322" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-8254974421493502859?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/8254974421493502859/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=8254974421493502859&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8254974421493502859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/8254974421493502859'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2009/06/kako-se-kalio-celik.html' title='Kako se kalio čelik'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rQI3KHRDvs4/TIoukxyAWkI/AAAAAAAAAKk/hxD4Vt0iwd8/s72-c/resenje_fig2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-3301945676942897640</id><published>2008-04-19T17:00:00.013+02:00</published><updated>2008-04-21T13:14:08.122+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='actioscript'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Zdravo svete iz Flex-a</title><content type='html'>Dugo me nije bilo, zaboravio sam i kako da se ulogujem :) Ali pokušaću da od sada pa na dalje i u buduće budem vredniji. Materijala za pisanje imam dovoljno, samo volje i vremena da nađem... A vidim da su i drugi blogeri zaspali i da nisam najgori od sve dece :)&lt;br /&gt;&lt;br /&gt;Čitao sam Misliti na javi 4. izdanje i u poglavlju o GUI-u se pominje nekoliko alternativa za SWING. Najviše me je zainteresovao Flex kao flash frontend za javu, i ne samo to, kao zgodna stavrčica za Web i prilika da se podsetim JavaScript-a, prvog jezika kog sam naučio posle COBOL-a :) Delovao je tako osvežavajuće. Doduše Flex koristi malo drugačiji JS pod nazvom ActionScript, a ni JS nije više igračka kao pre 8 godina. &lt;br /&gt;&lt;br /&gt;Vraški mi je bilo teško naći link za sam Flex SDK. Mnogo kliktanja i paženja da se ne skine Flex Builder, što ti Adobe uporno pokušava uvaliti. Za one koji bi da se ne smaraju i odmah skinu SDK link je&lt;a href="http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip"&gt; http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip&lt;/a&gt; One file to rule them all, odnosno isti zip za Linux, MacOSX i Windows. Instalacija se sastoji u odzipovanju :)&lt;br /&gt;&lt;br /&gt;Flex ima sopstvetni XML zapis GUI-a koji se zove MXML (Macromedia XML). Skript kojim se kontrolišu GUI elementi može biti direktno stavljen u MXML ali može biti linkovan u drugoj datoteci kao u HTML-u. Slično tome moguće je MXML tagove dekorisati CSS-om. &lt;br /&gt;&lt;br /&gt;Kod izgleda ovako:&lt;br /&gt;&lt;A onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rQI3KHRDvs4/SAoRl-ACHZI/AAAAAAAAAAM/xJ-q-kR0peA/s1600-h/flex.png"&gt;&lt;IMG STYLE='display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; cursor: pointer' src="http://2.bp.blogspot.com/_rQI3KHRDvs4/SAoRl-ACHZI/AAAAAAAAAAM/xJ-q-kR0peA/s400/flex.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5190980864493886866"&gt;&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;a rezultat je:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_rQI3KHRDvs4/SAojmOACHaI/AAAAAAAAAAU/eXNKYfAkIB0/s1600-h/flex12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_rQI3KHRDvs4/SAojmOACHaI/AAAAAAAAAAU/eXNKYfAkIB0/s400/flex12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5191000659998154146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Prevođenje mxml datoteke u swf se obavlja pomoću komande:&lt;br /&gt;&lt;code&gt;direktorijum_gde_je_sdk/flex_sdk_3/bin/mxmlc zdravosvete2.mxml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Flex je mnogo vezan za Adobe, izgleda da za bilo šta ozbiljno mora da se kešira. Ali tu je i otvorena varijanta &lt;a href="http://www.openlaszlo.org/"&gt;OpenLaszlo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Toliko za sada a možete očekitavti i tekst o interakciji flex-a sa javom.&lt;br /&gt;&lt;br /&gt;Izmena: Adobe je otvorio flex pre nekoliko meseci i sada naplaćuje samo FlexBuilder. Živeo slobodni softver!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-3301945676942897640?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/3301945676942897640/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=3301945676942897640&amp;isPopup=true' title='2 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3301945676942897640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/3301945676942897640'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2008/04/zdravo-svete-iz-flex.html' title='Zdravo svete iz Flex-a'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rQI3KHRDvs4/SAoRl-ACHZI/AAAAAAAAAAM/xJ-q-kR0peA/s72-c/flex.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-115082671719142845</id><published>2006-06-20T18:57:00.001+02:00</published><updated>2008-04-19T19:21:29.793+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tupljenje'/><title type='text'>Zalazak izvršnog koda</title><content type='html'>Svi znamo kako je tekao razvoj programiranja i programskih jezika, od mašinskog koda, preko asemblera pa do današnjih viših programskih jezika. Svaka generacija se naslanjala na prethodnu i svodila je na najmanju moguću meru.&lt;br /&gt;&lt;br /&gt;Danas prisustujemo još jednoj smeni. Jezici čiji se kod kompajlira u izvršni polako bivaju skrajnuti. Na &lt;a href="http://www.tiobe.com/tiobe_index/index.htm"&gt;TIOBE listi&lt;/a&gt; od 10 prvoplasiranih jezika samo 3 su klasična. Pri tom je moguće da delphi sklizne sa top 10 liste, a java već godinama vodi.&lt;br /&gt;&lt;br /&gt;Šta je uzrok tome? Sve je u parama prost je odgovor. A pravi odgovor je malo složeniji. Glavni razlog je sniženje troškova razvoja i održavanja. Da bi jezik bio produktivniji mora da se izdigne iznad mašine, da postvi debeo izolacioni sloj. Pri tom taj izolacioni sloj dovodi do još jednog efekta a to je lako postizanje platformske nezavisnosti što su neki jezici postvili kao cilj (npr. java) a drugi su bili pragmatični pa su se poveli onom: sve može, a i ne mora, kao u pythonu. Zato se već godinama nije pojavio novi jezik a da je prevodio kod u izvršni (native code) osim &lt;a href="http://www.digitalmars.com/d/"&gt;projekta jezika D&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pošto je ovaj razlog stalno prisutan mora da ima još nešto. Rad programera je sve skuplji, a mašina je sve jeftinija. I ne samo to, mašine su sada dovoljno snažne da ne moraju direktno koristiti izvršni kod. Količina biblioteka i softvera napisanog u klasičnim jezicima je dovela do toga da se programiranje u većini slučajeva svodi na pozivanje tog koda koji je već isprogramiran i preveden u izvršni. Npr. PHP je mnogo sporiji od C-a. Ipak za web se programira u PHP-u jer najveći deo obrade nekog web zateva izvršava baza koja je pisana u C-u. PHP samo poziva kod baze i to je par procenata ukupnog vremena a za tih par procenata niko neće da se bakće C-om.&lt;br /&gt;&lt;br /&gt;I sami interpreteri koriste kod od ranije i ubrzavaju izvršenje za razliku od starih interpretera. Klasična je priča o upređivanje javine i C implementacije Linpack algoritma. Pokazuje se da nema razlike u brzini, što i ne čudi obzirom na to da se najveći rad u algoritmu svodi na numerička izračunavanja a oba jezika za to koriste istu BLAS biblioteku programiranu u FORTRAN-u :)&lt;br /&gt;&lt;br /&gt;Moderni jezici ne koriste priglupe interpretere koji su izvršavali liniju po liniju izvornog koda. Danas se često izvorni kod prevodi na međujezik, imamo inteligentne virtelne mašine koje analiziraju kod, pronalaze uska grla i optimizuju ga, odlučuju da li da objekat alociraju na heap-u ili stacku, primenjuju različite algoritme sakupljanja smeća zavisno od situacije...&lt;br /&gt;&lt;br /&gt;Došlo se do novih otkrića i rešenja kod VM. Tu su nove arhitekture, primena niti, novi algoritmi za optimizaciju. To je dovelo do toga da se sad &lt;code&gt;new&lt;/code&gt; operator u javi izvrši u nekoliko taktova brže nego najbrža implementacija &lt;code&gt;malloc&lt;/code&gt; funkcije u C-u a pri tom JVM uz alokaciju radi i inicijalizaciju memorije.&lt;br /&gt;&lt;br /&gt;Šta se danas događa kod jezika sa VM? Primetno je stremljenje ka razdvajanju jezika i VM. Sad je situacija da se jedan jezik izvršava na više VM i da jedna VM može da pokrene više jezika. Za to je potrebno napisati mini interpreter. Pokušava se sve više da se olakša pisanje tih mini interpretera kako bi VM mogla da podrži više jezika. Npr. u JVM 1.6 se to znatno olakšava i samo je potrebno napisati određen pllugin, a plugin za JavaScript se dobija uz JVM.&lt;br /&gt;&lt;br /&gt;Postoje i pokušaji da se naprave zajedničke VM za nekoliko jezika. Za Perl, Python i PHP se radi jedna takva mašina. MS se otvorio ka raznim jezicima. Najnovija je podrška pythonu preko IronPython-a. To omogućava da se koriste standardne i druge biblioteke nekog drugog jezika samim izvršavanjem u VM tog jezika. Npr. da se iz pythona koristi SWING i Hibernate. I više od toga: da se python kod prevede u javin bajtod i korsti iz jave ili bilo kog jezika na JVM. Moguće je i odbratno da se bibiliteke u drugom jeziku prilagode VM preko omotavanja, tj. dekorator obrasca. Npr. u pythonu je moguće koristiti QT GUI biblioteku programiranu u C++ preko PyQT omotača.&lt;br /&gt;&lt;br /&gt;Sve to dovodi do snažne sinergije. Više nije bitno ko u čemu šta piše. Izbor postaje velik. Svako može da osmisli svoj jezik za neku specifičnu namenu (domain specific) i to implementira za neku VM. Ruše se ograde između jezika i između platformi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-115082671719142845?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/115082671719142845/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=115082671719142845&amp;isPopup=true' title='4 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/115082671719142845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/115082671719142845'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2006/06/zalazak-izvrnog-koda.html' title='Zalazak izvršnog koda'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-114943924709738488</id><published>2006-06-04T14:57:00.001+02:00</published><updated>2008-04-19T19:22:40.350+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='free software'/><title type='text'>3 džepna linuxa</title><content type='html'>Juče sam se igrao sa 3 mala linuxa, ali moćna kao uvek: &lt;ul&gt;&lt;br /&gt;&lt;li&gt;Damn Small Linux verovatno najmanji i najmanje zahtevan linux uopšte. Iako je mali ima sve što mu treba. Automatski mi je prepoznao mrežnu karticu i konfigurisao mrežu. I ostala hardverska podešavanja je uradio automatski. Mana je što ne podrzava NTFS sistem ili bar meni nije pošlo za rukom da uradim mount. GUI je Fluxbox, što će reći da nije lepotica. Kernel je generacije 2.4.* Pozitivna stvar je i to što preko Knoppixa ima Debian korene a to znači da sa apt-getom nema problema. Veličina mu je samo 49 MB a autori tvrde da im je gornji limit 50 MB. Podiže se i na 486DX mašinama sa 16 MB RAM. Postoji i embedded izdanje koje pomoću QUEMU VM može da se vrti i na Win i na Linux OS i to sve radi jedna ista verzija! Što je još neverovatnije uspeli su da stave još jedan window manager JVM koji koristi i Puppy linux. Sledi slika DSL sa Fluxbox wm: &lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="DSL u akciji, Chupin blog :)" src="http://photos1.blogger.com/blogger/2638/3108/400/capture_04062006_173359.0.jpg" border="0" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Austrumi 1.2: poslastica iz Letonije. Automatski je podesio sve osim mreže. A za to korsiti prilično bazične alatke u tekstualnom modu (netconfig). Trebate znati sve parametre mreže, a posle toga nema problema. GUI je E17 koji jos nije u finalnoj verziji ali je najvažnije da je izuzentno napredan i lep a pri tom lagan. Kernel svežiji nego kod novog Ubuntua. Jest mali ali nije zaostao. Automatski je mountovao ntfs particiju. Učitava se u potpunosti u RAM, čak izbaci CD iz drajva kad završi. Vidi se da je malo nedovršen, dosta je grešaka što u njemu što u E17, ali da ima potencijala da bude najpotpuniji mali linux. ISO fajl je 49,5 MB a za pokretanje traži 128 MB. Moguće je intalirati ga na hdd: &lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Lepa Letonka, ali votka čini svoje" src="http://photos1.blogger.com/blogger/2638/3108/400/screenshot2re.jpg" border="0" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Puppy 1.09CE: Mnogo smara kod boota. Dok su prethodna 2 sve sama podesila ovaj samo zapitkuje u text modu. Ali to je prvi linux koji je zalajao na mene. Ako pri podešavanju zvukačujete AV nemojte se uplasiti, ne ujeda :) Koristi JWM kao GUI. Po lepoti je negde blizak Fluxboxu. Nije konfigurisao mrežu ali ima wizard koji sa par kliktanja sam pronalazi mrežu. Inače nisam nigde video toliko wizarda, ima čak i wizard za wizard (ne šalim se bukvalno tako piše). Puppy iso fajl ima 62 MB. Troši manje memorije nego Austrumi samim tim što ne mora da se sav učita u RAM, mada ta opcija postoji. Kernel je 2.4 generacije. Nisam uspeo da mountujem ntfs particiju. &lt;p&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Lajavi linux" src="http://photos1.blogger.com/blogger/2638/3108/400/ekran2op.0.jpg" border="0" /&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;Damn Small i Puppy se mogu lako prilagoditi dodavanjem modula na CD. Imaju mogućnost da zapamte podešavanja na USB, a Puppy čak može sam sebe da doreže sa novim podešavanjima ako je CD u rezaču. Sva tri linuxa se mogu instalirati i na hard a Puppy i DSL i na USB, zipdrive, Compact Flash drive itd. Bilo kuda linux svuda! Problem sa mountovanjem dolazi iz činjenice da kernel verzija 2.4 ne podržava direktno NTFS, a i kad se podrška uključi ona je read only. Tako je sve do kernela 2.6.15 mada i tu postoje problemi sa fajlovima manjim od 512 B. Problem sa zatvorenim kodom jedne velike firme sitnih duša (pesničko nadahnuće :) ). Drugi uzrok je što imam novi hard SATA 2 (koji se kao uređaj u linuxu prijavljuju sa &lt;code&gt;/dev/sda&lt;/code&gt;). Šteta što nisam imao FAT32 particiju na njemu čisto da vidim da li bi se i to mountovalo. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-114943924709738488?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/114943924709738488/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=114943924709738488&amp;isPopup=true' title='4 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/114943924709738488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/114943924709738488'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2006/06/3-depna-linuxa.html' title='3 džepna linuxa'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226980.post-114938092203823971</id><published>2006-06-04T02:25:00.000+02:00</published><updated>2006-06-04T02:28:57.530+02:00</updated><title type='text'>Prvo pa muško, pa se zove Persa :)</title><content type='html'>Svečano otvaram blog, nek nam je živ i zdrav!&lt;br /&gt;&lt;br /&gt;Šta će svega na njemu biti, ko to zna. Važno je da se krenulo, pa će se stići vremenom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226980-114938092203823971?l=aurelije.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aurelije.blogspot.com/feeds/114938092203823971/comments/default' title='Објављивање коментара'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226980&amp;postID=114938092203823971&amp;isPopup=true' title='5 Коментари'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/114938092203823971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226980/posts/default/114938092203823971'/><link rel='alternate' type='text/html' href='http://aurelije.blogspot.com/2006/06/prvo-pa-muko-pa-se-zove-persa.html' title='Prvo pa muško, pa se zove Persa :)'/><author><name>Zlatan Kadragić</name><uri>http://www.blogger.com/profile/14414712184569814512</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></feed>
