<?xml version="1.0" encoding="utf-8" ?>
<rss version="1.0">
    <channel>
        <title>Revolution blahg</title>
        <link>http://mapleoin.bluepink.ro/</link>
        <description>mapleoin's rambling blahg</description>
        <language>en</language>
        <pubDate>Sat, 30 Jan 2010 10:36:54 +0200</pubDate>
        <generator>pyBlee!</generator>
        <item>
            <title>Cum să peticești un rpm (patch rpm)</title>
            <link>http://mapleoin.bluepink.ro/perma/cum-sa-peticesti-un-rpm</link>
            <author>mapleoin@bluepink.ro (Oin Maple)</author>
            <description>  &lt;p&gt;O să vă descriu cum am aplicat un petec pentru unul dintre pachetele pentru care sunt responsabil la fedora: calibre, în timp ce așteptam să-mi vină pizza http://www.fedoraproject.ro/am-lansat-fedora-12-avans . Petecul este răspunsul la un bug report: https://bugzilla.redhat.com/show_bug.cgi?id=537525 . Calibre verifică de fiecare dată când este pornit dacă pe situl oficial a apărut o nouă versiune și dacă a apărut, îl anunță pe utilizator printr-un pop-up că trebuie să actualizeze aplicația. Cum fedora are propriul management al pachetelor și deci și al actualizărilor, este recomandat ca pachetele noi să fie instalate folosind yum; deci mesajul trebuie eliminat.&lt;/p&gt;
&lt;p&gt;Mai întâi trebuie să descărcăm sursele actuale ale rpm-ului (în momentul în care am scris patchul, în repo-uri cea mai recentă versiune era 0.6.21-1, acum ar trebui să fie una cu patchul deja aplicat):&lt;/p&gt;
&lt;pre&gt;
  $ yumdownloader --source calibre
