tag:blogger.com,1999:blog-171563942024-03-14T11:26:07.752-04:00Programación LibreCesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-17156394.post-50824762192213910962013-04-02T16:10:00.000-04:302013-04-02T16:10:20.872-04:30Virtualbox para un Linux con Kernel 2.6.38-2-686-bigmemDespués de mucho tiempo sin escribir, creo que es bueno retomar algunos apuntes, ya saben, por sí se me olvida ;-)<br />
<br />
En una serie de equipos PC recién adquiridos en la oficina, y que vienen con Canaima GNU/Linux preinstalado, necesitamos virtualizar el SO M$ Windows XP (sí, el viejo XP).<br />
<br />
Canaima GNU/Linux V-3.0 con actualizaciones a la fecha, que incluyen:
<br />
<b>$ uname -r</b><br />
<b>2.6.38-2-686-bigmem
</b><br />
<b><br /></b>
<b>$ aptitude show gcc-4.4</b><br />
<b>Paquete: gcc-4.4 </b><br />
<b>Nuevo: sí</b><br />
<b>Estado: instalado</b><br />
<b>Instalado automáticamente: no</b><br />
<b>Versión: 4.4.6-7</b><br />
<b><br /></b>
<div>
con lo cual, el virtualbox que viene por defecto en los repos no funciona.</div>
<div>
Googleando un poco, encontré [0] que instalando la versión 4 de virtualbox, es suficiente y funciona perfectamente... claro! ahí no dice va a funcionar con el kernel y compilador en cuestión! tuve que probar!</div>
<div>
De manera que:</div>
<div>
Añadir en el repositorio (sources.list)</div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; text-align: center;">deb http://download.virtualbox.org/virtualbox/debian squeeze contrib non-free</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; text-align: center;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;">Agregar la llave pública:</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; text-align: center;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; text-align: center;">wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px; text-align: center;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;">Actualizar:</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;"><b>aptitude update</b></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;"><b><br /></b></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;">Instalar:</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: center;"><b>aptitude install dkms</b></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px;">aptitude install virtualbox-4.0</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; font-weight: bold; line-height: 18px;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;">Listo! ahora, sólo faltaría agregarlo al menú ya que ésta instalación no lo hace.</span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"><br /></span></div>
<div>
<span style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;">Pendientes,</span></div>
<div>
<br /></div>
<div>
[0] <a href="http://usandocanaima.blogspot.com/2011/05/instalar-virtualbox-en-canaima-30.html">http://usandocanaima.blogspot.com/2011/05/instalar-virtualbox-en-canaima-30.html</a></div>
Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-72122888164436289052012-08-03T10:50:00.000-04:302012-08-03T10:50:07.901-04:30Actualizar el valor de un campo, a partir del campo de otra tabla<br />
UPDATE tabla1<br />
SET tabla1.campo = tabla2.campo<br />
FROM tabla2 WHERE tabla1.campo_id = tabla2.campo_id<br />
<br />
La documentación oficial, siempre tan amable ;-)<br />
<a href="http://www.postgresql.org/docs/8.3/static/sql-update.html">http://www.postgresql.org/docs/8.3/static/sql-update.html</a><br />Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-84016891468312883412010-11-01T21:41:00.004-04:302010-11-01T21:57:30.426-04:30Actualizar desde postgresql-8.1 a postgresql-8.3Cosas de cosas... en la oficina tenemos un servidor que estaba en etch y bueno, luego de revisar que tanto tenía funcionando, tomar la decisión... lo más importante es el servidor Postgresql así que a actualizarlo!<br /><br />De dónde saqué cómo hacerlo? pues, el aptitude muy completo me lanzó:<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyR3vnXfnVWOT90ou6M2vknOktbilHEuJKtuQOlJ3zKj9vJYLAsBaAUb8GrCXfK0t9FPaXw9hjHqhlUrE-0bUW-ryoh2WpPXtoIWlUXW2ykh0NOtPyyZeJyq0uT-8But-QZ0o0/s1600/Pantallazo-2.png"><img style="cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyR3vnXfnVWOT90ou6M2vknOktbilHEuJKtuQOlJ3zKj9vJYLAsBaAUb8GrCXfK0t9FPaXw9hjHqhlUrE-0bUW-ryoh2WpPXtoIWlUXW2ykh0NOtPyyZeJyq0uT-8But-QZ0o0/s320/Pantallazo-2.png" alt="" id="BLOGGER_PHOTO_ID_5534770751046388498" border="0" /></a><br />Con lo que le pregunté a Google y me devolvió, entre otras cosas[0]:<br /><br />Primeramente debe instalar las últimas versiones de los paquetes (postgresql-8.3 y postgresql-client-8.3)<br /><span style="font-family:courier new;"># aptitude install postgresql-8.3</span><br />Tenga en cuenta que la instalación de postgresql-8.3 creará automáticamente un clúster por omisión 8.3/main. Tiene que borrar el clúster 8.3 existente<br /><span style="font-family:courier new;"># pg_dropcluster --stop 8.3 main</span><br />Luego, necesita actualizar el clúster 8.1/main a 8.3<br /><span style="font-family:courier new;"># pg_upgradecluster 8.1 main</span><br />Posteriormente, elimina el clúster 8.1/main después de actualizar los clústers que tenga.<br /><span style="font-family:courier new;"># pg_dropcluster 8.1 main</span><br />Por último, elimina los paquetes postgresql-8.1 y postgresql-client-8.1<br /><span style="font-family:courier new;"># aptitude purge postgresql-8.1 postgresql-client-8.1<br /><br />Gracias gente!<br /><br /><br />[0]http://glosario-x.blogspot.com/2009/11/actualizar-desde-postgresql-81.html<br /></span>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-50222085607937571922010-10-01T11:25:00.002-04:302010-10-01T12:10:18.304-04:30Montando un Multisitio web con DrupalMontando un Multisitio web con Drupal - séptima parte<br /><br />Un multisitio es una características de algunos CMS que permiten crear varios sitios distintos utilizando código en forma compartida, y por ende, un mismo núcleo o base del CMS.[1]<br /><br />Es así como podemos tener varios sitios con una administración más cómoda y sencilla. Claro que cada sitio puede tener sus propios temas y módulos, compartir unos ya existentes en el sitio por defecto... sí lo hay.<br /><br />El proceso que describiremos será para un nuevo sitio, dentro de una instalación de drupal ya en funcionamiento, pero que podrá repetirse para sucesivos nuevos sitios.<br /><br />Vale decir que estos pasos llegan gracias al valeroso aporte de ilo a través del irc de drupal-es en freenode ;-) quien amablemente me pidió que nombre a documentadosDOTcom[2]<br /><br />Prerequesitos:<br /><ul><li>Linux</li><li>un sitrio con Drupal funcionando<br /></li></ul>La receta:<br /><ul><li><span style="font-size:100%;">editar el /etc/hosts</span> <span style="font-size:100%;">y añadir: <span style="font-weight: bold;">127.0.0.1 prueba</span></span></li><li><span style="font-size:100%;">ir a: cd drupal/sites</span></li><li><span style="font-size:100%;">crear el directorio: <span style="font-weight: bold;">mkdir</span> <span style="font-weight: bold;">prueba</span></span></li><li><span style="font-size:100%;"><span>copiar</span><span>:</span><span style="font-weight: bold;"> </span></span><span style="font-size:100%;">default/default-settings.php prueba/</span></li><li><span style="font-size:100%;">copiar prueba/default-settings.php prueba/settings.php</span></li><li><span style="font-size:100%;">en el navegador, ir </span><span style="font-size:100%;">a <a href="http://prueba/drupal">http://prueba/drupal</a></span></li></ul><br />[1]http://cuencodigital.com/articulos/multisitios_en_drupal.html<br />[2]http://www.documentados.com/Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-3308247477169806242010-07-02T09:42:00.003-04:302010-07-02T09:51:24.391-04:30crosstab para consultas de tablas cruzadasEsta no le he necesitado aún, pero me puse a revisarla para ver qué tal funciona y ver sí luego se le puede sacar provecho.<div><br /></div><div>La documentación oficial[0] habla por sí sola, sobre lo que se quiere. hacerla funcionar no es complicado, pero tiene su engaño.</div><div><br /></div><div>Lo que se tiene:</div><div><blockquote><br />SELECT est_002::text, agri02_002::text, count(*)::numeric<br />FROM consulta_agri04 GROUP BY agri02_002, est_002 ORDER BY est_002, agri02_002;<br />est_002 | agri02_002 | count<br />----------+------------------------+-------<br />Mérida | CACAO | 83<br />Mérida | CAFE | 169<br />Mérida | CAÑA | 68<br />Mérida | CEREALES Y LEGUMINOSAS | 421<br />Mérida | FRUTALES | 746<br />Mérida | HORTALIZAS | 1277<br />Mérida | ORNAMENTALES | 41<br />Mérida | RAICES Y TUBERCULOS | 484<br />Táchira | CACAO | 12<br />Táchira | CAFE | 29<br />Táchira | CAÑA | 1<br />Táchira | CEREALES Y LEGUMINOSAS | 310<br />Táchira | FRUTALES | 209<br />Táchira | HORTALIZAS | 451<br />Táchira | RAICES Y TUBERCULOS | 222<br />Trujillo | CAFE | 26<br />Trujillo | CAÑA | 20<br />Trujillo | CEREALES Y LEGUMINOSAS | 97<br />Trujillo | FRUTALES | 174<br />Trujillo | HORTALIZAS | 361<br />Trujillo | RAICES Y TUBERCULOS | 127<br /></blockquote>Lo que se quiere:<br /><blockquote><br />est_002 |CACAO |CAFE |CAÑA<br />Mérida |83 |169 |68<br />Táchira |12 |29 |1<br />Trujillo | |26 |20<br /></blockquote>con ésta consulta verifico cuántas columnas tendré:</div><div>SELECT DISTINCT agri02_002 FROM consulta_agri04 ORDER BY agri02_002, ya que luego voy a necesitar esa información para definir la salida.</div><div><br /></div><div>SELECT est_002, agri02_002, count(*)::numeric </div><div><br /></div><div>Acá defindo, como primer campo, la columna pivote, el segunda campo, serán las columnas, y el tercer campo, los valores a rellenar en la tabla.</div><div><br /></div><div>Acá defino as columnas de salida en la tabla:</div><div>AS lista(estado text, renglon1 text, renglon2 text, renglon3 text, renglon4 text, renglon5 text, renglon6 text, renglon7 text, renglon8 text)</div><div><br /></div><div>primer campo, el pivot, los demás serán tantos como me devuelva la consulta con el DISTINCT.</div><div><br /></div><div>De esta amnera, la consulta completa queda:</div><div><div>SELECT * FROM public.crosstab</div><div>(</div><div> 'SELECT est_002, agri02_002, count(*)::numeric FROM consulta_agri04 GROUP BY agri02_002, est_002 ORDER BY est_002, agri02_002',</div><div> 'SELECT DISTINCT agri02_002 FROM consulta_agri04 ORDER BY agri02_002'</div><div>) AS lista(estado text, renglon1 text, renglon2 text, renglon3 text, renglon4 text, renglon5 text, renglon6 text, renglon7 text, renglon8 text);</div><div><br /></div><div>y devuelve:</div><div><div>estado | renglon1 | renglon2 | renglon3 | renglon4 | renglon5 | renglon6 | renglon7 | renglon8</div><div>----------+----------+----------+----------+----------+----------+----------+----------+----------</div><div> Mérida | 83 | 169 | 68 | 421 | 746 | 1277 | 41 | 484</div><div> Táchira | 12 | 29 | 1 | 310 | 209 | 451 | | 222</div><div> Trujillo | | 26 | 20 | 97 | 174 | 361 | | 127</div><div>(3 filas)</div></div></div><div><br /></div><div><br /></div><div><br /></div><div>[0]http://www.postgresql.org/docs/8.3/interactive/tablefunc.html</div>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-17526248651836730022010-04-16T08:56:00.004-04:302010-10-06T17:12:39.177-04:30Configuración y ejecución con PL / R (PLR) en PostgreSQL<div><div><i><span class="Apple-style-span" style="font-family:arial;">Algunos de los datos aquí provistos, provienen de [0], los cuales se encuentran en Inglés.</span></i></div><div><br /></div><div>R es tanto un lenguaje como un medio para hacer el análisis estadístico. R está disponible como software libre bajo la GPL. Para aquellos familiarizados con entornos como S, MatLab, y SAS - R tiene el mismo propósito. Tiene poderosas construcciones para la manipulación de matrices, los paquetes para importar datos de fuentes de datos diversas como bases de datos relacionales, csv, hojas de cálculo, entre otras.</div><div><br /></div><div>PL / R es una extensión del lenguaje de PostgreSQL que le permite escribir funciones PostgreSQL y funciones de agregación en el lenguaje estadístico R.</div><div><br /></div><div>Con el lenguaje R puede escribir cosas como funciones de agregación para calcular la mediana, que no existe de forma nativa en PostgreSQL y sólo existe en una pocas bases de datos relacionales de forma nativa (por ejemplo Oracle) se me ocurre. Incluso en la función de Oracle no aparece hasta la versión 10.</div><div><br /></div><div>Otro uso popular de R es para hacer diagramas de Voronoi...</div><div><br /></div><div>Cuando se combina esto con PostGIS tiene un ambiente extremadamente poderoso para hacer cosas como <i>vecino más cercano</i> y <i>búsquedas planeación de instalaciones</i>.</div><div><br /></div><div><b>Instalando R</b></div><div><br /></div><div>En Debian Linux, aptitude install r-cran-base para obtener R. Sí a alguien se le ocurre hacer un search podrá encontrar un montón de cosas adicionales para R, como módulos por ejemplo, que cada quien instalará según necesite o quiera.</div><div><br /></div><div><b>Instalando PL/R</b></div><div><br /></div><div>En la lista de postgresql-es, cuando pregunté, Alvaro Herrera me respondió: "¿Probaste apt-get install postgresql-8.3-plr ?". ciertamente lo había buscado en los repos de Debian, pensando que quizás existía, y no lo había encontrado, asumí que sólo conseguiría el tar.gz de la página oficial de PL/R [1], pero, se me ocurrió preguntarle a google y zas! Ubuntu sí que lo tiene en un repos, así que me descargue el .deb a ver qué tal me iba, y bueno... dpkg -i y listo!</div><div><br /></div><div>Por ahí leí que había que decirle a postgresql dónde está R, y la seña era agregar <span class="Apple-style-span" style="font-family:'lucida grande';">R_HOME = '/usr/lib/R/'</span> a environment de postresql (en /etc). Reiniciar postgresql</div><div><br /></div><div><b>Agregando el lenguaje a la BD</b></div><div><br /></div><div>Luego, me di cuenta que un simple createlang plr no funcionaba, así que volví a google y... [2] psql -d mi_bd < /usr/share/postgresql/8.3/plr.sql. Ojo, es posible que esté en otro lado</div><div><br /></div><div><b>Probando PL/R</b></div><div><br /></div><div><div>SELECT * FROM plr_environ();</div><div>SELECT load_r_typenames();</div><div>SELECT * FROM r_typenames();</div><div>SELECT plr_array_accum('{23,35}', 42);</div><div><br /></div><div>Next try to create a helper function (this was copied from (http://www.joeconway.com/plr/doc/plr-pgsql-support-funcs.html) - and test with the following</div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); white-space: pre;font-size:medium;" ><span class="Apple-style-span" style="font-family:'times new roman';">CREATE OR REPLACE FUNCTION plr_array (text, text) RETURNS text[] AS '$libdir/plr','plr_array' LANGUAGE 'C' WITH (isstrict);<br />select plr_array('hello','world');</span></span></div></div></div><br /><b>Creating Median Function in PostgreSQL using R</b><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51);font-family:courier;font-size:medium;" ><pre>create or replace function r_median(_float8) returns float as 'median(arg1)' language 'plr';<br />CREATE AGGREGATE median (sfunc = plr_array_accum, basetype = float8, stype = _float8, finalfunc = r_median );<br />create table foo(f0 int, f1 text, f2 float8);<br />insert into foo values(1,'cat1',1.21);<br />insert into foo values(2,'cat1',1.24);<br />insert into foo values(3,'cat1',1.18);<br />insert into foo values(4,'cat1',1.26);<br />insert into foo values(5,'cat1',1.15);<br />insert into foo values(6,'cat2',1.15);<br />insert into foo values(7,'cat2',1.26);<br />insert into foo values(8,'cat2',1.32);<br />insert into foo values(9,'cat2',1.30);<br />select f1, median(f2) from foo group by f1 order by f1;</pre></span><div>[0]http://www.bostongis.com/PrinterFriendly.aspx?content_name=postgresql_plr_tut01</div><div>[1]http://www.joeconway.com/web/guest/pl/r</div><div>[2]http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg589297.html</div></div>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-72745758253644827612010-03-02T08:14:00.002-04:302010-03-02T08:18:21.859-04:30Las universidades españolas acuerdan promover el software libreBuenas noticias para el código libre: la Conferencia de Rectores de las Universidades Españolas o <span class="caps">CRUE</span>, una asociación de 74 universidades públicas y privadas, ha acordado en una reunión que <strong>las universidades impulsarán los programas de código libre</strong> para situarse “en una posición de referencia en el ámbito de nuevas tecnologías”.<br /><br /><br />Ciertamente, aún queda mucho camino que recorrer en el tema del uso de software libre como prioridad para el aprovechamiento de los recursos en la parte acedémica, pero puede ser un avance...<br /><br />La noticia completa <a href="http://www.genbeta.com/actualidad/las-universidades-espanolas-acuerdan-promover-el-software-libre">aquí</a>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-800325880477389592010-01-15T20:03:00.002-04:302010-01-15T20:06:56.761-04:30Instalando una impresora nueva: Epson Stylus T20Agradecimientos públicos a otro blog [0]<br /><br />El primer paso es descargar el archivo desde la web:<br /><br /><span style="font-weight: bold;">http://www.ircdshells.com.ar/linux/epson-pips.tar.gz</span><br /><br />Entramos al directorio donde sea que sea que hayamos descargado el archivo, en mi caso:<br /><br /><span style="font-weight: bold;"># cd /home/emmanuel/Desktop</span><br /><br />Descomprimimos el archivo:<br /><br /><span style="font-weight: bold;"># tar zxvf epson-pips.tar.gz</span><br /><br /><span style="font-weight: bold;"># cd epson-pips</span><br /><br />Instalamos los drivers:<br /><br /><span style="font-weight: bold;"># sudo dpkg -i *.deb</span><br /><br />Copiamos el archivo "ekpd":<br /><br /><span style="font-weight: bold;"># sudo cp ekpd /etc/init.d/ekpd</span><br /><br />Damos Permiso de Ejecucion:<br /><br /><span style="font-weight: bold;"># sudo chmod +x /etc/init.d/ekpd</span><br /><br />Agregamos ekpd para que se ejecute al inicio:<br /><br /># <span style="color: red;"><span style="color: rgb(0, 0, 0); font-weight: bold;">sudo update-rc.d ekpd defaults</span><br /><br /></span>Instalamos 2 librerias:<br /><br /><span style="font-weight: bold;"># sudo apt-get install libtiff4 libpng3</span><br /><br />Creamos el siguiente enlace simbolico:<br /><br /><span style="font-weight: bold;"># sudo ln -s /usr/lib/libtiff.so.4.2.1 /usr/lib/libtiff.so.3</span><br /><br />Copiamos el archivo de configuracion:<br /><br /><span style="font-weight: bold;"># sudo cp /usr/local/EPAva/printer/st20/ekpdrc_st20 /etc/ekpdrc</span><br /><br />Apartir de este punto, la impresora debe estar conectada!<br /><br />Ejecutamos la aplicacion "ekpd-tool":<br /><br /><span style="font-weight: bold;"># sudo ekpd-tool</span><br /><br />En mi caso los valores que puse son los siguientes:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4E39hbwXqvn2bs-ixu56nekEspiOvtBVq3Z-Dh7WemGOooOg5d5orwQht42cVrbeGATNfgS-TV28EBkcnLZRwRg4ShiCux8XMN-Sjrymx67cKnWIGvljNAzsuHXcQkyaBFGNi/s1600-h/ekdp-tool.png"><img style="cursor: pointer; width: 320px; height: 166px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4E39hbwXqvn2bs-ixu56nekEspiOvtBVq3Z-Dh7WemGOooOg5d5orwQht42cVrbeGATNfgS-TV28EBkcnLZRwRg4ShiCux8XMN-Sjrymx67cKnWIGvljNAzsuHXcQkyaBFGNi/s320/ekdp-tool.png" alt="" id="BLOGGER_PHOTO_ID_5337031012427638706" border="0" /></a><br /><br />Ahora iniciamos el demonio ekpd:<br /><br /><span style="font-weight: bold;"># sudo /etc/init.d/ekpd start</span><br /><br />Ahora abrimos el configurador de impresoras, y taran! ahí ta!<br /><br />[0]http://linuxapuntes.blogspot.com/2009/05/instalar-impresora-epson-stylus.htmlCesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-83204716695562303502010-01-04T12:33:00.003-04:302010-01-04T12:37:39.356-04:30FLISOL 2010<div>El evento Latinoamericano más importante, en su edición 2010, será el próximo sábado 24 de abril, y Mérida no escapará a esta oportunidad.</div><div><br /></div><div>Aún se está montando el evento, pero como todos los años, es un encuentro de experiencias que dejan emociones y satisfacciones.</div><div><br /></div><a href="http://www.installfest.info/FLISOL2010/Venezuela/Merida">Festival Latinoamericano de Instalación de Software LIbre</a><div><br /></div><div>Pendientes!</div>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-39304836314494526452009-12-16T15:55:00.001-04:302009-12-16T15:58:01.944-04:30Buscar y Reemplazar texto desde la cónsola<div>Buscar y Reemplazar texto desde la cónsola en varios archivos y sus subdirectorios</div><div><br /></div><div>http://www.guatewireless.org/buscar-y-reemplazar-texto-en-todos-los-archivos-dentro-de-un-directorio-y-todos-los-subdirectorios/</div><div><br /></div>find ./ "*.php" | xargs perl -pi -e 's/user=yoyoyoyo/user=tambien/g'Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-63227392251589307962009-10-27T17:15:00.003-04:302009-10-27T17:19:59.940-04:30Sabiduría para programarRecientemente leí en el histórica de la lista de postgresql, en palabras de Alvaro Herrera, algo así como: <blockquote>No le digas como lo va a hacer, dile qué es lo que tiene que hacer</blockquote>. Palabras que hoy en día me sonaron, por mucho, llenas de sabiduría... ¿a qué se refería? era parte de una respuesta a una programación del lado de la Base de Datos... mejorar la programación, el rendimiento del motor, etc...<br /><br />Haré el intento de conseguir las palabras exactas...<br /><blockquote></blockquote>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-84584953328977969792009-10-16T13:13:00.005-04:302009-10-19T17:53:14.343-04:30Insertar varios registros sí no existeBueno... es posible que esta idea este extraña, pero así es como lo tenemos.<br /><br />Nuestro código político está más o menos así:<br /><span style="font-family:courier new;"> \d region</span><br /><span style="font-family:courier new;"> Tabla «public.region»</span><br /><span style="font-family:courier new;"> Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+---------------</span><br /><span style="font-family:courier new;"> reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> reg_002 | character varying(35) | not null</span><br /><span style="font-family:courier new;">Índices:</span><br /><span style="font-family:courier new;"> «region_pkey» PRIMARY KEY, btree (reg_001)</span><br /><br /><span style="font-family:courier new;">\d estado</span><br /><span style="font-family:courier new;"> Tabla «public.estado»</span><br /><span style="font-family:courier new;"> Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+---------------</span><br /><span style="font-family:courier new;"> reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> est_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> est_002 | character varying(35) | not null</span><br /><span style="font-family:courier new;">Índices:</span><br /><span style="font-family:courier new;"> «estado_pkey» PRIMARY KEY, btree (est_001)</span><br /><span style="font-family:courier new;"> «estado_ukey» UNIQUE, btree (reg_001, est_001)</span><br /><span style="font-family:courier new;">Restricciones de llave foránea:</span><br /><span style="font-family:courier new;"> «estado_fkey» FOREIGN KEY (reg_001) REFERENCES region(reg_001) ON UPDATE CASCADE ON DELETE RESTRICT</span><br /><br /><span style="font-family:courier new;"> \d municipio</span><br /><span style="font-family:courier new;"> Tabla «public.municipio»</span><br /><span style="font-family:courier new;"> Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+---------------</span><br /><span style="font-family:courier new;"> reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> est_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> mun_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> mun_002 | character varying(35) | not null</span><br /><span style="font-family:courier new;">Índices:</span><br /><span style="font-family:courier new;"> «municipio_ukey» UNIQUE, btree (reg_001, est_001, mun_001)</span><br /><span style="font-family:courier new;">Restricciones de llave foránea:</span><br /><span style="font-family:courier new;"> «municipio_fkey» FOREIGN KEY (est_001) REFERENCES estado(est_001) ON UPDATE CASCADE ON DELETE RESTRICT</span><br /><br /><span style="font-family:courier new;"> \d parroquia</span><br /><span style="font-family:courier new;"> Tabla «public.parroquia»</span><br /><span style="font-family:courier new;"> Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+---------------</span><br /><span style="font-family:courier new;"> reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> est_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> mun_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> par_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> par_002 | character varying(35) | not null</span><br /><span style="font-family:courier new;">Índices:</span><br /><span style="font-family:courier new;"> «parroquia_ukey» UNIQUE, btree (reg_001, est_001, mun_001, par_001)</span><br /><br /><span style="font-family:courier new;">\d centro_poblado</span><br /><span style="font-family:courier new;"> Tabla «public.centro_poblado»</span><br /><span style="font-family:courier new;"> Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+-------------------------------------------------------------</span><br /><span style="font-family:courier new;"> reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> est_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> mun_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> par_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;"> cpo_001 | character varying(3) | not null</span><br /><span style="font-family:courier new;"> cpo_002 | character varying(50) | not null</span><br /><span style="font-family:courier new;"> id | integer | not null default nextval('centro_poblado_id_seq'::regclass)</span><br /><br />Y para el registro de datos, existe la posibilidad de que el detalle no llegue sino hasta la parroquia, por ejemplo, por lo que habría que seleccionar un Centro Poblado del tipo 'No Aplica', pero, un 'No Aplica' por cada parroquia existente, son como... muchos! al menos para insertarlos manualmente y uno por uno, así que decidí estudiar un poquito y ver cómo lo hacía vía plpgsql, he aquí el resultado:<br /><span style="font-family:courier new;">CREATE OR REPLACE FUNCTION leer(out a varchar) RETURNS SETOF varchar LANGUAGE plpgsql AS $$</span><br /><span style="font-family:courier new;">DECLARE</span><br /><span style="font-family:courier new;"> r record;</span><br /><span style="font-family:courier new;"> p varchar := '01';</span><br /><span style="font-family:courier new;">BEGIN</span><br /><span style="font-family:courier new;"> -- recorrer la tabla tantas veces como parroquias existan</span><br /><span style="font-family:courier new;"> FOR r IN SELECT par_001 FROM centro_poblado GROUP BY par_001 LOOP</span><br /><span style="font-family:courier new;"> -- recorrer la tabla tantas veces como parroquias existan y centros poblados con código igual a '000' existan</span><br /><span style="font-family:courier new;"> FOR r IN SELECT COUNT(*) AS cuenta FROM centro_poblado WHERE par_001 = p AND cpo_001 = '000' LOOP</span><br /><span style="font-family:courier new;"> -- inicializo 'a'</span><br /><span style="font-family:courier new;"> a = r.cuenta;</span><br /><span style="font-family:courier new;"> -- sí a leido como entero, es igual a cero, es porque no existe un centro poblado con código igual a '000'</span><br /><span style="font-family:courier new;"> IF (a::int = 0) THEN</span><br /><span style="font-family:courier new;"> -- insertar el registro</span><br /><span style="font-family:courier new;"> INSERT INTO centro_poblado (reg_001, est_001, mun_001, par_001, cpo_001, cpo_002) VALUES ('06', '14', '01', p, '000', 'No Aplica');</span><br /><span style="font-family:courier new;"> END IF;</span><br /><span style="font-family:courier new;"> -- incremento para pasar a la siguiente parroquia</span><br /><span style="font-family:courier new;"> p := '0'|| p::int + 1;</span><br /><span style="font-family:courier new;"> -- paso a la siguiente parroquia</span><br /><span style="font-family:courier new;"> RETURN next;</span><br /><span style="font-family:courier new;"> END LOOP;</span><br /><span style="font-family:courier new;"> END LOOP;</span><br /><span style="font-family:courier new;">END;</span><br /><span style="font-family:courier new;">$$;</span><br /><br />Seguro, alguien consigue otra forma de hacerlo mejor, pero al menos sirve... También es posible ir lanzando algunas notificaciones para saber por dónde y cómo va, tal como <span style="font-family:courier new;">RAISE NOTICE ' Parroquia tiene %',p;</span> pero es a gusto de cada quien...<br /><br />Listo! yo mismo lo hice de otra forma:<br /><br />--<br />-- funcion para insertar no aplica para parroquias<br />--<br /><span style="font-family: courier new;">CREATE OR REPLACE FUNCTION insertar_no_aplica_centro_poblado(e varchar, out a varchar) RETURNS SETOF varchar LANGUAGE plpgsql AS $$</span><br /><span style="font-family: courier new;">DECLARE</span><br /><span style="font-family: courier new;"> l record;</span><br /><span style="font-family: courier new;"> r record;</span><br /><span style="font-family: courier new;"> p record;</span><br /><span style="font-family: courier new;">BEGIN</span><br /><span style="font-family: courier new;"> create temp table audit_tmp (usuario integer, ip inet, ocurrencia timestamp default now());</span><br /><span style="font-family: courier new;"> -- listar todas las parroquias y municipios agrupadas</span><br /><span style="font-family: courier new;"> FOR l IN SELECT mun_001 FROM centro_poblado WHERE est_001 = e GROUP BY mun_001 ORDER BY mun_001 LOOP</span><br /><span style="font-family: courier new;"> FOR r IN SELECT par_001 FROM centro_poblado WHERE est_001 = e AND mun_001 = l.mun_001 GROUP BY par_001 ORDER BY par_001 LOOP</span><br /><span style="font-family: courier new;"> FOR p IN SELECT cpo_001 FROM centro_poblado WHERE est_001 = e AND mun_001 = l.mun_001 AND par_001 = r.par_001 GROUP BY cpo_001 ORDER BY cpo_001 LOOP</span><br /><span style="font-family: courier new;"> IF (p.cpo_001 = '000') THEN</span><br /><span style="font-family: courier new;"> RAISE NOTICE 'No Aplica para : %', r.par_001;</span><br /><span style="font-family: courier new;"> EXIT;</span><br /><span style="font-family: courier new;"> ELSE</span><br /><span style="font-family: courier new;"> insert into audit_tmp values (1, '127.0.0.1');</span><br /><span style="font-family: courier new;"> RAISE NOTICE 'Insertando para la parroquia : %', r.par_001;</span><br /><span style="font-family: courier new;"> INSERT INTO centro_poblado (reg_001, est_001, mun_001, par_001, cpo_001, cpo_002) VALUES ('06', e, l.mun_001, r.par_001, '000', 'No Aplica');</span><br /><span style="font-family: courier new;"> EXIT;</span><br /><span style="font-family: courier new;"> END IF;</span><br /><span style="font-family: courier new;"> END LOOP;</span><br /><span style="font-family: courier new;"> END LOOP;</span><br /><span style="font-family: courier new;"> END LOOP;</span><br /><span style="font-family: courier new;">END;</span><br /><span style="font-family: courier new;">$$;</span><br /><br />Ya ven, es otra forma...Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-28118964182531407702009-10-14T16:09:00.003-04:302009-10-15T17:50:10.874-04:30Eliminando registros duplicados, desde SQLZas! Por un error de programación, de repente aparecieron un montón de registros duplicados, y cuando digo un montón, son un montón!!!<br /><br />y ahora? pues, a pensar con cabeza fría... cuáles son las opciones?<br /><ul><li>borrar todos los duplicados a través del mismo sistema</li><li>pensar en un script en cualquier lenguaje que haga todo de un sólo halón</li></ul>Por razones de seguridad de los datos, me inclino por la segunda opción... lo primero que pensé es en cómo se podía hacer con SQL<br /><br />La tabla:<br /><span style="font-family:courier new;">\d centro_poblado</span><br /><span style="font-family:courier new;"> Tabla «public.centro_poblado»</span><br /><span style="font-family:courier new;">Columna | Tipo | Modificadores </span><br /><span style="font-family:courier new;">---------+-----------------------+-------------------------------------------------------------</span><br /><span style="font-family:courier new;">reg_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;">est_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;">mun_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;">par_001 | character varying(2) | not null</span><br /><span style="font-family:courier new;">cpo_001 | character varying(3) | not null</span><br /><span style="font-family:courier new;">cpo_002 | character varying(50) | not null</span><br /><span style="font-family:courier new;">id | integer | not null default nextval('centro_poblado_id_seq'::regclass)</span><br /><br />Como la tabla tiene un id de tipo serial, eso ayuda.<br /><br />Verficiar cuáles son los registros repetidos:<br /><span style="font-family:courier new;font-size:78%;">SELECT COUNT(*), reg_001, est_001, mun_001, par_001 FROM centro_poblado GROUP BY cpo_002, reg_001, est_001, mun_001, par_001 ORDER BY reg_001, est_001, mun_001, par_001;</span><br /><br />Verificar los registros repetidos:<br /><span style="font-family:courier new;font-size:78%;">SELECT * FROM centro_poblado WHERE reg_001 = '06' AND est_001 = '14' AND mun_001 = '01' AND par_001 = '05';</span><br /><br />Contar los registros repetidos, en detalle:<br /><span style="font-family:courier new;font-size:78%;">SELECT count(*) FROM centro_poblado WHERE reg_001 = '06' AND est_001 = '14' AND mun_001 = '01' AND par_001 = '05' AND cpo_001 = '018';</span><br /><br />Verificar el id min y máx del detalle de los registros repetidos:<br /><span style="font-family:courier new;font-size:78%;">SELECT min(id), max(id) FROM centro_poblado WHERE reg_001 = '06' AND est_001 = '14' AND mun_001 = '01' AND par_001 = '05' AND cpo_001 = '018';</span><br /><br />La verdad es que luego descubrí que se podía hacer así:<br /><span style="font-family:courier new;font-size:78%;">SELECT * FROM centro_poblado AS a</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> WHERE EXISTS(</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> SELECT cpo_001, COUNT(cpo_001)</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> FROM centro_poblado</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> WHERE a.cpo_001= cpo_001</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> GROUP BY cpo_001</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> HAVING COUNT(cpo_001)>1)</span><span style="font-size:78%;"><br /></span><span style="font-family:courier new;font-size:78%;"> ORDER BY cpo_001</span><br /><br />Eliminar los registros repetidos, menos 1:<br /><span style="font-family:courier new;font-size:78%;">DELETE FROM centro_poblado WHERE reg_001 = '06' AND est_001 = '14' AND mun_001 = '01' AND par_001 = '05' AND cpo_001 = '018' AND id > 1;</span><br /><br />Esto también se puede resolver con una tabla temporal, y metiendo la consulta en una función y todo eso, pero aun no lo he probado...<br /><br />Finalmente, y gracias a la lista de usuarios de postgres y su histórico, me encontré [1]:<br /><span style="font-family: courier new;">DELETE FROM centro_poblado WHERE ctid NOT IN (SELECT min(ctid) </span><span style="font-family:courier new;">FROM centro_poblado GROUP BY cpo_002, reg_001, est_001, mun_001, par_001</span>);<br /><br />[1]http://archives.postgresql.org/pgsql-es-ayuda/2007-01/msg00353.phpCesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com1tag:blogger.com,1999:blog-17156394.post-60837811065251484862009-09-10T08:06:00.003-04:302009-09-10T16:41:42.832-04:30Jugando con los privilegios de accesos a Bases de Datos PostgreSQLEl escenario varias BDs con<br /><ul><li>Un usuario diferente para cada BD con privilegios para insertar/modificar</li><li>Un usuario capaz de leer todas las BDs</li><li>Un usuario admin de todas las BDs</li><li>Un Rol, que agrupe todos los usuarios y no tenga ningún privilegio</li></ul>CREATE ROLE dba NO LOGIN;<br />CREATE USER user1 IN ROLE dba LOGIN ENCRYPTED PASSWORD '123456';<br />CREATE USER user2 LOGIN ENCRYPTED PASSWORD '123456';<br />CREATE USER admin1 IN ROLE dba LOGIN ENCRYPTED PASSWORD '123456';<br /><br />ALTER GROUP dba ADD USER user2;<br /><br />CREATE DATABASE db1 OWNER TO user1;<br />CREATE TABLE tabla1 (id serial, nombre character varying(10));<br /><br />quitar todos los privilegios sobre la tabla: tabla1 para los usuarios user1 y user2<br />REVOKE ALL ON tabla1 FROM user1;<br />REVOKE ALL ON tabla1 FROM user2;<br /><br />otorgar privilegios de consulta sobre la tabla talba1 para el usuario user1<br />GRANT SELECT ON tabla1 TO user1;<br /><br />otorgar privilegios para insertar datos sobre la tabla tabla1 para el usuario user2 (requiere privilegios sobre la secuencia de la tabla)<br />GRANT INSERT ON tabla1 TO user2;<br />GTANT UPDATE ON tabla1_id_seq TO user2;<br /><br />Para poder actualizar/eliminar un registro, se requiere tener privilegios de selección (requiere privilegios sobre la secuencias de la tabla)<br />GRANT UPDATE ON tabla1 TO user2;<br />GRANT DELETE ON tabla1 TO user2;Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-72011483021829939562009-09-09T17:03:00.009-04:302009-09-17T17:48:21.250-04:30Migrando capas shape (.shp) a postgisEl tema de pasar capas .shp a postgis, no sé sí será una manía, pero el tema de acceso a bases de datos contra el acceso a archivos no lo creo...<br /><br />Resulta que en el trabajo, hay un poco de gente haciendo capas y capas de mapas en software propietario... alguna vez pregunté (en pasillo) sí se habían puesto de acuerdo sobre algunas normas para hacer esas capas y me miraron como sí gubiera hablado en húngaro! y pensé... coño!<br /><br />No me equivoqué... cuando me dieron la tarea de montar un servidor de mapas y empecé a pedir las capas, empezaron mis dolores de cabeza... ahora, me toca ver cómo hacer, y escribir (acá) para que la cosa funcione...<br /><br />Vale decir que no tengo conocimientos en el tema de cartografía... por ahora...<br /><br />Existen varias formas, una de ellas es con el comando shp2pgsql, otra con QGis y otra con gvSIG (esas son las que yo conozco)...<br /><br /><span style="font-weight: bold;">shp2pgsql:</span> debería funcionar con algo parecido a esto<br /><blockquote><span style=";font-family:courier new;font-size:85%;" >shp2pgsql -W UTF-8 <span style="font-weight: bold;"><filename></filename></span>.shp <span style="font-weight: bold;"><</span><span style="font-weight: bold;">schema</span><span style="font-weight: bold;">></span>.<span style="font-weight: bold;"><</span><span style="font-weight: bold;">tablename</span><span style="font-weight: bold;">></span> ><span style="font-weight: bold;"><</span><span style="font-weight: bold;">filename</span><span style="font-weight: bold;">></span>.sql</span></blockquote>pero yo obtuve un mensaje de error por la codificación en la que está hecha la capa, o la mala norma de los atributos<br /><br />Finalmente amprendí algo sobre el estándar a seleccionar para que la cosa funcione. No significa que haya entendido, pero lo aprendí. Existe algo que se llama <span style="font-style: italic;">Sistema de Coordenadas Proyectadas</span> y <span style="font-style: italic;">Sistema de Coordenadas Geográficas</span>, ambas tienen como <span style="font-weight: bold;">Sistema de Coordenadas de Referencia WGS84</span>, pero la primera utiliza UTM y al segunda no, de manera que para la región Los Andes (Venezuela) sería para el primer caso SRC: EPSG 32619 que tiene WGS84 / UTM 19N y para el segundo caso SRC: EPSG 4326. De manera que es importante recordar este detalle para las propiedades de los proyectos y capas...<br /><br /><span style="font-weight: bold;">QGis:</span><br /><ul><li>verifico en las propiedades del proyecto que el Sistema de Referencia de Coordenadas (SRC) esté en WGS 84 (EPSG 4326 o 32619 según sea el caso)</li><li>Añado la capa vectorial (.shp)</li><li>verifico las propiedades de la capa que tenga el datum WGS 84</li></ul>Importando la capa (.shp) a PostGIS:<br /><ul><li>Deseleccionar la opción <span style="font-style: italic;">Usar SRID por omisión o especificar aquí</span> (que trae por defecto -1)</li><li>cambiar el -1 por 4326 (o el que corresponda)<br /></li><li>añadir la capa</li><li>ok</li></ul><span style="font-weight: bold;">gvSIG:</span><br /><ul><li>Agragar una vista nueva</li><li>Verificar en Propiedades la <span style="font-style: italic;">Proyección Actual</span>, que por defecto viene en 23030 (España), con lo cual seleccionamos 4326 o 32619 (u otra, según sea el caso)</li><li>Click al botón Abrir, para añadir una capa .shp</li><li>Al seleccionar la opción de añadir una capa, verificamos que tenga en <span style="font-style: italic;">Proyección Actual</span>, el mismo valor que hemos puesto a la vista. Añadios la capa<br /></li><li>Seleccionada la capa a exportar, menú -> capa -> exportar -> postgis</li><li>llenamos los datos que nos solicitan (nombre de la tabla, datos para la conexión con la BD) y listo!</li></ul>En todo esto, seguro hay algunas otras consideraciones a tomar en cuenta. Sí algiuen las sabe, paselas, sino, esperémos a descubrirlas...Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com2tag:blogger.com,1999:blog-17156394.post-30065307397814815852009-09-09T15:27:00.002-04:302009-09-09T17:02:50.592-04:30Normas de cortesía para trabajar con Bases de DatosJusto ahora que me encuentro tratando de montar un servidor de mapas, con un conjunto de capas .shp generadas por estudiantes, pasantes, tesistas y profesionales del área (no informáticos) me encuentro con algo que creo será todo un dolor de cabeza... la falta de cortesía!<br /><br />Claro! ellos no tienen la culpa, como siempre, la culpa es de la vaca (para los que no saben, ese es el título de un libro, sí alguien cree que le suena interesante, pues, búsquelo, y leálo)... ¿cuál vaca? la que sea, no importa! cuando les dije que por favor, no utilizaran en los nombres de atributos (atributos en SIGs son las tablas de BD para los informáticos) carácteres acentuados, ni especiales, ni mayúsculas, me respondieron: "Cómo vamos a irrespetar la ortografía! sí es un nombre propio, claro que irá en mayúscula!"<br /><br />A lo que pensé... coño!<br /><br />Para los que puedan, corran la voz!!! siempre que un producto informático, tenga como futuro una base de datos, aunque sea remoto, por favor, recordar:<br /><ul><li>No utilizar caracteres especiales (vocales acentuadas, eñes, etc)</li><li>No utlizar combinaciones de mayúsculas/minúsculas</li><li>Utilizar nombres descriptibles</li><li>En caso de ser nombres muy largos, utilizar nemotécnicos y su respectivo diccionario</li></ul>A medida que vaya recordando (o tropezando) agregaré a la lista... o sí algún lector se le ocurre colaborar...Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-82393084443552693332009-09-08T14:40:00.004-04:302009-09-08T17:19:02.943-04:30Preparando un entorno SIG en Debian LennyPara la presentación de datos georeferenciados, a través de un servicio web, voy a instalar un servidor de mapas. Ahora no recuerdo los detalles porque ya lo tengo instalado, pero trataré de ir corrigiendo en caso de que haga falta.<br /><br />aptitude install cgi-mapserver mapserver-bin mapserver-doc gdal-bin proj proj-bin proj-data php5-mapscript<br /><br />Sí algo me falta, es probable que aptitude se los traiga. con esto ya quedaría instalado el servidor de mapas.<br /><br />Cómo accederlo todavía estoy revisando la doc, pero en un navegador al teclear http://localhost/cgi-bin/mapserv te debería devolver algo como <span style="font-style: italic;">No query information to decode. QUERY_STRING is set, but empty</span>.lo que dice que ya está funcionando. Una vez se tenga una capa para mostrar, también se puede cargar vía http://localhost/tu_path_al_template/<br /><br />El qué y cómo mostrar, vienen en la próxima entrega del blog... generar el mapfile y trabajar con la plantilla, que por ahora, me tiro a <a href="http://openlayers.org">OpenLayers</a>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-229894434989365182009-09-07T11:29:00.006-04:302009-09-11T15:22:18.759-04:30Migrar BD de Mysql a PostGreSQL (parte 3)<span style="font-weight: bold;">Conversión de tipos</span><br /><br />Resulta, que cuando vemos lo que nos dice el espejo que hemos creado de mysql sobre postgresql con dbi-link, los campos son creados como tipo text, con un comentario en la vista que dice qué tipo de dato aproximado debería haber ahí...<br /><br />Esto es así, porque los tipos de datos entre diferentes gestores normalmente no son iguales, es decir, todos aplican los estándares, pero además, cada uno le da su toque, de manera que es posible que tenga más o menos, y que de paso, se llamen diferentes... o más bien, se le aplique aliases...<br /><br />El tema es que cuando trato de leer para insertar en otra tabla, en un proceso de migración, debo tener muy presente los tipos de datos, ocasionalmente, podría recibir un mensaje del tipo:<br /><br /><span style="font-family:courier new;">Error de SQL:</span><br /><br /><span style="font-family:courier new;">ERROR: la columna «id» es de tipo integer pero la expresión es de tipo text</span><br /><span style="font-family:courier new;">LINE 1: INSERT INTO cultu03 (id, cultu02_001, cultu03_002) (SELECT c...</span><br /><span style="font-family:courier new;"> ^</span><br /><span style="font-family:courier new;">HINT: Necesitará reescribir la expresión o aplicarle una conversión de tipo.</span><br /><br /><span style="font-family:courier new;">En la declaración:</span><br /><span style="font-family:courier new;">INSERT INTO cultu03 (id, cultu02_001, cultu03_002) (SELECT codcat, codedi, catedi FROM sir_cultura_catedi)</span><br /><br />Con lo cual, cualquiera se asusta a la primera... y no hace falta... con leer el mensaje y fijarme en la frase "aplicarle una conversión de tipos" será más que suficiente para tener algo de calma nuevamente...<br /><br />¿qué es una conversión de tipos? digamos que tenemos un campo de un tipo de dato (p.e. text), pero queremos "interpretar" su contenido como sí fuera otro tipo de dato (p.e. int)... a eso se le conoce como conversión de tipos<br /><br /><span style="font-family:courier new;">INSERT INTO cultu03 (id, cultu02_001, cultu03_002) (SELECT codcat::int, codedi::int, catedi FROM sir_cultura_catedi)</span><br /><br />o<br /><br /><span style="font-family:courier new;">INSERT INTO cultu03 (id, cultu02_001, cultu03_002) (SELECT cast(codcat as int), cast (codedi as int), catedi FROM sir_cultura_catedi)</span><br /><br />y listo!!!<br /><br />Una consultica que tiene algo más:<br /><br /><span style="font-family:courier new;">INSERT INTO cultu04 (reg_001, est_001, mun_001, par_001, cpo_001, cultu04_001, cultu04_002, cultu04_003, cultu04_004, cultu04_005, cultu04_006, cultu04_007, cultu02_001, cultu03_001) </span><br /><span style="font-family:courier new;">(SELECT codreg, codest, codmun, codpar, codcen, anno, nombre, direccion, telefono, correo, web, </span><br /><span style="font-family:courier new;"> CASE WHEN area <> '' THEN </span><br /><span style="font-family:courier new;"> CAST(area AS numeric) </span><br /><span style="font-family:courier new;"> ELSE </span><br /><span style="font-family:courier new;"> 0 </span><br /><span style="font-family:courier new;"> END, </span><br /><span style="font-family:courier new;">codedi::int, codcat::int FROM sir_cultura_edif_det)</span><br /><br />Creo que no hace falta explicar la estructura de las tablas, sólo entender que leo en una tabla e inserto lo que estoy leyendo, con algunas particularidades sencillas....<br /><br />Una más<br /><br /><span style="font-family: courier new;">INSERT INTO acu03 (reg_001, est_001, mun_001, par_001, cpo_001, acu03_001, acu01_001, acu03_003, acu03_004, acu03_005, acu02_001, acu03_006, acu03_007, acu03_008)</span><br /><span style="font-family: courier new;">(SELECT codreg, codest, codmun, CASE WHEN codpar = 'NA' THEN '00' ELSE codpar END, CASE WHEN codcen = 'NA' THEN '000' ELSE codcen END, EXTRACT(YEAR FROM agno)::int, tipo::int, nb_acueducto, fuentes, caudal, tratamiento::int, suscriptores, poblacion, produccion FROM servicios_acueducto)</span>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com2tag:blogger.com,1999:blog-17156394.post-57157929488400411562009-09-03T11:02:00.004-04:302009-09-03T11:18:02.060-04:30Migrar BD de Mysql a PostGreSQL (parte 1 Versión 2)Diciendo que soy usuario Debian, no digo mucho, pero les cuento que habiendo reinstalado mi equipo de la oficina, en el momento en que estoy devolviendo las cosas a la normalidad, se me ocurrió hacer un aptitude search dbi_link y vaya sorpresa, existe!<br /><br />Pues, se me ocurrió instalarlo, y probar luego, cómo sería el procedimiento para que funcione... de manera que está sería la versión 2 de <a href="http://programacionlibre.blogspot.com/2008/01/migrar-bd-de-mysql-postgresql-parte-1.html">Migrar BD de Mysql a PostGreSQL (parte 1)</a><br /><br />instalarlo: <ul><li>aptitude install dbi_link</li></ul>buscar donde queda: <ul><li>find /usr/ -iname dbi_link</li></ul>crear la BD en postgresql: <ul><li>createdb migracion</li></ul>crear el lenguaje plperlu a la BD recien creada:<br /><ul><li>createlang plperlu -d migracion</li></ul>lanzar dbi_link.sql a la BD recien creada:<br /><ul><li>psql -d migracion -f /path/completo/dbi_link.sql</li></ul>crear la estructura que me permitirá _conectar_ con la otra BD, en este caso mysql (acá usamos el mysql.sql que viene en el example del dbi_link, que no viene con el aptitude install):<br /><ul><li>psql -d migracion -f /path/completo/mysql.sql</li></ul>y listo! ya está el esquema con la estructura y datos que necesito leer...Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com1tag:blogger.com,1999:blog-17156394.post-47080249700254940982009-09-01T17:36:00.004-04:302009-09-01T17:48:29.028-04:30Solucionando el error de llave pública en Debian<span style="font-family:arial;">Hoy decidí reinstalar mi computador de la oficina, tenía Debian Etch, y me estoy halando Debian Lenny desde un netinstall de etch...</span><br /><br /><span style="font-family:arial;">¿Por qué reinstalar en vez de actualizar? vale, porque había instalado varias cosillas que no tienen uninstall (no son productos nativos para debian) y algunos quedaron mal instalados, con lo cual el sistema se fue poneindo "fastidioso" con el tiempo...</span><br /><br /><span style="font-family:arial;">Lo que hice: instalar sólo el sistema base, esto es, que cuando llegó el tasksel, le dije que nada de eso, de manera que instaló algunos 8 paquetes más y listo. Luego, edité el sources.list para colocar uno que tengo cerca, y al darle aptitude update me saltaron 2 errores relacionados con las llaves, uno para el security y otro para el mirror que yo había agregado...</span><br /><br /><span style="font-family:arial;">La solución:</span><br /><span style="font-family:courier new;">gpg --keyserver subkeys.pgp.net --recv-keys 07DC563D1F41B907 && gpg --export --armor 07DC563D1F41B907 | apt-key add -</span><br /><br /><span style="font-family: arial;">donde el 07DC563D1F41B907 es la llave que devuelve el error, de manera que tuve que hacerlo 2 veces, primero para el mirror y luego para el security... y update!</span>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-33238803944323579582009-09-01T09:19:00.002-04:302009-09-01T09:27:13.037-04:30Apache como proxy reverseConfigurando Apache como Servidor de Páginas Web para Sistemas alojados en otro server dentro de la intranet<br /><br /><span style="font-weight: bold;">La situación:</span> Un servidor A que tiene Apache2 (servidor de páginas web que aloja la página web institucional) y Bind9 (servidor de nombres de dominio: DNS), un servidor B que contiene otro Apache2 (para aplicaciones a la medida de la oficina, las cuales deben ser accedidas desde la intranet pero también desde otros lugares geográficos, de manera que son accedidos desde su propio subdominio, de la forma sistemas.misitio.tal)<br /><br />Siguiendo lo que dice en [1], en ele ejemplo básico, he agregado además del default modificado, una especie de vhost, que en realidad es un proxy reverse, el el servidor A:<br /><span style="font-family:courier new;"><virtualhost></virtualhost></span><virtualhost><br /><span style="font-family:courier new;"> ServerName sistemas.misitio.tal</span><br /><br /><span style="font-family:courier new;"> ProxyRequests Off</span><br /><span style="font-family:courier new;"> <proxy></proxy></span><br /><span style="font-family:courier new;"> Order deny,allow</span><br /><span style="font-family:courier new;"> Allow from all</span><br /><span style="font-family:courier new;"> </span><br /><span style="font-family:courier new;"> ProxyPass / http://192.168.15.18/</span><br /><span style="font-family:courier new;"> ProxyPassReverse / http://192.168.15.18/</span><br /><br /><span style="font-family:courier new;"> ErrorDocument 404 /</span><br /><br /><span style="font-family:courier new;"> TransferLog /var/log/apache2/sistemas.access</span><br /><span style="font-family:courier new;"> ErrorLog /var/log/apache2/sistemas.error</span><br /></virtualhost><br /><br />En el servidor B, sólo basta que esté el site default.<br /><br />Luego, buscar los módulos para instalar y activar: proxy, proxy_connect y proxy_http<br /><br />reiniciar apache y listo!<br /><br />[1] <a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html">http://httpd.apache.org/docs/2.2/mod/mod_proxy.html</a>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-63139135895003817642009-08-31T17:31:00.002-04:302009-08-31T17:50:29.697-04:30Configurando Apache como Servidor de Páginas WebConfigurando Apache como Servidor de Páginas Web<br /><br />La situación: en la oficina tenemos nuestro propio hosting, de manera que nuestra página web y nuestras aplicaciones (de uso interno) están también alojadas por nuestros servidores... por ahora, sólo vamos con la página web institucional.<br /><br />Servidor corriendo Debian Lenny, instalado por la vía tradicional (aptitude) apache2 (como la página está en drupal, pues, todo lo demás, php5, mysql etc...)<br /><br />El sites activado por defecto nos sirve para la ocasión, editado, modifico el DocumentRoot y la directiva <directory> para que ambos apunten al directorio de drupal... y listo!<br /><br />Ahora no recuerdo que haya sido distinto, el asunto es que dedicamos más tiempo a configurar otras cositas que espero contar mañana...<br /><br />See you!Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-52839020618732685332009-08-28T13:15:00.005-04:302009-08-31T09:46:39.536-04:30Montando un sitio web con Drupal (Video)Montando un sitio web con Drupal - sexta parte<br /><br /><span style="font-style: italic;">Instalar un módulo: Flashvideo</span><br /><br />Crear un tipo de contenido exclusivo para videos institucionales<br /><br />Me he guiado por [1], pero con pequeñas variaciones, que describo desde el principio. Haré una mala traducción, ya que [1] por estar publicado en drupal.org le da carácter de oficial.<br /><br />Permite subir vídeos a su sitio web e incorporarlo a cualquier contenido existente en la misma<br /><br />Manual para el uso del módulo de FlashVideo para Drupal.<br /><br />Pasos a seguir:<br /><ol><li>Descargar del sitio de Drupal el módulo (<a href="http://drupal.org/project/flashvideo">http://drupal.org/project/flashvideo</a>)</li><li>Una vez descargado, instalelo normalmente copiando el módulo en la carpeta de módulos de su sitio</li><li>Luego, en el sitio debe activar el módulo</li><li>El módulo, una vez instalado, se verá en la lista de módulos en: Administrar -> Configuración del sitio, c omo se muestra en la <a href="http://drupal.org/node/496368">imagen 1</a></li><li>La configuración del entorno del módulo, quedará más o menos como se ve en la <a href="http://drupal.org/node/496370">imagen 2</a> (muestra unas notas importantes sobre los parámetros a ser fijados en php.ini, los actuales de sus sistema y los recomendados) y la <a href="http://drupal.org/node/496372">imagen 3</a> (muestra los tipos de nodos existentes en su sistema, donde podrá ingresar a cada uno para ver el estado y opearción de cada uno. Esto es, que puede publicar videos en cualquier módulo, basta con configurar el tipo de contenido y habilitar el módulo, tal como se muestra en la <a href="http://74.125.115.132/translate_c?hl=es&ie=UTF-8&sl=en&tl=es&u=http://drupal.org/node/496374&rurl=translate.google.co.ve&usg=ALkJrhh7qN6L_dPEZkz0AKWGDkRfQoeAew">imagen 4</a>)<br /></li><li><span onmouseover="_tipon(this)" onmouseout="_tipoff()"> Si se desea incrustar el vídeo en un tipo de contenido, seleccione el tipo de contenido y sus operaciones estraán marcados para este tipo de nodo.</span> El procedimiento será el mismo para cualquier tipo de contenido<span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()">.</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()">En las imágenes se muestra como la configuración de estos campos y opciones:</span></li><li><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Una vez configurado el módulo, guardar los cambios.</span></li><li><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Puede ocurrir un error semejante al mostrado en la<a href="http://drupal.org/node/496392"> imágen</a>, que se resolverá descargando los controladores de S3 en [4]</span></li><li><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Descargar y extraer la carpeta. Ésta se guarda en el directorio módulos -> FlashVideo -> drivers. Luego, volver a la página de configuración y verña como el error a desaparecido.<br /></span></li><li><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Para este módulo se pueden utilizar varios tipos reproductores de medios swf. Dos de los más utilizados, son </span>JW Player and the Dash Media Player los cuales puedes descargar en [2]. Ahí mismo hay unas instrucciones para su instalación, las cuales también comentaré acá según mi experiencia.</li><li>En mi caso, he decidido el JW Player, así que será ese el que comentaré acá cómo me ha ido... Descargado y descomprimido, hay un archivo lamado player-viral.swf el cual he renombrado a Player.swf. Éste último y el swfobject.js los he copiado en el directorio raíz de mi instalación de drupal. En [2] sugiere que se copien en el directorio files, pero mirando los logs de apache me decía que no los encontraba en el directorio padre, así que los coloqué ahí. El resto de pasos sugeridos en [2] no me han sido útiles, así que los he obviado.</li><li>Finalmente, para poder verlo, he seguido lo que dice [3].<span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()"></span></li><li><span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()">El último paso, tal como dice en [1], para poder ver el vídeo insertado en el sitio, es ejecutar el cron, esto se hace de la siguiente manera, vaya a Administrar / Informe de situación y tareas de mantenimiento de cron / ejecutar cron manualmente, lo que necesita saber que cada vez cree una página para integrar un video se necesita ejecutar el cron, una vez hecho esto se puede ver el vídeo incrustado.</span><br /></li></ol>[1] <a href="http://drupal.org/node/496410">http://drupal.org/node/496410</a><br />[2] <a href="http://www.travistidwell.com/node/177">http://www.travistidwell.com/node/177</a><br />[3] <a href="http://www.longtailvideo.com/players/jw-flv-player/">http://www.longtailvideo.com/players/jw-flv-player/</a><br />[4] <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><a href="http://www.travistidwell.com/files/Storage3.tar.gz" title="http://www.travistidwell.com/files/Storage3.tar.gz" rel="nofollow">http://www.travistidwell.com/files/Storage3.tar.gz</a></span>Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-68578984646440938102009-08-16T07:33:00.003-04:302009-08-31T08:47:34.192-04:30Empezando a estudiar de nuevo... con djangoHora de cambiar de nivel: Django<br /><br />Bueno, yo aquí, haciéndome el valiente...<br /><br />Resulta que en el trabajo uso php, y por un tiempo, creo, que así seguirá siendo, pero, ahora que retomé mis estudios, pensé que aprender a programar soluciones web en python sería interesante... Ahora que lo pienso, me da susto, porque noto que tengo pocas horas "libres" al día, pero bueno, como dice un profesor amigo de la (otra) universidad, "Sí no fuera por lo uno, sería por lo otro", así que nada de tenerle miedo al cuero, después de haber matado al tigre!<br /><br />Soy profesional de carrera corta (3 años) y cotinúo 2 años más y obtengo el título de Ingeniero (carrera de 5 años), todavía no se para qué, pero ahi lo llevo. De paso, con todos los cambios que conlleva el siglo XXI, se plantea la nueva universidad, con nuevos paradigmas y todo ese cuento; de manera que los 2 años tienen una colección de materias, entre ellas, una que llaman el eje central de la carrera: <span style="font-weight: bold;">Proyecto Socio Tecnológico</span>, donde nos toca montarnos en un proyecto de alcance social con aporte tecnológico, que, de paso, pueda enmarcarse dentro de los planes de desarrollo del país.<br /><br />Eso suena a Desarrollo Endógeno y Sobreanía Tecnológica, así que suena bien. Siendo así, demósle! y de paso, con Software Libre!!! ja! demósle pero con ganas!!!<br /><br />Pues bueno, ah instalar django, plone y a hechar pa'lante... Por ahora, plone lo he instalado en mi portatil (con Debian Lenny) de dos formas, ya que es posible tener las dos instancias juntas sin estar resvueltas: vía apt-get[0] y vía tar-gz instalador unificado [1]... y funciona! Luego, django, para empezar lo he instalado vía apt-get [2] (aunque me falta revisar [3] ya que hasta el paso 4 perfecto, pero en el paso 5 hice los cambios para postgresql, se me ocurrió ejecutar <code>/manage.py startapp [appname]</code> como sugiere la bienvenida de django, y zas! errores saltaron), ya veré que cosa...<br /><br />Por lo pronto, así voy, espero hoy mismo publicar otra entrada, de cómo voy...<br /><br />[0]http://plone.org/documentation/how-to/plone-on-debian-etch/<br />[1]http://plone.org/countries/conosur/documentacion/instalando-plone-3-con-el-instalador-unificado<br />[2]http://www.howtoforge.com/installing-django-on-debian-etch-apache2-mod_python<br />[3]http://codespatter.com/2008/10/15/setting-up-apache2-mod_python-mysql-and-django-on-debian-lenny-or-ubuntu-hardy-heron/Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0tag:blogger.com,1999:blog-17156394.post-62762886579379386362009-08-12T11:32:00.004-04:302009-08-14T14:05:00.320-04:30Montando un sitio web con Drupal (Editor WYSIWYG)Montando un sitio web con Drupal - quinta parte<br /><br />Instalar un Módulo: Editor WYSIWYG<br /><br />En la anterior instalación había mirado y probado un par, así que ahora me voy por el que tenía: FCKEditor<br /><br />Este módulo parecería ser más laborioso de dejar listo para usar, pero no será tanto...<br /><br />Tal y como dice el COPY_HERE.txt que viene en el módulo (fckeditor/fckeditor/) hay que descargarse de la página oficial el fckeditor.algo (tar.gz en mi caso), descomprimir, copiar todo su contendio y pegarlo dentro de la carpeta donde está el .txt ya mencionado... y listo! activar el módulo, configurarlo en el menú Configuración del Sitio y ya se puede empezar a utilizar el editor WYSIWYG.Cesar Carbonarahttp://www.blogger.com/profile/03730653665446019753noreply@blogger.com0