Archív

Archív pro

Phing – SvnLogTask

29.06.2008 View Comments

Phing obsahuje ve verzi 2.3 tyto Tasky pro práci se Subversion.

  • SvnCheckoutTask
  • SvnExportTask
  • SvnLastRevisionTask
  • SvnUpdateTask

To se hodí a také ve svém buildu používám tento postup:

  1. udělám export HEAD revision (SvnExportTask)
  2. načtu si číslo HEAD revision (SvnLastRevisionTask)
  3. potom vygeneruju SVN Log (SvnLogTask)
  4. vygeneruju API dokumentaci pro build (PhpDocumentorTask)
  5. všechno zakomprimuji do souboru s dokumentací a se zdrojáky a uložím kam potřebuju (ZipTask)

V postupu je něco co není standardní součástí Phingu i když si myslím, že se to tam objeví. Phing pro práci se SVN používá VersionControl_SVN 0.3.1 alpha. Bohužel neexistuje zatím stable verze této PEAR knihovny což je škoda, protože funguje celkem dobře a má implementováno vše co potřebuji. Když používáte VersionControl_SVN dá se pracovat s několika návratovými typy:

  • VERSIONCONTROL_SVN_FETCHMODE_ASSOC,
  • VERSIONCONTROL_SVN_FETCHMODE_OBJECT,
  • VERSIONCONTROL_SVN_FETCHMODE_XML,
  • VERSIONCONTROL_SVN_FETCHMODE_RAW,
  • VERSIONCONTROL_SVN_FETCHMODE_ALL,
  • VERSIONCONTROL_SVN_FETCHMODE_ARRAY

V Phingu se používá, ale výhradně VERSIONCONTROL_SVN_FETCHMODE_ASSOC což není někdy úplně vhodné. V případě, že máte totiž zapnutý přepínač pro výpis v XML je lepší návratový typ VERSIONCONTROL_SVN_FETCHMODE_XML. Proto jsem musel upravit phing\tasks\ext\svn\SvnBaseTask.php.

Tuto část

$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ASSOC, 'svn_path' => $this->getSvnPath());

jsem nahradil tímto kódem

		// Set up runtime options. Will be passed to all
		// subclasses.
		if ($mode=="log")
		{
		$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_XML, 'svn_path' => $this->getSvnPath());
		}
		else
		{
		$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ASSOC, 'svn_path' => $this->getSvnPath());
		}

Po této úpravě, která jistě by šla udělat lépe. Jsem se dal do psaní vlastního tasku SvnLogTask.php. Task vrátí log z repozitory v XML formátu. Pokud chceme plain text, tak to prožene XSLT transformací a potom ještě vymaže whitespaces z celého dokumentu.

require_once 'phing/Task.php';
require_once 'phing/tasks/ext/svn/SvnBaseTask.php';

class SvnLogTask extends SvnBaseTask
{
    private $name = 'log.xml';
    private $xml = true;
    private $verbose = false;
    /**
     * The setter for the attribute "name"
     */
    public function setName($str) {
        $this->name = $str;
    }
    /**
     * The setter for the attribute "xml"
     */
    public function setXML($str) {
        $this->xml = $str;
    }
    /**
     * The setter for the attribute "verbose"
     */
    public function setVerbose($str) {
        $this->verbose = $str;
    }
	/**
	 * The main entry point
	 *
	 * @throws BuildException
	 */
	function main()
	{
		$this->setup('log');
		$this->log("Log SVN"); 

         $switches = array('verbose' => $this->verbose);
         $output=$this->run(array(), $switches);

        $doc = new DOMDocument();
        $doc->formatOutput = true;
        $doc->loadXML($output);
        // output format 

        if ($this->xml=="true")
        {
          $doc->save($this->getToDir()."/".$this->name);
        }
        else
        {
         // print in plain
         $xsl = new DOMDocument;
         $xsl->load(dirname(__FILE__).'\LogTxt.xsl');
         $proc = new XSLTProcessor;
         $proc->importStyleSheet($xsl); // attach the xsl rules
         $output=$proc->transformToDoc($doc)->firstChild->wholeText;

         $pat[0] = "/^\s+/";
         $pat[1] = "/\s{2,}/";
         $pat[2] = "/\s+\$/";
         $rep[0] = "";
         $rep[1] = " ";
         $rep[2] = "";
         $after=preg_replace($pat, $rep, $output);
         $str=str_replace("\\n ","\n", $after);
         file_put_contents($this->getToDir()."/".$this->name,$str);
        }
    }
}

