<?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-3812840746656887122</id><updated>2012-02-16T19:19:29.195+01:00</updated><category term='linux'/><category term='apache'/><category term='pyAlfresco'/><category term='processing'/><category term='plone'/><category term='datos'/><category term='soap'/><category term='SEO'/><category term='java'/><category term='alfresco'/><category term='Chrome'/><category term='python'/><category term='php'/><category term='tips'/><category term='wsgi'/><category term='cheats'/><category term='visualizacion'/><category term='Zope'/><category term='repoze.bfg'/><category term='diseño'/><category term='blog'/><category term='Chromium'/><title type='text'>Montxoguerrero's blog</title><subtitle type='html'>Programación, experimentos y otras notas mentales.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-1319023481664083454</id><published>2011-01-10T11:58:00.006+01:00</published><updated>2011-01-11T17:47:47.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><category scheme='http://www.blogger.com/atom/ns#' term='datos'/><title type='text'>El arte de programar con Processing</title><content type='html'>Processing es un lenguaje de código abierto basado en java que en principio fue diseñado para el aprendizaje de programación en un entorno visual.&lt;br /&gt;Actualmente lo usan bastantes diseñadores y artistas para presentaciones pruebas conceptuales, etc...&lt;br /&gt;Se puede ver una muestra en la url &lt;a href="http://processing.org/exhibition/"&gt;http://processing.org/exhibition/&lt;/a&gt;&lt;br /&gt;Entre las pruebas realizadas he creado este gráfico dinámico que lee los datos de mysql y crea una distribución en círculo de los nodos y la relación entre ellos.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-kQftsinPB8/TSrprYuMvdI/AAAAAAAAAag/IaMeycqfziU/s1600/grafo%2B-%2Bcopia%2B%25282%2529.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_-kQftsinPB8/TSrprYuMvdI/AAAAAAAAAag/IaMeycqfziU/s320/grafo%2B-%2Bcopia%2B%25282%2529.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5560513621522169298" /&gt;&lt;/a&gt;&lt;br /&gt;Grafo simple con pesos:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/TSsjlFVrebI/AAAAAAAAAao/oxi2fLi1WeU/s1600/grafo%2B-%2Bcopia%2B%25284%2529.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/TSsjlFVrebI/AAAAAAAAAao/oxi2fLi1WeU/s320/grafo%2B-%2Bcopia%2B%25284%2529.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5560577284914248114" /&gt;&lt;/a&gt;&lt;br /&gt;Grafo con pesos II:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-kQftsinPB8/TSx_FiVNFmI/AAAAAAAAAa4/VlBYzS6HKkk/s1600/grafo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_-kQftsinPB8/TSx_FiVNFmI/AAAAAAAAAa4/VlBYzS6HKkk/s320/grafo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5560959372987536994" /&gt;&lt;/a&gt;&lt;br /&gt;Gráfica de evolución:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/TSx-bMJmOjI/AAAAAAAAAaw/F35fH6HHlB8/s1600/graficaTiempo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/TSx-bMJmOjI/AAAAAAAAAaw/F35fH6HHlB8/s320/graficaTiempo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5560958645478767154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entre las utilidades que tiene el editor cuenta con una clase para leer directamente del puerto de serie, conectores con bases de datos, utilidades para generación de pdfs y la exportación de la app en un applet.&lt;br /&gt;Todo el entorno es extensible mediante java por lo que todo lo que se pueda ejecutar en java se ejecutará en processing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1319023481664083454?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1319023481664083454/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2011/01/el-arte-de-programar-con-processing.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1319023481664083454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1319023481664083454'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2011/01/el-arte-de-programar-con-processing.html' title='El arte de programar con Processing'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/TSrprYuMvdI/AAAAAAAAAag/IaMeycqfziU/s72-c/grafo%2B-%2Bcopia%2B%25282%2529.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-1539447810409370818</id><published>2011-01-04T18:17:00.010+01:00</published><updated>2011-01-05T15:29:13.844+01:00</updated><title type='text'>Trasteando con drools y maven.</title><content type='html'>Uno de los mejores motores de reglas que conocía era CLIPS con librerías en c, c++ y algunos bindings en otros lenguajes.&lt;br /&gt;Desde que trabajo con java siempre me ha llamado la atención DROOLS de JBoss y me he decidido a realizar algunos de los ejemplos que vienen en la documentación para ir adaptándome al entorno.&lt;br /&gt;Aquí el pom que he usado para iniciar el proyecto maven.&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;fire&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;fire&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;repositories&amp;gt;&lt;br /&gt;  &amp;lt;repository&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;drools&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;public jboss&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;url&amp;gt;http://repository.jboss.org/nexus/content/groups/public-jboss/&amp;lt;/url&amp;gt;&lt;br /&gt;   &lt;br /&gt;  &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;/repositories&amp;gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;   &amp;lt;drools.version&amp;gt;5.0.1&amp;lt;/drools.version&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;dependencies&amp;gt;&lt;br /&gt;   &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.drools&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;drools-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;${drools.version}&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;/dependency&amp;gt;&lt;br /&gt;   &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.drools&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;drools-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;${drools.version}&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;/dependency&amp;gt;&lt;br /&gt;   &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.drools&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;drools-compiler&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;${drools.version}&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con estas tres librerías es suficiente para tener lo básico.&lt;br /&gt;También he descargado el plugin de eclipse para Drools que permite el resaltado de código y autocompletado.&lt;br /&gt;&lt;a href="http://www.jboss.org/drools/downloads"&gt;http://www.jboss.org/drools/downloads&lt;/a&gt;&lt;br /&gt;La estructura del proyecto quedaría así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;|   pom.xml&lt;br /&gt;|&lt;br /&gt;+---bin&lt;br /&gt;+---src&lt;br /&gt;   \---main&lt;br /&gt;       +---java&lt;br /&gt;       |   |   main.java&lt;br /&gt;       |   |&lt;br /&gt;       |   \---elements&lt;br /&gt;       |           Alarm.java&lt;br /&gt;       |           Fire.java&lt;br /&gt;       |           Room.java&lt;br /&gt;       |           Sprinkler.java&lt;br /&gt;       |&lt;br /&gt;       \---resources&lt;br /&gt;               fireAlarm.drl&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El ejemplo completo se puede descargar de &lt;a href="http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e401"&gt;aquí &lt;/a&gt;&lt;br /&gt;En mi caso he modificado algunas pequeñas erratas para que funcione en mi clase main podemos ver:&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();&lt;br /&gt;  KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();&lt;br /&gt;  kbuilder.add( ResourceFactory.newClassPathResource( "fireAlarm.drl"),&lt;br /&gt;                ResourceType.DRL );&lt;br /&gt;  if ( kbuilder.hasErrors() ) {&lt;br /&gt;      System.err.println( kbuilder.getErrors().toString() );&lt;br /&gt;  }&lt;br /&gt;  kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );&lt;br /&gt;  StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();&lt;br /&gt;  Room estudio = new Room("estudio");&lt;br /&gt;  ksession.insert(new Sprinkler(estudio,false));&lt;br /&gt;  ksession.insert(new Fire(estudio));&lt;br /&gt;  ksession.fireAllRules();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y en mi fichero de reglas:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;&lt;br /&gt;import elements.*;&lt;br /&gt;rule "Cuando se detecte fuego encendemos el extintor"&lt;br /&gt;when&lt;br /&gt;    Fire($room : room)&lt;br /&gt;    $sprinkler : Sprinkler( room == $room, on == false )&lt;br /&gt;then&lt;br /&gt; System.out.println("Fuego detectado");&lt;br /&gt;    modify( $sprinkler ) { setOn( true ) };&lt;br /&gt;    System.out.println("Encender el extintor para: " + $room.getName());&lt;br /&gt;end&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/3812840746656887122-1539447810409370818?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1539447810409370818/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2011/01/trasteando-con-drools-y-maven.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1539447810409370818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1539447810409370818'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2011/01/trasteando-con-drools-y-maven.html' title='Trasteando con drools y maven.'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6338091053592563664</id><published>2010-12-01T13:27:00.004+01:00</published><updated>2011-01-04T18:13:04.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cheats'/><title type='text'>Cheats para consultas SQL muy usadas</title><content type='html'>En esta página se pueden encontrar un listado por categorias de consultas SQL que normalmente tardas unas horas en crear para que cuando pasa el tiempo vuelvas a necesitarlas.&lt;br /&gt;&lt;a href="http://www.artfulsoftware.com/infotree/queries.php?&amp;bw=1280"&gt;http://www.artfulsoftware.com/infotree/queries.php?&amp;bw=1280&lt;/a&gt;&lt;br /&gt;Muy interesante la implementación de un procedimiento para la busqueda del camino más cercano de &lt;a href="http://en.wikipedia.org/wiki/Dijkstra's_algorithm"&gt;Dijkstra &lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6338091053592563664?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6338091053592563664/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2010/12/cheats-para-consultas-sql-muy-usadas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6338091053592563664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6338091053592563664'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2010/12/cheats-para-consultas-sql-muy-usadas.html' title='Cheats para consultas SQL muy usadas'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4186619606646444727</id><published>2010-11-03T21:02:00.002+01:00</published><updated>2010-11-03T21:21:23.332+01:00</updated><title type='text'>Volveré!</title><content type='html'>Hace bastante tiempo que no escribo en el blog. Dentro de unos días retomaré o intentaré escribir algunos posts. Y es que hace un año que cambié de empresa un proyecto del que creo que he dado más de lo que he recibido en todos los aspectos y que decidí darle fin. Afortunadamente siempre se abren nuevos caminos, se renuevan fuerzas y se emprenden nuevos viajes profesionales en los que por supuesto siempre quedan las experiencias, los grandes profesionales y los amigos que encontramos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4186619606646444727?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4186619606646444727/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2010/11/volvere.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4186619606646444727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4186619606646444727'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2010/11/volvere.html' title='Volveré!'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-3953713242826799831</id><published>2009-10-06T10:25:00.009+02:00</published><updated>2011-01-05T15:30:13.689+01:00</updated><title type='text'>Accediendo a Report Server de MS desde Java con Axis2</title><content type='html'>Con Axis2 el código se reduce y se hace mas legible:&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;import javax.activation.DataHandler;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.io.IOUtils;&lt;br /&gt;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.ExecutionHeader;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.ExecutionHeaderE;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.LoadReport;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.LoadReportResponse;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.Render;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceStub.RenderResponse;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt;  public String getReport() throws Exception{&lt;br /&gt;   ReportExecutionServiceStub re = new ReportExecutionServiceStub(null,"http://localhost/ReportServer/ReportExecution2005.asmx");&lt;br /&gt;   LoadReport loadReport76= new LoadReport();&lt;br /&gt;   &lt;br /&gt;   loadReport76.setReport("/ruta/al/report");&lt;br /&gt;   loadReport76.setHistoryID(null);&lt;br /&gt;   &lt;br /&gt;   LoadReportResponse LRepResp= re.loadReport(loadReport76, null);&lt;br /&gt;   String ID= LRepResp.getExecutionInfo().getExecutionID();&lt;br /&gt;   ExecutionHeaderE executionHeader73=new ExecutionHeaderE();&lt;br /&gt;   &lt;br /&gt;   ExecutionHeader param= new ExecutionHeader();&lt;br /&gt;   param.setExecutionID(ID);&lt;br /&gt;   executionHeader73.setExecutionHeader(param);&lt;br /&gt;   &lt;br /&gt;   Render render47= new Render();&lt;br /&gt;   render47.setDeviceInfo("&amp;lt;DeviceInfo&amp;gt;&amp;lt;Toolbar&amp;gt;False&amp;lt;/Toolbar&amp;gt;&amp;lt;/DeviceInfo&amp;gt;");&lt;br /&gt;   render47.setFormat("XML");&lt;br /&gt;   &lt;br /&gt;   RenderResponse respuesta=re.render(render47, executionHeader73, null);&lt;br /&gt;   DataHandler dh=respuesta.getResult();&lt;br /&gt;   &lt;br /&gt;   String xml = IOUtils.toString(dh.getInputStream());&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   return xml;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las clases necesarias para el cliente fueron generadas con el WTP de eclipse con el entorno Axis 2 configurado.&lt;br /&gt;Aqui se puede descargar el &lt;a href="http://sites.google.com/site/icarosite/archivos/ssrsExecutionService.jar?attredirects=0"&gt;ssrsExecutionService.jar generado por axis2&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-3953713242826799831?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3953713242826799831/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/10/accediendo-report-server-de-ms-desde_06.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3953713242826799831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3953713242826799831'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/10/accediendo-report-server-de-ms-desde_06.html' title='Accediendo a Report Server de MS desde Java con Axis2'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8856410091585052287</id><published>2009-10-05T11:55:00.013+02:00</published><updated>2009-10-05T20:38:29.511+02:00</updated><title type='text'>Accediendo a Report Server de MS desde Java con Axis</title><content type='html'>Después de pegarme durante horas con los servicios web de Reporting Services de MS y sufrir como siempre las exquisiteces de .NET he decidido publicar el código en java con axis(Autogenerado desde WTP de eclipse) con la modificación de las cabeceras SOAP necesarias para el servicio devuelva el informe.&lt;br /&gt;&lt;pre class="prettyprint" style="overflow:scroll;"&gt;&lt;br /&gt;import java.net.URL;&lt;br /&gt;&lt;br /&gt;import javax.xml.rpc.holders.ByteArrayHolder;&lt;br /&gt;import javax.xml.rpc.holders.StringHolder;&lt;br /&gt;import javax.xml.soap.SOAPElement;&lt;br /&gt;&lt;br /&gt;import org.apache.axis.AxisFault;&lt;br /&gt;import org.apache.axis.message.SOAPHeaderElement;&lt;br /&gt;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ExecutionInfo;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportingService2005SoapStub;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.holders.ArrayOfStringHolder;&lt;br /&gt;import com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.holders.ArrayOfWarningHolder;&lt;br /&gt;public class reportingClient {&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @param args&lt;br /&gt;  * @throws AxisFault &lt;br /&gt;  * @throws Exception &lt;br /&gt;  */&lt;br /&gt; public static void main(String[] args) throws AxisFault, Exception {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  &lt;br /&gt;  ReportingService2005SoapStub rs = new ReportingService2005SoapStub(new URL("http://localhost/ReportServer/ReportService2005.asmx"), null);&lt;br /&gt;  ReportExecutionServiceSoapStub re = new ReportExecutionServiceSoapStub(new URL("http://localhost/ReportServer/ReportExecution2005.asmx"),null);&lt;br /&gt;  &lt;br /&gt;  //ejecutamos el informe&lt;br /&gt;  ExecutionInfo EInfo=re.loadReport("/tu/ruta/al/report", null);&lt;br /&gt;  //¿necesitamos algun parametro o una credencial? esperemos que no.&lt;br /&gt;  System.out.println(EInfo.isParametersRequired());&lt;br /&gt;  System.out.println(EInfo.isCredentialsRequired());&lt;br /&gt;  &lt;br /&gt;  //load report and get executionID &lt;br /&gt;  //lo mas dificil ha sido meter las cabeceras para que MS pillara el id de ejecucion&lt;br /&gt;  //&lt;br /&gt;  SOAPHeaderElement header = new SOAPHeaderElement("http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices", "ExecutionHeader");&lt;br /&gt;  SOAPElement se = header.addChildElement("ExecutionID").addTextNode(EInfo.getExecutionID());&lt;br /&gt;  re.setHeader(header);&lt;br /&gt;  //fin set headers&lt;br /&gt;  &lt;br /&gt;  //parametros de render&lt;br /&gt;  ByteArrayHolder result = new ByteArrayHolder();&lt;br /&gt;  StringHolder encoding=new StringHolder();&lt;br /&gt;  StringHolder mimeType=new StringHolder();&lt;br /&gt;  StringHolder extension=new StringHolder();&lt;br /&gt;  ArrayOfWarningHolder warnings=new ArrayOfWarningHolder();&lt;br /&gt;  ArrayOfStringHolder streamIds=new ArrayOfStringHolder();&lt;br /&gt;  //fin de parametros para render&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  re.render("XML", "&lt;DeviceInfo&gt;&lt;Toolbar&gt;False&lt;/Toolbar&gt;&lt;/DeviceInfo&gt;", result, extension, mimeType, encoding, warnings, streamIds);&lt;br /&gt;  System.out.write(result.value);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que os sirva de algo y os ahorre tiempo.&lt;br /&gt;Justo después de lograr conectar encontré un &lt;a href="http://social.msdn.microsoft.com/forums/en-US/sqlreportingservices/thread/147f9d81-80ca-4dc6-a998-33468179ab4f/"&gt;ejemplo en el MSDN de MS&lt;/a&gt; bastante parecido al mio. También encontré varios ejemplos con variantes en cuanto a la &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/99a05a4b-a130-4e7e-a18b-c6754a1d9d4b"&gt;generación de las cabeceras&lt;/a&gt;.&lt;br /&gt;Por cierto que el resultado del informe viene con estos bytes al inicio&lt;span style="font-weight:bold;"&gt; ï»¿&lt;/span&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&amp;lt;Report... y que tiene que ver con la codificación del documento. Se puede leer mas info &lt;a href="http://en.wikipedia.org/wiki/Byte-order_mark"&gt;aquí&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8856410091585052287?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8856410091585052287/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/10/accediendo-report-server-de-ms-desde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8856410091585052287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8856410091585052287'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/10/accediendo-report-server-de-ms-desde.html' title='Accediendo a Report Server de MS desde Java con Axis'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1907466399077654303</id><published>2009-09-18T09:46:00.014+02:00</published><updated>2009-09-18T11:12:02.772+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='alfresco'/><title type='text'>Crear un cliente Web services para Alfresco 3.2 desde eclipse.</title><content type='html'>Después de pelearme con el API java de los servicios web de Alfresco he decidido publicar algunos ejemplos de clientes que he programado.&lt;br /&gt;Necesitamos descargar el API desde la dirección:&lt;br /&gt;&lt;a href="http://wiki.alfresco.com/wiki/Labs_3_Stable_download_files"&gt;http://wiki.alfresco.com/wiki/Labs_3_Stable_download_files&lt;/a&gt;&lt;br /&gt;Podemos descargar el SDK completo o simplemente las librerias de servicios web &lt;a href="http://process.alfresco.com/ccdl/?file=release/labs/build-1526/alfresco-web-service-client-3Stable.zip&amp;a=y&amp;s=n&amp;t=y"&gt;(Alfresco Web Service Client)&lt;/a&gt;&lt;br /&gt;Abrimos eclipse y creamos un nuevo proyecto java&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/SrNGdhiFJCI/AAAAAAAAAW8/DXq5IY-n2wk/s1600-h/nuevojavaproyecto.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/SrNGdhiFJCI/AAAAAAAAAW8/DXq5IY-n2wk/s320/nuevojavaproyecto.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382723452669338658" /&gt;&lt;/a&gt;&lt;br /&gt;Agregamos las librerias del SDK al proyecto con click derecho propiedades -&gt; Build Path-&gt; Add External JARs&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SrNHIzvWPZI/AAAAAAAAAXE/QnM0XapkP28/s1600-h/agregarlibreriaswebclient.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SrNHIzvWPZI/AAAAAAAAAXE/QnM0XapkP28/s320/agregarlibreriaswebclient.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382724196291198354" /&gt;&lt;/a&gt;&lt;br /&gt;Y las librerias de la carpeta dependencies:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SrNHfORpx1I/AAAAAAAAAXM/Hv8qE3c5DaM/s1600-h/dependencias.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 234px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SrNHfORpx1I/AAAAAAAAAXM/Hv8qE3c5DaM/s320/dependencias.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382724581371529042" /&gt;&lt;/a&gt;&lt;br /&gt;Si queremos programar más agusto podemos asociar el codigo fuente a alfresco-web-service-client.jar&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/SrNI08cQ0XI/AAAAAAAAAXU/S4aG4EQl9a8/s1600-h/asociarfuentes.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/SrNI08cQ0XI/AAAAAAAAAXU/S4aG4EQl9a8/s320/asociarfuentes.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5382726054052942194" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora es el momento de crear el cliente en este caso el cliente descargará un documento conociendo el uuid:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;import org.alfresco.webservice.types.Predicate;&lt;br /&gt;import org.alfresco.webservice.types.Reference;&lt;br /&gt;import org.alfresco.webservice.content.Content;&lt;br /&gt;import org.alfresco.webservice.content.ContentServiceSoapBindingStub;&lt;br /&gt;import org.alfresco.webservice.types.Store;&lt;br /&gt;import org.alfresco.webservice.util.AuthenticationUtils;&lt;br /&gt;import org.alfresco.webservice.util.Constants;&lt;br /&gt;import org.alfresco.webservice.util.ContentUtils;&lt;br /&gt;import org.alfresco.webservice.util.WebServiceFactory;&lt;br /&gt;&lt;br /&gt;public class Cliente {&lt;br /&gt;&lt;br /&gt; private static final String USERNAME = "admin";&lt;br /&gt; private static final String PASSWORD = "admin";&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @param args&lt;br /&gt;  */&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;&lt;br /&gt;  WebServiceFactory.setEndpointAddress("http://localhost/alfresco/api");&lt;br /&gt;  AuthenticationUtils.startSession(USERNAME, PASSWORD);&lt;br /&gt;  Store STORE = new Store(Constants.WORKSPACE_STORE, "SpacesStore");&lt;br /&gt;&lt;br /&gt;  // vamos a leer contenido del repositorio&lt;br /&gt;  ContentServiceSoapBindingStub contentService = WebServiceFactory&lt;br /&gt;    .getContentService();&lt;br /&gt;  Reference ref = new Reference();&lt;br /&gt;&lt;br /&gt;  ref.setStore(STORE);&lt;br /&gt;  ref.setUuid("51758149-66a4-4eb7-a500-15d5eed95030");&lt;br /&gt;  Content[] readResult = contentService.read(new Predicate(&lt;br /&gt;    new Reference[] { ref }, STORE, null), Constants.PROP_CONTENT);&lt;br /&gt;  Content content = readResult[0];&lt;br /&gt;&lt;br /&gt;  System.out.println("Contenido:");&lt;br /&gt;  System.out.println(ContentUtils.getContentAsString(content));&lt;br /&gt;&lt;br /&gt;  AuthenticationUtils.endSession();&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ejecutamos el cliente y nos devuelve el contenido del documento:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Contenido:&lt;br /&gt;%PDF-1.4&lt;br /&gt;%âãÏÓ&lt;br /&gt;15 0 obj&lt;br /&gt;........ etc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Uno de los problemas que tuve con el cliente fué que el timestamp de las cabeceras WS estaban desincronizadas con el servidor (Ubuntu en vmware server) así que reinicié el servidor y el cliente sincronice en ambos la hora y ya está.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;wsu:Timestamp xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; wsu:Id=&amp;quot;Timestamp-4347180&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;wsu:Created&amp;gt;2009-09-18T09:07:12.288Z&amp;lt;/wsu:Created&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;wsu:Expires&amp;gt;2009-09-18T09:12:12.288Z&amp;lt;/wsu:Expires&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/wsu:Timestamp&amp;gt;&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/3812840746656887122-1907466399077654303?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1907466399077654303/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/09/crear-un-cliente-web-services-para.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1907466399077654303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1907466399077654303'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/09/crear-un-cliente-web-services-para.html' title='Crear un cliente Web services para Alfresco 3.2 desde eclipse.'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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://1.bp.blogspot.com/_-kQftsinPB8/SrNGdhiFJCI/AAAAAAAAAW8/DXq5IY-n2wk/s72-c/nuevojavaproyecto.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-3081315467972343597</id><published>2009-09-12T17:41:00.002+02:00</published><updated>2009-09-12T17:46:40.366+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Tornado Web Server liberado bajo licencia Apache 2.0</title><content type='html'>Si os impresionan los números y sobre todo si es con python como es mi caso os gustará la liberación del servidor web que usan en friendfeed (Facebook) con unos test que dan miedo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chart.apis.google.com/chart?chxt=y&amp;chd=t%3A100%2C40%2C27%2C25%2C9&amp;chco=609bcc&amp;chm=t+8213%2C000000%2C0%2C0%2C11%7Ct+3353%2C000000%2C0%2C1%2C11%7Ct+2223%2C000000%2C0%2C2%2C11%7Ct+2066%2C000000%2C0%2C3%2C11%7Ct+785%2C000000%2C0%2C4%2C11&amp;chs=600x175&amp;cht=bhs&amp;chtt=Web+server+requests%2Fsec+%28AMD+Opteron%2C+2.4GHz%2C+4+cores%29&amp;chxl=0%3A%7CCherryPy+%28standalone%29%7Cweb.py+%28Apache%2Fmod_wsgi%29%7CDjango+%28Apache%2Fmod_wsgi%29%7CTornado+%281+single-threaded+frontend%29%7CTornado+%28nginx%3B+4+frontends%29%7C"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 175px;" src="http://chart.apis.google.com/chart?chxt=y&amp;chd=t%3A100%2C40%2C27%2C25%2C9&amp;chco=609bcc&amp;chm=t+8213%2C000000%2C0%2C0%2C11%7Ct+3353%2C000000%2C0%2C1%2C11%7Ct+2223%2C000000%2C0%2C2%2C11%7Ct+2066%2C000000%2C0%2C3%2C11%7Ct+785%2C000000%2C0%2C4%2C11&amp;chs=600x175&amp;cht=bhs&amp;chtt=Web+server+requests%2Fsec+%28AMD+Opteron%2C+2.4GHz%2C+4+cores%29&amp;chxl=0%3A%7CCherryPy+%28standalone%29%7Cweb.py+%28Apache%2Fmod_wsgi%29%7CDjango+%28Apache%2Fmod_wsgi%29%7CTornado+%281+single-threaded+frontend%29%7CTornado+%28nginx%3B+4+frontends%29%7C" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Esto tengo que probarlo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-3081315467972343597?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3081315467972343597/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/09/tornado-web-server-liberado-bajo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3081315467972343597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3081315467972343597'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/09/tornado-web-server-liberado-bajo.html' title='Tornado Web Server liberado bajo licencia Apache 2.0'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4211038237849003239</id><published>2009-09-01T08:47:00.006+02:00</published><updated>2009-09-01T09:10:46.969+02:00</updated><title type='text'>Mejorando la productividad con Eclipse</title><content type='html'>Después de leer el articulo &lt;a href="http://www.smashingmagazine.com/2009/08/28/how-to-develop-web-sites-on-linux/"&gt;"How to Develop Websites On Linux"&lt;/a&gt; de smashing magazine y descubrir la estupenda función code snipets se me ocurrió pensar que un IDE como eclipse tenia que tener algo así ya que tiene un sistema de plantillas y efectivamente podemos encontrarla en Window-&gt;Show View-&gt;Other abrimos General-&gt;Snippets y ya podremos ver una pestaña con la utilidad lo malo es que solo hay código jsp así que agregue algunos trocitos de código que me están resultando muy útiles para python:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;snippets&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;category filters=&amp;quot;org.python.pydev.pythonfile&amp;quot; id=&amp;quot;category_1251717399460&amp;quot; initial_state=&amp;quot;0&amp;quot; label=&amp;quot;Python&amp;quot; largeicon=&amp;quot;&amp;quot; smallicon=&amp;quot;&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[Python snippets]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;item category=&amp;quot;category_1251717399460&amp;quot; class=&amp;quot;&amp;quot; editorclass=&amp;quot;&amp;quot; id=&amp;quot;item_1251719680958&amp;quot; label=&amp;quot;def function:&amp;quot; largeicon=&amp;quot;&amp;quot; smallicon=&amp;quot;&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[define una funcion]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;content&amp;gt;&amp;lt;![CDATA[def ${MyFunction}(self,**kargs):&lt;br&gt;&lt;br /&gt;&amp;quot;&amp;quot;&amp;quot;doc string aqui&amp;quot;&amp;quot;&amp;quot;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;]]&amp;gt;&amp;lt;/content&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;variable default=&amp;quot;MyFunction&amp;quot; id=&amp;quot;name_1&amp;quot; name=&amp;quot;MyFunction&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description/&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/variable&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;item category=&amp;quot;category_1251717399460&amp;quot; class=&amp;quot;&amp;quot; editorclass=&amp;quot;&amp;quot; id=&amp;quot;item_1251719451602&amp;quot; label=&amp;quot;class ${name}:&amp;quot; largeicon=&amp;quot;&amp;quot; smallicon=&amp;quot;&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[nueva clase]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;content&amp;gt;&amp;lt;![CDATA[class ${name}:&lt;br&gt;&lt;br /&gt;&amp;quot;&amp;quot;&amp;quot;doc strings aqui&amp;quot;&amp;quot;&amp;quot;&lt;br&gt;&lt;br /&gt;def __init__(self):&lt;br&gt;&lt;br /&gt;&amp;quot;&amp;quot;&amp;quot;constructor&amp;quot;&amp;quot;&amp;quot;&lt;br&gt;&lt;br /&gt;]]&amp;gt;&amp;lt;/content&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;variable default=&amp;quot;myClass&amp;quot; id=&amp;quot;name_1&amp;quot; name=&amp;quot;name&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description/&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/variable&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;item category=&amp;quot;category_1251717399460&amp;quot; class=&amp;quot;&amp;quot; editorclass=&amp;quot;&amp;quot; id=&amp;quot;item_1251719063513&amp;quot; label=&amp;quot;[n for n in m]&amp;quot; largeicon=&amp;quot;&amp;quot; smallicon=&amp;quot;&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[array de resultados]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;content&amp;gt;&amp;lt;![CDATA[[n for n in m]]]&amp;gt;&amp;lt;/content&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;item category=&amp;quot;category_1251717399460&amp;quot; class=&amp;quot;&amp;quot; editorclass=&amp;quot;&amp;quot; id=&amp;quot;item_1251717431069&amp;quot; label=&amp;quot;for n in m&amp;quot; largeicon=&amp;quot;&amp;quot; smallicon=&amp;quot;&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[bucle for]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;content&amp;gt;&amp;lt;![CDATA[for ${n} in ${m}:&lt;br&gt;&lt;br /&gt;]]&amp;gt;&amp;lt;/content&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;variable default=&amp;quot;n&amp;quot; id=&amp;quot;name_1&amp;quot; name=&amp;quot;n&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description/&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/variable&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;variable default=&amp;quot;m&amp;quot; id=&amp;quot;name_2&amp;quot; name=&amp;quot;m&amp;quot;&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;description/&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/variable&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/category&amp;gt;&lt;br&gt;&lt;br /&gt;&amp;lt;/snippets&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aquí una captura:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SpzFoKO11LI/AAAAAAAAAWc/B7yv99uxHGM/s1600-h/snippets.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 308px; height: 320px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SpzFoKO11LI/AAAAAAAAAWc/B7yv99uxHGM/s320/snippets.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376389348905571506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lo que no pude encontrar en internet es alguna plantilla ya hecha para eclipse con código python ...&lt;br /&gt;Si usais django habitualmente podeis encontrar grandes cantidades de código &lt;a href="http://www.djangosnippets.org/"&gt;aquí&lt;/a&gt;&lt;br /&gt;Espero que a alguien le sea útil de momento a mi me está resultando de lo mas cómodo simplemente con el código mínimo de creación de una clase, una funcion y un par de bucles que uso habitualmente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4211038237849003239?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4211038237849003239/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/09/mejorando-la-productividad-con-eclipse.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4211038237849003239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4211038237849003239'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/09/mejorando-la-productividad-con-eclipse.html' title='Mejorando la productividad con Eclipse'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/SpzFoKO11LI/AAAAAAAAAWc/B7yv99uxHGM/s72-c/snippets.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-2759302256703509057</id><published>2009-07-24T14:29:00.005+02:00</published><updated>2009-09-07T13:22:15.523+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Me ha dado por php</title><content type='html'>Nunca pensé que fuera tan sencillo crear un blog con php y cakephp. Lo que más me sorprende es que el coste total ha sido 0€.&lt;br /&gt;El resultado se podia ver en &lt;a href="#"&gt;http://montxoguerrero.no-ip.org/&lt;/a&gt;.&lt;br /&gt;Poco a poco voy dotando de funcionalidades al sitio al tiempo que aprendo php y uso un estupendo framework cakephp.&lt;br /&gt;Entre las funcionalidades que quiero implementar están:&lt;br /&gt;Una galeria de imagenes.&lt;br /&gt;Sistema de comentarios.&lt;br /&gt;Gestión de videos&lt;br /&gt;&lt;br /&gt;Actualización:&lt;br /&gt;pronto migrare a un hosting serio esta pequeña app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2759302256703509057?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2759302256703509057/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/07/me-ha-dado-por-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2759302256703509057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2759302256703509057'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/07/me-ha-dado-por-php.html' title='Me ha dado por php'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4555351078507903174</id><published>2009-05-29T11:10:00.004+02:00</published><updated>2009-05-29T11:27:44.388+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chromium'/><title type='text'>Chromium en ubuntu linux II</title><content type='html'>Hace algún tiempo publiqué un post sobre la instalacion de chromium en linux con el port de &lt;a href="http://www.codeweavers.com/services/ports/"&gt;codeweavers&lt;/a&gt;.&lt;br /&gt;Desde &lt;a href="https://launchpad.net/~chromium-daily/+archive/ppa"&gt;launchpad &lt;/a&gt;están realizando compilaciones diarias de la version open source de este navegador y aunque no es 100% funcional a nivel básico funciona extremandamente rápido.&lt;br /&gt;Simplemente agregando los repositorios a vuestra Ubuntu podreis descargar el paquete y probarlo.&lt;br /&gt;En otras distribuciones basadas en el sistema de paquetes de Debian no lo he probado pero supongo que se debe instalar sin problemas ya que no tiene excesivas dependencias&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4555351078507903174?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4555351078507903174/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/05/chromium-en-ubuntu-linux-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4555351078507903174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4555351078507903174'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/05/chromium-en-ubuntu-linux-ii.html' title='Chromium en ubuntu linux II'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4307588144074134529</id><published>2009-05-20T09:26:00.007+02:00</published><updated>2009-05-21T11:23:48.040+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Usando Buildout con Plone y Squid en Windows</title><content type='html'>La instalación de Plone en Windows tiene una serie de peculiaridades sobre todo para instalar Squid ya que la receta para squid de plone descarga y compila el producto y en windows salvo que tengas el entorno mingw y las utilidades minsys perfectamente configuradas dará un error en la instalación.&lt;br /&gt;En este punto simplemente me descargué el paquete binario de squid para windows y agregué en el buildout la sección de la instancia evitando el bloque build:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;[squid-instance]&lt;br /&gt;recipe = plone.recipe.squid:instance&lt;br /&gt;daemon = c:/squid/sbin/squid.exe&lt;br /&gt;bind = 3128&lt;br /&gt;backends = mydomain.com:127.0.0.1:8080&lt;br /&gt;cache-size = 1000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En la instancia Plone se generan los directorios \plone\parts\squid-instance donde reside la configuración de squid squid.conf y \plone\var\squidstorage donde estará el cache en disco que hay que inicializar con:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;c:\sbin\squid.exe -z -f \plone\parts\squid-instance\squid.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para iniciar squid la receta crea un shell script que reside en \plone\bin denominado squid-instance por lo que para Windows crearemos su analogo en bat&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;@echo off&lt;br /&gt;c:/squid/sbin/squid.exe -d10 -f \plone\parts\squid-instance\squid.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En mi caso particular -d10 es para realizar un debug sobre el cache pero en caso de estar en producción se debe quitar el parametro.&lt;br /&gt;Algunas pruebas que he realizado con ab muestran los siguientes resultados:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://spreadsheets.google.com/pub?key=rtw56m6pUigdDlfJsZDd5cA&amp;oid=1&amp;output=image" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4307588144074134529?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4307588144074134529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/05/usando-buildout-con-plone-y-squid-en.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4307588144074134529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4307588144074134529'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/05/usando-buildout-con-plone-y-squid-en.html' title='Usando Buildout con Plone y Squid en Windows'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4339241742607096681</id><published>2009-05-06T16:22:00.007+02:00</published><updated>2009-05-20T09:26:21.523+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze.bfg'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Repoze bfg sin dependencias de C</title><content type='html'>La versión en desarrollo en svn svn co http://svn.repoze.org/repoze.bfg/trunk repoze.bfg actualmente la 0.8 de este joven framework se ha reescrito para eliminiar la dependencia que tenia con lxml y que requeria de la compilacion de esta libreria. Ahora es posible instalar este framework en google app engine o en sistemas Windows sin tener que instalar visual estudio (La versión con la que esta compilado python 2.4 para windows y aún me pregunto por que no han portado a gcc o mingw32).&lt;br /&gt;Para instalar en Windows hacemos lo siguiente:&lt;br /&gt;- Creamos el entorno virtual: virtualenv --no-site-packages fbgenv&lt;br /&gt;- Descargamos la versión de desarrollo: svn co http://svn.repoze.org/repoze.bfg/trunk repoze.bfg&lt;br /&gt;- Creamos el egg: cd repoze.bfg&lt;br /&gt;                  python setup.py bdist_egg &lt;br /&gt;- Instalamos: Scripts\easy_install.exe repoze.bfg\dist\repoze.bfg-0.8dev-py2.4.egg&lt;br /&gt;&lt;br /&gt;y voila ya podemos crear nuestras aplicaciones web siguiendo el manual &lt;a href="http://static.repoze.org/bfgdocs/narr/project.html"&gt;http://static.repoze.org/bfgdocs/narr/project.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4339241742607096681?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4339241742607096681/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/05/repoze-bfg-sin-dependencias-de-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4339241742607096681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4339241742607096681'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/05/repoze-bfg-sin-dependencias-de-c.html' title='Repoze bfg sin dependencias de C'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4157117254051422787</id><published>2009-04-22T14:05:00.003+02:00</published><updated>2009-09-02T11:57:17.490+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Firebug para Explorer</title><content type='html'>Existe una herramienta parecida a firebug de firefox pero para explorer y creada por la compañia de redmon que puede ser descargada desde su pagina web.&lt;br /&gt;El enlace es &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en"&gt;este &lt;/a&gt;&lt;br /&gt;Me ha resultado tedioso lidiar con las herramientas de pago que existen en el mercado como ie dom inspector así que espero que os sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4157117254051422787?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4157117254051422787/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/04/firebug-para-explorer.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4157117254051422787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4157117254051422787'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/04/firebug-para-explorer.html' title='Firebug para Explorer'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4515656567490265144</id><published>2009-04-01T10:24:00.006+02:00</published><updated>2009-09-02T11:56:28.331+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><title type='text'>Testear Mensajes SOAP con ZSI</title><content type='html'>Con ZSI es bastante arduo realizar un debug del mensaje soap que estas enviando al servidor. Hay varias formas de ver que envias al servidor una de ellas es pasando como parametro a la construcción del servicio tracefile=sys.stdout, otra de ellas importando directamente httplib:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;import httplib&lt;br /&gt;httplib.HTTPConnection.debuglevel = 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y por último si no queremos enviar ningun mensaje al servidor y simplemente ver el mensaje soap que nos genera podemos hacerlo con SoapWriter. Una vez generados los scripts mediante wsdl2py podemos ver los mensajes de envio y sus respectivas declaraciones de tipos en el typecode con ellos podemos generar el xml que enviará al servicio. Un ejemplo sencillo seria para la función queryAssociated del api de servicios web de alfresco:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;from ZSI import *&lt;br /&gt;import sys&lt;br /&gt;from repository_service_client import *&lt;br /&gt;def testAssociationType():&lt;br /&gt;  peticion = queryAssociatedRequest()&lt;br /&gt;  peticion.node = www_alfresco_org_ws_model_content_1_0.Reference_('node').pyclass()&lt;br /&gt;  peticion.node.store = www_alfresco_org_ws_model_content_1_0.Store_('store').pyclass()&lt;br /&gt;  peticion.node.store.address = "SpacesStore"&lt;br /&gt;  peticion.node.store.scheme = "workspace"&lt;br /&gt;  peticion.node.uuid="85fe5c3a-0267-11de-b91a-85a7284b8774"&lt;br /&gt;  peticion.association = www_alfresco_org_ws_service_repository_1_0.Association_('association').pyclass()&lt;br /&gt;  peticion.association.associationType = "{http://www.alfresco.org/model/content/1.0}contains"&lt;br /&gt;  peticion.association.direction =  ""&lt;br /&gt;  sw = SoapWriter()&lt;br /&gt;  print sw.serialize(peticion,peticion.typecode)&lt;br /&gt;  &lt;br /&gt;if __name__=="__main__":&lt;br /&gt;  testAssociationType()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El resultado sería:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"&lt;br /&gt; xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" &lt;br /&gt; xmlns:ZSI="http://www.zolera.com/schemas/ZSI/"&lt;br /&gt; xmlns:xsd="http://www.w3.org/2001/XMLSchema" &lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;&lt;br /&gt; &amp;lt;SOAP-ENV:Header&amp;gt;&amp;lt;/SOAP-ENV:Header&amp;gt;&lt;br /&gt; &amp;lt;SOAP-ENV:Body xmlns:ns1="http://www.alfresco.org/ws/service/repository/1.0"&amp;gt;&lt;br /&gt; &amp;lt;ns1:queryAssociated&amp;gt;&lt;br /&gt; &amp;lt;ns1:node xmlns:ns2="http://www.alfresco.org/ws/model/content/1.0"&lt;br /&gt;  xsi:type="ns2:Reference"&amp;gt;&lt;br /&gt;  &amp;lt;ns2:store xsi:type="ns2:Store"&amp;gt;&lt;br /&gt;   &amp;lt;ns2:scheme&amp;gt;workspace&amp;lt;/ns2:scheme&amp;gt;&lt;br /&gt;   &amp;lt;ns2:address&amp;gt;SpacesStore&amp;lt;/ns2:address&amp;gt;&lt;br /&gt;  &amp;lt;/ns2:store&amp;gt;&lt;br /&gt;  &amp;lt;ns2:uuid&amp;gt;85fe5c3a-0267-11de-b91a-85a7284b8774&lt;br /&gt;  &amp;lt;/ns2:uuid&amp;gt;&lt;br /&gt; &amp;lt;/ns1:node&amp;gt;&lt;br /&gt; &amp;lt;ns1:association xsi:type="ns1:Association"&amp;gt;&lt;br /&gt;  &amp;lt;ns1:associationType&amp;gt;&lt;br /&gt;   {http://www.alfresco.org/model/content/1.0}contains&lt;br /&gt;  &amp;lt;/ns1:associationType&amp;gt;&lt;br /&gt;  &amp;lt;ns1:direction&amp;gt;&amp;lt;/ns1:direction&amp;gt;&lt;br /&gt; &amp;lt;/ns1:association&amp;gt;&lt;br /&gt; &amp;lt;/ns1:queryAssociated&amp;gt;&lt;br /&gt; &amp;lt;/SOAP-ENV:Body&amp;gt;&lt;br /&gt;&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Simplemente creando una instancia de SoapWriter y serializando el mensaje obtenemos el xml que será enviando.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;sw = SoapWriter()&lt;br /&gt;print sw.serialize(peticion,peticion.typecode)&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/3812840746656887122-4515656567490265144?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4515656567490265144/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/04/testear-mensajes-soap-con-zsi.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4515656567490265144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4515656567490265144'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/04/testear-mensajes-soap-con-zsi.html' title='Testear Mensajes SOAP con ZSI'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2606299902238339296</id><published>2009-03-26T12:25:00.006+01:00</published><updated>2009-06-05T10:34:47.606+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alfresco'/><title type='text'>Instalar Alfresco 3 labs stable en ubuntu server LTS (Versión rápida)</title><content type='html'>El primer paso es instalar mysql:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;sudo apt-get install mysql-server-5.0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Instalamos java la versión 5:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;sudo apt-get install sun-java5*&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Descargamos Alfresco-Labs-3Stable-Linux-x86-Install:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;wget http://us.dl.alfresco.com/release/labs/build-1526/Alfresco-Labs-3Stable-Linux-x86-Install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Instalamos el paquete de alfresco:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;sudo cp Alfresco-Labs-3Stable-Linux-x86-Install /opt&lt;br /&gt;cd /opt&lt;br /&gt;sudo su&lt;br /&gt;chmod +x Alfresco-Labs-3Stable-Linux-x86-Install&lt;br /&gt;./Alfresco-Labs-3Stable-Linux-x86-Install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configuramos mysql:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd /opt/Alfresco/extras/databases/mysql/&lt;br /&gt;mysql -u root -p &lt; db_setup.sql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configuramos el script de inicio de alfresco:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd /opt/Alfresco&lt;br /&gt;vim alfresco.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;# Start or stop Alfresco server&lt;br /&gt;# Set the following to where Tomcat is installed&lt;br /&gt;ALF_HOME=/opt/Alfresco&lt;br /&gt;cd "$ALF_HOME"&lt;br /&gt;APPSERVER="${ALF_HOME}/tomcat"&lt;br /&gt;export JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun"&lt;br /&gt;# Set any default JVM values&lt;br /&gt;export JAVA_OPTS='-Xms128m -Xmx512m -XX:MaxPermSize=128m -server'&lt;br /&gt;# Following only needed for Sun JVMs before to 1.5 update 8&lt;br /&gt;export JAVA_OPTS="${JAVA_OPTS} -XX:CompileCommand=exclude,org/apache/lucene/index/IndexReader\$1,doBody -XX:CompileCommand=exclude,org/alfresco/repo/search/impl/lucene/index/IndexInfo\$Merger,mergeIndexes -XX:CompileCommand=exclude,org/alfresco/repo/search/impl/lucene/index/IndexInfo\$Merger,mergeDeletions"&lt;br /&gt;#&lt;br /&gt;if [ "$1" = "start" ]; then&lt;br /&gt;  "${APPSERVER}/bin/startup.sh"&lt;br /&gt;#  if [ -r ./virtual_start.sh ]; then&lt;br /&gt;#    sh ./virtual_start.sh&lt;br /&gt;#  fi&lt;br /&gt;#  if [ -r "$ALF_HOME"/start_oo.sh ]; then&lt;br /&gt;#    sh "$ALF_HOME"/start_oo.sh&lt;br /&gt;#  fi&lt;br /&gt;elif [ "$1" = "stop" ]; then&lt;br /&gt;  "${APPSERVER}/bin/shutdown.sh"&lt;br /&gt;#  if [ -r ./virtual_start.sh ]; then&lt;br /&gt;#    sh ./virtual_stop.sh&lt;br /&gt;#  fi&lt;br /&gt;#  if [ -r "$ALF_HOME"/start_oo.sh ]; then&lt;br /&gt;#    killall soffice.bin&lt;br /&gt;#  fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Configuramos el fichero /opt/Alfresco/tomcat/shared/classes/alfresco/extension/custom-repository.properties:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;###############################&lt;br /&gt;## Common Alfresco Properties #&lt;br /&gt;###############################&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Sample custom content and index data location&lt;br /&gt;#&lt;br /&gt;dir.root=./alf_data&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Sample database connection properties&lt;br /&gt;#&lt;br /&gt;db.username=alfresco&lt;br /&gt;db.password=alfresco&lt;br /&gt;#db.pool.initial=10&lt;br /&gt;#db.pool.max=100&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Sample external executable locations&lt;br /&gt;#&lt;br /&gt;#ooo.exe=/opt/openoffice/program/soffice&lt;br /&gt;#ooo.user=${dir.root}/oouser&lt;br /&gt;#img.root=/srv/alfresco/ImageMagick&lt;br /&gt;#swf.exe=/srv/alfresco/bin/pdf2swf&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Sample index tracking frequency&lt;br /&gt;#&lt;br /&gt;#index.tracking.cronExpression=0/5 * * * * ?&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Property to control whether schema updates are performed automatically.&lt;br /&gt;# Updates must be enabled during upgrades as, apart from the static upgrade scripts,&lt;br /&gt;# there are also auto-generated update scripts that will need to be executed.  After&lt;br /&gt;# upgrading to a new version, this can be disabled.&lt;br /&gt;#&lt;br /&gt;#db.schema.update=true&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Derby connection&lt;br /&gt;#&lt;br /&gt;#db.driver=org.apache.derby.jdbc.EmbeddedDriver&lt;br /&gt;#db.url=jdbc:derby:alf_data/derby_data/alfresco;create=true&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# HSQL connection&lt;br /&gt;#&lt;br /&gt;#db.driver=org.hsqldb.jdbcDriver&lt;br /&gt;#db.url=jdbc:hsqldb:file:alf_data/hsql_data/alfresco;ifexists=true;shutdown=true;&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# MySQL connection (This is default and requires mysql-connector-java-5.0.3-bin.jar, which ships with the Alfresco server)&lt;br /&gt;#&lt;br /&gt;db.driver=org.gjt.mm.mysql.Driver&lt;br /&gt;db.url=jdbc:mysql://localhost/alfresco&lt;br /&gt;# PostgreSQL connection (requires postgresql-8.2-504.jdbc3.jar or equivalent)&lt;br /&gt;#&lt;br /&gt;#db.driver=org.postgresql.Driver&lt;br /&gt;#db.url=jdbc:postgresql://localhost:5432/alfresco&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y el fichero /opt/Alfresco/tomcat/shared/classes/alfresco/extension/custom-hibernate-dialect.properties&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#&lt;br /&gt;# Sample Hibernate configuration for changing Database dialect&lt;br /&gt;# For a full list: http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#configuration-optional-dialects&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Derby dialect&lt;br /&gt;#&lt;br /&gt;#hibernate.dialect=org.hibernate.dialect.DerbyDialect&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# HSQL dialect&lt;br /&gt;#&lt;br /&gt;#hibernate.dialect=org.hibernate.dialect.HSQLDialect&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# MySQL dialect (default)&lt;br /&gt;#&lt;br /&gt;hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# PostgreSQL dialect&lt;br /&gt;#&lt;br /&gt;#hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect&lt;br /&gt;#hibernate.query.substitutions=true TRUE, false FALSE&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Iniciamos el servidor:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;./alfresco.sh start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Los siguientes pasos serian instalar imagemagick, openoffice xvfb y demás utilidades y configurar el inicio del sistema.&lt;br /&gt;Podeis ir a la guia oficial en el wiki de alfresco &lt;a href="http://wiki.alfresco.com/wiki/Installing_Alfresco_Lab_3_Stable_on_Ubuntu_8.10"&gt;http://wiki.alfresco.com/wiki/Installing_Alfresco_Lab_3_Stable_on_Ubuntu_8.10&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2606299902238339296?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2606299902238339296/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/03/instalar-alfresco-3-labs-stable-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2606299902238339296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2606299902238339296'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/03/instalar-alfresco-3-labs-stable-en.html' title='Instalar Alfresco 3 labs stable en ubuntu server LTS (Versión rápida)'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-5184019041412825486</id><published>2009-03-26T10:23:00.002+01:00</published><updated>2009-03-26T10:34:19.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyAlfresco'/><title type='text'>pyAlfresco funciona también  en la version 3 labs</title><content type='html'>Unas pruebas preliminares sobre esta versión de alfresco me confirman que funciona sobre la 3 labs lo que alarga la vida de este experimento personal.&lt;br /&gt;Alfresco también tiene una interesante api restful que me parece más sencilla de mantener y además se puede usar con simple javascript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-5184019041412825486?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/5184019041412825486/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/03/pyalfresco-funciona-tambien-en-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/5184019041412825486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/5184019041412825486'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/03/pyalfresco-funciona-tambien-en-la.html' title='pyAlfresco funciona también  en la version 3 labs'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-3361682853776094797</id><published>2009-03-11T12:27:00.005+01:00</published><updated>2009-03-11T16:57:55.104+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyAlfresco'/><title type='text'>pyAlfresco Alpha API released</title><content type='html'>Finalmente he subido el código a launchpad de las librerias &lt;a href="https://launchpad.net/pyalfresco"&gt;pyAlfresco&lt;/a&gt;. Tiene una serie de funcionalidades básicas y seguramente muchos bugs xD pero está en fase alfa y espero poder tener tiempo para depurar los fallos que vayan surgiendo.&lt;br /&gt;Podeis instalarlo via easy_install con la siguiente &lt;a href="http://launchpad.net/pyalfresco/trunk/0.1alpha/+download/pyAlfresco-0.1.Alpha-py2.4.egg"&gt;dirección&lt;/a&gt;.&lt;br /&gt;Si alguien quiere unirse al proyecto para desarrollar las funciones que faltan por implementar que deje su mensaje.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-3361682853776094797?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3361682853776094797/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/03/pyalfresco-alpha-api-released.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3361682853776094797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3361682853776094797'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/03/pyalfresco-alpha-api-released.html' title='pyAlfresco Alpha API released'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2043717685396779557</id><published>2009-03-10T19:43:00.003+01:00</published><updated>2009-03-10T20:17:32.370+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='alfresco'/><title type='text'>Librerias python para la API de alfresco</title><content type='html'>Actualmente estoy trabajando en unas librerías para el uso del api web services que ofrece Alfresco. En esta primera versión he usado las librerías ZSI para generar el código python necesario para conectar con los servicios web y algunas clases personalizadas para generar las cabeceras necesarias.&lt;br /&gt;Seguramente librerías como Suds o soaplib se encuentran en un mejor estado de desarrollo ya que desde diciembre del 2007 el proyecto python web services se encuentra aparentemente parado pero por requerimientos de la versión de python la 2.3 es imposible usar elementos clave de suds como los decoradores propios de python = &gt; 2.4.&lt;br /&gt;Otra posibilidad seria usar SOAPpy pero el abandono de la librería y su integración con wstools de ZSI hizo que la descartara.&lt;br /&gt;De momento he integrado las funciones mínimas para subir documentos, crear, borrar y editar propiedades de documentos, carpetas o cualquier elemento propio de alfresco o clases personalizadas.&lt;br /&gt;Intentaré subir un egg y la documentación para su uso en muy poco tiempo con licencia GPL o similar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2043717685396779557?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2043717685396779557/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/03/librerias-python-para-la-api-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2043717685396779557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2043717685396779557'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/03/librerias-python-para-la-api-de.html' title='Librerias python para la API de alfresco'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6779664229661780433</id><published>2009-02-10T16:54:00.009+01:00</published><updated>2009-02-10T23:00:45.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Consejos básicos de migración de Plone 2.1 a Plone 3</title><content type='html'>Ahora estoy inmerso en un proceso de migración de portales Plone de su versión 2.1 a su última versión la 3.2. Los pasos necesarios están estrictamente explicados en la página &lt;a href="http://plone.org/documentation/manual/upgrade-guide"&gt;oficial&lt;/a&gt;, salvo unos pequeños tips:&lt;br /&gt;El salto entre la versión 2.1 y la 3 es muy largo por ello es necesario realizar un paso intermedio de migración a la 2.5.&lt;br /&gt;Lo más importante es migrar los datos y luego ir migrando las plantillas y productos personalizados para adaptarlos a la nueva infraestructura de vistas, etc.&lt;br /&gt;Un fallo común en la exportación/importación de los datos desde plone 2.1 a 2.5 es que le faltan algunos mimetypes por ello es necesario agregarlos a la herramienta mimetypes_registry&lt;br /&gt;estos son text/x-web-markdown, text/x-web-textile, text/x-web-intelligent tal como explican en &lt;a href="http://www.sbtechsolutions.biz/upgrading-plone-from-version-2-to-version-3"&gt;esta url&lt;/a&gt;.&lt;br /&gt;Algunos productos pueden "romper" el sitio como FCKEditor si se migra y después no se instala el síntoma más común es tener el error "_v_transform AttributeError". Por suerte existe el editor para la versión 3.&lt;br /&gt;Si no tienes la suerte de tener un producto para la versión a migrar es aconsejable borrar todas las instancias antes de realizar la exportación. Por ejemplo PloneJUpload no tiene versión para Plone 3 aunque existen alternativas en flash como PloneFlashUpload (En fase beta y no la última versión de Plone 3).&lt;br /&gt;Por último las nuevas características de edición de plone 3 como las KSS pueden ser ignoradas en algunos casos de personalización de plantillas de administración.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6779664229661780433?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6779664229661780433/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/02/consejos-basicos-de-migracion-de-plone.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6779664229661780433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6779664229661780433'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/02/consejos-basicos-de-migracion-de-plone.html' title='Consejos básicos de migración de Plone 2.1 a Plone 3'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1086458621763295663</id><published>2009-02-06T10:58:00.005+01:00</published><updated>2009-02-08T10:54:25.699+01:00</updated><title type='text'>Un clon de windows GPL en fase alfa</title><content type='html'>Para los usuarios de windows reacios a cambiar de sistema operativo existe una alternativa ("en fase beta eso si") bastante lograda llamada &lt;a href="http://www.reactos.org/"&gt;Reactos&lt;/a&gt;.&lt;br /&gt;Este sistema se creó desde cero construyendose en base a los sistemas NT pero con tecnologías GPL.&lt;br /&gt;Según la definición que hacen en la propia página:&lt;br /&gt;&lt;blockquote&gt;ReactOS es un sistema operativo Libre y de Código Abierto basado en el diseño de la arquitectura de Windows NT, incluyendo soporte para los drivers y aplicaciones existentes y una alternativa al sistema operativo dominante entre usuarios domésticos y servidores.&lt;/blockquote&gt;.&lt;br /&gt;La instalación sobre vmware server no lleva mas de 5 minutos y lo más sorprendente es el arranque que tarda entre 6 y 10 segundos en levantar el sistema.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-kQftsinPB8/SYwMoeF2azI/AAAAAAAAAS4/oCeCCz6ny-4/s1600-h/reactosenaccion.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="http://2.bp.blogspot.com/_-kQftsinPB8/SYwMoeF2azI/AAAAAAAAAS4/oCeCCz6ny-4/s320/reactosenaccion.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5299624750920133426" /&gt;&lt;/a&gt;&lt;br /&gt;De momento el sistema tiene un soporte básico en el que no pude hacer funcionar entre otras cosas la red pero el desarrollo está en fase alfa y como aseguran en su página web &lt;blockquote&gt;ReactOS 0.3.8 se encuentra bajo desarrollo (fase alpha) y no está preparado para uso diario. &lt;/blockquote&gt;&lt;br /&gt;Viendo el panorama actual de otros sistemas operativos puede llegar a ser una alternativa real y sobre todo &lt;a href="http://www.gnu.org/licenses/licenses.es.html"&gt;libre&lt;/a&gt; a las plataformas de redmon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1086458621763295663?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1086458621763295663/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/02/un-clon-de-windows-gpl-en-fase-alfa.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1086458621763295663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1086458621763295663'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/02/un-clon-de-windows-gpl-en-fase-alfa.html' title='Un clon de windows GPL en fase alfa'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/SYwMoeF2azI/AAAAAAAAAS4/oCeCCz6ny-4/s72-c/reactosenaccion.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-4267308486485662246</id><published>2009-01-30T08:48:00.005+01:00</published><updated>2009-02-03T10:25:00.144+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope'/><title type='text'>Increible trabajo de limpieza de las dependencias de zope</title><content type='html'>Leo en &lt;a href="http://faassen.n--tree.net/blog/view/weblog/2009/01/29/0"&gt;Python Secret Weblog&lt;/a&gt; que zope ha sido reestructurado pasando de esto:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SYKxXUFCT_I/AAAAAAAAASo/18g6jSbnFmc/s1600-h/zope.app.container-before.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 82px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SYKxXUFCT_I/AAAAAAAAASo/18g6jSbnFmc/s320/zope.app.container-before.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5296991125826064370" /&gt;&lt;/a&gt;&lt;br /&gt;A esto:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SYKxiHVnA5I/AAAAAAAAASw/_KVUphmoUKM/s1600-h/zope.container-after.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 91px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SYKxiHVnA5I/AAAAAAAAASw/_KVUphmoUKM/s320/zope.container-after.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5296991311384478610" /&gt;&lt;/a&gt;&lt;br /&gt;Increible el trabajo de simplificación de la estructura de dependencias que ha sustituido zope.app.container por zope.container contribuyendo considerablemente a la mejora de zope 3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4267308486485662246?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4267308486485662246/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/increible-trabajo-de-limpieza-de-las.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4267308486485662246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4267308486485662246'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/increible-trabajo-de-limpieza-de-las.html' title='Increible trabajo de limpieza de las dependencias de zope'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/SYKxXUFCT_I/AAAAAAAAASo/18g6jSbnFmc/s72-c/zope.app.container-before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-2446277899455121540</id><published>2009-01-28T09:36:00.004+01:00</published><updated>2009-09-02T11:58:14.932+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope'/><title type='text'>Nueva versión de RelStorage 1.1.2</title><content type='html'>Shane Hathaway ha publicado en su blog un artículo sobre la nueva versión de este potente software que permite guardar los datos, que zope normalmente guarda en zodb, en una base de datos relacional.&lt;br /&gt;Actualmente soporta Postgres, Mysql y Oracle. Se puede descargar mediante las build_tools de python desde la página de &lt;a href="http://pypi.python.org/pypi/RelStorage/1.1.2"&gt;pypi&lt;/a&gt;.&lt;br /&gt;Entre las mejoras incluidas en esta versión se encuentra la actualización distribuida de los caches usando las opciones de poll-interval y cache-servers conjuntamente lo que permite que un usuario vea instantaneamente los cambios introducidos por el servidor. Además de la corrección de un fallo en la compactación de la base de datos se ha incluido una nueva opción llamada pack-dry-run que permite previsualizar los objetos que se borrarán con la compactación.&lt;br /&gt;Para más información se puede visitar la página web del &lt;a href="http://shane.willowrise.com/archives/relstorage-112/"&gt;autor&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2446277899455121540?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2446277899455121540/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/nueva-version-de-relstorage-112.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2446277899455121540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2446277899455121540'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/nueva-version-de-relstorage-112.html' title='Nueva versión de RelStorage 1.1.2'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-479495070915714193</id><published>2009-01-24T12:31:00.010+01:00</published><updated>2009-05-06T16:52:30.977+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze.bfg'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Repoze.bfg con mod_wsgi</title><content type='html'>Siguiendo la linea de post sobre repoze.bfg expondré la configuración básica para publicar una aplicación mínima sobre mod_wsgi de Apache.&lt;br /&gt;Lo primero es tener correctamente &lt;a href="http://static.repoze.org/bfgdocs/narr/install.html"&gt;instalado repoze.bfg&lt;/a&gt; tal como indican en la página oficial del framework. También crearemos una &lt;a href="http://static.repoze.org/bfgdocs/narr/project.html"&gt;aplicación básica &lt;/a&gt;tal como explican en su página.&lt;br /&gt;Tendríamos el siguiente listado de directorios en el virtualenv creado anteriormente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;repozebfg&lt;br /&gt; -bin&lt;br /&gt; -lib&lt;br /&gt; -include&lt;br /&gt; -MyProyect&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se crea una carpeta etc donde estará el fichero app.wsgi que servirá para la configuración wsgi de la aplicación.&lt;br /&gt;El contenido del fichero es el siguiente:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;from myproyect.run import *&lt;br /&gt;application = app({'reload_templates':'true',&lt;br /&gt;                   'debug_authorization':'false',&lt;br /&gt;                   'debug_notfound':'false'})&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora le toca el turno a apache:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;NameVirtualHost *&lt;br /&gt;WSGIPythonHome /home/icaro/repozebfg/&lt;br /&gt;WSGIPythonPath /home/icaro/repozebfg/lib/python2.4:\&lt;br /&gt;               /home/icaro/repozebfg/lib/python2.4/site-packages/&lt;br /&gt;&lt;br /&gt;&amp;lt;virtualhost&amp;gt;&lt;br /&gt; ServerAdmin webmaster@localhost&lt;br /&gt;      &lt;br /&gt; DocumentRoot /home/icaro/www&lt;br /&gt;&lt;br /&gt; Alias /myapp/static \&lt;br /&gt;       /home/icaro/repozebfg/MyProyect/myproyect/templates/static/&lt;br /&gt; WSGIScriptAlias /myapp /home/icaro/repozebfg/etc/app.wsgi&lt;br /&gt; &amp;lt;directory home/icaro/www&amp;gt;&lt;br /&gt;   Options Indexes FollowSymLinks MultiViews&lt;br /&gt;   AllowOverride None&lt;br /&gt;   Order allow,deny&lt;br /&gt;   allow from all&lt;br /&gt; &amp;lt;/directory&amp;gt;&lt;br /&gt; ErrorLog /var/log/apache2/error.log&lt;br /&gt;&lt;br /&gt; # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt; # alert, emerg.&lt;br /&gt; LogLevel warn&lt;br /&gt; CustomLog /var/log/apache2/access.log combined&lt;br /&gt; # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt; # alert, emerg.&lt;br /&gt; LogLevel warn&lt;br /&gt;&lt;br /&gt; CustomLog /var/log/apache2/access.log combined&lt;br /&gt; ServerSignature On&lt;br /&gt;&amp;lt;/virtualhost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Este es el resultado:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/SXtdHuxhbZI/AAAAAAAAASg/uIIXMz61Lg4/s1600-h/snapshot1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/SXtdHuxhbZI/AAAAAAAAASg/uIIXMz61Lg4/s320/snapshot1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294928174300360082" /&gt;&lt;/a&gt;&lt;br /&gt;Algunos test de velocidad sobre apache:&lt;br /&gt;Requests per second:    509.87 [#/sec] (mean)&lt;br /&gt;Requests per second:    565.74 [#/sec] (mean)&lt;br /&gt;Requests per second:    576.90 [#/sec] (mean)&lt;br /&gt;Requests per second:    507.49 [#/sec] (mean)&lt;br /&gt;Otros resultados con paster:&lt;br /&gt;Requests per second:    419.51 [#/sec] (mean)&lt;br /&gt;Requests per second:    348.97 [#/sec] (mean)&lt;br /&gt;Requests per second:    461.03 [#/sec] (mean)&lt;br /&gt;Requests per second:    441.53 [#/sec] (mean)&lt;br /&gt;Todas las pruebas se han realizado sobre una máquina virtual con VirtualBox OSE con 256 MB de Ram.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-479495070915714193?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/479495070915714193/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/repozefbg-con-modwsgi.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/479495070915714193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/479495070915714193'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/repozefbg-con-modwsgi.html' title='Repoze.bfg con mod_wsgi'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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://1.bp.blogspot.com/_-kQftsinPB8/SXtdHuxhbZI/AAAAAAAAASg/uIIXMz61Lg4/s72-c/snapshot1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-1572830014831721935</id><published>2009-01-16T14:44:00.009+01:00</published><updated>2009-05-06T16:52:22.432+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze.bfg'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Ejemplos de repoze.bfg</title><content type='html'>Leo en el blog de &lt;a href="http://www.eflorenzano.com/blog/post/writing-blazing-fast-infinitely-scalable-pure-wsgi/"&gt;Eric Florenzano’s&lt;/a&gt; un interesante articulo sobre una aplicacion creada sobre wsgi con código de ejemplo y algunos increibles benchmarks realizados.&lt;br /&gt;Por su parte &lt;a href="http://blog.delaguardia.com.mx/index.php?op=ViewArticle&amp;amp;articleId=119&amp;amp;blogId=1"&gt;Carlos de la Guardia&lt;/a&gt; realizó un port de esta para el framework repoze.bfg y el resultado es prometedor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1572830014831721935?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1572830014831721935/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/ejemplos-de-repozefbg.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1572830014831721935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1572830014831721935'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/ejemplos-de-repozefbg.html' title='Ejemplos de repoze.bfg'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2694599378105228168</id><published>2009-01-15T12:37:00.003+01:00</published><updated>2009-05-06T16:52:07.702+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze.bfg'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Framework basado en zope: repoze.bfg</title><content type='html'>Con aproximadamente 6 meses de vida el framework &lt;a href="http://static.repoze.org/bfgdocs/index.html"&gt;repoze.bfg&lt;/a&gt; me ha causado muy buena impresión, sobre todo por que esta basado en algo que ya conozco Zope.&lt;br /&gt;El framework esta licenciado en BSD y entre sus caracteristicas más destacadas están:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Permite construir urls &lt;a href="http://static.repoze.org/bfgdocs/narr/urlmapping.html#differences-between-traversal-and-url-dispatch"&gt;transversales o mapeadas&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Permite el uso de vistas para servir contenido estático, redireccionamiento, plantillas personalizadas para un objeto determinado...&lt;/li&gt;&lt;li&gt;Plantillas usando Chameleon (que es una reimplementación de los zpt), xslt o texto plano instalados por defecto aunque permite usar cualquier lenguaje de templates hecho en python.&lt;/li&gt;&lt;li&gt;Api de seguridad.&lt;/li&gt;&lt;li&gt;Permite el uso de eventos por lo que se puede diferenciar la respuesta del servidor si se usa un cliente web o si se usa un cliente json en la petición.&lt;/li&gt;&lt;li&gt;Entorno para realizar baterias de tests.&lt;/li&gt;&lt;/ul&gt;Además de todo esto se han publicado ejemplos de &lt;a href="http://static.repoze.org/bfgdocs/index.html#sample-applications"&gt;aplicaciones&lt;/a&gt; hechas con este framework.&lt;br /&gt;&lt;br /&gt;Una nueva opción para el desarrollo web en python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2694599378105228168?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2694599378105228168/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/framework-basado-en-zope-repozebfg.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2694599378105228168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2694599378105228168'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/framework-basado-en-zope-repozebfg.html' title='Framework basado en zope: repoze.bfg'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1148334290760746980</id><published>2009-01-13T15:24:00.003+01:00</published><updated>2009-01-13T15:39:58.173+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Evitar que zope se caiga o consuma mucha memoria</title><content type='html'>Pequeño mix de dos scripts que comprueba la disponibilidad de zope y lo reinicia en caso necesario.&lt;br /&gt;Los dos scripts están por internet y puede que estén más actualizados:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;SERVICE_HOME="/etc/init.d"&lt;br /&gt;ZOPE_ROOT_URL="http://127.0.0.1:8080/"&lt;br /&gt;&lt;br /&gt;echo "--- comprobando zope.. ---" &gt;&gt; ~/watchlog.log&lt;br /&gt;&lt;br /&gt;if ! wget --spider -t 1 -T 30 $ZOPE_ROOT_URL 2&gt;&amp;1; then&lt;br /&gt;  echo "reiniciando zope...";&lt;br /&gt;  ~/instance/bin/zopectl restart;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;RAMUSAGE=$(ps -u $LOGNAME -o %mem,command | \&lt;br /&gt;  grep -v peruser | awk '{sum+=$1} END {print sum}')&lt;br /&gt;if [ $RAMUSAGE -gt 51 ]; then&lt;br /&gt;    echo "$( date +'%Y-%m-%d %H:%M:%S') Uso de memoria\&lt;br /&gt;      sobrepasado $RAMUSAGE - reiniciando Zope" &gt;&gt; ~/watchlog.log&lt;br /&gt;    ~/instance/bin/zopectl restart&lt;br /&gt;fi&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/3812840746656887122-1148334290760746980?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1148334290760746980/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/evitar-que-zope-se-caiga-o-consuma.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1148334290760746980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1148334290760746980'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/evitar-que-zope-se-caiga-o-consuma.html' title='Evitar que zope se caiga o consuma mucha memoria'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4422241776529117223</id><published>2009-01-12T11:22:00.011+01:00</published><updated>2009-01-12T12:21:34.496+01:00</updated><title type='text'>El poder del eeepc en auditorias wireless</title><content type='html'>El ultraportatil de Asus viene dotado con una tarjeta de red wifi con el chipset atheros compatible con madwifi y compatible después de un esfuerzo con la suite &lt;a href="http://www.aircrack-ng.org/doku.php?id=madwifi-ng"&gt;aircrack-ng&lt;/a&gt;, lo que unido a un peso inferior a 1 kg lo hace tremendamente útil para auditar redes wifi, wardriving, etc&lt;br /&gt;Para que todo funcione correctamente tenemos que tener instaladas las cabeceras del kernel.&lt;br /&gt;Todos los pasos restantes de compilación vienen en la página web de aircrack-ng pero para el caso del modelo Atheros AR2425 (AR5007EG) chipset (including EEE PC) - PCI ID 168c001c que es el modelo del 701 hay que variar la descarga para instalar un branch con soporte en el módulo HAL 0.10.5.6.&lt;br /&gt;El proceso modificado seria:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;ifconfig ath0 down&lt;br /&gt; ifconfig wifi0 down&lt;br /&gt; svn -r 3745\ &lt;br /&gt;   checkout http://svn.madwifi-project.org/\&lt;br /&gt;     madwifi/branches/madwifi-hal-0.10.5.6/ madwifi-ng&lt;br /&gt; wget http://patches.aircrack-ng.org/madwifi-ng-r3745.patch&lt;br /&gt; cd madwifi-ng&lt;br /&gt; patch -Np1 -i ../madwifi-ng-r3745.patch&lt;br /&gt; ./scripts/madwifi-unload&lt;br /&gt; make&lt;br /&gt; make install&lt;br /&gt; depmod -ae&lt;br /&gt; modprobe ath_pci&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una vez instalado el módulo en el kernel debemos comprobar que el test de inyección en modo monitor  es factible con los comandos:&lt;br /&gt;airmon-ng stop ath0&lt;br /&gt;airmon-ng start wifi0&lt;br /&gt;aireplay-ng -9 ath1[o la interfaz que cree]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4422241776529117223?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4422241776529117223/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/el-poder-del-eeepc-en-auditorias.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4422241776529117223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4422241776529117223'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/el-poder-del-eeepc-en-auditorias.html' title='El poder del eeepc en auditorias wireless'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-7810276793235303117</id><published>2009-01-11T14:39:00.008+01:00</published><updated>2009-01-13T10:46:13.535+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Overclocking eeepc en DebianEeePC</title><content type='html'>¿Se calienta tu eeepc 701?, ¿Quieres sacar el máximo partido al procesador?. La solución a estas dos preguntas vienen de la mano de un &lt;a href="http://code.google.com/p/eeepc-linux/"&gt;módulo experimental&lt;/a&gt; (la versión 0.2 parece ser más "estable") para el kernel que permite controlar el fsb y monitorizar la temperatura y otras variables.&lt;br /&gt;Para controlar la temperatura del eeepc de forma más eficiente existen unos &lt;a href="http://code.google.com/p/eeepc-fancontrol/"&gt;scripts en perl&lt;/a&gt; asociados directamente con ese módulo del kernel que simplemente monitorizan la temperatura y atendiendo a una tabla de valores ajustar la velocidad del ventilador.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CPU temperature (C)   Fan speed&lt;br /&gt;0 - 54  off&lt;br /&gt;55 - 68  40%&lt;br /&gt;69 - 80  65%&lt;br /&gt;81 - 90  80%&lt;br /&gt;91+      100%&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El módulo eeepc-laptop en el kernel 2.6.26 incluye ya el control manual del ventilador aunque no el control de la velocidad del fsb.&lt;br /&gt;&lt;br /&gt;Para compilar el módulo es necesario tener instalado el paquete linux-headers de tu kernel en mi caso linux-headers-2.6.26-1-686 que puedes instalar con apt.&lt;br /&gt;El siguiente paso es descargar el driver &lt;a href="http://eeepc-linux.googlecode.com/files/eeepc-linux-0.2.tar.gz"&gt;eeepc-linux&lt;/a&gt; de la página web. Lo descomprimimos entramos en la carpeta modules y compilamos con make.&lt;br /&gt;Puede que el módulo de un error al compilar parecido a este:&lt;br /&gt;‘proc_root’ undeclared (first use in this function)&lt;br /&gt;en ese caso debes cambiar las siguientes lineas de código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;line: 399&lt;br /&gt;-    eee_proc_rootdir = proc_mkdir("eee", &amp;proc_root);&lt;br /&gt;+    eee_proc_rootdir = proc_mkdir("eee", NULL);&lt;br /&gt;&lt;br /&gt;line: 433&lt;br /&gt;-    remove_proc_entry("eee", &amp;proc_root);&lt;br /&gt;+    remove_proc_entry("eee", NULL);&lt;br /&gt;&lt;br /&gt;line: 442&lt;br /&gt;-    remove_proc_entry("eee", &amp;proc_root);&lt;br /&gt;+    remove_proc_entry("eee", NULL);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esta incidencia la puedes seguir en profundidad en esta dirección de la &lt;a href="http://code.google.com/p/eeepc-linux/issues/detail?id=10&amp;colspec=ID%20Type%20Status%20Priority%20Owner%20Summary"&gt;página del módulo&lt;br /&gt;&lt;/a&gt;.&lt;br /&gt;Una vez compilado insertamos el módulo en el kernel con el comando:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;insmod eee.ko&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y podremos ver la carpeta /proc/eee con los ficheros de configuración e información que el módulo generó: fan_manual, temperature, fsb, etc ...&lt;br /&gt;Aunque la versión 0.2 no tiene la sección install en el Makefile por lo que para que se agregue permanentemente al kernel y se cargue en el inicio hacemos lo siguiente:&lt;br /&gt;Copiamos eee.ko a /lib/modules/2.6.26-1-686/kernel/drivers/acpi&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;insmod /lib/modules/2.6.26-1-686/kernel/drivers/acpi/eee.ko&lt;br /&gt;depmod -ae&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;editamos el fichero /etc/modules y agregamos una nueva linea con el nombre del módulo:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;eee&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora instalaremos los scripts de control del ventilador:&lt;br /&gt;Bajamos el paquete deb de la página web de &lt;a href="http://code.google.com/p/eeepc-fancontrol/"&gt;raimoradczewski&lt;/a&gt; en google code.&lt;br /&gt;Lo instalamos con dpkg -i eeepc-fancontrol-0.21.deb y ya tenemos controlada la temperatura.&lt;br /&gt;&lt;br /&gt;Nota: Al reiniciar tiempo despues me di cuenta que no agrega el script al inicio del sistema por lo que hay que agregarlo manualmente con el siguiente comando:&lt;br /&gt;update-rc.d eeepc-fancontrol defaults&lt;br /&gt;&lt;br /&gt;Ahora para poner la velocidad del procesador podemos hacer esto:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;echo 85 24 1 &gt; /proc/eee/fsb&lt;br /&gt;echo 100 24 1 &gt; /proc/eee/fsb &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El 85 y el 100 son los valores que suben el fsb y es necesario hacerlo así para que el eeepc no se caiga ya que si subimos de golpe la velocidad puede pasar que se quede colgado.&lt;br /&gt;Ahora para verificar que la velocidad ha subido realizamos la prueba con glxgears por ejemplo.&lt;br /&gt;A mi me da estos resultados:&lt;br /&gt;&lt;br /&gt;2959 frames in 5.0 seconds = 591.718 FPS para una velocidad fsb de 100 Mhz&lt;br /&gt;2560 frames in 5.0 seconds = 511.975 FPS para una velocidad fsb de 85 Mhz&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;2096 frames in 5.0 seconds = 419.090 FPS para una velocidad fsb de 70 Mhz&lt;/span&gt;&lt;br /&gt;La última linea corresponde a la velocidad por defecto del eeepc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-7810276793235303117?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/7810276793235303117/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2009/01/overclocking-eeepc-en-debianeeepc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7810276793235303117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7810276793235303117'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2009/01/overclocking-eeepc-en-debianeeepc.html' title='Overclocking eeepc en DebianEeePC'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-3527923924905927666</id><published>2008-12-18T15:44:00.006+01:00</published><updated>2008-12-18T20:16:57.647+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Debug Unauthorized exceptions en Plone</title><content type='html'>En la página oficial de Plone existen una serie de manuales sobre como realizar un &lt;a href="http://plone.org/documentation/how-to/debug-unauthorized"&gt;debug&lt;/a&gt; sobre excepciones de seguridad sobre Zope.&lt;br /&gt;La situación es la siguiente: estás customizando un script python en zope y cuando vas a testearlo te redirije a la página de login de plone sin dar mensaje alguno del por que de esta acción ni dejar trazas en el log.&lt;br /&gt;Una forma rápida de solucionar esto es ir a la administración de zope entrar en la instancia Plone-&gt;error_log, En la caja de texto de "Ignored exception types" quitar Unauthorized. Una vez realizado esto podremos probar de nuevo el script y ver en que contexto está fallando.&lt;br /&gt;Ahora ya veo mensajes de este tipo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Exception Type   Unauthorized&lt;br /&gt;Exception Value  &amp;lt;strong&amp;gt;You are not authorized to access this resource.&amp;lt;/strong&amp;gt;&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/3812840746656887122-3527923924905927666?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3527923924905927666/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/debug-unauthorized-exceptions-en-plone.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3527923924905927666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3527923924905927666'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/debug-unauthorized-exceptions-en-plone.html' title='Debug Unauthorized exceptions en Plone'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8295082609866668095</id><published>2008-12-18T10:22:00.004+01:00</published><updated>2008-12-18T10:34:16.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><title type='text'>Mi lista de regalos para los Reyes Magos</title><content type='html'>¿Que quereis para Reyes (o Santa si es que lo celebrais)?. Yo ya me he escrito mi lista de &lt;a href="http://www.smashingmagazine.com/2008/12/17/the-ultimate-web-developers-christmas-wish-list/"&gt;regalos&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://www.smashingmagazine.com/"&gt;Smashingmagazine &lt;/a&gt;como siempre sorprende por este tipo de post tan interesantes.&lt;br /&gt;Un item que seguro que a muchos desarrolladores web les gustará es &lt;a href="http://browsershots.org"&gt;http://browsershots.org&lt;/a&gt; que permite crear capturas de pantalla con los navegadores que elijas y probar así la compatibilidad de tus páginas web.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SUoY4ulxT2I/AAAAAAAAAMI/C5a7LP3Cfds/s1600-h/browsershots.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 212px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SUoY4ulxT2I/AAAAAAAAAMI/C5a7LP3Cfds/s320/browsershots.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5281060875903520610" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8295082609866668095?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8295082609866668095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/mi-lista-de-regalos-para-los-reyes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8295082609866668095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8295082609866668095'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/mi-lista-de-regalos-para-los-reyes.html' title='Mi lista de regalos para los Reyes Magos'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/SUoY4ulxT2I/AAAAAAAAAMI/C5a7LP3Cfds/s72-c/browsershots.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-724803812388505166</id><published>2008-12-17T20:58:00.002+01:00</published><updated>2008-12-17T21:05:57.825+01:00</updated><title type='text'>Kevin Mitnick entrevistado "digitalmente" por el mundo</title><content type='html'>Un encuentro de lo más interesante con Kevin Mitnick en &lt;a href="http://www.elmundo.es/encuentros/invitados/2008/12/3397/"&gt;elmundo.es&lt;/a&gt;.&lt;br /&gt;Me quedo con esta respuesta:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;El hackear sistemas es, ¿diversión, adicción, lucro,...? Gracias por su atención.&lt;/span&gt;&lt;br /&gt;Para mí, es el subidón de adrenalina, resolver un rompecabezas mejor que tus oponentes, pero puede convertirse en una adicción igual que el juego&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-724803812388505166?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/724803812388505166/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/kevin-mitnick-entrevistado-digitalmente.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/724803812388505166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/724803812388505166'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/kevin-mitnick-entrevistado-digitalmente.html' title='Kevin Mitnick entrevistado &quot;digitalmente&quot; por el mundo'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2826614191372327531</id><published>2008-12-16T10:30:00.005+01:00</published><updated>2008-12-16T10:50:57.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><title type='text'>Construye tu propio framework en python con wsgi</title><content type='html'>Uno de los mas interesantes artículos que he leido últimamente de desarrollo web en python es el de "como construir tu propio framework python con el protocolo wsgi". Lo seguí hace tiempo en su &lt;a href="http://pythonpaste.org/do-it-yourself-framework.html#writing-a-wsgi-application"&gt;primera versión&lt;/a&gt; pero Ian Bicking lo ha mejorado sustancialmente con el uso de &lt;a href="http://pythonpaste.org/webob/do-it-yourself.html"&gt;webob&lt;/a&gt;.&lt;br /&gt;Wsgi es el futuro de las aplicaciones web en python, proyectos como &lt;a href="http://code.google.com/p/modwsgi/"&gt;mod_wsgi&lt;/a&gt; que permiten integrar las aplicaciones en el potente servidor web apache, repoze que integra zope, plone y grok, el esfuerzo de otros frameworks como django apuntan un auge en esta tecnologia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2826614191372327531?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2826614191372327531/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/construye-tu-propio-framework-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2826614191372327531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2826614191372327531'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/construye-tu-propio-framework-en-python.html' title='Construye tu propio framework en python con wsgi'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-3062718730970535633</id><published>2008-12-15T19:50:00.006+01:00</published><updated>2009-02-16T11:44:08.129+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Configurar iptables en Debian</title><content type='html'>Debian y distribuciones asociadas (lease Ubuntu) traen por defecto una serie de scripts que mejoran considerablemente la gestión de iptables.&lt;br /&gt;Los scripts son iptables-save e iptables-restore el primero muestra por stdout la configuración actual con el formato adecuado de iptables y el segundo restaura la configuración de iptables asociada a un fichero.&lt;br /&gt;Lo primero que tenemos que hacer es mediante el comando iptables realizar la configuración que se ajuste a nuestras necesidades. Cada politica de seguridad es diferente para cada sistema y pueden ser mas o menos complejas, a modo de ejemplo simplemente aceptaremos todo lo que venga por el puerto 80 y denegaremos el resto:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para que las conexiones se mantengan una vez establecidas agregamos la siguiente regla&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Denegamos en la politica input el resto&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;iptables -P INPUT DROP&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Denegamos igualmente todo para la politica forward&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;iptables -P FORWARD DROP&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una vez que tengamos las políticas necesarias las guardamos en el fichero /etc/iptables.conf con el comando iptables-save &gt;/etc/iptables.conf (el fichero es orientativo vale cualquiera que queramos en la ruta que más convenga)&lt;br /&gt;Quedaria algo así:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;# Generated by iptables-save v1.3.6 on Mon ...&lt;br /&gt;*filter&lt;br /&gt;:INPUT DROP [51246:7399298]&lt;br /&gt;:FORWARD DROP [0:0]&lt;br /&gt;:OUTPUT ACCEPT [1940596:1621335103]&lt;br /&gt;-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT&lt;br /&gt;COMMIT&lt;br /&gt;# Completed on Mon ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora para levantar el firewall cada vez que iniciemos nuestra red agregamos el script en bash en la ruta /etc/network/if-up.d/iptables, el contenido es este:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;iptables-restore &lt; /etc/iptables.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;¿Simple no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-3062718730970535633?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3062718730970535633/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/configurar-iptables-en-debian.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3062718730970535633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3062718730970535633'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/configurar-iptables-en-debian.html' title='Configurar iptables en Debian'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4356017609620488568</id><published>2008-12-11T16:51:00.010+01:00</published><updated>2008-12-12T13:56:15.393+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><title type='text'>Instalar Chromium en linux</title><content type='html'>¿Ansiosos por probar Chromium en linux?&lt;br /&gt;Grácias a &lt;a href="http://www.codeweavers.com/services/ports/"&gt;codeweavers&lt;/a&gt; podemos instalar chromium en linux. Han realizado un port basado en su tecnología de emulación basada a su vez en wine. La ventaja de este soft es que está empaquetado para ubuntu, debian y otro genérico sh.&lt;br /&gt;La primera experiencia con esta instalación no ha sido muy agradable ya que los paneles de configuración no me han funcionado como es debido y me ha sido imposible configurar el proxy.&lt;br /&gt;Habrá que esperar un tiempo para poder probar el navegador de google 100% integrado en linux.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SUJalFSzQ-I/AAAAAAAAAMA/1TLLiL0UTpk/s1600-h/chromium.png" title="Imagen del navegador de Google instalada en linux"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SUJalFSzQ-I/AAAAAAAAAMA/1TLLiL0UTpk/s320/chromium.png" border="0" id="BLOGGER_PHOTO_ID_5278881306354336738" alt="Imagen del navegador de Google" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4356017609620488568?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4356017609620488568/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/instalar-chronium-en-linux.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4356017609620488568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4356017609620488568'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/instalar-chronium-en-linux.html' title='Instalar Chromium en linux'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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/_-kQftsinPB8/SUJalFSzQ-I/AAAAAAAAAMA/1TLLiL0UTpk/s72-c/chromium.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-814398571865751549</id><published>2008-12-11T12:43:00.006+01:00</published><updated>2008-12-11T22:50:06.030+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SEO'/><title type='text'>Rafa Nadal, youtube y Bibiana Aído entre lo más buscado en 2008</title><content type='html'>Leo en &lt;a href="http://www.lavanguardia.es/internet-y-tecnologia/noticias/20081210/53596434894/youtube-rafa-nadal-y-bibiana-aido-lo-mas-buscado-en-google-paco-juegos-olimpicos-rafael-nadal-angel-.html"&gt;La Vanguardia&lt;/a&gt; que google ha hecho pública su lista de lo más buscado en 2008. &lt;br /&gt;En España entre las categorías más buscadas se encuentran nombres como Bibiana Aído para política o Rafa Nadal en deportes, youtube para los más populares y atención en series se pone a la cabeza Heroes una de mis series sci-fi favoritas.&lt;br /&gt;En las listas internacionales la ganadora es Sarah Palin. En España parece que lo que más interés despierta en este mes es ¿fama?. Increible...&lt;br /&gt;Para más datos podeis visitar la página de google de &lt;a href="http://www.google.com/intl/en/press/zeitgeist2008/"&gt;ranking de búsqueda&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-814398571865751549?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/814398571865751549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/rafa-nadal-youtube-y-bibiana-ado-lo-ms.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/814398571865751549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/814398571865751549'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/rafa-nadal-youtube-y-bibiana-ado-lo-ms.html' title='Rafa Nadal, youtube y Bibiana Aído entre lo más buscado en 2008'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6550786983284689353</id><published>2008-12-09T10:35:00.004+01:00</published><updated>2008-12-09T17:06:28.764+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Captchas en aplicaciones web. Ejemplos prácticos en Zope.</title><content type='html'>Según la wikipedia:&lt;br /&gt;&lt;blockquote&gt;Captcha es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart (Prueba de Turing pública y automática para diferenciar a máquinas y humanos).&lt;/blockquote&gt;&lt;br /&gt;En plone existen varios productos que implementan captchas. Productos como plonecaptcha o collective.captcha pueden servir para prevenir el spam masivo en sitios en plone, también Mail2Image evita la recolección de mails por robots para envio de spam masivo.&lt;br /&gt;Lo más normal son los captchas de imagen como este de ejemplo:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;def captchaimagen(self):&lt;br /&gt; """Captcha"""&lt;br /&gt; from PIL import Image,ImageDraw,ImageFont&lt;br /&gt; from random import choice&lt;br /&gt; from random import uniform&lt;br /&gt; from random import randint&lt;br /&gt; from cStringIO import StringIO&lt;br /&gt; import os&lt;br /&gt; request = self.REQUEST&lt;br /&gt; response = request.RESPONSE&lt;br /&gt; MEDIA_PATH = str(os.environ.get('INSTANCE_HOME', '')+'/'+'/'.join(self.__module__.split('.')[:-1]))&lt;br /&gt; fontsize = 32&lt;br /&gt; font=ImageFont.truetype('%s/media/Vera.ttf'%(MEDIA_PATH), fontsize)&lt;br /&gt; imgtext = request.SESSION.get('textoVerificacion',None)&lt;br /&gt; if not imgtext:&lt;br /&gt;   return&lt;br /&gt; textSize = font.getsize(imgtext)&lt;br /&gt; img = Image.new('RGB', ((fontsize+10)*4,40), (209,209,209))&lt;br /&gt; draw=ImageDraw.Draw(img)&lt;br /&gt; draw.text((20,2),imgtext,font=font,fill=0)&lt;br /&gt; unidadY = img.size[1]/6&lt;br /&gt; unidadX = img.size[0]/20&lt;br /&gt; for n in range(1,7):&lt;br /&gt;   draw.line((0, n*unidadY, img.size[0], n*unidadY),width=1,fill=0)&lt;br /&gt; for n in range(1,21):&lt;br /&gt;   draw.line((n*unidadX,0, n*unidadX,img.size[1]),width=1,fill=0)&lt;br /&gt;   fmt='JPEG'&lt;br /&gt;   imgData = StringIO()&lt;br /&gt;   img.save(imgData, fmt)&lt;br /&gt;&lt;br /&gt;   response.setHeader('Content-type','image/jpeg')&lt;br /&gt;   response.setHeader('Content-disposition','inline;filename=aleat.jpg')&lt;br /&gt;   response.write(imgData.getvalue())&lt;br /&gt;   return response&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es necesario el uso de PIL para que funcione.&lt;br /&gt;Otro tipo de captchas menos populares son los de sonido que pueden ser una alternativa a la imagen incrementando la accesibilidad a nuestros sitios. El problema que se encuentran los programadores de habla hispana a la hora de implementar este tipo de captchas es encontrar unas voces en castellano. Para este caso concreto use el programa festival para crear el texto auditivo previamente configurandolo con unas voces en castellano que ofrece la junta de andalucia con licencia GPL &lt;a href="http://forja.guadalinex.org/repositorio/projects/hispavoces/"&gt;http://forja.guadalinex.org/repositorio/projects/hispavoces/&lt;/a&gt;.&lt;br /&gt;Una vez configuradas las voces correctamente podemos crear un script tal que nos cree los captchas sonoros:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;def captchaaudio(self):&lt;br /&gt; """audio"""&lt;br /&gt; from random import sample&lt;br /&gt; from cStringIO import StringIO&lt;br /&gt; import os&lt;br /&gt; request = self.REQUEST&lt;br /&gt; response = request.RESPONSE&lt;br /&gt; audiotext = request.SESSION.get('textoVerificacion',None)&lt;br /&gt; if not audiotext:&lt;br /&gt;   return&lt;br /&gt; codigo = '. '.join([n for n in audiotext])&lt;br /&gt; id = "tmp%s.wav"%(str(audiotext))&lt;br /&gt; cmd = """echo "%s" | /opt/festival/bin/text2wave -o /tmp/%s"""%(str(audiotext),str(id))&lt;br /&gt; f=os.popen(cmd,'r')&lt;br /&gt; f.close()&lt;br /&gt; file=open('/tmp/%s'%(id),'r+b')&lt;br /&gt; response.setHeader('Content-type','audio/x-wav')&lt;br /&gt; response.setHeader('Content-disposition','inline;filename=aleat.wav')&lt;br /&gt; response.write(file.read())&lt;br /&gt; file.close()&lt;br /&gt;&lt;br /&gt; return response&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Fijaos que el código es un poco cutre y hasta podria ser inseguro, pero podemos partir de esta idea y pregenerar cientos de códigos y aleatoriamente ir publicandolos uno a uno dentro del zodb para evitar overload del servidor y descartar códigos mal generados, es decir, publicarlos de forma estática.&lt;br /&gt;Otro tipo de captchas que me parecen muy interesantes son los que he denominado lógicos. Este tipo es muy poco frecuente aunque increiblemente accesibles y usables. Simplemente se crea una pregunta que el usuario tiene que responder correctamente, por ejemplo:&lt;br /&gt;¿Cuánto es 4 + 2?&lt;br /&gt;¿Qué elemento no forma parte del conjunto pera, manzana, casa, coco?&lt;br /&gt;Se pueden crear bases de datos de pregunta/respuesta o conjuntos de elementos y extraer n elementos de un conjunto y 1 de otro escogido de forma aleatoria....&lt;br /&gt;&lt;br /&gt;Los ataques más comunes a este tipo de elementos de "Seguridad" son los OCR aplicados sobres las imagenes o sistemas de reconocimiento de voz, por ello es recomendable agregar una capa de ruido a la imagen o el audio (distorsionar las letras, rejillas, distintos colores para cada letra,...) aunque muchas veces el propio ruido impide el reconocimiento del código de validación, con la consiguiente crispación de los usuarios.&lt;br /&gt;Otro tipo de ataque es el de tipo humano, equipos de gente que se dedica exclusivamente a resolver los puzzles de todo tipo de captchas e introducirlos en bases de datos que posteriormente son usadas.&lt;br /&gt;Fuentes:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/CAPTCHA"&gt;http://en.wikipedia.org/wiki/CAPTCHA&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6550786983284689353?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6550786983284689353/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/captchas-en-aplicaciones-web-ejemplos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6550786983284689353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6550786983284689353'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/captchas-en-aplicaciones-web-ejemplos.html' title='Captchas en aplicaciones web. Ejemplos prácticos en Zope.'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6430497438335774093</id><published>2008-12-05T11:38:00.011+01:00</published><updated>2009-09-02T11:59:16.052+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Single Sign On con Plone. Una alternativa a mod_ntlm.</title><content type='html'>En la página oficial de plone hay un tutorial para realizar &lt;a href="http://plone.org/documentation/how-to/single-sign-on-with-active-directory"&gt;SSO en plone&lt;/a&gt; mediante el módulo de apache ntlm2.&lt;br /&gt;En la versión de apache/plone que uso no es posible instalar ntlm2 y el módulo apache pas solo nos permitia ntlm y el módulo remoteuserfolder para un plone 2.1 lo que obliga a usar fast-cgi para pasar las variables en lugar de variables de entorno de mod_ssl:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;RewriteCond %{LA-U:REMOTE_USER} (.+)&lt;br /&gt;RewriteRule .* - [E=RU:%1]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mucho más elegante.&lt;br /&gt;Con este módulo en una intranet dominada por explorer 6,7 me encontré varios problemas debido a las diferentes librerias / versiones del navegador en windows que no permitian a algunos usuarios logarse correctamente en la intranet debido a errores en el proceso ntlm etc.&lt;br /&gt;Para solucionar esto opté por una alternativa en perl Apache::AuthenNTLM disponible en cpan.&lt;br /&gt;La configuración que usé es esta:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;FastCgiExternalServer /var/www/intranet -host intranet.midominio.com:8081 -pass-header Authorization&lt;br /&gt;&amp;lt;Location /intranet&amp;gt;&lt;br /&gt;   PerlAuthenHandler Apache::AuthenNTLM&lt;br /&gt;                &lt;br /&gt;   AuthName Intranet&lt;br /&gt;   AuthType ntlm,basic&lt;br /&gt;   PerlAddVar ntdomain "dominioIntranet controladorDominio1"&lt;br /&gt;   PerlSetVar defaultdomain dominioIntranet &lt;br /&gt;   PerlSetVar ntlmdebug 1&lt;br /&gt;   PerlSetVar splitdomainprefix 1&lt;br /&gt;   PerlSetVar ntlmsemtimeout 1&lt;br /&gt;   require valid-user&lt;br /&gt;   SetHandler fastcgi-script&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&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/3812840746656887122-6430497438335774093?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6430497438335774093/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/single-sign-on-con-plone-una.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6430497438335774093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6430497438335774093'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/single-sign-on-con-plone-una.html' title='Single Sign On con Plone. Una alternativa a mod_ntlm.'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8598399882684876525</id><published>2008-12-04T13:04:00.005+01:00</published><updated>2008-12-04T13:17:17.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python ya es el sexto lenguaje de programación</title><content type='html'>Python se encuentra entre los 10 lenguajes de programación mas usados concretamente en el 6 puesto subiendo un puesto en la escala según &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;tiobe&lt;/a&gt; por encima de lenguajes como c# incluido en la plataforma .NET .&lt;br /&gt;Las malas noticias vienen para Perl que ha descendido del 6 al 9 puesto. Por otra parte java sigue como primer lenguaje de programación en el mundo.&lt;br /&gt;Es interesante ver el ascenso de ActionScript que de estar en el puesto 25 ha pasado al 16 ¿Se deberá a Flex?.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8598399882684876525?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8598399882684876525/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/python-ya-es-el-sexto-lenguaje-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8598399882684876525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8598399882684876525'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/python-ya-es-el-sexto-lenguaje-de.html' title='Python ya es el sexto lenguaje de programación'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-5917644573182839276</id><published>2008-12-03T15:55:00.004+01:00</published><updated>2008-12-03T16:06:50.885+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Instalar Plone 3 en debian etch</title><content type='html'>Este es un mini tip para instalar plone 3 en debian estable.&lt;br /&gt;Simplemente entramos como root y editamos el archivo /etc/apt/sources.list agregamos al final la linea &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;deb http://www.backports.org/debian etch-backports main&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Instalamos el anillo de claves para los backports evitamos así el continuo mensaje de seguridad que dice que se van a instalar paquetes sin verificación.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apt-get install debian-backports-keyring&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Instalamos plone 3 desde los backports.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apt-get install -t etch-backports plone3-site&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y listo.&lt;br /&gt;Para administrar los sitios plone en debian recomiendo dzhandle que nos permite con un solo comando desde instalar add-ons a plone hasta crear/borrar instancias.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-5917644573182839276?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/5917644573182839276/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/instalar-plone-3-en-debian-etch.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/5917644573182839276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/5917644573182839276'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/instalar-plone-3-en-debian-etch.html' title='Instalar Plone 3 en debian etch'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-7566406731831927319</id><published>2008-12-01T17:07:00.023+01:00</published><updated>2008-12-09T17:07:47.551+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Incrementar el rendimiento de plone con Apache 2 en Debian</title><content type='html'>Versión del S.O Debian etch&lt;br /&gt;Apache 2.2.3 la que viene en debian etch&lt;br /&gt;mod_disk_cache&lt;br /&gt;mod_cache&lt;br /&gt;mod_proxy&lt;br /&gt;Plone 3.1 Instalador completo de la web oficial para linux.&lt;br /&gt;No voy a explicar detalladamente el proceso de instalación de cada uno de los componentes, solo expondré el fichero final de configuración httpd.conf con el cache y rewrite configurado.&lt;br /&gt;El fichero final es este:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;DocumentRoot /var/www/&lt;br /&gt;ErrorLog /var/log/apache2/error_ssl.log&lt;br /&gt;LogLevel debug&lt;br /&gt;CustomLog /var/log/apache2/plone.log combined&lt;br /&gt;ServerSignature On&lt;br /&gt;CacheEnable disk /&lt;br /&gt;CacheRoot "/var/cache/apache2/mod_disk_cache/"&lt;br /&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;  RewriteEngine On&lt;br /&gt;  RewriteLog "/var/log/apache2/rewrite_log"&lt;br /&gt;  RewriteLogLevel 0&lt;br /&gt;  RewriteRule ^/Plone(.*) \&lt;br /&gt;    http://XX.X.XXX.XXX:8080/VirtualHostBase/\&lt;br /&gt;    http/XX.X.XXX.XXX:80/Plone/$1 [P]&lt;br /&gt;  RewriteRule ^/(.*) \ &lt;br /&gt;    http://XX.X.XXX.XXX:8080/VirtualHostBase/\&lt;br /&gt;    http/XX.X.XXX.XXX:80/Plone/$1 [L,P]&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;br /&gt;ExpiresActive On&lt;br /&gt;ExpiresByType image/gif A3600&lt;br /&gt;ExpiresByType image/png A3600&lt;br /&gt;ExpiresByType image/jpeg A3600&lt;br /&gt;ExpiresByType text/css A3600&lt;br /&gt;ExpiresByType text/javascript A3600&lt;br /&gt;ExpiresByType application/x-javascript A3600&lt;br /&gt;ExpiresByType text/html A3600&lt;br /&gt;ExpiresByType text/xml A3600&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;De forma predeterminada el instalador crea una instancia en la que inicia un sitio predeterminado llamado Plone.&lt;br /&gt;la ip usada es la pública del interfaz de red XX.X.XXX.XXX aquí deberia estar el dominio de nuestro sitio web pero en entorno de pruebas es mas rápido usar directamente la ip.&lt;br /&gt;Las únicas directivas necesarias para realizar el cache son:&lt;br /&gt;&lt;br /&gt;CacheEnable disk /&lt;br /&gt;CacheRoot "/var/cache/apache2/mod_disk_cache/"&lt;br /&gt;&lt;br /&gt;Otras opcionales son los tiempos de cache:&lt;br /&gt;&lt;br /&gt;ExpiresActive On&lt;br /&gt;ExpiresByType image/gif A3600&lt;br /&gt;ExpiresByType image/png A3600&lt;br /&gt;ExpiresByType image/jpeg A3600&lt;br /&gt;ExpiresByType text/css A3600&lt;br /&gt;ExpiresByType text/javascript A3600&lt;br /&gt;ExpiresByType application/x-javascript A3600&lt;br /&gt;ExpiresByType text/html A3600&lt;br /&gt;ExpiresByType text/xml A3600&lt;br /&gt;&lt;br /&gt;He seguido las instrucciones del manual de plone para los tiempos de expiración de cache que indican 3600 segundos.&lt;br /&gt;&lt;br /&gt;Una vez configurado Apache correctamente queda la parte de administracion del cache de plone. Dentro de cada sitio plone encontraremos una pequeña aplicación para administrar las plantillas que cachearemos, esto es, si queremos cachear por ejemplo todas las noticias buscaremos la plantilla newsitem_view y la marcaremos para agregarla al cache http.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/STUBjMMNS3I/AAAAAAAAAK0/TKMIUCrwy8U/s1600-h/agregamosnewsitemcap.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://1.bp.blogspot.com/_-kQftsinPB8/STUBjMMNS3I/AAAAAAAAAK0/TKMIUCrwy8U/s320/agregamosnewsitemcap.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5275124242613881714" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora plone se encarga de agregarle las cabeceras necesarias a la plantilla para que al renderizar la página completa de la noticia el cache de apache pueda almacenarla.&lt;br /&gt;Si vemos la información de la página podemos ver que incluye el tiempo de caducidad del cache y la fuente en este caso disk cache.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/STUPGQAfd9I/AAAAAAAAALc/xZ3oY3qPMLg/s1600-h/Pantallazo-Page+Info.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 279px; height: 320px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/STUPGQAfd9I/AAAAAAAAALc/xZ3oY3qPMLg/s320/Pantallazo-Page+Info.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5275139138585065426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Todas las noticias ahora serán cacheadas y servidas por apache.&lt;br /&gt;Realizamos un benchmark directamente a zope sobre una noticia que he creado:&lt;br /&gt;&lt;br /&gt;Document Path:          /Plone/noticia&lt;br /&gt;Document Length:        23626 bytes&lt;br /&gt;&lt;br /&gt;Concurrency Level:      1&lt;br /&gt;Time taken for tests:   44.816844 seconds&lt;br /&gt;Complete requests:      100&lt;br /&gt;Failed requests:        0&lt;br /&gt;Write errors:           0&lt;br /&gt;Total transferred:      2398000 bytes&lt;br /&gt;HTML transferred:       2362600 bytes&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Requests per second:    2.23 [#/sec] (mean)&lt;/span&gt;&lt;br /&gt;Time per request:       448.168 [ms] (mean)&lt;br /&gt;Time per request:       448.168 [ms] (mean, across all concurrent requests)&lt;br /&gt;Transfer rate:          52.23 [Kbytes/sec] received&lt;br /&gt;&lt;br /&gt;Connection Times (ms)&lt;br /&gt;              min  mean[+/-sd] median   max&lt;br /&gt;Connect:        0    0   0.4      0       4&lt;br /&gt;Processing:   387  447  75.7    432    1073&lt;br /&gt;Waiting:      380  438  72.9    426    1063&lt;br /&gt;Total:        387  447  75.8    432    1073&lt;br /&gt;&lt;br /&gt;Percentage of the requests served within a certain time (ms)&lt;br /&gt;  50%    432&lt;br /&gt;  66%    443&lt;br /&gt;  75%    458&lt;br /&gt;  80%    467&lt;br /&gt;  90%    510&lt;br /&gt;  95%    525&lt;br /&gt;  98%    661&lt;br /&gt;  99%   1073&lt;br /&gt; 100%   1073 (longest request)&lt;br /&gt;&lt;br /&gt;Como vemos nos da un tiempo de 2.23 peticiones por segundo.&lt;br /&gt;&lt;br /&gt;Ahora sobre apache.&lt;br /&gt;Document Path:          /Plone/noticia&lt;br /&gt;Document Length:        23396 bytes&lt;br /&gt;&lt;br /&gt;Concurrency Level:      1&lt;br /&gt;Time taken for tests:   0.443597 seconds&lt;br /&gt;Complete requests:      100&lt;br /&gt;Failed requests:        0&lt;br /&gt;Write errors:           0&lt;br /&gt;Total transferred:      2384400 bytes&lt;br /&gt;HTML transferred:       2339600 bytes&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Requests per second:    225.43 [#/sec] (mean)&lt;/span&gt;&lt;br /&gt;Time per request:       4.436 [ms] (mean)&lt;br /&gt;Time per request:       4.436 [ms] (mean, across all concurrent requests)&lt;br /&gt;Transfer rate:          5248.01 [Kbytes/sec] received&lt;br /&gt;&lt;br /&gt;Connection Times (ms)&lt;br /&gt;              min  mean[+/-sd] median   max&lt;br /&gt;Connect:        0    0   0.0      0       0&lt;br /&gt;Processing:     2    3   1.8      3      17&lt;br /&gt;Waiting:        1    1   1.0      2       4&lt;br /&gt;Total:          2    3   1.8      3      17&lt;br /&gt;&lt;br /&gt;Percentage of the requests served within a certain time (ms)&lt;br /&gt;  50%      3&lt;br /&gt;  66%      3&lt;br /&gt;  75%      4&lt;br /&gt;  80%      4&lt;br /&gt;  90%      4&lt;br /&gt;  95%      6&lt;br /&gt;  98%      8&lt;br /&gt;  99%     17&lt;br /&gt; 100%     17 (longest request)&lt;br /&gt;&lt;br /&gt;Vemos que las peticiones han subido a ¡225 por segundo! ,una mejora bastante grande de rendimiento.&lt;br /&gt;Estos cambios se perderán cada vez que reiniciemos zope, para hacer que sean permanentes tendremos que agregar junto a la plantilla que queremos cachear un archivo metadata. Para el caso de newsitem_view.pt tendremos que agregar newsitem_view.pt.metadata y dentro de la sección [default] poner la siguiente linea cache=HTTPCache.&lt;br /&gt;Ahora cada vez que reiniciemos zope los cambios de cache persistirán.&lt;br /&gt;Que cachear depende de las necesidades del sitio web. Noticias, documentos, links, etc son items que prácticamente no cambian y pueden ser cacheados, por el contrario una plantilla de calendario, una plantilla de consulta a una base de datos, etc al contener datos mucho más dinámicos no interesa incluirlos en cache.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://plone.org/documentation/tutorial/optimizing-plone"&gt;Manual de optimización en plone&lt;/a&gt;&lt;br /&gt;&lt;a href="http://plone.org/documentation/how-to/squid-on-windows"&gt;Manual de optimizacion en plone.org para usar squid en lugar de apache&lt;/a&gt;&lt;br /&gt;&lt;a href="http://plone.org/products/cachefu"&gt;Un producto que nos puede interesar usar es cache fu si usamos squid o apache&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-7566406731831927319?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/7566406731831927319/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/12/incrementar-el-rendimiento-de-plone-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7566406731831927319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7566406731831927319'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/12/incrementar-el-rendimiento-de-plone-con.html' title='Incrementar el rendimiento de plone con Apache 2 en Debian'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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://1.bp.blogspot.com/_-kQftsinPB8/STUBjMMNS3I/AAAAAAAAAK0/TKMIUCrwy8U/s72-c/agregamosnewsitemcap.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-8007662621788058982</id><published>2008-11-28T10:46:00.003+01:00</published><updated>2008-11-28T10:56:17.475+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Habilitar SSL en Apache 2 para Windows</title><content type='html'>Si alguien ha instalado OpenSSL y Apache 2 en windows y se ha encontrado con la sorpresa de que al iniciar el motor ssl en Apache no le funciona, ha de tener en cuenta este pequeño tip que a mi me trajo de cabeza más tiempo de la cuenta y es habilitar la opción al inicio de la aplicación con -D SSL para ello en linux simplemente se añade al script de inicio y listo, en cambio, en windows hay que iniciar el registro mediante inicio-&gt;ejecutar-&gt;regedit y nos vamos a la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Apache2\Parameters\ConfigArgs y añadimos al inicio -D SSL el registro quedaria así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-D&lt;br /&gt;SSL&lt;br /&gt;-f&lt;br /&gt;C:\apache\Apache2\conf\httpd.conf&lt;br /&gt;-d&lt;br /&gt;C:\apache\Apache2\.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Reiniciamos el servicio apache y listo. Espero que le sea útil a alguien.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8007662621788058982?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8007662621788058982/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/11/habilitar-ssl-en-apache-2-para-windows.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8007662621788058982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8007662621788058982'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/11/habilitar-ssl-en-apache-2-para-windows.html' title='Habilitar SSL en Apache 2 para Windows'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1696215368833193548</id><published>2008-11-20T17:28:00.020+01:00</published><updated>2008-11-21T10:05:32.448+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><title type='text'>Como exponer datos en Microsoft SQL Server mediante SOA</title><content type='html'>Hay varias formas de extraer datos desde nuestras aplicaciones hacia una base de datos. Mediante conectores especificos del lenguaje se optiene un buen rendimiento, odbc, unixodbc, freeTDS,Dao, ...&lt;br /&gt;Las desventajas de estos protocolos es básicamente la interoperatibilidad entre lenguajes, es decir tener un determinado servidor de base de datos necesariamente va ligado a un conector específico para el lenguaje en que esté hecha la aplicación, esto a veces nos ata al software o dada la diversidad de lenguajes de un determinado entorno nos hace imposible mantener una serie de librerias (de pago o no) simplemente para conectar nuestras aplicaciones a una BD.&lt;br /&gt;Una solución a este problema podria ser la de publicar esos recursos en SOA que nos brinda la posibilidad de tranferir datos mediante el protocolo HTTP que lleva con nosotros desde el nacimiento de internet.&lt;br /&gt;Especificamente en MS SQL Server existe el acceso a datos SODA. En algunas bases de datos existen cosas parecidas (Oracle por ejemplo) pero no es un denominador común.&lt;br /&gt;&lt;a href="http://wso2.org/"&gt;WSO2&lt;/a&gt; nos introduce el concepto de Web Services Aplication Server y data services cimentado sobre axis2 la potente libreria SOA de apache.&lt;br /&gt;Con wso2 WSAS tenemos la posibilidad de crear servicios web sobre cualquier cosa, pero en este minitutorial reflejaré como exponer datos desde WSAS usando una base de datos MS SQL Server.&lt;br /&gt;Para ello nos logamos en la consola de administración y generamos un nuevo servicio de datos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SSWeJ4oQSSI/AAAAAAAAAJ0/VQKuEbTQItQ/s1600-h/nuevodataservice.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SSWeJ4oQSSI/AAAAAAAAAJ0/VQKuEbTQItQ/s320/nuevodataservice.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270792831564269858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Elegimos RDBS en el wizard.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SSWe_6IM_bI/AAAAAAAAAJ8/dyqjkHZFy6g/s1600-h/elegirRDBMS.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 189px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SSWe_6IM_bI/AAAAAAAAAJ8/dyqjkHZFy6g/s320/elegirRDBMS.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5270793759679643058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Después configuramos la fuente de datos con el conector jdbc de microsoft descargable desde la propia página de la compañia. (recordar ponerlo en el path del servidor), la cadena de conexión, el usuario y el password.&lt;br /&gt;&lt;br /&gt;Driver  com.microsoft.sqlserver.jdbc.SQLServerDriver&lt;br /&gt;Url  jdbc:sqlserver://XXX.XXX.XXX.XXX;&lt;br /&gt;User  test&lt;br /&gt;Password  test&lt;br /&gt;&lt;br /&gt;Quedaría algo así:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ0zoFQsnI/AAAAAAAAAKM/Fh7O9yk862M/s1600-h/conexion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 211px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ0zoFQsnI/AAAAAAAAAKM/Fh7O9yk862M/s320/conexion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5271028844165378674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay que fijarse bien en la cadena de conexión ya que por defecto wsas nos pone jdbc:microsoft:sqlserver:.... cuando debe ser jdbc:sqlserver://&lt;br /&gt;&lt;br /&gt;Despues de esto hay que realizar la query a la base de datos,mapear los campos y elegir obligatoriamente uno de ellos para agruparlos:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ2BE7WPOI/AAAAAAAAAKU/oFbu3JEjkEI/s1600-h/mapeodecampos.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 243px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ2BE7WPOI/AAAAAAAAAKU/oFbu3JEjkEI/s320/mapeodecampos.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5271030174758354146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se realiza un mapeo por cada campo con add new input mapping.&lt;br /&gt;En la siguiente pantalla agregamos una nueva operación que también llamaremos getText y mapeamos con nuestra query sql anterior.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-kQftsinPB8/SSZ3WA5bawI/AAAAAAAAAKk/KqHm2PNtctk/s1600-h/agregaroperacion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://4.bp.blogspot.com/_-kQftsinPB8/SSZ3WA5bawI/AAAAAAAAAKk/KqHm2PNtctk/s320/agregaroperacion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5271031633965443842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El servicio se despliega automáticamente y genera el wsdl 1.1 y 2.0 &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ30pQ4WJI/AAAAAAAAAKs/E_HhTn5znkk/s1600-h/wsdl.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://3.bp.blogspot.com/_-kQftsinPB8/SSZ30pQ4WJI/AAAAAAAAAKs/E_HhTn5znkk/s320/wsdl.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5271032160197302418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y ya está así de simple ahora solo nos queda probarlo desde el propio servidor WSAS que trae la funcionalidad con el enlace "try it".&lt;br /&gt;&lt;br /&gt;Una de las pegas que me he encontrado es que el wsdl que genera construya mal la url del servicio, poniendo por defecto la primera interfaz de red como url.&lt;br /&gt;Esto se puede corregir desde el cliente cambiando la dirección del endpoint a mano ,dependiendo del lenguaje que useis será más o menos fácil.&lt;br /&gt;&lt;br /&gt;Con este servicio evitamos el uso de un conector odbc y diversificamos el espectro de lenguajes que pueden ir desde javascript hasta java pasando por python, php...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1696215368833193548?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1696215368833193548/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/11/como-exponer-datos-en-microsoft-sql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1696215368833193548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1696215368833193548'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/11/como-exponer-datos-en-microsoft-sql.html' title='Como exponer datos en Microsoft SQL Server mediante SOA'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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://3.bp.blogspot.com/_-kQftsinPB8/SSWeJ4oQSSI/AAAAAAAAAJ0/VQKuEbTQItQ/s72-c/nuevodataservice.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-55955712566852273</id><published>2008-11-03T15:50:00.005+01:00</published><updated>2008-11-05T16:17:38.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><title type='text'>Error migrando plone a la versión 3.1.5.1</title><content type='html'>Migrando un sitio plone a la version 3 desde 2.5 me encuentro con que uno de los paquetes de plone da error el error es el siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;plone.app.portlets.portletcontext, line 81, in _getGroupIds&lt;br /&gt;AttributeError: getGroups&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mirando el código veo que en la linea que nos indica el error, en el fichero de la clase portlets, tengo el siguiente código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for g in self._getGroupIds():&lt;br /&gt;  cats.append((GROUP_CATEGORY, g,))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Viendo el sitio desde un usuario anonimo ¡¡¡se ve perfectamente!!! así que solo me queda pensar que la nueva maquinaria de portlets asocia portlets concretos a determinados grupos con el fallo de que para determinados usuarios la función _getGroupsIds no comprueba eficazmente los grupos a los que pertenece.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def _getGroupIds(self):&lt;br /&gt;        membership = getToolByName(self.context, 'portal_membership', None)&lt;br /&gt;        if membership is None or membership.isAnonymousUser():&lt;br /&gt;            return ()&lt;br /&gt;&lt;br /&gt;        member = membership.getAuthenticatedMember()&lt;br /&gt;        if not member:&lt;br /&gt;            return ()&lt;br /&gt;&lt;br /&gt;        groups = member.getGroups()&lt;br /&gt;&lt;br /&gt;        # Ensure we get the list of ids - getGroups() suffers some acquision&lt;br /&gt;        # ambiguity - the Plone member-data version returns ids.&lt;br /&gt;&lt;br /&gt;        for group in groups:&lt;br /&gt;            if type(group) not in StringTypes:&lt;br /&gt;                return ()&lt;br /&gt;&lt;br /&gt;        return sorted(groups)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Efectivamente si el usuario es anonimo o no es miembro retorna un array vacio de grupos pero parece ser que el objeto que devuelve member = membership.getAuthenticatedMember() no posee la funcion getGroups() (¿Se perdió en la migración por ser una versión más anticuada?).&lt;br /&gt;&lt;br /&gt;Para solucionarlo temporalmente (Es un parche muuuy cutre) opté por coger la excepción&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; try:&lt;br /&gt;   groups = member.getGroups()&lt;br /&gt; except: return ()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y retornar un array vacio en caso de que la clase member no tuviera definida la función.&lt;br /&gt;Ahora funciona perfectamente el sitio plone y se ha solucionado temporalmente el fallo aunque falta saber si existe una solución más elegante en la migración o la comunidad plone parchea el fallo a más bajo nivel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-55955712566852273?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/55955712566852273/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/11/error-migrando-plone-la-versin-3151.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/55955712566852273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/55955712566852273'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/11/error-migrando-plone-la-versin-3151.html' title='Error migrando plone a la versión 3.1.5.1'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8249714169784083270</id><published>2008-10-22T11:37:00.005+02:00</published><updated>2008-11-05T16:19:38.737+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><title type='text'>Conectar a un servicio web .NET desde python con SOAPpy</title><content type='html'>Soappy forma parte del proyecto ZSI y esta desfasado aun así es posible conectar con un servicio .NET de forma sencilla usando estas librerias. &lt;br /&gt;El proxy que genera la clase WSDL no funciona así que hay que hacerlo a mano con SOAPProxy esto es:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from SOAPpy import SOAPProxy&lt;br /&gt;s=SOAPProxy('http://xx.xx.xx.xx/Hello/HelloService.asmx',&lt;br /&gt;            namespace="http://tempuri.org/",&lt;br /&gt;            soapaction="http://tempuri.org/Hello")&lt;br /&gt;resultado = s.Hello()&lt;br /&gt;print resultado&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esto me ha sorprendido bastante por que en las pruebas que realize hace tiempo no conseguí conectarme y opté por usar la alternativa ZSI. Supongo que no usaria la versión 0.12 que es la última que se ha publicado. También se ha mejorado las librerias comunes wstools.&lt;br /&gt;De todos modos es una pena que esta libreria esté anticuada y se vaya a desaparecer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8249714169784083270?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8249714169784083270/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/10/conectar-un-servicio-web-net-desde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8249714169784083270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8249714169784083270'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/10/conectar-un-servicio-web-net-desde.html' title='Conectar a un servicio web .NET desde python con SOAPpy'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8434415664312531732</id><published>2008-09-23T12:35:00.017+02:00</published><updated>2008-09-25T15:01:21.601+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><title type='text'>Probando repoze.plone y repoze.zope bajo mod_wsgi</title><content type='html'>Por que si instalar plone bajo wsgi:&lt;br /&gt;- Nos ofrece la posibilidad de instalar middleware entre la salida y la entrada principal del framework controlando por ejemplo el formato de salida (realizando una transformacion xslt), controlar el acceso, etc ... de cualquier aplicación zope.&lt;br /&gt;- Puede convivir con otras aplicaciones que usen el estandard WSGI, por ejemplo django.&lt;br /&gt;- Con mod_wsgi bajo apache nos aporta gran escalabilidad y bajo consumo de memoria, Perfecto para sitios en producción.&lt;br /&gt;- Podemos hacer más simple la configuración en apache si se hace un uso intensivo de rewrite, es decir si lo tenemos como frontend.&lt;br /&gt;&lt;br /&gt;Por que no instalar plone bajo wsgi:&lt;br /&gt;- Bajo apache con mod_wsgi y con la configuración que nos deja repoze de apache en ${sandbox}/etc es muy lento. repoze.zope2 es algo más rápido bajo este entorno. (todas las pruebas se han realizado bajando un mismo fichero de 56k). Supongo que la carga en memoria de toda la maquinaria de plone pasa factura. Con la utilidad paster para exponer la aplicación wsgi pasa exactamente lo mismo.&lt;br /&gt;&lt;br /&gt;He basado la instalación en el manual de la página oficial de &lt;a href="http://repoze.org/quickstart.html"&gt;repoze&lt;/a&gt; y la configuracion sobre &lt;a href="http://plone.org/documentation/tutorial/install-plone-3-behind-apache-and-mod_wsgi-using-repoze/installing-and-configuring-a-plone-site-under-repoze"&gt;mod_wsgi&lt;/a&gt; en una máquina virtual con debian.&lt;br /&gt;&lt;br /&gt;Las pruebas de benchmarking sobre la página de inicio de plone fueron:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Concurrency Level:      10&lt;br /&gt;Time taken for tests:   44.329543 seconds&lt;br /&gt;Complete requests:      100&lt;br /&gt;Failed requests:        0&lt;br /&gt;Write errors:           0&lt;br /&gt;Total transferred:      2252100 bytes&lt;br /&gt;HTML transferred:       2220300 bytes&lt;br /&gt;Requests per second:    2.26 [#/sec] (mean)&lt;br /&gt;Time per request:       4432.954 [ms] (mean)&lt;br /&gt;Time per request:       443.295 [ms] (mean, across all concurrent requests)&lt;br /&gt;Transfer rate:          49.61 [Kbytes/sec] received&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Otros enlaces en los que se puede encontrar información al respecto es:&lt;br /&gt;- La página de martin aspeli donde explica por que repoze.plone puede ir &lt;a href="http://martinaspeli.net/articles/update-repoze-under-mod-wsgi-is-not-slow"&gt;lento&lt;/a&gt; y como &lt;a href="http://martinaspeli.net/articles/rolling-out-repoze"&gt;instalarlo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8434415664312531732?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8434415664312531732/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/09/probando-repozeplone-y-repozezope-bajo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8434415664312531732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8434415664312531732'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/09/probando-repozeplone-y-repozezope-bajo.html' title='Probando repoze.plone y repoze.zope bajo mod_wsgi'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6595331459148347201</id><published>2008-09-18T15:39:00.003+02:00</published><updated>2008-11-24T16:01:50.745+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Nuevas librerias Soap en python Suds</title><content type='html'>Leo en la página oficial de python que existen unas nuevas librerias para python llamadas suds.&lt;br /&gt;En la pagina oficial de &lt;a href="https://fedorahosted.org/suds/"&gt;suds&lt;/a&gt; podemos encontrar las primeras versiones de la libreria para python 2.5.&lt;br /&gt;La caracteristica que me llama la atención es que no usan generación de clases como hace ZSI, sino que todas las llamadas son generadas en ejecución.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; from suds.client import Client&lt;br /&gt;&gt;&gt;&gt; cliente=Client('[url].asmx?wsdl')&lt;br /&gt;&gt;&gt;&gt; print cliente&lt;br /&gt;suds ( version=0.2.9 )&lt;br /&gt;&lt;br /&gt;service ( Service )&lt;br /&gt;prefixes:&lt;br /&gt;ns0 = "http://tempuri.org/"&lt;br /&gt;methods (1):&lt;br /&gt;LoadHello(xs:string mensaje, xs:string nombre, )&lt;br /&gt;types (2):&lt;br /&gt;LoadHello&lt;br /&gt;LoadHelloResponse&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aunque el esfuerzo en python ZSI es similar el código que enmascara es infinitamente más complejo y en mi modesta opinión la simplicidad es un valor añadido a cualquier desarrollo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6595331459148347201?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6595331459148347201/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/09/nuevas-librerias-soap-en-python-suds.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6595331459148347201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6595331459148347201'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/09/nuevas-librerias-soap-en-python-suds.html' title='Nuevas librerias Soap en python Suds'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4635121570339951341</id><published>2008-08-27T13:55:00.013+02:00</published><updated>2008-11-24T16:02:16.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>KDE4 en eeepc</title><content type='html'>No lo he podido resistir y me he instalado &lt;a href="http://wiki.debian.org/DebianEeePC"&gt;Debian&lt;/a&gt; en mi mini portatil además KDE4 al contrario que la version 3 me gusta muchísimo más y me ha creado una adicción a sus plasmoids y menús y no he dudado en instalarlo.&lt;br /&gt;Este nuevo diseño de escritorio se ve muy bien en el eeepc con iconos grandes y un menu muy intuitivo.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="imagen de KDE4 en el eeepc 4G" src="http://icaro0.googlepages.com/eeepcKde4.JPG" width="300" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4635121570339951341?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4635121570339951341/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/08/kde4-en-eeepc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4635121570339951341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4635121570339951341'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/08/kde4-en-eeepc.html' title='KDE4 en eeepc'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1909166488473113741</id><published>2008-08-20T13:45:00.006+02:00</published><updated>2008-08-21T08:52:51.991+02:00</updated><title type='text'>Impresiones sobre eeepc de Asus</title><content type='html'>Simplemente me encanta mi nuevo juguete. La versión de linux que lleva instalada "Xandros" no está mal lo único que no me gusta es que tiene kde por defecto aunque la 3.4 es muy ligera la verdad.&lt;br /&gt;Lo primero como buen linuxero es customizar tu eeepc en estos links encontre varias soluciones a los problemas con los que me he ido encontrando hasta dejar mi miniportatil listo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.edugeek.net/wiki/index.php/EeePC_-_Linux_OS"&gt;http://www.edugeek.net/wiki/index.php/EeePC_-_Linux_OS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.eeeuser.com/"&gt;http://wiki.eeeuser.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1909166488473113741?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1909166488473113741/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/08/impresiones-sobre-eeepc-de-asus.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1909166488473113741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1909166488473113741'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/08/impresiones-sobre-eeepc-de-asus.html' title='Impresiones sobre eeepc de Asus'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2562850925580119820</id><published>2008-06-25T10:27:00.008+02:00</published><updated>2008-06-25T11:03:07.422+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><title type='text'>Aproximación de ZSI al standard WSGI VS soaplib</title><content type='html'>La libreria para generaci&amp;oacute;n de webservices ZSI ha incluido en su &amp;uacute;ltima versi&amp;oacute;n una aproximaci&amp;oacute;n al modelo wsgi. Y digo aproximaci&amp;oacute;n por que las primeras experiencias no han sido muy gratificantes.&lt;br /&gt;En primer lugar no es compatible con python 2.4 ya que la generaci&amp;oacute;n din&amp;aacute;mica del wsdl no puede encontar etree libreria incluida en el modulo xml de python 2.5 para ello hay que parchear el modulo wsgi.py situado en la carpeta twisted de ZSI.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;--- wsgiold.py 2007-11-01 21:33:34.000000000 +0100&lt;br /&gt;+++ wsgi.py 2008-06-03 20:21:52.000000000 +0200&lt;br /&gt;@@ -231,8 +231,15 @@&lt;br /&gt;     return type(f) is types.MethodType and getattr(f, 'soapmethod', False)&lt;br /&gt; &lt;br /&gt; def _resourceToWSDL(resource):&lt;br /&gt;-    from xml.etree import ElementTree&lt;br /&gt;-    from xml.etree.ElementTree import Element, QName&lt;br /&gt;+    try:&lt;br /&gt;+        from xml.etree import ElementTree&lt;br /&gt;+        from xml.etree.ElementTree import Element, QName&lt;br /&gt;+    except:&lt;br /&gt;+        try:&lt;br /&gt;+     from elementtree import ElementTree&lt;br /&gt;+     from elementtree.ElementTree import Element,QName&lt;br /&gt;+ except:&lt;br /&gt;+     raise "ElementTree is not in your system. Try install."&lt;br /&gt;     from ZSI.wstools.Namespaces import WSDL&lt;br /&gt;     &lt;br /&gt;     r = resource&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mi primer objetivo era que desde mod_wsgi pudiera exponer un servicio web desde apache y haciendolo con un wsdl aprobechando la generaci&amp;oacute;n din&amp;aacute;mica que ZSI parece incluir, pero el wsdl generado parece incluir un namespace que resetea la declaraci&amp;oacute;n anterior por lo que resulta inv&amp;aacute;lido.&lt;br /&gt;El servicio que he usado es el que viene en samples de ZSI 2.1 versi&amp;oacute;n alfa y para exponer el servicio he configurado la aplicacion wsgi adaptando el ejemplo de EchoService a modwsgi.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import sys&lt;br /&gt;sys.stdout = sys.stderr&lt;br /&gt;from EchoServer_client import *&lt;br /&gt;from wsgi import SOAPApplication, soapmethod,&lt;br /&gt; SOAPHandlerChainFactory,WSGIApplication&lt;br /&gt;class EchoService(SOAPApplication):&lt;br /&gt;  factory = SOAPHandlerChainFactory&lt;br /&gt;  wsdl_content = dict(name='Echo',&lt;br /&gt; targetNamespace='urn:echo', imports=(), portType='')&lt;br /&gt;&lt;br /&gt;  @soapmethod(EchoRequest.typecode,&lt;br /&gt; EchoResponse.typecode, operation='Echo', soapaction='Echo')&lt;br /&gt;  def soap_Echo(self, request, response, **kw):&lt;br /&gt;    response = request&lt;br /&gt;    return request,response&lt;br /&gt;&lt;br /&gt;app=WSGIApplication()&lt;br /&gt;app['echo']=EchoService()&lt;br /&gt;application = app&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como se puede observar la primera linea:&lt;br /&gt;import sys&lt;br /&gt;sys.stdout = sys.stderr&lt;br /&gt;redirijo las dos salidas estandard debido a que la librer&amp;iacute;a realiza llamadas a la funci&amp;oacute;n print de python y esto rompe con la pol&amp;iacute;tica de seguridad de mod_wsgi.&lt;br /&gt;Al final he usado el wsdl incluido con el ejemplo para conectar.&lt;br /&gt;Otra opción es usar la librer&amp;iacute;a soaplib que si tiene soporte completo para wsgi.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import os&lt;br /&gt;os.environ['PYTHON_EGG_CACHE'] = '/tmp/'&lt;br /&gt;from soaplib.wsgi_soap import SimpleWSGISoapApp&lt;br /&gt;from soaplib.service import soapmethod&lt;br /&gt;from soaplib.serializers.primitive import String, Integer, Array&lt;br /&gt;&lt;br /&gt;class HelloWorldService(SimpleWSGISoapApp):&lt;br /&gt;  @soapmethod(String,Integer,_returns=Array(String))&lt;br /&gt;  def say_hello(self,name,times):&lt;br /&gt;    results = []&lt;br /&gt;    for i in range(0,times):&lt;br /&gt;      results.append('Hello, %s'%name)&lt;br /&gt;    return results&lt;br /&gt;application=HelloWorldService()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es infin&amp;iacute;tamente más sencillo servir desde apache con este m&amp;oacute;dulo. La l&amp;iacute;nea os.environ['PYTHON_EGG_CACHE'] = '/tmp/' es importante si os instalais modulos desde egg por el tema de permisos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2562850925580119820?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2562850925580119820/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/06/aproximaci-de-zsi-al-standard-wsgi-vs.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2562850925580119820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2562850925580119820'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/06/aproximaci-de-zsi-al-standard-wsgi-vs.html' title='Aproximaci&amp;oacute;n de ZSI al standard WSGI VS soaplib'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-4487480937540251549</id><published>2008-06-17T10:12:00.002+02:00</published><updated>2008-06-17T10:16:03.671+02:00</updated><title type='text'>Abierta la edicion de comentarios</title><content type='html'>Desde hace algun tiempo deshabilité la creación de comentarios debido a se publicaba spam en algunos de ellos. Ahora los vuelvo abrir aunque espero que no vuelva a ocurrir, de todos modos seguiré borrando los mensajes de spam que se posteen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-4487480937540251549?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/4487480937540251549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/06/abierta-la-edicion-de-comentarios.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4487480937540251549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/4487480937540251549'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/06/abierta-la-edicion-de-comentarios.html' title='Abierta la edicion de comentarios'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-2238226544890877962</id><published>2008-06-03T10:30:00.005+02:00</published><updated>2008-12-11T12:28:40.435+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Blog system con mod_python, psp y mysql parte I</title><content type='html'>Instalación de todo el software necesario:&lt;br /&gt;Actualmente el modulo mod_wsgi pretende ser el sustituto de mod_python y seguramente este post este desactualizado. Aun así iré escribiendo este pequeño tutorial por que creo que en la diversidad está el gusto ;-).&lt;br /&gt;En mi caso y al usar debian la instalación la realizo mediante el gestor de paquetes apt. Los programas que he instalado son &lt;a href="http://httpd.apache.org/"&gt;apache2&lt;/a&gt; , &lt;a href="http://www.modpython.org/"&gt;libapache2-mod-python&lt;/a&gt;, &lt;a href="http://www.mysql.com"&gt;mysql&lt;/a&gt; y el paquete mysql para python &lt;a href="http://mysql-python.sourceforge.net/"&gt;python-mysqldb&lt;/a&gt;&lt;br /&gt;Lo primero que vamos a configurar es apache. Para ello nos vamos a /etc/apache2/ y editamos directamente el fichero http.conf tambien se puede configurar creando un ficheo de configuracion en sites-avaliable y linkando desde sites-enabled...&lt;br /&gt;El codigo quedaria asi:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;#quitando version de apache&lt;br /&gt;ServerSignature Off&lt;br /&gt;#quitando las cabeceras de respuesta http de la directiva Server&lt;br /&gt;ServerTokens Prod&lt;br /&gt;DocumentRoot /home/icaro/www/sitioMVC&lt;br /&gt;&lt;br /&gt;DirectoryIndex index.html index.psp index.py inicio.psp index.html.var inicio.html&lt;br /&gt;&amp;lt;Directory /home/icaro/www/sitioMVC/&amp;gt;&lt;br /&gt;&lt;br /&gt;  AddHandler mod_python .py .psp&lt;br /&gt;  PythonHandler mod_python.publisher | .py&lt;br /&gt;  PythonHandler mod_python.psp | .psp&lt;br /&gt;  PythonDebug On&lt;br /&gt;&lt;br /&gt;#quitando el listado en directorios con -Indexes&lt;br /&gt;  Options -Indexes -FollowSymLinks&lt;br /&gt;  AllowOverride None&lt;br /&gt;  Order allow,deny&lt;br /&gt;  allow from all&lt;br /&gt;#evitar el robo de las bases de datos sqlite(por si quieres crear apps en ese formato)&lt;br /&gt;  &amp;lt;FilesMatch "\.(sq2)"&amp;gt;&lt;br /&gt;  Order Deny,Allow&lt;br /&gt;  Deny from all&lt;br /&gt;  &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;#donde van a residir las css&lt;br /&gt;&amp;lt;Location /styles/&amp;gt;&lt;br /&gt;  SetHandler None&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;#donde estaran las imagenes&lt;br /&gt;&amp;lt;Location /img/&amp;gt;&lt;br /&gt;  SetHandler None&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;ErrorLog /var/log/apache2/python_error.log&lt;br /&gt;&lt;br /&gt;# Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt;# alert, emerg.&lt;br /&gt;LogLevel debug&lt;br /&gt;CustomLog /var/log/apache2/python_access.log combined&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bien ahora todos los ficheros .py pueden ejecutar el código python como publisher y los ficheros .psp como python server pages aunque yo prefiero renderizar las plantillas desde el publisher. En la página de mod_python existe información de como configurar apache.&lt;br /&gt;En un post próximo crearé los puntos de entrada a la app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-2238226544890877962?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/2238226544890877962/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/06/blog-system-con-modpython-psp-y-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2238226544890877962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/2238226544890877962'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/06/blog-system-con-modpython-psp-y-mysql.html' title='Blog system con mod_python, psp y mysql parte I'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-869864563916830418</id><published>2008-06-02T23:05:00.007+02:00</published><updated>2008-11-24T16:03:31.013+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Sitios web en python con Google App engine</title><content type='html'>Google app engine abre sus generosas puertas al público. Hoy mismo me he registrado en google app y he creado una aplicación web (un simple blog) de cartón piedra eso si. La verdad es que me ha gustado mucho poder programar con un framework tan simple y además en uno de mis lenguajes favoritos, python. En los próximos días me meteré en el modelo de datos para poder crear un interfaz de administración y poder crear entradas.&lt;br /&gt;La aplicación python en cuestión solo tiene la plantilla y los ficheros estáticos, pero con tiempo generaré el resto del backend. Podéis ver una prerelease de esta &lt;a href="http://montxoguerreroapp.appspot.com/"&gt;aplicacion&lt;/a&gt; y con el tiempo pretendo escribir un pequeño tutorial de los pasos que he seguido.&lt;br /&gt;Hasta muy pronto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-869864563916830418?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/869864563916830418/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/06/sitios-web-en-python-con-google-app.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/869864563916830418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/869864563916830418'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/06/sitios-web-en-python-con-google-app.html' title='Sitios web en python con Google App engine'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1651299765268738365</id><published>2008-05-16T11:09:00.004+02:00</published><updated>2008-05-16T11:22:11.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SEO'/><title type='text'>Google page Ranking y keydensity tool python script</title><content type='html'>Es posible calcular la densidad de palabras de tu sitio con un simple script en python y la libreria sgmlib. La densidad de palabras clave es un factor importante para los buscadores como google. Aquí pego un artículo interesante donde hablan del factor &lt;a href="http://www.chicaseo.com/keydensity-cuanto-ms-alto-es-mejor/"&gt;keydensity&lt;/a&gt;.&lt;br /&gt;Este código en parte esta sacado de este script &lt;a href="http://www.djangosnippets.org/snippets/221/"&gt;http://www.djangosnippets.org/snippets/221/&lt;/a&gt;&lt;br /&gt;He quitado las opciones que no me hacen falta y he agregado otra opcion de keydensity para realizar algunos de mis informes.&lt;br /&gt;Espero que os sirva.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;""" script original sacado de esta pagina&lt;br /&gt;http://www.djangosnippets.org/snippets/221/&lt;br /&gt;modificado por icaro&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;from urllib2 import *&lt;br /&gt;from sgmllib import SGMLParser&lt;br /&gt;#aqui puedes incluir todas las palabras que no quieres que aparezcan en tus estadisticas&lt;br /&gt;listaNegra=['a', 'ante', 'bajo', 'con', 'de', 'desde',&lt;br /&gt;            'durante', 'en', 'entre', 'excepto', 'hacia',&lt;br /&gt;            'hasta', 'mediante', 'para', 'por', 'salvo',&lt;br /&gt;            'seg\xfan', 'sin', 'sobre' , 'tras','el', 'la',&lt;br /&gt;            'lo', 'los', 'las','mi', 'tu', 'su', 'nuestro',&lt;br /&gt;            'vuestro','mis', 'tus', 'sus', 'nuestros',&lt;br /&gt;            'vuestros','y','que','porque','del','al']&lt;br /&gt;&lt;br /&gt;class extractorTexto(SGMLParser):&lt;br /&gt;  """clase que extrae todo el texto"""&lt;br /&gt;  def reset(self):&lt;br /&gt;    SGMLParser.reset(self)&lt;br /&gt;    self.texto=[]&lt;br /&gt;  def handle_data(self,data):&lt;br /&gt;    self.data=data&lt;br /&gt;    [self.texto.append(n.lower()) for n in data.split() if data is not None and n not in listaNegra]&lt;br /&gt;  def start_img(self,attrs):&lt;br /&gt;    for key,value in attrs:&lt;br /&gt;      if key=='alt':&lt;br /&gt;        [self.texto.append(n.lower()) for n in value.split() if value is not None and n not in listaNegra]&lt;br /&gt;  def start_a(self,attrs):&lt;br /&gt;    for key,value in attrs:&lt;br /&gt;      if key=='title':&lt;br /&gt;        [self.texto.append(n.lower()) for n in value.split() if value is not None and n not in listaNegra]&lt;br /&gt;&lt;br /&gt;class Counter:&lt;br /&gt;  """contamos los resultados"""&lt;br /&gt;  def __init__(self):&lt;br /&gt;    self.dict = {}&lt;br /&gt;  def add(self, item):&lt;br /&gt;    count = self.dict.get(item, 0)&lt;br /&gt;    self.dict[item] = count + 1&lt;br /&gt;  def counts(self, desc=None):&lt;br /&gt;    """ cuenta las coincidencias"""&lt;br /&gt;    result = map(None, self.dict.values(),self.dict.keys( ))&lt;br /&gt;    result.sort()&lt;br /&gt;    if desc: result.reverse()&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;def densidadClaves(url,proxy=''):&lt;br /&gt;  if proxy!='':&lt;br /&gt;    proxy_handler = ProxyHandler({'http': '%s'%proxy})&lt;br /&gt;    opener = build_opener(proxy_handler)&lt;br /&gt;  else:&lt;br /&gt;    opener=build_opener()&lt;br /&gt;  htmlopener = opener.open('%s'%url)&lt;br /&gt;  htmlcode=htmlopener.read()&lt;br /&gt;  &lt;br /&gt;  parser=extractorTexto()&lt;br /&gt;  parser.feed(htmlcode)&lt;br /&gt;  total=float(len(parser.texto))&lt;br /&gt;  &lt;br /&gt;  resultados=open('resultados.txt','a')&lt;br /&gt;  c= Counter()&lt;br /&gt;  for n in parser.texto: c.add(n)&lt;br /&gt;  for numero,valor in c.counts(desc=1):resultados.write('%s %s %f\n'%(numero,valor,(float(numero)/total)*100))&lt;br /&gt;  &lt;br /&gt;  htmlopener.close()&lt;br /&gt;  parser.close()&lt;br /&gt;  resultados.close()&lt;br /&gt;&lt;br /&gt;#Google Ranking&lt;br /&gt;&lt;br /&gt;def  IntStr(String, Integer, Factor):&lt;br /&gt;  for i in range(len(String)) :&lt;br /&gt;    Integer *= Factor&lt;br /&gt;    Integer &amp;= 0xFFFFFFFF&lt;br /&gt;    Integer += ord(String[i])&lt;br /&gt;  return Integer&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def HashURL(Str):&lt;br /&gt;  C1 = IntStr(Str, 0x1505, 0x21)&lt;br /&gt;  C2 = IntStr(Str, 0, 0x1003F)&lt;br /&gt;&lt;br /&gt;  C1 &gt;&gt;= 2&lt;br /&gt;  C1 = ((C1 &gt;&gt; 4) &amp; 0x3FFFFC0) | (C1 &amp; 0x3F)&lt;br /&gt;  C1 = ((C1 &gt;&gt; 4) &amp; 0x3FFC00) | (C1 &amp; 0x3FF)&lt;br /&gt;  C1 = ((C1 &gt;&gt; 4) &amp; 0x3C000) | (C1 &amp; 0x3FFF)&lt;br /&gt;&lt;br /&gt;  T1 = (C1 &amp; 0x3C0) &lt;&lt; 4&lt;br /&gt;  T1 |= C1 &amp; 0x3C&lt;br /&gt;  T1 = (T1 &lt;&lt; 2) | (C2 &amp; 0xF0F)&lt;br /&gt;&lt;br /&gt;  T2 = (C1 &amp; 0xFFFFC000) &lt;&lt; 4&lt;br /&gt;  T2 |= C1 &amp; 0x3C00&lt;br /&gt;  T2 = (T2 &lt;&lt; 0xA) | (C2 &amp; 0xF0F0000)&lt;br /&gt;&lt;br /&gt;  return (T1 | T2)&lt;br /&gt; &lt;br /&gt;def CheckHash(HashInt):&lt;br /&gt;  HashStr = "%u" % (HashInt)&lt;br /&gt;  Flag = 0&lt;br /&gt;  CheckByte = 0&lt;br /&gt;&lt;br /&gt;  i = len(HashStr) - 1&lt;br /&gt;  while i &gt;= 0:&lt;br /&gt;    Byte = int(HashStr[i])&lt;br /&gt;    if 1 == (Flag % 2):&lt;br /&gt;        Byte *= 2;&lt;br /&gt;        Byte = Byte / 10 + Byte % 10&lt;br /&gt;    CheckByte += Byte&lt;br /&gt;    Flag += 1&lt;br /&gt;    i -= 1&lt;br /&gt;&lt;br /&gt;  CheckByte %= 10&lt;br /&gt;  if 0 != CheckByte:&lt;br /&gt;    CheckByte = 10 - CheckByte&lt;br /&gt;    if 1 == Flag % 2:&lt;br /&gt;      if 1 == CheckByte % 2:&lt;br /&gt;        CheckByte += 9&lt;br /&gt;      CheckByte &gt;&gt;= 1&lt;br /&gt;&lt;br /&gt;  return '7' + str(CheckByte) + HashStr&lt;br /&gt;&lt;br /&gt;def RetPr(url,proxy=''):&lt;br /&gt;  from urllib2 import ProxyHandler,build_opener&lt;br /&gt;  import urllib&lt;br /&gt;  hsh = CheckHash(HashURL(url))&lt;br /&gt;  gurl = 'http://www.google.com/search?client=navclient-auto&amp;features=Rank:&amp;q=info:%s&amp;ch=%s' % (urllib.quote(url), hsh)&lt;br /&gt;  &lt;br /&gt;  if proxy!='':&lt;br /&gt;    proxy_handler = ProxyHandler({'http': '%s'%proxy})&lt;br /&gt;    opener = build_opener(proxy_handler)&lt;br /&gt;  else:&lt;br /&gt;    opener=build_opener()&lt;br /&gt;  htmlopener = opener.open(gurl)&lt;br /&gt;  st=htmlopener.read()&lt;br /&gt;  st = st.lstrip().rstrip()&lt;br /&gt;  st = st[9:]&lt;br /&gt;  try:&lt;br /&gt;    st = int(st)&lt;br /&gt;  except:&lt;br /&gt;    st = 0&lt;br /&gt;  return st&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;  import sys&lt;br /&gt;  if len(sys.argv) &lt; 3:&lt;br /&gt;    print '[-]Duh. Uso: python keydensity.py PR [url] [Proxy]'&lt;br /&gt;    sys.exit()&lt;br /&gt;  &lt;br /&gt;  if sys.argv[1] == 'PR':&lt;br /&gt;    if len(sys.argv)==3:&lt;br /&gt;      print '[+]Ranking: ',RetPr(sys.argv[2])&lt;br /&gt;    if len(sys.argv)==4:&lt;br /&gt;      print '[+]Ranking: ',RetPr(sys.argv[2],sys.argv[3])&lt;br /&gt;    &lt;br /&gt;  if sys.argv[1] == 'KD':&lt;br /&gt;    if len(sys.argv)==3:&lt;br /&gt;      densidadClaves(sys.argv[2])&lt;br /&gt;    if len(sys.argv)==4:&lt;br /&gt;      densidadClaves(sys.argv[2],sys.argv[3])&lt;br /&gt;    print '[+]Generado el archivo resultados.txt'&lt;br /&gt;    &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/3812840746656887122-1651299765268738365?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1651299765268738365/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/05/google-page-ranking-y-keydensity-tool.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1651299765268738365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1651299765268738365'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/05/google-page-ranking-y-keydensity-tool.html' title='Google page Ranking y keydensity tool python script'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6984542016355988602</id><published>2008-04-30T13:43:00.005+02:00</published><updated>2008-04-30T13:50:06.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Prevenir el robo de imagenes en Apache</title><content type='html'>Si se dispone de mod_rewrite es posible prevenir que otras webs incluyan nuestras imágenes como suyas con esta sencilla directiva en el http.conf&lt;br /&gt;RewriteCond %{HTTP_REFERER} !^http://(.+\.)?tudominio\.es/ [NC]&lt;br /&gt;RewriteCond %{HTTP_REFERER} !^$&lt;br /&gt;RewriteRule .*\.(jpe?g|gif|bmp|png|jpg)$ /imgs/NoCopies.jpg [L]&lt;br /&gt;El truco lo encontré en esta página &lt;a href="http://css-tricks.com/techniques-for-fighting-image-theft/"&gt;http://css-tricks.com/techniques-for-fighting-image-theft/&lt;/a&gt; decir que en la documentacion de apache viene también otra forma de hacerlo pero no conseguí hacerlo funcionar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6984542016355988602?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6984542016355988602/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/04/prevenir-el-robo-de-imagenes-en-apache.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6984542016355988602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6984542016355988602'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/04/prevenir-el-robo-de-imagenes-en-apache.html' title='Prevenir el robo de imagenes en Apache'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-674526042179684593</id><published>2008-04-29T15:06:00.007+02:00</published><updated>2008-04-29T17:28:09.871+02:00</updated><title type='text'>Estadísticas de búsqueda local en plone con apache como front-end</title><content type='html'>Uno de los datos interesantes que todo webmaster debe tener encuenta son las búsquedas que los usuarios hacen en el portal, esas palabras clave pueden servir para definir que interés suscita el contenido del sitio y poder aplicar algunas técnicas de &lt;a href="http://es.wikipedia.org/wiki/Data_Mining"&gt;mineria de datos&lt;/a&gt; a los mismos. Pues bien para todos aquellos que tengais apache como front-end de plone os interesará este script en python que genera unas estadísticas de las búsquedas realizadas por los usuarios.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import re&lt;br /&gt;from glob import glob&lt;br /&gt;class Counter:&lt;br /&gt;  def __init__(self):&lt;br /&gt;    self.dict = {}&lt;br /&gt;  def add(self, item):&lt;br /&gt;    count = self.dict.get(item, 0)&lt;br /&gt;    self.dict[item] = count + 1&lt;br /&gt;  def counts(self, desc=None):&lt;br /&gt;    """ cuenta las coincidencias"""&lt;br /&gt;    result = map(None, self.dict.values(),self.dict.keys( ))&lt;br /&gt;    result.sort()&lt;br /&gt;    if desc: result.reverse()&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;total=[]&lt;br /&gt;for log in glob('/home/www/logs/web.log.*'):&lt;br /&gt;  datos = open(log,'r').read()&lt;br /&gt;  busquedas =re.findall(&lt;br /&gt;r'GET /instanciaplone/search\?SearchableText=[\w+\-%]*',datos)&lt;br /&gt;  total = total + busquedas&lt;br /&gt;&lt;br /&gt;c= Counter()&lt;br /&gt;for n in total: c.add(n)&lt;br /&gt;f=open('resultados.xml','wa')&lt;br /&gt;f.write("""&amp;lt;?xml version='1.0'?&amp;gt;""")&lt;br /&gt;for m in c.counts(desc=1): f.write("""&amp;lt;terminoBusqueda&amp;gt;&lt;br /&gt;  &amp;lt;reiteraciones&amp;gt;%s&amp;lt;/reiteraciones&amp;gt;&lt;br /&gt;  &amp;lt;frase&amp;gt;%s&amp;lt;/frase&amp;gt;&lt;br /&gt;&amp;lt;/terminoBusqueda&amp;gt;&lt;br /&gt;"""%(m[0],m[1]))&lt;br /&gt;f.close()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La clase Counter es un ejemplo del libro Python Cookbook de O´Reilly, la segunda parte del script lee todos los ficheros de log y hace una busqueda con la expresión regular 'GET /instanciaplone/search\?SearchableText=[\w+\-%]*' &lt;span style="font-style:italic;"&gt;(Sin duda mejorable)&lt;/span&gt; y por último sobre el total de coincidencias generamos el xml.&lt;br /&gt;Una vez generado el fichero xml podemos exportarlo fácilmente a una base de datos, generar un grafico dinámicamente con los datos y google chart api para python o lo que la imaginación nos proponga.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from pygooglechart import PieChart2D&lt;br /&gt;chart = PieChart2D(int(300*1.7),300)&lt;br /&gt;chart.add_data([31,29,28,19])&lt;br /&gt;chart.set_pie_labels(['python','zope','apache','wsgi'])&lt;br /&gt;print """&amp;lt;img src="%s" &lt;br /&gt;alt="reporting de datos" /&amp;gt;""" %(chart.get_url())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El resultado seria:&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?cht=p&amp;chs=510x300&amp;chd=s:953l&amp;chl=python|zope|apache|wsgi" alt="gráfico comparativo de búsquedas en un sitio imaginario" /&gt;&lt;br /&gt;&lt;br /&gt;O también podemos generar los gráficos con alguna otra herramienta como gnuplot.py, &lt;a href="http://plone.org/documentation/how-to/add-charts"&gt;pychart&lt;/a&gt; o incluso con PIL directamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-674526042179684593?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/674526042179684593/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/04/estadsticas-de-bsqueda-local-en-plone.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/674526042179684593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/674526042179684593'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/04/estadsticas-de-bsqueda-local-en-plone.html' title='Estadísticas de búsqueda local en plone con apache como front-end'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-7304792874336517166</id><published>2008-04-24T12:21:00.003+02:00</published><updated>2008-11-24T16:03:55.121+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Cacharreando con django</title><content type='html'>&lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt; es un framework de desarrollo en python de lo más interesante. Los chicos de google app debieron de pensar lo mismo cuando prácticamente han desarrollado su "applicación" basandose en algunas de sus librerias y su filosofia.&lt;br /&gt;Me gustan mucho el sistema de modelos que usan para la persistencia es algo muy parecido a lo que hace zope (salvando las distancias) con sus clases.&lt;br /&gt;Otros puntos que me ha gustado son su sistema de plantillas, su velocidad y su simplicidad para aplicar el modelo MVC.&lt;br /&gt;Lo que no me ha gustado es la forma de gestionar las urls, que puede ser un tanto enrevesada al principio y quiza la dependencia con los módulos de bases de datos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-7304792874336517166?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/7304792874336517166/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/04/cacharreando-con-django.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7304792874336517166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7304792874336517166'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/04/cacharreando-con-django.html' title='Cacharreando con django'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-1059341807613716736</id><published>2008-04-04T08:59:00.009+02:00</published><updated>2008-12-09T03:23:08.071+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Configurar Zope 3 con mod_wsgi</title><content type='html'>Zope ha incluido en su version 3 un modulo para wsgi un estandard de comunicaciones para aplicaciones web recogido como estandard python en el siguiente enlace http://www.python.org/dev/peps/pep-0333/. Un cambio en la forma de exponer aplicaciones que desde luego se convierte en un punto interesante desde que aparece en escena el modulo para apache mod_wsgi.&lt;br /&gt;Para configurar zope 3 con mod_wsgi se da por supuesto que se han instalado &lt;a href="http://www.apache.org/"&gt;apache 2&lt;/a&gt;, &lt;a href="http://www.python.org/"&gt;python 2.4&lt;/a&gt; y &lt;a href="http://www.modwsgi.org/"&gt;mod_wsgi&lt;/a&gt; correctamente.&lt;br /&gt;La configuracion que he usado en mi http.conf es la siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;WSGIScriptAlias /wsgi /home/wsgiWWW/&lt;br /&gt;WSGIPassAuthorization On&lt;br /&gt;WSGIDaemonProcess user=www-data group=www-data processes=5 threads=25&lt;br /&gt;ErrorLog /var/log/apache2/python_error.log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y dentro de /home/wsgiWWW/ incluimos el script zope.wsgi:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from zope.app import wsgi&lt;br /&gt;application = wsgi.getWSGIApplication(&lt;br /&gt;              '/home/zope34/etc/zope.conf',&lt;br /&gt;              '/usr/lib/zope3/lib/python/zope/app/server/schema.xml')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Otra forma de hacerlo seria:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Read all configuration files and bring up the component architecture&lt;br /&gt;&lt;br /&gt;args = ["-C/home/zope34/etc/zope.conf"]&lt;br /&gt;db = setup(load_options(args))&lt;br /&gt;&lt;br /&gt;# Initialize the WSGI-compliant publisher application with the database&lt;br /&gt;&lt;br /&gt;application=WSGIPublisherApplication(db)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Estas configuraciones estan recogidas en el readme.txt del modulo wsgi de zope 3 por lo que es conveniente revisarlo.&lt;br /&gt;Pero hay un error interno de servidor constante que hay que subsanar me refiero a este:&lt;br /&gt;fcntl.flock(file.fileno(), _flags),....&lt;br /&gt;IOError: [Errno 11] Resource temporarily unavailable....&lt;br /&gt;Es evidente que con la configuracion por defecto de zope 3 estamos accediendo a la base de datos (mismo fichero) desde diferentes procesos e hilos lo que produce un error de concurrencia.&lt;br /&gt;La solución más inmediata es configurar zope con zeo ya que de esta forma soporta varios procesos leyendo concurrentemente(que no escribiendo), la configuracion que nos queda en zope seria entonces por parte del servidor zeo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;zeo&gt;&lt;br /&gt;  address 3333&lt;br /&gt;  read-only false&lt;br /&gt;  invalidation-queue-size 100&lt;br /&gt;  # pid-filename $INSTANCE/var/ZEO.pid&lt;br /&gt;  # monitor-address PORT&lt;br /&gt;  # transaction-timeout SECONDS&lt;br /&gt;&lt;/zeo&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y en el cliente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;zeoclient&gt;&lt;br /&gt;    server localhost:3333&lt;br /&gt;    storage 1&lt;br /&gt;#    # ZEO client cache, in bytes&lt;br /&gt;    cache-size 20MB&lt;br /&gt;#    # Uncomment to have a persistent disk cache&lt;br /&gt;#    #client zeo1&lt;br /&gt;  &lt;/zeoclient&gt;&lt;br /&gt;&lt;/zodb&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Algunas capturas:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-kQftsinPB8/R_XcfVFETsI/AAAAAAAAAEg/c4qiUChHo-M/s1600-h/zope3mod_wsgi.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_-kQftsinPB8/R_XcfVFETsI/AAAAAAAAAEg/c4qiUChHo-M/s320/zope3mod_wsgi.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5185292976779448002" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-1059341807613716736?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/1059341807613716736/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/04/configurar-zope-3-con-modwsgi.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1059341807613716736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/1059341807613716736'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/04/configurar-zope-3-con-modwsgi.html' title='Configurar Zope 3 con mod_wsgi'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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://1.bp.blogspot.com/_-kQftsinPB8/R_XcfVFETsI/AAAAAAAAAEg/c4qiUChHo-M/s72-c/zope3mod_wsgi.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3812840746656887122.post-7030987962324493399</id><published>2008-03-17T13:04:00.006+01:00</published><updated>2008-04-24T12:20:56.373+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Blog system con mod_python, psp y mysql</title><content type='html'>En la pagina web de mod_python y si buscamos un poco por internet veremos que hay poca información referente a la programación de aplicaciones web con este fantástico módulo de apache que nos permite embeber un interprete de python en el servidor para generar contenido web a partir de código en python.&lt;br /&gt;En una serie de pequeños articulos describiré como construir un sistema de blog muy elemental desde 0.&lt;br /&gt;Los pasos que se darán serán estos:&lt;br /&gt;- Instalación de todo el software necesario: Apache,mod_python,mysql-python, mysql.&lt;br /&gt;- Configuración de todo el software.&lt;br /&gt;- Creación de tablas en mysql.&lt;br /&gt;- Diseño del sitio.&lt;br /&gt;- Programación del core de la aplicación.&lt;br /&gt;- Programación de las plantillas.&lt;br /&gt;- Programación de la administración del sitio con sesiones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-7030987962324493399?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/7030987962324493399/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/03/blog-system-con-modpython-psp-y-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7030987962324493399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7030987962324493399'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/03/blog-system-con-modpython-psp-y-mysql.html' title='Blog system con mod_python, psp y mysql'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-6651292546802815302</id><published>2008-03-13T15:35:00.005+01:00</published><updated>2008-03-17T10:08:13.405+01:00</updated><title type='text'>Ocultar la barra de blogger con jquery</title><content type='html'>Seguro que hay formas mucho mas elegantes de ocultar la barra de blogger he visto sitios donde simplemente la hace invisible con estilos aka display:none; pero una solucion intermedia seria ocultar temporalmente la barra hasta que alguien quiera usarla y para ello no tiene mas que pasar el puntero del raton por encima de la cabecera del sitio.&lt;br /&gt;Aqui pego el script que he usado:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="http://tusitioweb/jquery.js"&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;$(document).ready(&lt;br /&gt;function(){&lt;br /&gt; $('#navbar').hide('slow');&lt;br /&gt; $('#header-wrapper').mouseover(&lt;br /&gt; function () {&lt;br /&gt; $('#navbar').show('slow');&lt;br /&gt; }&lt;br /&gt; );&lt;br /&gt; $('#content-wrapper').mouseover(function(){$('#navbar').hide('slow')});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si alguien sabe alguna forma mas elegante de resolverlo que no dude en postear. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-6651292546802815302?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/6651292546802815302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/03/ocultar-la-barra-de-blogger-con-jquery.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6651292546802815302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/6651292546802815302'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/03/ocultar-la-barra-de-blogger-con-jquery.html' title='Ocultar la barra de blogger con jquery'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-698810060109364290</id><published>2008-03-12T14:09:00.010+01:00</published><updated>2008-11-24T16:04:27.944+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Nueva Versión de ZSI, uso de ServiceProxy para conectar con servicios .NET</title><content type='html'>La nueva versión de ZSI 2.1 en fase alfa nos permite hacer uso de ServiceProxy para conectar con un servicio web .net sin problemas. En la version 2.0 da problemas con el address binding.&lt;br /&gt;Pasos que he seguido:&lt;br /&gt;1- uso de wsdl2py para la generacion de los tipos.&lt;br /&gt;2- uso de ServiceProxy para generar una instancia de proxy soap.&lt;br /&gt;3- llamadas al servicio.&lt;br /&gt;Una vez generados los tipos mediante wsdl2py creamos nuestro cliente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from ZSI.ServiceProxy import ServiceProxy&lt;br /&gt;s=ServiceProxy('http://dummy/myservice.asmx?wsdl')&lt;br /&gt;print "[+]metodos que soporta el servidor."&lt;br /&gt;print s._methods&lt;br /&gt;res = s.getMeSome(_param1='some str param',_param2='')&lt;br /&gt;print "[+]respuesta soap del servidor."&lt;br /&gt;print res['_respuesta'][:30],'....'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El proceso de generar clientes para este tipo de servicios se agiliza bastante :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-698810060109364290?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/698810060109364290/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/03/nueva-versin-de-zsi-uso-de-serviceproxy.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/698810060109364290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/698810060109364290'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/03/nueva-versin-de-zsi-uso-de-serviceproxy.html' title='Nueva Versión de ZSI, uso de ServiceProxy para conectar con servicios .NET'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-3131165568805731670</id><published>2008-03-07T09:17:00.002+01:00</published><updated>2008-04-24T12:04:56.582+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Consumir un servicio web .NET desde Python ZSI</title><content type='html'>He encontrado algun sitio de &lt;a href="http://users.skynet.be/pascalbotte/"&gt;referencia&lt;/a&gt; donde se expone como conectar con los servicios web basados en .NET de tres formas posibles:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Con el uso de la utilidad wsdl2py, la cual genera una serie de librerias a partir de un wsdl. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otra es la generación manual de los typecodes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otra opción es realizar la petición enviando el xml con httplib o urllib.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Y la última opcion consiste en el uso de ServiceProxy&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt; Con la utilidad ZSI wsdl2py conecto sin problemas, con la opcion manual de generación de typecodes tenia el problema del namespace, ya que sin él, el servicio web .NET no es capaz de deserializar los parametros(lo que es lógico desde un punto de vista xml pero otros servicios son bastante más flexibles). Con ServiceProxy actualmente da problemas con la direccion de binding y es que el wsdl que genera MS no se entiende muy bien con ZSI en la direccion por lo que habria que modificarlo a mano, aunque unas pruebas preliminares con otros servicios que antes no funcionaban con esta opción ahora si lo hacen en la version 2.1 por lo que tengo que probarlo.&lt;br /&gt;La opción de enviar el xml directamente la he descartado.&lt;br /&gt;&lt;br /&gt;Aquí os dejo el codigo que he usado para conectar con un servicio .Net sin el uso de la utilidad wsdl2py, para este caso concreto he tenido que definir a mano en el typecode el namespace para cada uno de los elementos. La petición LoadReportXML recibe dos parametros de tipo string, la respuesta LoadReportXMLResponse devuelve un parametro de tipo string también.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import sys&lt;br /&gt;from ZSI.client import Binding&lt;br /&gt;from ZSI import TC&lt;br /&gt;&lt;br /&gt;class LoadReportXML:&lt;br /&gt;  def __init__(self,reportName,nodeList):&lt;br /&gt;    self.reportName=reportName&lt;br /&gt;    self.nodeList=nodeList&lt;br /&gt;LoadReportXML.typecode = TC.Struct(LoadReportXML,&lt;br /&gt;                         [TC.String('reportName',&lt;br /&gt;                                    unique=True,&lt;br /&gt;                                    typed=False),&lt;br /&gt;                          TC.String('nodeList',&lt;br /&gt;                                    unique=True,&lt;br /&gt;                                    typed=False)],&lt;br /&gt;                                   'LoadReportXML',&lt;br /&gt;                                   inline=1)&lt;br /&gt;LoadReportXML.typecode.nspname='http://tempuri.org/'&lt;br /&gt;LoadReportXML.typecode.ofwhat[0].nspname='http://tempuri.org/'&lt;br /&gt;LoadReportXML.typecode.ofwhat[1].nspname='http://tempuri.org/'&lt;br /&gt;&lt;br /&gt;class LoadReportXMLResponse:&lt;br /&gt;  def __init__(self,LoadReportXMLResult=''):&lt;br /&gt;    self.LoadReportXMLResult = LoadReportXMLResult&lt;br /&gt;&lt;br /&gt;LoadReportXMLResponse.typecode = TC.Struct(LoadReportXMLResponse,&lt;br /&gt;                      [TC.String('LoadReportXMLResult',&lt;br /&gt;                                 unique=True,&lt;br /&gt;                                 typed=False)],&lt;br /&gt;                       'LoadReportXMLResponse',&lt;br /&gt;                       inline=1)&lt;br /&gt;LoadReportXMLResponse.typecode.nspname='http://tempuri.org/'&lt;br /&gt;LoadReportXMLResponse.typecode.ofwhat[0].nspname='http://tempuri.org/'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;b=Binding(url='https://mm/InformesService/service.asmx',&lt;br /&gt;          soapaction='http://tempuri.org/LoadReportXML')&lt;br /&gt;try:&lt;br /&gt;  res = b.RPC('https://mm/InformesService/service.asmx',&lt;br /&gt;              'LoadReportXML',&lt;br /&gt;              LoadReportXML('firstparam','secondparam'),&lt;br /&gt;              LoadReportXMLResponse.typecode)&lt;br /&gt;except:&lt;br /&gt;  raise&lt;br /&gt;open('report.xml','w').write(res.LoadReportXMLResult)&lt;br /&gt;&lt;br /&gt;&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/3812840746656887122-3131165568805731670?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/3131165568805731670/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2008/03/consumir-un-servicio-web-net-desde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3131165568805731670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/3131165568805731670'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2008/03/consumir-un-servicio-web-net-desde.html' title='Consumir un servicio web .NET desde Python ZSI'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-8850750028160514197</id><published>2007-12-10T15:13:00.001+01:00</published><updated>2008-04-27T23:08:47.167+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Mandar mail con mensaje adjunto desde python</title><content type='html'>Una alternativa en zope al envio de emails desde su cliente MailHost mediante dtml es crear un metodo externo que use la libreria smtplib.&lt;br /&gt;El metodo externo que yo estoy probando seria este:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import smtplib&lt;br /&gt;from email.MIMEMultipart import MIMEMultipart&lt;br /&gt;from email.MIMEBase import MIMEBase&lt;br /&gt;from email.Encoders import encode_base64&lt;br /&gt;&lt;br /&gt;def enviarCorreo(fromaddr, toaddrs, file):&lt;br /&gt;    """funcion para enviar 1 adjunto con un email"""&lt;br /&gt;    msg = MIMEMultipart('related')&lt;br /&gt;    msg['From'] = fromaddr&lt;br /&gt;    msg['To'] = toaddrs&lt;br /&gt;    msg['Subject'] = 'asunto'&lt;br /&gt;    #adjunto&lt;br /&gt;    adjunto = MIMEBase('application', "octet-stream")&lt;br /&gt;    adjunto.set_payload(open(file, "rb").read())&lt;br /&gt;    encode_base64(adjunto)&lt;br /&gt;    adjunto.add_header('Content-Disposition', 'attachment; filename = "%s"' % file)&lt;br /&gt;    msg.attach(adjunto)&lt;br /&gt;    #enviar&lt;br /&gt;    server = smtplib.SMTP('dummy.server.com')&lt;br /&gt;    server.set_debuglevel(1)&lt;br /&gt;    server.sendmail(fromaddr, toaddrs, msg.as_string())&lt;br /&gt;    server.quit()&lt;br /&gt;    return&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;    enviarCorreo('lala','dummy@mail.com','excel.xls')&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creo que el codigo es autoexplicativo y desde luego es mejorable en temas de seguridad( comprobar nombres, usar un usuario para mandar email, etc...) pero para empezar no está nada mal. Espero que os sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-8850750028160514197?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/8850750028160514197/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2007/12/mandar-mail-con-mensaje-adjunto-desde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8850750028160514197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/8850750028160514197'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2007/12/mandar-mail-con-mensaje-adjunto-desde.html' title='Mandar mail con mensaje adjunto desde python'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-100648702363736939</id><published>2007-12-05T23:53:00.000+01:00</published><updated>2007-12-06T18:36:50.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope'/><title type='text'>Zope Ram Cache Manager</title><content type='html'>&lt;span style="font-family:arial;"&gt;Después de mucho tiempo trasteando con Zope descubro uno de los servicios más interesantes a mi modo de ver en entornos de producción. Se trata del RAM Cache Manager una herramienta de extremada utilidad en estos casos. El caso es que en uno de los sitios web que he programado en zope he optado por generar todo el contenido como objetos zope, al contrario de otras veces que registraba plantillas, imagenes y otro elementos desde el sistema de ficheros, lo he hecho en el propio framework y he agregado un cache por memoria RAM y los resultados son sorprendentes:&lt;br /&gt;Con la herramienta ab de apache medí el tiempo de latencia para 1000 peticiones 10 de ellas concurrentes.&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Sin cache por ram ni siquiera dio resultados en alguna de las ejecuciones en otras me daba 3 o 4 peticiones por segundo.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Con el cache esto se incrementó a más de 150 peticiones por segundo, casi ni se nota la recarga de la pagina, por no decir que las peticiones que realizan algunas funciones de la aplicación que se conectan por xml-rpc a otro servidor zope no son necesarias mientras dure el cache por lo que descarga la renderización de esas partes de la plantilla.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-100648702363736939?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/100648702363736939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2007/12/despus-de-mucho-tiempo-trasteando-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/100648702363736939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/100648702363736939'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2007/12/despus-de-mucho-tiempo-trasteando-con.html' title='Zope Ram Cache Manager'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</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-3812840746656887122.post-7530691039526852142</id><published>2007-12-04T23:36:00.000+01:00</published><updated>2007-12-04T23:46:38.350+01:00</updated><title type='text'>Bienvenido al mundo ¿web 2.0?</title><content type='html'>Pues aquí empieza mi camino como blogger. Dicen que esto es una revolución, que ha cambiado la forma de comunicar. Eso es web 2.0 dicen, aunque también hay gente que no lo tiene claro, los que más años llevan en esto me dicen que es lo de siempre con una mano de pintura.&lt;br /&gt;Continuará...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3812840746656887122-7530691039526852142?l=icaro0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://icaro0.blogspot.com/feeds/7530691039526852142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://icaro0.blogspot.com/2007/12/bienvenido-al-mundo-web-20.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7530691039526852142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3812840746656887122/posts/default/7530691039526852142'/><link rel='alternate' type='text/html' href='http://icaro0.blogspot.com/2007/12/bienvenido-al-mundo-web-20.html' title='Bienvenido al mundo ¿web 2.0?'/><author><name>ICARO</name><uri>http://www.blogger.com/profile/17683581346799404059</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
