<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>maduixa &#187; php</title>
	<atom:link href="http://blog.jau.cat/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jau.cat</link>
	<description>Blog personal d&#039;en minterior amb gust a maduixa</description>
	<lastBuildDate>Sun, 16 Oct 2011 22:02:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Variables no inicialitzades &#8220;unitialized&#8221; depurant PHP amb Eclipse i xdebug</title>
		<link>http://blog.jau.cat/2011/01/21/variables-no-inicialitzades-unitialized-depurant-php-amb-eclipse-i-xdebug/</link>
		<comments>http://blog.jau.cat/2011/01/21/variables-no-inicialitzades-unitialized-depurant-php-amb-eclipse-i-xdebug/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 23:54:54 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=405</guid>
		<description><![CDATA[Mentre depurava codi en una nova instal·lació d&#8217;Apache+PHP+xdebug m&#8217;he trobat amb el problema de no veure els valors de les variables a la vista &#8220;Variables&#8221; de l&#8217;Eclipse. Pràcticament totes apareixien com &#8220;unitialized&#8221; o no inicialitzades, però en canvi imprimint-les per pantalla sí que tenien valors.  Cercant una mica he trobat aquest bug de xdebug: http://bugs.xdebug.org/view.php?id=467. [...]]]></description>
			<content:encoded><![CDATA[<p>Mentre depurava codi en una nova instal·lació d&#8217;Apache+PHP+xdebug m&#8217;he trobat amb el problema de no veure els valors de les variables a la vista &#8220;Variables&#8221; de l&#8217;Eclipse. Pràcticament totes apareixien com &#8220;unitialized&#8221; o no inicialitzades, però en canvi imprimint-les per pantalla sí que tenien valors.  Cercant una mica he trobat aquest bug de xdebug: <a href="http://bugs.xdebug.org/view.php?id=467">http://bugs.xdebug.org/view.php?id=467</a>.</p>
<p>Se m&#8217;ha acudit que si mai abans he tingut problemes depurant qualsevol versió de PHP, potser l&#8217;error estigués relacionat amb què aquí tinc la 5.3.2. Per resoldre el problema podia instal·lar una versió superior de xdebug on sé que el problema ja està resolt, com a la 2.1, però com realment no necessitava aquesta versió de PHP, podia provar amb la 5.2. Així que he seguit el post de <a href="http://blog.jau.cat/2010/04/28/com-usar-paquets-duna-versio-anterior-dubuntu/">com usar paquets d&#8217;una versió anterior d&#8217;Ubuntu</a> i he fet un <em>downgrade</em> de la versió de PHP+xdebug, a la 5.2.10 i 2.0.4 respectivament.</p>
<p>Després de reiniciar l&#8217;Apache la depuració torna a funcionar bé!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2011/01/21/variables-no-inicialitzades-unitialized-depurant-php-amb-eclipse-i-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instal·lació de xdebug per PHP i Apache2 a Ubuntu</title>
		<link>http://blog.jau.cat/2010/05/19/instal%c2%b7lacio-de-xdebug-per-php-i-apache2-a-ubuntu/</link>
		<comments>http://blog.jau.cat/2010/05/19/instal%c2%b7lacio-de-xdebug-per-php-i-apache2-a-ubuntu/#comments</comments>
		<pubDate>Wed, 19 May 2010 00:19:42 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=343</guid>
		<description><![CDATA[Un dels principals defectes de la majoria de programadors de PHP és oblidar-se de les eines de depuració (debugger). Tots hem estat en feines on no disposaven d&#8217;aquestes eines a la nostra màquina, o no permetien la seva instal·lació, o senzillament no hem pensat en posar-les. Jo vaig començar el meu primer contacte amb la [...]]]></description>
			<content:encoded><![CDATA[<p>Un dels principals defectes de la majoria de programadors de <a title="Entrades sobre PHP" href="http://blog.jau.cat/tag/php/">PHP</a> és oblidar-se de les eines de depuració (debugger). Tots hem estat en feines on no disposaven d&#8217;aquestes eines a la nostra màquina, o no permetien la seva instal·lació, o senzillament no hem pensat en posar-les.</p>
<p>Jo vaig començar el meu primer contacte amb la programació amb el llenguatge c. Llavors a la universitat ens feien usar el programa Microsoft Visual Studio, amb el qual podíem compilar i depurar (debug). La depuració ens permetia seguir el programa pas a pas i saber el valor de cada variable en cada moment, i corregir així errors existents que s&#8217;escapaven a simple vista i que no eren de sintaxi.</p>
<p>En passar a PHP, penso que és més difícil entendre com funciona la depuració, pel fet de tenir el navegador per un costat i l&#8217;<a title="Enllaç extern a la Viquipèdia" href="http://ca.wikipedia.org/wiki/Entorn_integrat_de_desenvolupament">entorn integrat de desenvolupament</a> (o IDE de l&#8217;acrònim en anglès) per un altre. Tanmateix, cal instal·lar prèviament alguna cosa al servidor per poder-li indicar des del nostre IDE l&#8217;ordre d&#8217;aturar-se a la línia de codi que nosaltres vulguem. Per aquest conjunt de factors la majoria de programadors prescindeixen del depurador com a tal i utilitzen el mètode de <a title="Ensayo y error a la Wikipedia (en castellà)" href="http://es.wikipedia.org/wiki/Ensayo_y_error">prova i error</a>, i miren el valor de les variables enviant el seu valor directament al navegador. Les tres funcions de PHP més utilitzades per fer això són: <em>echo</em>, <em>print_r</em> i <em>var_dump</em>.</p>
<p>Jo he passat força temps utilitzant-les també, però quan tornes a la depuració t&#8217;adones que abans estaves perdent el temps. Amb aquest rudimentari mètode, si no coneixes molt bé el codi, primer has de trobar el punt on està la variable que vols observar, teclejar el codi que mostri el seu valor i executar la consulta de la pàgina des del navegador. Molt bé, ja has vist el seu contingut, però com ha estat calculat? Com s&#8217;ha arribat fins aquí, a través de quins fitxers, mètodes o funcions? La majoria de vegades has de tornar a escriure més codi per mostrar altres variables, perquè l&#8217;anterior no t&#8217;ha servit de massa, i tornar a actualitzar el navegador. A més a més, després cal eliminar tot aquest codi extra que has creat només per mirar el valor d&#8217;algunes de les variables. I quantes vegades passa -a mi també- que acaba pujant a producció codi amb aquestes sentències de &#8220;depuració&#8221;?</p>
<p>Per evitar tot això, el millor és usar un depurador de veritat. Encara que al principi perdem una mica de temps per configurar-lo i aprendre com funciona, després ens estalviarà molt temps i mal de caps. Jo per desenvolupar en PHP i MySQL utilitzo el servidor web Apache2 sobre Ubuntu; una solució LAMP vaja. I com a IDE l&#8217;<a href="http://www.eclipse.org/">Eclipse</a> amb el PDT (<a href="http://www.eclipse.org/pdt/">PHP Development Tools</a>) i alguns altres <em>plugins</em>.</p>
<p>Amb els següents passos podreu instal·lar xdebug amb l&#8217;Apache2 i PHP:</p>
<pre class="brush: bash; title: ; notranslate">sudo apt-get install php5-xdebug</pre>
<p>Això ha instal·lat el paquet corresponent i ha creat el fitxer /etc/php5/conf.d/xdebug.ini amb aquest contingut:</p>
<pre>zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so</pre>
<p>Si ara comprovem el resultat de cridar a phpinfo(), veurem:</p>
<pre>This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans</pre>
<p>Al mateix fitxer xdebug.ini hem d&#8217;afegir aquestes línies:</p>
<pre class="brush: plain; title: ; notranslate">
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
</pre>
<p>I ja per acabar, carreguem els canvis de configuració a l&#8217;Apache:</p>
<pre class="brush: bash; title: ; notranslate">sudo /etc/init.d/apache2 reload</pre>
<p>En un altre capítol escriuré com configurar l&#8217;Eclipse per depurar des d&#8217;allà.</p>
<p>Gràcies Derick pel fantàstic xdebug!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/05/19/instal%c2%b7lacio-de-xdebug-per-php-i-apache2-a-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Com usar paquets d&#8217;una versió anterior d&#8217;Ubuntu</title>
		<link>http://blog.jau.cat/2010/04/28/com-usar-paquets-duna-versio-anterior-dubuntu/</link>
		<comments>http://blog.jau.cat/2010/04/28/com-usar-paquets-duna-versio-anterior-dubuntu/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 17:15:52 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=329</guid>
		<description><![CDATA[En actualitzar (ahir) a Ubuntu 10.04 LTS Lucid Lynx, he passat de la versió de PHP 5.2.10.dfsg.1-2ubuntu6 a la 5.3.2-1ubuntu4. Si volem tornar a tenir la versió 5.2, hem de configurar l&#8217;APT per tal que usi aquells paquets que vulguem de les fonts de Karmic Koala. Així: Primer llistarem els paquets de php que tenim instal·lats: En el [...]]]></description>
			<content:encoded><![CDATA[<p>En actualitzar (ahir) a Ubuntu 10.04 LTS Lucid Lynx, he passat de la versió de <a title="Entrades sobre PHP" href="http://blog.jau.cat/tag/php/">PHP</a> 5.2.10.dfsg.1-2ubuntu6 a la 5.3.2-1ubuntu4. Si volem tornar a tenir la versió 5.2, hem de configurar l&#8217;<a title="APT a la Viquipèdia" href="http://ca.wikipedia.org/wiki/Apt_(ordre)">APT</a> per tal que usi aquells paquets que vulguem de les fonts de Karmic Koala. Així:</p>
<p>Primer llistarem els paquets de php que tenim instal·lats:</p>
<pre class="brush: bash; title: ; notranslate">dpkg -l | egrep php</pre>
<p>En el meu cas són:</p>
<ul>
<li>php5-common</li>
<li>libapache2-mod-php5</li>
<li>php-pear</li>
<li>php5-cli</li>
<li>php5-curl</li>
<li>php5-dev</li>
<li>php5-mysql</li>
<li>php5-memcache</li>
<li>php5-suhosin</li>
</ul>
<p>Dupliquem el fitxer amb les fonts de programari canviant la paraula <em>lucid</em> per <em>karmic</em>:</p>
<pre class="brush: bash; title: ; notranslate">sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list</pre>
<p>Creem un nou fitxer de preferències que anomenem per exemple &#8220;php&#8221;:</p>
<pre class="brush: bash; title: ; notranslate">sudo nano /etc/apt/preferences.d/php</pre>
<p>I copiem aquestes tres línies per cada paquet dels llistats anteriorment, tot canviant el nom del paquet:</p>
<pre class="brush: plain; title: ; notranslate">
Package: php5-common
Pin: release a=karmic
Pin-Priority: 991
...
</pre>
<p>Un cop ho hem configurat tot, actualitzem els paquets:</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
</pre>
<p>No ens oblidem de reiniciar el servidor web; per l&#8217;Apache:</p>
<pre class="brush: bash; title: ; notranslate">sudo apache2ctl restart</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/04/28/com-usar-paquets-duna-versio-anterior-dubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Actualitzar automàticament la revisió/data/autor en fer commit a subversion</title>
		<link>http://blog.jau.cat/2010/03/12/actualitzar-automaticament-la-revisio-data-autor-en-fer-commit-a-subversion/</link>
		<comments>http://blog.jau.cat/2010/03/12/actualitzar-automaticament-la-revisio-data-autor-en-fer-commit-a-subversion/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 22:11:06 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=210</guid>
		<description><![CDATA[Si recentment escrivia l&#8217;entrada sobre la amb la possibilitat de fer diferents cerques simultànies, avui explico un cas on ho he usat. Alguna vegada haureu vist en fitxers amb codi font (siguin del llenguatge de programació que siguin), que a la part superior apareix informació sobre què conté el fitxer, la seva llicència, o l&#8217;autor, [...]]]></description>
			<content:encoded><![CDATA[<p>Si recentment escrivia l&#8217;entrada sobre la <a href="http://blog.jau.cat/2010/03/01/cerca-amb-la-comanda-find-de-gnulinux/">comanda <strong>find</strong></a> amb la possibilitat de fer diferents cerques simultànies, avui explico un cas on ho he usat.</p>
<p>Alguna vegada haureu vist en fitxers amb <a title="En Informàtica es refereix a una sèrie d'instruccions escrites en algun llenguatge de programació llegible per l'home" href="http://ca.wikipedia.org/wiki/Codi_font">codi font</a> (siguin del llenguatge de programació que siguin), que a la part superior apareix informació sobre què conté el fitxer, la seva llicència, o <strong>l&#8217;autor, la data i el número de revisió</strong> dels darrers canvis que ha patit el fitxer en qüestió. En referència a aquestes tres darreres em refereixo a una línia d&#8217;aquest estil:</p>
<p>﻿﻿$Id: codi.php 148 2006-07-28 21:30:43Z jaume $</p>
<p>Evidentment aquestes dades no són escrites a mà per l&#8217;autor cada vegada que fa un canvi al fitxer (una nova revisió), sinó que es realitza automàticament; i concretament aquest és el format que utilitza <strong><em>subversion</em></strong> per la variable Id. En realitat jo havia escrit <strong>$Id$</strong> allà on he volgut del fitxer anomenat codi.php, i en fer el <em>commit</em> al dipòsit el sistema ho ha substituït per la línia completa que veieu a dalt. <em>Id</em> és una combinació reduïda de les paraules clau <strong>$Author$</strong>, <strong>$Revision$</strong> i <strong>$Date$</strong>, que també podeu utilitzar de forma independent. Al <a title="Nova finestra" href="http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html" target="_blank">manual de subversion</a> (en anglès) podeu llegir més al respecte. Si volem que tots els fitxers del nostre projecte que tinguem al sistema de control de versions <em>subversion</em> incorporin aquesta funcionalitat, hem de configurar el servidor de certa manera. Editem el fitxer /etc/subversion/config (aquest és el camí a Ubuntu, però serà similar a altres distribucions). Per defecte <em>enable-auto-props</em> està comentat, ho deixem així:</p>
<pre class="brush: bash; title: ; notranslate">
### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes
</pre>
<p>I una mica més avall editem les propietats automàtiques:</p>
<pre class="brush: bash; title: ; notranslate">
### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
*.php = svn:eol-style=native;svn:keywords=Author Date Id Revision
*.txt = svn:eol-style=native;svn:keywords=Author Date Id Revision
*.sh  = svn:eol-style=native;svn:keywords=Author Date Id Revision;svn:executable
*.tpl = svn:eol-style=native
*.css = svn:eol-style=native
*.js  = svn:eol-style=native
*.htm = svn:eol-style=native
*.html = svn:eol-style=native
*.htaccess = svn:eol-style=native
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
*.gif = svn:mime-type=image/gif
</pre>
<p>Jo he definit que només els fitxers amb l&#8217;extensió php, txt i sh tinguin la capacitat de substitució de paraules clau. A més a més els .sh vull que siguin executables (de manera que si algú fa un <em>check out<span style="font-style: normal;"> el propi </span>subversion</em> s&#8217;encarregui de marcar el bit d&#8217;execució per nosaltres). I si us hi fixeu, la resta de fitxers de text tenen una altra propietat: <em>svn:eol-style=native</em>. Això fa referència al final de línia (en anglès, eol = end of line), i serveix per què vàries persones treballin sobre els mateixos fitxers en sistemes operatius diferents (els quals usen diferents caràcters per indicar el final de línia). Les tres darreres línies són pels fitxers d&#8217;imatge, cadascun amb el seu tipus <a title="Extensions de correu Internet multipropòsit" href="http://ca.wikipedia.org/wiki/Multi-Purpose_Internet_Mail_Extensions">mime</a> corresponent.</p>
<p>Un cop fet això, ens assegurem que els fitxers <strong>nous</strong> que agreguem al dipòsit tindran aquestes propietats, però què passa amb els fitxers existents? Cal que els donem les propietats nosaltres manualment, i aquí entra la potència de la comanda <em>find</em>. I si ho podem fer tot d&#8217;una sola passada millor <img src='http://blog.jau.cat/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Ens situem al directori arrel del nostre projecte i executem:</p>
<pre class="brush: bash; title: ; notranslate">
find . \
\( -name '*.php' -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; \) , \
\( -name '*.txt' -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; \) , \
\( -name '*.sh'  -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; -exec svn propset svn:executable {} \; \) , \
\( -name '*.tpl' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '*.css' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '*.js' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '*.htm' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '*.html' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '.htaccess' -exec svn propset svn:eol-style native {} \; \) , \
\( -name '*.png' -exec svn propset svn:mime-type 'image/png' {} \; \) , \
\( -name '*.jpg' -exec svn propset svn:mime-type 'image/jpeg' {} \; \) , \
\( -name '*.gif' -exec svn propset svn:mime-type 'image/gif' {} \; \) &gt; /dev/null
</pre>
<p>I això és tot, a programar de gust! <img src='http://blog.jau.cat/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/03/12/actualitzar-automaticament-la-revisio-data-autor-en-fer-commit-a-subversion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Error javascript provocat pel plugin Ozh&#8217; Admin Drop Down Menu de WordPress</title>
		<link>http://blog.jau.cat/2010/02/28/error-javascript-provocat-pel-plugin-ozh-admin-drop-down-menu-de-wordpress/</link>
		<comments>http://blog.jau.cat/2010/02/28/error-javascript-provocat-pel-plugin-ozh-admin-drop-down-menu-de-wordpress/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 20:26:29 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=257</guid>
		<description><![CDATA[No sé si hi ha alguna incompatibilitat entre els plugins RB Internal Linker i Ozh&#8217; Admin Drop Down Menu de WordPress, però ahir vaig actualitzar el primer a la versió 2.0.11 i ara està fallant. El problema l&#8217;he detectat amb Firebug (quina eina més meravellosa!), que mostrava el següent error de javascript: syntax error var [...]]]></description>
			<content:encoded><![CDATA[<p>No sé si hi ha alguna incompatibilitat entre els plugins <em>RB Internal Linker</em> i <em>Ozh&#8217; Admin Drop Down Menu</em> de WordPress, però ahir vaig actualitzar el primer a la versió 2.0.11 i ara està fallant. El problema l&#8217;he detectat amb <a title="Utilitats amb què podem analitzar, editar, monitoritzar i depurar el codi font d'una pàgina web" href="http://es.wikipedia.org/wiki/Firebug">Firebug</a> (quina eina més meravellosa!), que mostrava el següent error de <strong>javascript</strong>:</p>
<p style="padding-left: 30px;"><span style="color: #ff0000;">syntax error</span><br />
<span style="padding-left: 40px; color: #ff0000;">var oam_toomanypluygins = ;\n</span></p>
<p>He cercat directament al directori de plugins quin fitxer contenia aquest nom de variable, des d&#8217;una connexió ssh al servidor, així:</p>
<pre class="brush: bash; title: ; notranslate">egrep -r oam_toomanypluygins *</pre>
<p>Han sortit tres resultats. El problema es troba al fitxer <strong>ozh-admin-drop-down-menu/inc/core.php</strong>, a la funció en llenguatge PHP <strong>wp_ozh_adminmenu_js()</strong>.<br />
A la línia:</p>
<pre class="brush: php; title: ; notranslate">$toomanyplugins = $wp_ozh_adminmenu['too_many_plugins'];</pre>
<p>veiem que la variable PHP <span style="color: #aa7700;">$toomanyplugins</span> és assignada i més endavant inserida directament entre codi javascript. Ràpidament ens podem adonar que si la variable és buida s&#8217;introduïrà un error al codi javascript perquè faltarà algun valor entre els caràcters = i ;</p>
<pre class="brush: jscript; title: ; notranslate">var oam_toomanypluygins = ;</pre>
<p>Per resoldre-ho, després de la línia PHP anteriorment esmentada he afegit:</p>
<pre class="brush: php; title: ; notranslate">
if (empty($toomanyplugins)) {
    $defaults = wp_ozh_adminmenu_defaults();
    $toomanyplugins = $defaults['too_many_plugins'];
}
</pre>
<p>D&#8217;aquesta manera comprovem si la variable és buida i li donem el valor per defecte abans d&#8217;inserir-la entre codi javascript.</p>
<p>Resolt! <img src='http://blog.jau.cat/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Actualització</strong> (01-03-2010): a vegades les coses serveixen per més persones, per això és bo compartir. El desenvolupador del plugin m&#8217;ha contestat:</p>
<blockquote>
<div><cite>Hello Jaume<br />
Nice catch, thanks for this! I&#8217;ve updated the plugin to deal with this case<br />
Cheers,<br />
Ozh</cite></div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/02/28/error-javascript-provocat-pel-plugin-ozh-admin-drop-down-menu-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fi de la Drupal Camp Barcelona 2010</title>
		<link>http://blog.jau.cat/2010/02/28/fi-de-la-drupal-camp-barcelona-2010/</link>
		<comments>http://blog.jau.cat/2010/02/28/fi-de-la-drupal-camp-barcelona-2010/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 18:15:00 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Esdeveniments]]></category>
		<category><![CDATA[Programari]]></category>
		<category><![CDATA[Barcelona]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=254</guid>
		<description><![CDATA[Aquest migdia ha acabat la Drupal Camp Barcelona 2010. Després de les sis ponències que vaig escoltar , avui he decidit assistir a les següents: Construyendo una red social con Drupal Implementando Sitios Multilenguaje Iniciación a Skinr La que més m&#8217;ha agradat avui ha estat la primera, d&#8217;en Daniel Primo Gorgoso.]]></description>
			<content:encoded><![CDATA[<div><img src="http://drupalcamp.es/sites/all/themes/barcelona2010c/img/logo.png" alt="logo drupal camp spain barcelona 2010" width="406" height="100" /></div>
<p class="clear">Aquest migdia ha acabat la <a title="Informació" href="http://drupalcamp.es/informacion">Drupal Camp Barcelona 2010</a>. Després de les sis ponències que vaig escoltar <a href="http://blog.jau.cat/2010/02/27/drupal-camp-barcelona-2010/">ahir</a>, avui he decidit assistir a les següents:</p>
<ul>
<li><a href="http://drupalcamp.es/sessions/construyendo-una-red-social-con-drupal">Construyendo una red social con Drupal</a></li>
<li><a href="http://drupalcamp.es/sessions/implementando-sitios-multilenguaje">Implementando Sitios Multilenguaje</a></li>
<li><a href="http://drupalcamp.es/sessions/iniciacion-skinr">Iniciación a Skinr</a></li>
</ul>
<p>La que més m&#8217;ha agradat avui ha estat la primera, d&#8217;en Daniel Primo Gorgoso.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/02/28/fi-de-la-drupal-camp-barcelona-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal Camp Barcelona 2010</title>
		<link>http://blog.jau.cat/2010/02/27/drupal-camp-barcelona-2010/</link>
		<comments>http://blog.jau.cat/2010/02/27/drupal-camp-barcelona-2010/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 08:02:03 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Esdeveniments]]></category>
		<category><![CDATA[Programari]]></category>
		<category><![CDATA[Barcelona]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=246</guid>
		<description><![CDATA[Ahir va començar la ﻿﻿﻿﻿﻿Drupal Camp Barcelona 2010, ﻿﻿el major esdeveniment anual organitzat per i pels amants de Drupal a Espanya. Jo vaig ser dels tres primers en inscriure&#8217;m-hi i ahir ja em vaig perdre el primer dia per culpa de passar . Però avui, malgrat anar enguixat i amb crosses, sí que assistiré a [...]]]></description>
			<content:encoded><![CDATA[<p>Ahir va començar la ﻿﻿﻿﻿﻿<a title="Informació" href="http://drupalcamp.es/informacion">Drupal Camp Barcelona 2010</a>, ﻿﻿el major esdeveniment anual organitzat per i pels amants de Drupal a Espanya. Jo vaig ser dels tres primers en inscriure&#8217;m-hi i ahir ja em vaig perdre el primer dia per culpa de passar <a href="http://blog.jau.cat/2010/02/26/lesionat-del-turmell-dret-una-setmana-despres/#Lesionat del turmell dret">hores al metge</a>. Però avui, malgrat anar enguixat i amb crosses, sí que assistiré a <a href="http://drupalcamp.es/programa">totes les ponències</a> que pugui. Som-hi!!</p>
<p><strong>Actualitzo</strong> (27-02-2010): finalment he assistit a totes les ponències de la sala auditori, la gran. Han estat:</p>
<ul>
<li><a href="http://drupalcamp.es/sessions/ecommerce-para-drupal-introduccion-ubercart">Ecommerce para Drupal: Introducción a Ubercart</a></li>
<li><a href="http://drupalcamp.es/sessions/presentacion-de-la-coleccion-de-libros-aprende-drupal-con-forcontu">Presentación de la Colección de libros Aprende Drupal con Forcontu</a></li>
<li><a href="http://drupalcamp.es/sessions/diseno-grafico-y-drupal-nuestra-experiencia">Diseño gráfico y Drupal. Nuestra experiencia</a></li>
<li><a href="http://drupalcamp.es/sessions/scrum-y-la-gesti%C3%B3n-de-proyectos-web">SCRUM y la Gestión de Proyectos WEB. Enfoque teórico orientado a la práctica</a></li>
<li><a href="http://drupalcamp.es/sessions/scrum-y-la-gestion-de-proyectos-web-experiencias-y-casos-reales-la-pareja-scrum-drupal">SCRUM y la Gestión de Proyectos web. Experiencias y casos reales. La pareja: scrum + drupal</a></li>
<li><a href="http://drupalcamp.es/sessions/programacion-con-la-api-de-views-un-caso-practico">Programación con la API de views. Un caso práctico</a></li>
</ul>
<p>La tercera és la que més m&#8217;ha agradat, realitzada per César Martin, sobretot pel seu dinamisme i la quantitat d&#8217;exemples que ha comentat.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/02/27/drupal-camp-barcelona-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Com obtenir el Pagerank (PR) d&#8217;una uri des de PHP</title>
		<link>http://blog.jau.cat/2010/02/12/com-obtenir-el-pagerank-pr-duna-uri-des-de-php/</link>
		<comments>http://blog.jau.cat/2010/02/12/com-obtenir-el-pagerank-pr-duna-uri-des-de-php/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 17:11:24 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[utilitats]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=206</guid>
		<description><![CDATA[Primer de tot, per aquells qui no sapigueu de què parlo, us poso la definició de Pagerank de la Viquipèdia:

﻿﻿PageRank és l'algorisme que utilitza Google per determinar la posició d'una pàgina web a l'hora de fer una consulta mitjançant el seu motor de cerca. Aquest mètode mesura el seu grau d'importància de forma numèrica i permet situar els resultats més fiables en primer lloc. Alhora, reflecteix la probabilitat que hi ha de que un usuari que navega a través d'enllaços de forma aleatòria arribi a una pàgina web concreta.

Doncs bé, he trobat un script en el llenguatge de programació PHP que permet obtenir el Pagerank . L'he transformat en una classe i aquí el teniu...]]></description>
			<content:encoded><![CDATA[<p>Primer de tot, per aquells qui no sapigueu de què parlo, us poso la <a href="http://ca.wikipedia.org/wiki/PageRank">definició de Pagerank de la Viquipèdia</a>:</p>
<p>﻿﻿<strong>PageRank</strong> és l&#8217;<a title="Algorisme" href="http://ca.wikipedia.org/wiki/Algorisme">algorisme</a> que utilitza Google per determinar la posició d&#8217;una pàgina web a l&#8217;hora de fer una consulta mitjançant el seu motor de cerca. Aquest mètode mesura el seu grau d&#8217;importància de forma numèrica i permet situar els resultats més fiables en primer lloc. Alhora, reflecteix la probabilitat que hi ha de que un usuari que navega a través d&#8217;enllaços de forma aleatòria arribi a una pàgina web concreta.</p>
<p>Doncs bé, he trobat un script en el llenguatge de programació PHP que permet obtenir el Pagerank . L&#8217;he transformat en una classe i aquí el teniu:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

/**
 * PageRank Lookup class v1.1 by HM2K (update: 31/01/2007)
 * based on an algorithm found here: http://pagerank.gamesaga.net/
 * @author HM2K
 * @version 1.1
 * @see http://pagerank.gamesaga.net/
 */
class Pagerank
{
    //settings - host and user agent
    private static $googlehost = 'toolbarqueries.google.com';
    private static $googleua   = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5';

    /**
     * Convert a string to a 32-bit integer
     */
    private function strToNum($Str, $Check, $Magic)
    {
        $Int32Unit = 4294967296;  // 2^32

        $length = strlen($Str);
        for ($i = 0; $i &lt; $length; $i++) {
            $Check *= $Magic;
            //If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
            //  the result of converting to integer is undefined
            //  refer to http://www.php.net/manual/en/language.types.integer.php
            if ($Check &gt;= $Int32Unit) {
                $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
                //if the check less than -2^31
                $Check = ($Check &lt; -2147483648) ? ($Check + $Int32Unit) : $Check;
            }
            $Check += ord($Str{$i});
        }
        return $Check;
    }

    /**
     * Genearate a hash for a url
     * @param string $String
     */
    private function hashURL($string)
    {
        $check1 = self::strToNum($string, 0x1505, 0x21);
        $check2 = self::strToNum($string, 0, 0x1003F);

        $check1 &gt;&gt;= 2;
        $check1 = (($check1 &gt;&gt; 4) &amp; 0x3FFFFC0 ) | ($check1 &amp; 0x3F);
        $check1 = (($check1 &gt;&gt; 4) &amp; 0x3FFC00 ) | ($check1 &amp; 0x3FF);
        $check1 = (($check1 &gt;&gt; 4) &amp; 0x3C000 ) | ($check1 &amp; 0x3FFF);

        $T1 = (((($check1 &amp; 0x3C0) &lt;&lt; 4) | ($check1 &amp; 0x3C)) &lt;&lt;2 ) | ($check2 &amp; 0xF0F );
        $T2 = (((($check1 &amp; 0xFFFFC000) &lt;&lt; 4) | ($check1 &amp; 0x3C00)) &lt;&lt; 0xA) | ($check2 &amp; 0xF0F0000 );

        return ($T1 | $T2);
    }

    /**
     * Genearate a checksum for the hash string
     * @param string $hashnum
     */
    private function checkHash($hashnum)
    {
        $checkByte = 0;
        $flag = 0;

        $HashStr = sprintf('%u', $hashnum) ;
        $length = strlen($HashStr);

        for ($i = $length - 1;  $i &gt;= 0;  $i --) {
            $Re = $HashStr{$i};
            if (1 === ($flag % 2)) {
                $Re += $Re;
                $Re = (int)($Re / 10) + ($Re % 10);
            }
            $checkByte += $Re;
            $flag ++;
        }

        $checkByte %= 10;
        if (0 !== $checkByte) {
            $checkByte = 10 - $checkByte;
            if (1 === ($flag % 2) ) {
                if (1 === ($checkByte % 2)) {
                    $checkByte += 9;
                }
                $checkByte &gt;&gt;= 1;
            }
        }

        return '7'.$checkByte.$HashStr;
    }

    /**
     * Return the pagerank checksum hash
     * @param string $url
     */
    private function getCh($url)
    {
        return self::checkHash(self::hashURL($url));
    }

    /**
     * Return the pagerank figure
     * @param string $url
     */
    public function getPagerank($url)
    {
        $googlehost = self::$googlehost;
        $googleua   = self::$googleua;
        $ch         = self::getCh($url);
        $fp         = fsockopen($googlehost, 80, $errno, $errstr, 30);
        if ($fp) {
            $out = &quot;GET /search?client=navclient-auto&amp;ch=$ch&amp;features=Rank&amp;q=info:$url HTTP/1.1\r\n&quot;;
            //echo &quot;&lt;pre&gt;$out&lt;/pre&gt;\n&quot;; //debug only
            $out .= &quot;User-Agent: $googleua\r\n&quot;;
            $out .= &quot;Host: $googlehost\r\n&quot;;
            $out .= &quot;Connection: Close\r\n\r\n&quot;;

            fwrite($fp, $out);

            //$pagerank = substr(fgets($fp, 128), 4); //debug only
            //echo $pagerank; //debug only
            while (!feof($fp)) {
                $data = fgets($fp, 128);
                //echo $data;
                $pos = strpos($data, &quot;Rank_&quot;);
                if($pos === false){} else{
                    $pr=substr($data, $pos + 9);
                    $pr=trim($pr);
                    $pr=str_replace(&quot;\n&quot;,'',$pr);
                    return $pr;
                }
            }
            //else { echo &quot;$errstr ($errno)&lt;br /&gt;\n&quot;; } //debug only
            fclose($fp);
        }
    }

    /**
     * Generate the graphical pagerank
     * @param $url
     * @param $width
     * @param $method
     */
    public function getGraphicalPagerank($url,$width=40,$method='style')
    {
        if (!preg_match('/^(http:\/\/)?([^\/]+)/i', $url))
        {
            $url='http://'.$url;
        }
        $pr=self::getPagerank($url);
        $pagerank=&quot;PageRank: $pr/10&quot;;

        //The (old) image method
        if ($method == 'image') {
            $prpos=$width*$pr/10;
            $prneg=$width-$prpos;
            $html='&lt;img src=&quot;http://www.google.com/images/pos.gif&quot; width='.$prpos.' height=4 border=0 alt=&quot;'.$pagerank.'&quot;&gt;&lt;img src=&quot;http://www.google.com/images/neg.gif&quot; width='.$prneg.' height=4 border=0 alt=&quot;'.$pagerank.'&quot;&gt;';
        }
        //The pre-styled method
        if ($method == 'style') {
            $prpercent=100*$pr/10;
            $html='&lt;div style=&quot;position: relative; width: '.$width.'px; padding: 0; background: #D9D9D9;&quot;&gt;&lt;strong style=&quot;width: '.$prpercent.'%; display: block; position: relative; background: #5EAA5E; text-align: center; color: #333; height: 4px; line-height: 4px;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;';
        }

        $out='&lt;a href=&quot;'.$url.'&quot; title=&quot;'.$pagerank.'&quot;&gt;'.$html.'&lt;/a&gt;';
        return $out;
    }

}
</pre>
<p>Per usar-la només cal el següent:</p>
<pre class="brush: php; title: ; notranslate">
require 'Pagerank.php';

echo Pagerank::getPagerank('google.com');
</pre>
<p>L&#8217;exemple mostrarà: 10</p>
<p>Podeu baixar-vos el fitxer amb el codi font fent clic <a href="http://blog.jau.cat/wp-content/uploads/2010/02/Pagerank.phps">aquí</a>.</p>
<p>Que aprofiti!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/02/12/com-obtenir-el-pagerank-pr-duna-uri-des-de-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack al header.php del tema de WordPress Mandingo</title>
		<link>http://blog.jau.cat/2010/01/21/hack-al-header-php-del-tema-del-blog-mandingo/</link>
		<comments>http://blog.jau.cat/2010/01/21/hack-al-header-php-del-tema-del-blog-mandingo/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 23:18:32 +0000</pubDate>
		<dc:creator>minterior</dc:creator>
				<category><![CDATA[Programari]]></category>
		<category><![CDATA[com es fa]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[mandingo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programació]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.jau.cat/?p=86</guid>
		<description><![CDATA[El tema per a WordPress Mandingo té la funcionalitat de poder excloure certes pàgines del menú superior; aquestes es poden configurar des de l&#8217;administrador, a la secció del tema. El que no permet és triar quines en volem incloure al menú. Per no haver de marcar cada nova pàgina que creem, i evitar així que [...]]]></description>
			<content:encoded><![CDATA[<p>El tema per a WordPress Mandingo té la funcionalitat de poder excloure certes pàgines del menú superior; aquestes es poden configurar des de l&#8217;administrador, a la secció del tema. El que no permet és triar quines en volem incloure al menú. Per no haver de marcar cada nova pàgina que creem, i evitar així que aparegui al menú superior, podem fer un petit canvi de funcionalitat: en lloc de marcar les que no volem, marcarem les que sí que volem.</p>
<p>A més a més hem de fer un petit canvi al codi font del tema. Editem el fitxer:</p>
<pre class="brush: plain; title: ; notranslate">themes/mandigo/header.php</pre>
<p>Busquem la crida a la funció PHP:</p>
<pre class="brush: php; title: ; notranslate">wp_list_pages</pre>
<p>I a la línia</p>
<pre class="brush: php; title: ; notranslate">'exclude' =&gt; @implode(',', $mandigo_options['header_navigation_exclude_pages']),</pre>
<p>canviem &#8216;exclude&#8217; per &#8216;<strong>include</strong>&#8216;. Desem el fitxer i ja hem acabat.</p>
<p>D&#8217;aquesta manera, només haurem de treballar quan vulguem modificar el menú superior, i no sempre que creem pàgines noves <img src='http://blog.jau.cat/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jau.cat/2010/01/21/hack-al-header-php-del-tema-del-blog-mandingo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