Potom se to dá už použít v build.xml.

        <taskdef name="svnlog" classname="phing.tasks.ext.svn.SvnLogTask" />
        <svnlog
           svnpath="${svnpath}"
           repositoryurl="${rep}"
           name="CHANGELOG"
           xml="true"
           verbose="true"
           todir="${tmp}\log"/>

Moje vlastní XSLT transformace (phing\tasks\ext\svn\LogTxt.xsl) na plain text není přiliš vhodná pro nějaké systémové řešení. Lepší je parametr nechat zapnutý. Vzít XML a pomocí XsltFilter aplikovat vlastní transformaci.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="log">
			CHANGELOG\n
			<xsl:apply-templates select='logentry'/>
</xsl:template>

<xsl:template match="logentry">
			\n R<xsl:apply-templates select='@revision'/>\n
			<xsl:apply-templates select='date' /> - <xsl:apply-templates select='author'/>\n
			<xsl:apply-templates select='msg'/>\n
</xsl:template>

</xsl:stylesheet>

Nakonec přidám ještě moje build.propeties a buid.xml jednoho moje projektu pro ilustraci.

# Property files contain key/value pairs
# key=value
tmp = c:\tmp
svnpath = c:\apps\svn\bin\svn.exe
rep = file:///rootwww/rep_cvut/akce/trunk
wc =  c:\rootwww\wc_cvut\akce

Tady v build.propeties si všimněte jen jediného detailu, ale ten vás může stát hodně času. Cesty k svn a k repozitory neobsahují mezery, pokud máte Subversion např. v Program Files může to nadělat více problémů než užitku a chyby se projevují různě a ne zcela systémově. Doporučuji se tomu předem vyhnout, ušetříte si čas a nervy.

<?xml version="1.0" ?>
<project name="akce2" basedir="." default="main">

    <!-- Sets the DSTAMP, TSTAMP and TODAY properties -->
    <tstamp/>  

    <!-- Load our configuration -->
    <property file="./build.properties" />
    <taskdef name="svnlog" classname="phing.tasks.ext.svn.SvnLogTask" />

    <property name="package"  value="${phing.project.name}" override="true" />
    <property name="builddir" value="${tmp}/build/${phing.project.name}" override="true" />
    <property name="srcdir"   value="${project.basedir}" override="true" />

    <target name="svn" description="SVN executes">
         <!-- Export HEAD copy do /tmp/ -->
       <svnexport
       svnpath="${svnpath}"
       repositoryurl="${rep}"
       force="yes"
       todir="${tmp}\export\${phing.project.name}"/>
        <!-- Získání čísla HEAD -->
        <svnlastrevision
           svnpath="${svnpath}"
           workingcopy="${wc}"
           propertyname="svn.lastrevision"/>
        <!-- Vygenerování aktuálního logu -->
        <svnlog
           svnpath="${svnpath}"
           repositoryurl="${rep}"
           name="CHANGELOG"
           xml="false"
           verbose="true"
           todir="${tmp}\export\${phing.project.name}"/>
    </target>

    <target name="phpdoc" description="API Documentation" depends="svn">
        <!-- Generování phpdoc dokumentace -->
        <phpdoc title="Akce2008 API Documentation"
          destdir="${builddir}/apidocs"
          sourcecode="yes"
          defaultpackagename="Akce2008"
          output="HTML:default:default">
           <fileset dir="${tmp}/export/${phing.project.name}">
              <include name="*/*.php" />
              <exclude name="inc/phpmailer/**" />
              <exclude name="build/**" />
           </fileset>
            <projdocfileset dir=".">
                  <include name="CHANGELOG" />
             </projdocfileset>
        </phpdoc>
      </target>

        <!-- Fileset for all files -->
        <fileset dir="${tmp}/export/${phing.project.name}" id="allfiles">
            <include name="**" />
            <exclude name="build.xml" />
            <exclude name="build.properties" />
        </fileset>

    <!-- Main Target -->
    <target name="main" description="main target" depends="phpdoc">
        <!-- Zdrojové kódy pro příslušnou revizi -->
        <zip destfile="${builddir}/${phing.project.name}-R${svn.lastrevision}-${DSTAMP}${TSTAMP}.zip" basedir="${tmp}/export/${phing.project.name}" />
        <!-- Vygenerovanou dokumentaci přesunu do ZIP s číslem příslušné revize -->
        <zip destfile="${builddir}/${phing.project.name}-apidocs-R${svn.lastrevision}-${DSTAMP}${TSTAMP}.zip" basedir="${builddir}/apidocs" />
        <!-- Smazaní temp adresáře -->
        <delete dir="${builddir}/apidocs" includeemptydirs="true" verbose="true" failonerror="true" />

    </target>