&lt;/pre&gt;
&lt;p&gt;și să le despachetăm:&lt;/p&gt;
&lt;div class="Bash"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="nv"&gt;$ &lt;/span&gt;rpm -ivh calibre-0.6.21-1.fc12.src.rpm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Comanda va crea un nou director rpmbuild, cu subdirectoarele &lt;span class="caps"&gt;SPECS&lt;/span&gt; și &lt;span class="caps"&gt;SOURCES&lt;/span&gt;. În &lt;span class="caps"&gt;SPECS&lt;/span&gt; avem fișierul care ține toate informațiile despre cum se va construi pachetul: calibre.spec, iar în &lt;span class="caps"&gt;SOURCES&lt;/span&gt; avem sursele pachetului și toate patchurile pe care le-am creat până acum:&lt;/p&gt;
&lt;pre&gt;
  $ tree rpmbuild/
  rpmbuild/
  |-- SOURCES
  |   |-- calibre-0.6.21-nofonts.tar.gz
  |   |-- calibre-cssprofiles.patch
  |   |-- calibre-manpages.patch
  |   `-- generate-tarball.sh
  `-- SPECS
  `-- calibre.spec
&lt;/pre&gt;
&lt;p&gt;Mai avem de făcut un pas, ca să putem umbla prin sursele programului. Trebuie să dezarhivăm arhiva calibre-0.6.21-nofonts.tar.gz. Următoarea comandă dezarhivează și aplică patchurile pe care le avem deja:&lt;/p&gt;
&lt;pre&gt;
  $ cd rpmbuild/SPECS
  $ rpmbuild -bp calibre.spec
&lt;/pre&gt;
&lt;p&gt;Au apărut mai multe directoare după comanda asta:&lt;/p&gt;
&lt;pre&gt;
  $ ls rpmbuild/
  BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
&lt;/pre&gt;
&lt;p&gt;Cel care ne interesează este &lt;span class="caps"&gt;BUILD&lt;/span&gt;, în care au apărut sursele peticite ale programului.&lt;/p&gt;
&lt;p&gt;Atunci când e pornit, dacă există o versiune mai nouă, calibre va afișa următorul mesaj în fereastra pop-up:&lt;/p&gt;
&lt;p&gt;calibre has been updated to version 0.6.24. See the new features. Visit the download page?&lt;/p&gt;
&lt;p&gt;Ca să aflăm din ce fișier vine fereastra de pop-up putem să căutăm pur și simplu o parte din textul de mai sus în sursele calibre:&lt;/p&gt;
&lt;pre&gt;
  $ cd rpmbuild/BUILD/calibre/
  $ find .|xargs grep &amp;#34;has been updated&amp;#34;
&lt;/pre&gt;
&lt;p&gt;Dacă ignorăm fișierele de localizare, vom afla sursa pop-up-ului:&lt;/p&gt;
&lt;pre&gt;
  ./calibre/src/calibre/gui2/main.py:                    _(&amp;#39;%s has been updated to version %s. &amp;#39;
&lt;/pre&gt;
&lt;p&gt;Mergând în fișierul respectiv vedem că acel cod face parte dintr-o funcție numită update_found:&lt;/p&gt;
&lt;div class="Bash"&gt;&lt;div class="highlight"&gt;&lt;pre&gt; 
  def update_found&lt;span class="o"&gt;(&lt;/span&gt;self, version&lt;span class="o"&gt;)&lt;/span&gt;:
  &lt;span class="nv"&gt;os&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;windows&amp;amp;#8217; if iswindows else &amp;#39;&lt;/span&gt;osx&amp;amp;#8217; &lt;span class="k"&gt;if &lt;/span&gt;isosx &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;linux&amp;amp;#8217;&lt;/span&gt;
&lt;span class="s1"&gt;  url = &amp;#39;&lt;/span&gt;http://%s.kovidgoyal.net/download_%s&amp;amp;#8217;%&lt;span class="o"&gt;(&lt;/span&gt;__appname__, os&lt;span class="o"&gt;)&lt;/span&gt;
  self.latest_version &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;br /&amp;gt;&amp;#39;&lt;/span&gt; + _&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;#8217;&amp;lt;span &lt;span class="nv"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;color:red; font-weight:bold&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;#39;&lt;/span&gt;Latest version: &amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;span&amp;gt;s&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&lt;span class="s1"&gt;&amp;#39;)(url, version)&lt;/span&gt;
&lt;span class="s1"&gt;  self.vanity.setText(self.vanity_template%\&lt;/span&gt;
&lt;span class="s1"&gt;  (dict(version=self.latest_version,&lt;/span&gt;
&lt;span class="s1"&gt;  device=self.device_info)))&lt;/span&gt;
&lt;span class="s1"&gt;  self.vanity.update()&lt;/span&gt;
&lt;span class="s1"&gt;  if config.get(&amp;#39;&lt;/span&gt;new_version_notification&amp;amp;#8217;&lt;span class="o"&gt;)&lt;/span&gt; and &lt;span class="se"&gt;\&lt;/span&gt;
  dynamic.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;update to version %s&amp;amp;#8217;%version, True):&lt;/span&gt;
&lt;span class="s1"&gt;  if question_dialog(self, _(&amp;#39;&lt;/span&gt;Update available&amp;amp;#8217;&lt;span class="o"&gt;)&lt;/span&gt;,
  &amp;lt;em &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ââ%s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;has&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;has&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;been&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;been&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;updated&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;updated&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;âhttp://calibre.kovidgoyal.net/wiki/â&amp;quot;&lt;/span&gt;&amp;gt;new features&amp;lt;/a&amp;gt;. Visit the download pa&amp;amp;#8217;
  &lt;span class="s1"&gt;&amp;#39;ge?&amp;amp;#8217;&amp;amp;#8221;&amp;gt;%(&amp;lt;/em&amp;gt;_appname__, version)):&lt;/span&gt;
&lt;span class="s1"&gt;  url = &amp;#39;&lt;/span&gt;http://calibre.kovidgoyal.net/download_&amp;amp;#8217;+&lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;windows&amp;amp;#8217; if iswindows else &amp;#39;&lt;/span&gt;osx&amp;amp;#8217; &lt;span class="k"&gt;if &lt;/span&gt;isosx &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;linux&amp;amp;#8217;)&lt;/span&gt;
&lt;span class="s1"&gt;  QDesktopServices.openUrl(QUrl(url))&lt;/span&gt;
&lt;span class="s1"&gt;  dynamic.set(&amp;#39;&lt;/span&gt;update to version %s&amp;amp;#8217;%version, False&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ne interesează ca modificarea pe care o vom aduce să fie cât mai lizibilă pentru cei care vor modifica pachetul nostru mai târziu și să fie cât mai ușor de revenit la versiunea nemodificată. Dacă ne uităm mai atent în main, găsim următorul cod:&lt;/p&gt;
&lt;pre&gt;
  if not opts.no_update_check:
  self.update_checker = CheckForUpdates()
  QObject.connect(self.update_checker,
  SIGNAL(&amp;#39;update_found(PyQt_PyObject)&amp;#39;), self.update_found)
  self.update_checker.start()
&lt;/pre&gt;
&lt;p&gt;Codul verifică dacă programul a fost pornit cu opțiunea no_update_check. Ar complica prea mult lucrurile dacă am modifica programul în așa fel încât să pornească de fiecare dată cu opțiunea asta așa că mai bine comentăm codul aici, ca să nu mai verifice opțiunea și deci să nu mai caute niciodată update-uri. E soluția cea mai simplă.&lt;/p&gt;
&lt;p&gt;Ca să facem un petec ca la carte, vom face așa:&lt;/p&gt;
&lt;p&gt;Facem o copie a fișierului main.py:&lt;/p&gt;
&lt;pre&gt;
  $ cd ~/rpmbuild/BUILD/calibre/src/calibre/gui2/
  $ cp main.py main.py.no_update
  După care modificăm *fișierul inițial* și comentăm codul respectiv așa:
  # if not opts.no_update_check:
  #     self.update_checker = CheckForUpdates()
  #     QObject.connect(self.update_checker,
  #             SIGNAL(&amp;#39;update_found(PyQt_PyObject)&amp;#39;), self.update_found)
  #     self.update_checker.start()
&lt;/pre&gt;
&lt;p&gt;Ca să generăm petecul vom folosi gendiff din directorul de deasupra directorului rădăcină:&lt;/p&gt;
&lt;pre&gt;
    $ cd ~/rpmbuild/BUILD
    $ gendiff calibre .no_update
    diff -up calibre/src/calibre/gui2/main.py.no_update calibre/src/calibre/gui2/main.py
    --- calibre/src/calibre/gui2/main.py.no_update	2009-11-16 14:21:55.200387171 +0200
    +++ calibre/src/calibre/gui2/main.py	2009-11-16 14:22:10.400510757 +0200
    &lt;code&gt;&lt;/code&gt; -221,11 +221,11 &lt;code&gt;&lt;/code&gt; class Main(MainWindow, Ui_MainWindow, De
    self.latest_version = &amp;#39; &amp;#39;
    self.vanity.setText(self.vanity_template%dict(version=&amp;#39; &amp;#39;, device=&amp;#39; &amp;#39;))
    self.device_info = &amp;#39; &amp;#39;
    -        if not opts.no_update_check:
    -            self.update_checker = CheckForUpdates()
    -            QObject.connect(self.update_checker,
    -                    SIGNAL(&amp;#39;update_found(PyQt_PyObject)&amp;#39;), self.update_found)
    -            self.update_checker.start()
    +        # if not opts.no_update_check:
    +        #     self.update_checker = CheckForUpdates()
    +        #     QObject.connect(self.update_checker,
    +        #             SIGNAL(&amp;#39;update_found(PyQt_PyObject)&amp;#39;), self.update_found)
    +        #     self.update_checker.start()
    ####################### Status Bar #####################
    self.status_bar = StatusBar(self.jobs_dialog, self.system_tray_icon)
    self.setStatusBar(self.status_bar)
&lt;/pre&gt;
&lt;p&gt;Totul arată bine, deci putem să-l punem în surse:&lt;/p&gt;
&lt;pre&gt;
  $ gendiff calibre .no_update &amp;#62; ~/rpmbuild/SOURCES/calibre-no-update.patch
  &lt;/pre&gt;
&lt;p&gt;Acum trebuie să modificăm spec-ul, adăugând un nou petec, incrementând release-ul, menționând motivul pentru petec și scriind modificarea în Changelog:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;
  &lt;code&gt;&lt;/code&gt; -1,6 +1,6 &lt;code&gt;&lt;/code&gt;
  Name:           calibre
  Version:        0.6.21
  -Release:        1%{?dist}
  +Release:        2%{?dist}
  Summary:        E-book converter and library management
  Group:          Applications/Multimedia
  License:        GPLv3
  &lt;code&gt;&lt;/code&gt; -18,6 +18,7 &lt;code&gt;&lt;/code&gt;
  Source1:        generate-tarball.sh
  Patch0:         %{name}-cssprofiles.patch
  Patch1:         %{name}-manpages.patch
  +Patch2:         %{name}-no-update.patch
  BuildRoot:      &lt;span style="_tmppath;"&gt;/&lt;/span&gt;{name&lt;del&gt;&lt;span style="version;text-align:left;"&gt;/del&gt;&lt;/span&gt;{release&lt;del&gt;root&lt;/del&gt;&lt;span&gt;(&lt;/span&gt;{__id_u} -n)
  BuildRequires:  python &gt;= 2.6
  &lt;code&gt;&lt;/code&gt; -72,6 +73,9 &lt;code&gt;&lt;/code&gt;
  # don&amp;#8217;t append calibre1 to the name of the manpages. No need to compress either
  %patch1 -p1 -b .manpages&lt;/del&gt;&lt;/pre&gt;&lt;/p&gt;

  +# don&amp;#8217;t check for new upstream version (that&amp;#8217;s what packagers do)
  +%patch2 -p1 -b .no-update
  +
  # dos2unix newline conversion
  %{__sed} -i 's/\r//&amp;#8217; src/calibre/web/feeds/recipes/*

  &lt;code&gt;&lt;/code&gt; -239,6 +243,9 &lt;code&gt;&lt;/code&gt;
  %{_mandir}/man1/*

  %changelog
  +* Sat Nov  29 2009 Ionuț C. Arțăriși &lt;mapleoin&gt; &amp;#8211; 0.6.21-2
    +- patch to stop checking for new upstream version
    +
    * Sat Nov  6 2009 Ionuț C. Arțăriși &lt;/mapleoin&gt;&lt;mapleoin&gt; &amp;#8211; 0.6.21-1
      &amp;#8211; new upstream version: http://calibre.kovidgoyal.net/wiki/Changelog#Version0.6.2106Nov2009
      &amp;#8211; added python-BeautifulSoup requirement
    
&lt;p&gt;Gata. Asta a fost tot :). Acum putem reconstrui pachetul cu noile patchuri:&lt;/p&gt;
&lt;pre&gt;
  $ cd ~/rpmbuild/SPECS/
  $ rpmbuild -ba calibre.spec
&lt;/pre&gt;
&lt;p&gt;Și putem reinstala noul pachet:&lt;/p&gt;
&lt;pre&gt;
  $ su -c &amp;#34;yum localinstall -y --nogpgcheck ~/rpmbuild/RPMS/x86_64/calibre-0.6.21-2.fc12.x86_64.rpm&amp;#34;
  &lt;/pre&gt;&lt;/mapleoin&gt; </description>
            <pubDate>Mon, 30 Nov 2009 12:00 GMT</pubDate>
        </item>
        <item>
            <title>Fedora Business Cards</title>
            <link>http://mapleoin.bluepink.ro/perma/fedora-business-cards</link>
            <author>mapleoin@bluepink.ro (Oin Maple)</author>
            <description>  &lt;p&gt;A few days ago, me and a few friends from Fedora Romania decided we&amp;#8217;d like some fedora business cards for the upcoming eLiberatica conference. &lt;a href="http://ianweller.org"&gt;Ian Weller&lt;/a&gt; had already developed an official &lt;a href="https://fedoraproject.org/wiki/Business_cards"&gt;template&lt;/a&gt; and even created a cool python generator script and packaged it.&lt;/p&gt;
&lt;p&gt;The problem, however, was that it only supported US-style business cards which are a bit smaller than the Romanian/Central European ones. Live and learnâ&amp;euro;Ś It seems that there are a lot of &lt;a href="http://en.wikipedia.org/wiki/Business_cards#Dimensions"&gt;different sizes&lt;/a&gt; actually.&lt;/p&gt;
&lt;p&gt;So I got my hacking hat and dived in. The code was quite nice to look at and easy to understand. The &lt;span class="caps"&gt;XML&lt;/span&gt; in the svg templates is quite easy to hack, too. Especially when using tools like python&amp;#8217;s &lt;a href="http://docs.python.org/library/xml.dom.minidom.html"&gt;minidom&lt;/a&gt; . It makes working with python and &lt;span class="caps"&gt;XML&lt;/span&gt; taste like javascript dom manipulation which is quite nice.&lt;/p&gt;
&lt;p&gt;Everything went smooth, I renamed a few tags, made some modifiable (for height and width), but then I had to make the blue strip on the right of the front of the business card extendable1 . There is no way in &lt;span class="caps"&gt;XML&lt;/span&gt; to align an element to the right so I spent about an hour coming up with a sweet solution. Instead of having a big white background on which I would apply the blue band, I made a big blue background and made the white background just a little narrower. Because the white background was on top of the blue one, it could get aligned to the left (x=0, y=0 in &lt;span class="caps"&gt;XML&lt;/span&gt;) and cover just the part that needed to be white, and left a blue band at the right. Problem solved. Hoo-grah!&lt;/p&gt;
&lt;p&gt;Now I&amp;#8217;m waiting for an answer to the patch that I sent to bugzilla. Hopefully it&amp;#8217;ll be accepted and will be available in Fedora, soon, so that others may enjoy and cherish the coolness that it be!&lt;/p&gt; </description>
            <pubDate>Fri, 24 Apr 2009 00:00 GMT</pubDate>
        </item>
    </channel>
</rss>