</project>

Vlastní build se pustí pomocí phing z příkazové řádky tam kde máte build.xml uložený. Pokud se nedaří Phing nainstalovat a nakonfigurovat pro chod např. s PHPDoc, tak doporučuji postup ze stránek Phingu.

pear channel-discover pear.phing.info
pear install -a phing/phing
pear install channel://pear.php.net/VersionControl_SVN-0.3.1

Doufám, že někomu rady budou k užitku, Phing je skvělý produkt i když většina asi dá za přednost Antu pokud nedělají čistě PHP.

Categories: phing, php, subversion Tags:

Subversion 1.5 vydán!

23.06.2008 View Comments

Hlavní novinky jsem představil už v TortoiseSVN 1.5.0-beta1 a podrobně s tím seznámím postupně jak s tím budu také delší dobu pracovat. Originální release notes je k dispozici na stránkách projektu.

Pro windows je k dispozici kromě zdojových kódů v této podobě, officiální binárky zatím k dispozici nejsou:

AnkhSVN 2.0 pro Visual Studio se chystá v co nekratší době, stejně jako officální binárky pro Windows, které mají bý hotovy v tomto týdnu, certifikace je plánovaná na 24.6.2008. Pro Red Hat jsou již dnes k dispozici. Pro Solaris se v zápětí 26.6. 2008.

Categories: scm, subversion Tags:

Assembla: SVN a Trac pro každého

23.06.2008 View Comments

Pokud hledáte free hosting pro svůj projekt a není to opensource na které se hodí Sourceforge nebo Google Code, tak je několik alternativ např. OpenSVN a Assembla. Já jsem si vybral Assembla, ve free variantě vám umožní hostovat projekty do 500MB což mě zatím stačí a pro ty na kterých aktuálně dělám také bude stačit. Tak není nic jednodušího než si založit projekt a potom vyexportovat repozitory u sebe ze SVN.

svnadmin dump path_to_rep >file.dump

Pokud máte toho víc, možná užijete tento export.bat, aby to bylo jednodušší pro celé repository, také se to hodí na zálohování.

dir path_to_rep\rep_dir /b /O /AD >dir1.txt

FOR /F  %%M IN (dir1.txt) DO (
  ECHO  %%M
  svnadmin dump path_to_rep/rep_dir/%%M  --incremental >%%M.dmp
  zip -m -9 -g %%M.dmp.zip %%M.dmp
)

Jednotlivé dump soubory potom naimportujete do Assembla. Hlavní výhodou je to, že je k dispozici celý systém třeba jen pro vás a nejste nikde k nalezení pokud zrovna nechcete. Samozřejmě těžko můžu dát ruku do ohně za spolehlivost a důvěryhodnost firmy, která to provozuje, ale jejich filozifie se mi líbí. Samozřejmě bych uvítal třeba firmu, která by to poskytovala u nás, ale myslím si že to už dnes není potřeba. Na http://www.assembla.com/tour najdete porovnání Free varianty s těmi komerčními. Commercial mi přijde při ceně kolem $150 (cca 2400 Kč) za rok celkem dobrá, myslím že provoz a údržba vlastního stroje na podobný účel musí přijít i malého soukromníka na mnohem větší peníze.

Aktualizace 17.12.2008

Už firma svoji politiku změnila a nemůžete si svůj projekt mít jako privátní zdarma, je to škoda, použitelné to ale zůstává pro otevřené projekty

Categories: git, subversion Tags:

OpenSuSE 11 a jak to nakonec dopadlo

19.06.2008 View Comments

Dnes vyšlo čerstvé OpenSUSE 11 a já jsem myslel, že by to mohlo být to pravé pro můj Sony VIAO VGN-TZ31XN. Ale bohužel jsem opět zkrachoval na tom, že moje rozlišení 1366×768 nějak nebrali v úvahu. Ať jsem to nastavil nebo ne. Detekce to nepozná a ruční nastavení nefungovalo. Nemyslím, že pokud nefunguje taková triviální věc jako nastavení rozlišení tak by to obyčejný člověk používal. Tak jsem se vrátil k Ubuntu 8.04, kde není sebemenší problém a všechno funguje jak má.

Problémy s Lighting 0.8 na Ubuntu

Jen jsem narazil vždy na problém s instalací Lightingu 0.8 do Thunderbirda. Úplně mi to rozhodilo Thunderbird a nezobrazoval se kalendář kde měl. Tak mě napadlo si pořádně přečíst release notes a co se dočtu:

Many modern Linux distributions only package libstdc++6, which is incompatible with Lightning. Therefore please install the package „libstdc++5″ or „compat-libstdc++“ on your system before installing Lightning)

Ano, Ubuntu je také taková moderní distribuce. Tak jsem vypnul dolněk a potom jsem příslušnou knihovnu nainstaloval.

sudo apt-get install libstdc++5

Když jsem doplněk pustil, je všechno ok. Třeba to někomu pomůže, já jsem na to přišel čistě náhodou. Kdyby někdo věděl jak na Sony VAIO rozchodit to OpenSUSE budu rád za radu.

Categories: ostatní Tags:

a tři videa ode mne

18.06.2008 View Comments

Myslel jsem, že ten mail od Pavla Šindelky smažu, ale prece jenom si ho vážím a Petra Ocáska znám z OpenMeetingu také celkem dobře a hlavně jsem celkem pro každou srandu. Jak říká jeden můj známý, není důležité zda je zážitek hezký nebo ošklivý, důležitý je, aby byl extrémní!

S výběrem videa byl celkem problém, protože na video zrovna moc nekoukám, nějak mě to nebaví čekat až se něco stane, raději si to přečtu. Ale prece jsem udělal takový výběr co řekne něco o mě.

Video první triler na World of Warcraft: Wrath of the Lich King. Jsem fanoušek a hráč WOW a moc se těším na nový datadisk. Ostatně je to jediná hra u které jsem vydržel déle než tři dny :-)

Něco co bych chtěl. Aston Martin V8 Vantage Coupe je opravdu auto ve kterém bych se chtěl projet. Mít to v garáži a živit to asi ale ne.

Něco vtípu na konec. Star Wars Parody – Interrogation Droid, mám rád komixy a filmy podle nich.

Tak jsem celkem svědomitě svůj úkol splňil a přeposílám ho dále. Babu má Jakub Vrána, Vašek Vančura a David Grudl. Snad se na mne nebudou zlobit.

Categories: ostatní Tags:

Jednoduchá aplikace v PHP a Flex

12.06.2008 View Comments

Protože jsem byl na Adobe Air nedalo mi to a řekl jsem si že udělám jednoduchou aplikaci pro vyhledávání v našem univerzitním LDAPu. Stáhnul jsem si trial verzi Flex Builduru 3, to se ocení zvláště pokud chcete dát aplikaci nějaký design. Výsledná aplikace vypadá takto, skládá se z několika prvků, textové pole (mx:TextInput), tlačítka (mx:Button), výběr (mx:ComboBox), ty jsou strčené do společného hboxu. Potom dole je umístěný datagrid (mx:DataGrid) pro zobrazování dat. image

Tvorba aplikace

Vytvořte projekt: File -> New -> Flex project image Tady je vidět, že nejdůležitější je nastavit mx:HTTPService na komunikaci s naším PHP skriptem, který funguje normálně jako u webové aplikace nebo spíše u AJAXové aplikace. Data vracím v XML, aby se dobře zobrazovali pomocí datagridu, ale mohl by to být i obyčejný text.

   			{txtInput.text}
   			{department.text}

Tady je část mx:Script, která se stará o ošetření toho co přijde z PHP a zobrazuje to.

			import mx.rpc.events.ResultEvent;
			import mx.rpc.events.FaultEvent;
			import mx.collections.ArrayCollection;

			public function handleResultXML(event:ResultEvent):void {
				// the result object is our xml root
				// we get the row nodes of our result object
				// the data of the dataprovider populates the component
				myDataGrid.dataProvider = event.result.row;
			}
			// this function is called when we get an error from the server
			public function handleFault(event:FaultEvent):void {
					//txtArea.text = "Fault Response from HTTPService call:\n " + event.fault.toString();
			}

Vlastní PHP skript je jednoduchý, používá mojí knihovnu, kde zadáte část jména a vrátí celé jméno i s tituly a k tomu odpovídající telefon.

$debug=false;
/**
  * Flex SSU
  */
if (!$debug) $name=$_REQUEST['query'];
else $name='prskavec';
error_log("[".date('r')."] Query: ".$_REQUEST['query']." Department:".$_REQUEST['department']."\n",3,"./flex.log");

if ($_REQUEST['department']=="VIC")
$vic=true;
else
 $vic=false;    

include "inc/config.inc.php";
include_once "inc/ldap_class.php";
$ldap=new Ldap($config);

print "<?xml version='1.0' encoding='UTF-8 ?>";
print "<rows>";

foreach ($ldap->get_person($name,$vic) as $person)
{
  $phone=$ldap->ldap_phone($person['cvutphone']['0']);
   if (!empty($phone))
   {
    if ($debug) var_dump($person);
    print "<row>";
    print "<cn>".$person['cn;lang-cs']['0']."</cn>";
	print "<phone>".$phone."</phone>";
    print "<email>".$person['preferredemail']['0']."</email>";
	print "</row>";

    error_log("[".date('r')."] Result: ".$person['cn;lang-cs']['0']." | ".$phone." | ".$person['preferredemail']['0']."\n",3,"./flex.log");
    }
}
print "</rows>";

Pokud vám všechno funguje v Flex builderu, stačí dát Project -> Export Release Build a vytvořit AIR soubor, který je nainstalovatelný jako desktopová aplikace.

Závěr

Přijde mi to rozhodně jednodušší než PHP-GTK. Jednoduchá aplikace, kterou používám denně, obdobných aplikací jsou dnes desítky a nejlepší mi přijde, že se dá udělat pěkné rozhraní k online službě v PHP a nedá to moc práce a na straně PHP není žádná práce navíc. Vlastní tvorba GUI dá zabrat podle mě všude.

Categories: adobe, adobe air, flex, php Tags:

on Air Tour v Praze

10.06.2008 View Comments

air_appicon Adobe nás přivítala ve velkém stylu, tak dobře organizačně připravenou akci jsem dlouho nezažil. Na začátku jsem dostal materiály, vizitku, k dispozici je internet, občerstvení po celou dobu akce a každý byl osobně uveden jejich pracovníkem a obsluha se o vás stará.  Balíček co jsem dostal obsahoval: Adobe AIR for Javascript Developers, ActionScript Reference, Flex Early Evalutation: Assessing Flex Your Project Needs. Nejsou to jen propagační materiály, ale příručka co se může opravdu hodit a reference ActionScriptu, která je sice k dispozici online, ale někdy se to hodí i vytištěné. Do místnosti kde se ve Staropramen pivovaru přednášelo, byly přidány prodlužováky se zásuvkami pro každého a jediný dojem z celé akce trochu ničil hluk z ulice hned za okny.

Program akce byl velmi dobře sestaven a zaměřen převážně na začínající vývojáře na platformě Adobe Air, která tu je od února a teď v červnu bude k dispozici verze 1.1.

Na úvod jedna poznámka pro ty co se s Air ještě nesetkali. Adobe Air je runtime prostředí pro běh aplikací napsaných v JS, HTML, Flash (Flex). Není to jen Flash, aplikace může být jen např. HTML a JS. Během vývoje mělo Adobe Air vývojový název Apollo, pod kterým občas něco najdete. Adobe Air je k dispozici pro Windows, Mac a Linux (alpha).

Program

Nebudu detailně probírat každou přednášku, ale jen to lehce shrnu a uvedu nejzajímavější odkazy. V Keynote Ryan Stewart řekl co to Adobe Air je, kam se bude ubírat Flash Player 10 a kam další verze Adobe Air, které na nás brzo čeká.

V další sérii přednášek byli ukázky jak vybudovat Adobe Air aplikaci pomocí Adobe Flex 3 builderu, Adobe Flex SDK a notepadu nebo pomocí Aptana IDE, které je zdarma.

Kromě vývojových nástrojů byla také představeny různé aplikace, které v Adobe Air jsou již vyrobeny. Pokud budete dělat vlastní aplikace je potřeba je digitálně podepsat, aby při instalaci jste byli důvěryhodní chce to také důvěryhodný certifikát a ne self signed. Certifikáty vydává pro Firefox např. Thawte ($299 za rok).

V rámci přednášek také byli přestaveny projekty www.flash.cz a www.flexgarden.net, které nám problematiku vývoje ve Flexu přinášjí v české a slovenském jazyce.

Přenášeli většinou američané a bylo to poznat např. na tom jak intenzivně používají sociální sítě jak Twitter, Brightkite, Tabrio, Facebook a další. O tomto fenoménu, který u nás ještě není tak rozvinutý přinesu další článek někdy později.

Další materiály jsou k dispozci také na stránkých akce, kde najdete např. i videoblog.

Keynote – Ryan Stewart

Building your first Adobe AIR application with Adobe Flex – Mike Chambers

Jak udělat jednoduchou aplikaci a další témata, které byli probírány na přednáškách? Stačí si pročíst knížku Adobe Air for Javascript Developers. Tam najdere všechny důležité informace o Adobe Air.

Building your first AIR application with HTML and JavaScript – Kevin Hoyt

Leveraging HTML and JavaScript within Adobe AIR – Kevin Hoyt

Deploying and Updating AIR Applications – Serge Jespers

Adobe AIR API Overview – Daniel Dura

Google App Engine and RIAs – Dion Almaer

Google App engine má jako runtime Python a využívá část framewroku Django.

Data Intensive Enterprise AIR Applications – Enrique Duvos

Using JavaScript Frameworks in AIR Applications – Andre Charland

AIR Conditioning – Lee Brimelow

Adobe Air Aplikace

Fotografie

http://www.flickr.com/photos/tags/onair2008prague/

Categories: adobe, adobe air, akce, flex, javascript Tags:

Android žije!

02.06.2008 View Comments

Jistě jste již slyšeli o operačním systému Android pro mobily, který má na svědomí Google. Jejich SDK je plně otevřené a může pro tuto platformu vyvíjet každý. Na webu komunity Androidu se objevil článek First LIVE images and videos of FULLSCREEN Android demos!. Konečně je vidět Android v akci a osobně se mi dost libí jaká konkurence tu na trhu s operačními systémy pro mobily vzniká.

Categories: mobil Tags:

Switch to our mobile site