tag:blogger.com,1999:blog-37487652711852535372024-02-20T04:04:21.061-08:00Finding owenowenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-3748765271185253537.post-22903461391584314602009-04-19T11:14:00.000-07:002009-04-19T11:19:11.221-07:00Editar gráficas con c# dentro de word con excel embebidoediting chart with c# inside word with excel embedded<br /><br /><code>using System;<br />using System.Collections.Generic;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Linq;<br />using System.Text;<br />using System.Windows.Forms;<br />using System.Reflection;<br />using System.IO.Packaging;<br />using System.IO;<br />using System.Xml;<br />using Word = Microsoft.Office.Interop.Word;<br /><br /><br />namespace WindowsFormsApplication1<br />{<br /> public partial class Form1 : Form<br /> {<br /> public Form1()<br /> {<br /> InitializeComponent();<br /> }<br /><br /> private void button1_Click(object sender, EventArgs e)<br /> {<br /> // Create the Word application and declare a document<br /> Word.Application word = new Word.Application();<br /> Word.Document doc = new Word.Document();<br /> <br /> // Define an object to pass to the API for missing parameters<br /> object oMissing = System.Type.Missing;<br /><br /> try<br /> {<br /> <br /><br /><br /><br /> object oTemplate = @"G:\document.docx";<br /><br /> Package docPackage = Package.Open(oTemplate.ToString(), FileMode.Open, FileAccess.ReadWrite);<br /><br /> PackagePart xlsPackagePart = docPackage.GetPart(new Uri("/word/embeddings/Hoja_de_c_lculo_de_Microsoft_Office_Excel1.xlsx", UriKind.Relative));<br /><br /> Package xlsPackage = Package.Open(xlsPackagePart.GetStream(), FileMode.Open, FileAccess.ReadWrite);<br /><br /> PackagePart hoja1 = xlsPackage.GetPart(new Uri("/xl/worksheets/sheet1.xml", UriKind.Relative));<br /><br /> XmlDocument docxml = new XmlDocument();<br /> docxml.Load(hoja1.GetStream());<br /><br /> XmlNamespaceManager nsManager = new XmlNamespaceManager(docxml.NameTable);<br /> nsManager.AddNamespace("d", docxml.DocumentElement.NamespaceURI);<br /> XmlNode cell = docxml.SelectSingleNode(string.Format("//d:sheetData/d:row/d:c[@r='{0}']/d:v", "D9"),nsManager);<br /> cell.ChildNodes[0].Value = "4";<br /> <br /> cell = docxml.SelectSingleNode(string.Format("//d:sheetData/d:row/d:c[@r='{0}']/d:v", "D10"), nsManager);<br /> cell.ChildNodes[0].Value = "5";<br /> <br /> <br /> docxml.Save(hoja1.GetStream(FileMode.Create, FileAccess.ReadWrite));<br /><br /> PackagePart chart1 = docPackage.GetPart(new Uri("/word/charts/chart1.xml", UriKind.Relative));<br /> docxml.Load(chart1.GetStream());<br /><br /> XmlNodeList nodos = docxml.GetElementsByTagName("c:numCache");<br /> nodos[0].ChildNodes[2].ChildNodes[0].ChildNodes[0].Value= "4";<br /> nodos[0].ChildNodes[3].ChildNodes[0].ChildNodes[0].Value = "5";<br /><br /> docxml.Save(chart1.GetStream(FileMode.Create, FileAccess.ReadWrite));<br /> <br /> xlsPackage.Close();<br /> docPackage.Close();<br /> <br /><br /><br /> <br /> <br /><br /><br /> doc = word.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);<br /><br /> <br /><br /> <br /> <br /> <br /> <br /> <br /> <br /> word.Visible = true;<br /><br /> <br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message);<br /> //doc.Close(ref missing, ref missing, ref missing);<br /> word.Application.Quit(ref oMissing, ref oMissing, ref oMissing);<br /> <br /> }<br /><br /> }<br /> }<br />}<br /></code>owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-13867916383569366732009-02-03T04:34:00.000-08:002009-02-03T04:51:46.112-08:00business days en alfrescola documentacion de alfresco para ciertas cosas.. es algo lamentable<br />por ejemplo, para enviar un correo pasado 3 días laborables.<br />o por ejemplo para que una tarea envie un correo utilizando un template y ese template se asocie a ese documento.<br /><code><br /> <task-node name="peticion"&rt;<br /> <task name="wf:peticionTask" swimlane="assignee"&rt;<br /> <timer name="sendNotification" duedate="3 business days"&rt;<br /> <action name="sendNotification" class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"&rt;<br /> <script&rt;<br /> var mydoc = bpm_package.children[0];<br /><br /> var mail = actions.create("mail");<br /> var mytemplate = companyhome.childByNamePath("Diccionario de datos/Modelos de Email/retraso_preparacion.ftl");<br /> mail.parameters.to = "something@domain.ext";<br /> mail.parameters.subject = "some text ";<br /> mail.parameters.from = "something@domaint.exe";<br /> mail.parameters.text = mydoc.processTemplate(mytemplate);<br /> mail.execute(bpm_package);<br /><br /> </script&rt;<br /> </action&rt;<br /> </timer&rt;<br /> </task&rt;<br /> </task-node&rt;<br /></code>owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-73705334155147922092008-11-02T01:22:00.000-07:002008-11-02T13:01:35.735-08:00Sobre el dinero<span style="font-style:italic;">A fin de cuentas, el dinero es una ficción, papel sin importancia que sólo adquiere valor porque un gran número de personas deciden dárselo. El sistema se basa en la fe. No en la verdad ni en la realidad, sino en la creencia colectiva. ¿Y qué pasaría si esa fe fuese socavada, si un gran número de personas empezara a dudar del sistema? Teóricamente, el sistema se derrumbaría.</span><br /><br />Paul Auster en "A salto de mata; crónica de un fracaso precoz"owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-22710913688989380682008-10-18T11:59:00.000-07:002008-10-18T12:01:10.464-07:00problema drivers nvidiaAl actualizar el libc6 (o alguna cosa con dist-upgrade), me surgió que no podía reinstalar los drivers de NVIDIA:<br /><br />WARNING: The symbolic link '/usr/lib/libnvidia-tls.so.1' does not point to<br /> 'libnvidia-tls.so.177.80' as is necessary for correct operation of the<br /> NVIDIA Accelerated Graphics Driver for Linux-x86. It is possible that<br /> `ldconfig` has created this incorrect symbolic link because<br /> tls/libnvidia-tls.so.177.80's "soname" conflicts with that of<br /> libnvidia-tls.so.177.80. It is recommended that you remove or rename<br /> the file 'tls/libnvidia-tls.so.177.80' and create the necessary<br /> symbolic link by running `ln -sf libnvidia-tls.so.177.80<br /> /usr/lib/libnvidia-tls.so.1`.<br />-> done.<br /><br /><br />cd /usr/lib/<br />rm libnvidia-tls.so.1 && ln -s tls/libnvidia-tls.so.177.80 libnvidia-tls.so.1 -> hacerlo mientras busca dependencias antiguas de GL, luego dará un WARNING, pero funcionará el driver.owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-4653576027507876092008-08-18T06:15:00.000-07:002008-08-18T06:16:56.217-07:00En un correo spamUn científico que vivía preocupado por los problemas del mundo, estaba decidido a encontrar las respuestas necesarias para solucionarlos. Por eso, pasaba día tras día en el estudio de su casa en busca de respuestas para sus dudas.<br />Una tarde, su hijo de cinco años entró en el estudio con la intención de ayudarle a trabajar. El científico, nervioso por la interrupción, le pidió al niño que fuese a jugar a otro sitio. Pero después de comprobar que no le hacía ni caso, pensó en algo que pudiese distraer su atención.<br />¡Perfecto! Encontró una revista y vio que en una de sus páginas había un mapa del mundo...¡justo lo que necesitaba! Arranco la hoja, recortó el mapa en muchos trozos y, junto con un rollo de celo, se lo dio a su hijo diciendo: “Mira hijo, como te gustan tanto los puzzles, te voy a dar el mundo en trocitos para que lo arregles sin ayuda de nadie”.<br />Así, el padre quedó satisfecho y el niño también. El padre porque pensó que el niño tardaría más de una hora en hacerlo. El niño porque creyó que estaba ayudando a su padre. Pero después de unos minutos el niño exclamó: “Papá, ya!”. El padre, en un primer momento, no dio crédito a las palabras del niño. Era imposible que, a su edad, hubiera conseguido recomponer un mapa que nunca había visto antes. Desconfiado, el científico levantó la vista del libro que leía, convencido de que vería resultado desastroso propio de un niño de cinco años. Pero, para su sorpresa, comprobó que el mapa estaba perfectamente reconstruido: cada trocito había sido colocado y pegado en el lugar correspondiente.<br />Sin salir de su asombro y mirando fijamente el mapa, le dijo al niño: “Hijo, si tu no sabías cómo era el mundo, ¿Cómo has podido hacerlo?” “¡Muy fácil papá!” – contestó el niño-, cuando arrancaste la hoja de la revista vi que por el otro lado había un hombre. Di la vuelta a los trocitos que me diste y me puse a hacer el puzzle del hombre, que sabía cómo era. Cuando conseguí arreglar el hombre di la vuelta a la hoja y vi que había arreglado el mundo...”owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-86059620151792050942008-07-29T09:57:00.000-07:002008-07-29T10:05:09.868-07:00AoEHoy hablaré como verl estado de un raid (<a href="http://www.coraid.com/">Coraid</a>) a través de <a href="http://en.wikipedia.org/wiki/ATA_over_Ethernet">ATA Over Ethernet</a> (aoe)<br /><br />Para ello utilizaremos<a href="http://dfn.dl.sourceforge.net/sourceforge/aoetools/cec-8.tgz"> Coraid Ethernet Console client</a><br /><br />Una vez descomprimido, compilado podemos ejecutar para ver el estado:<br /><br /><br />datos:~/cec-8# ./cec -s 1 eth1<br />Probing for shelves ... shelf 1 found.<br />connecting ... done.<br />Escape is Ctrl-\<br /><br />SR shelf 1> show -l<br />1.0 500.108GB up<br />1.1 500.108GB up<br />1.2 500.108GB up<br />1.3 500.108GB up<br />1.4 500.108GB up<br />1.5 500.108GB up<br />1.6 500.108GB up<br />1.7 500.108GB up<br />1.8 0.000GB down<br />1.9 0.000GB down<br />1.10 0.000GB down<br />1.11 0.000GB down<br />1.12 0.000GB down<br />1.13 0.000GB down<br />1.14 0.000GB down<br />SR shelf 1> list<br /> 1 2000.431GB online<br /> 2 1000.216GB online<br />SR shelf 1> list -l<br /> 1 2000.431GB online<br /> 1.0 2000.431GB raid5 normal <br /> 1.0.0 normal 500.108GB 1.0<br /> 1.0.1 normal 500.108GB 1.1<br /> 1.0.2 normal 500.108GB 1.2<br /> 1.0.3 normal 500.108GB 1.3<br /> 1.0.4 normal 500.108GB 1.4<br /> 2 1000.216GB online<br /> 2.0 1000.216GB raid5 normal <br /> 2.0.0 normal 500.108GB 1.5<br /> 2.0.1 normal 500.108GB 1.6<br /> 2.0.2 normal 500.108GB 1.7<br /><br /><br />Yo me he hecho un pequeño script en <a href="http://en.wikipedia.org/wiki/Expect">expect</a> para que compruebe si el estado del raid es "online". Lo que hace es lanzar el "cec", hacer un list y salir.<br /><br />#!/usr/bin/expect -f<br />set send_slow {1 .1}<br />proc send {ignore arg} {<br /> sleep .3<br /> exp_send -s -- $arg<br />}<br /><br />set timeout -1<br />spawn /root/cec-8/cec -s 1 eth1<br />match_max 100000<br />expect -exact "Probing for shelves ... shelf 1 found.\r<br />connecting ... done.\r<br />Escape is Ctrl-\\\r<br />"<br />send -- "\r"<br />expect -exact "\r\r<br />SR shelf 1> "<br />send -- "list\r"<br />send -- "\r"<br />expect -exact "\r\r<br />SR shelf 1> "<br />send -- ""<br />expect -exact ">>> "<br />send -- "q\r"<br />expect eofowenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-55195754878730664632008-07-12T01:24:00.000-07:002008-07-12T02:01:49.833-07:00Raid<blockquote>Hoy hablaré sobre las distintas utilidades para ver el estado de distintas controladoras raid.
<br />No de todas que sería imposible, sino de las que monitorizo a diario y he encontrado aplicaciones para ello.
<br />
<br /><span style="font-weight:bold;">3ware</span>
<br />
<br />Su aplicación es <a href="http://www.3ware.com/support/download.asp">tw_cli</a>:
<br />
<br />
<br /><code>//backup> /c5 show all
<br />/c5 Driver Version = 2.26.02.008
<br />/c5 Model = 9550SXU-8LP
<br />/c5 Available Memory = 112MB
<br />/c5 Firmware Version = FE9X 3.04.00.005
<br />/c5 Bios Version = BE9X 3.04.00.002
<br />...
<br />/c5 Number of Ports = 8
<br />/c5 Number of Drives = 4
<br />/c5 Number of Units = 1
<br />/c5 Total Optimal Units = 1
<br />/c5 Not Optimal Units = 0
<br />...
<br />/c5 Controller Bus Speed = 66 Mhz
<br />
<br />Unit UnitType Status %RCmpl %V/I/M Stripe Size(GB) Cache AVrfy
<br />------------------------------------------------------------------------------
<br />u0 RAID-5 OK - - 64K 2095.44 ON OFF
<br />
<br />Port Status Unit Size Blocks Serial
<br />---------------------------------------------------------------
<br />p0 OK u0 698.63 GB 1465149168 5QD0D6RW
<br />p1 OK u0 698.63 GB 1465149168 5QD0D8B5
<br />p2 OK u0 698.63 GB 1465149168 5QD0D6TG
<br />p3 OK u0 698.63 GB 1465149168 5QD0D6TK
<br />p4 NOT-PRESENT - - - -
<br />..
<br /></code>
<br />
<br /><span style="font-weight:bold;">ADAPTEC</span>
<br />
<br />Tenemos dos aplicaciones dependiendo la versión de la controladora, si tiene firmware antiguo utilizaremos <a href="http://linux.dell.com/storage.shtml#aacraid">afacli</a>
<br />
<br />Debemos crear primero /dev/afa0, para ello vemos <span style="font-style:italic;">major number</span> con:
<br />grep aac /proc/devices
<br />
<br />y luego mknod /dev/afa0 c <span style="font-style:italic;"><major number></span> 0
<br />
<br /><code>
<br />:# afacli
<br />CLI > open afa0
<br />Executing: open "afa0"
<br />
<br />AFA0> container list
<br />
<br />Executing: container list
<br />Num Total Oth Chunk Scsi Partition
<br />Label Type Size Ctr Size Usage B:ID:L Offset:Size
<br />----- ------ ------ --- ------ ------- ------ -------------
<br /> 0 RAID-5 1.09TB 64KB Valid 0:00:0 64.0KB: 279GB
<br /> /dev/sda RAID5_5x300 0:01:0 64.0KB: 279GB
<br /> 0:05:0 64.0KB: 279GB
<br /> 0:03:0 64.0KB: 279GB
<br /> 0:04:0 64.0KB: 279GB
<br />
<br /> 1 Volume 279GB Valid 0:02:0 64.0KB: 279GB
<br /> /dev/sdb VOLUME_1X300
<br />
<br /></code>
<br />
<br />Para las controladoras con nuevo Firmware (lo sabran porque el afacli dice que la DLL que tiene es antigua) tendrán que usar <a href="http://snapappliance.com/en-US/downloads/storage_manager/sm?productId=ICP5125BR&dn=ICP5125BR">arcconf utilidad de StorMan</a>
<br />
<br /><code>~# /usr/src/prueba/usr/StorMan/arcconf GETCONFIG 1 AD
<br />sh: /bin/sort: No existe el fichero o el directorio
<br />Controllers found: 1
<br />----------------------------------------------------------------------
<br />Controller information
<br />----------------------------------------------------------------------
<br /> Controller Status : Optimal
<br /> Channel description : SCSI
<br /> Controller Model : Adaptec 2020ZCR
<br /> Controller Serial Number : BAD0
<br /> Physical Slot : 2
<br /> Installed memory : 64 MB
<br /> Copyback : Disabled
<br /> Background consistency check : Disabled
<br /> Automatic Failover : Enabled
<br /> Defunct disk drive count : 0
<br /> Logical devices/Failed/Degraded : 2/0/0
<br /> --------------------------------------------------------
<br /> Controller Version Information
<br /> --------------------------------------------------------
<br /> BIOS : 5.1-0 (8458)
<br /> Firmware : 5.1-0 (8458)
<br /> Driver : 1.1-5 (2409)
<br /> Boot Flash : 0.0-0 (0)
<br /></code>
<br />
<br /><span style="font-weight:bold;">Compaq Computer Corporation Smart Array</span>
<br />
<br />Utilizaremos <a href="http://www.strocamp.net/opensource/">arrayprobe</a>
<br />
<br /><code>correo:~# /usr/bin/arrayprobe -r|tail -3
<br />Logical drive 0 on controller /dev/cciss/c0d0 has state 0
<br />Logical drive 1 on controller /dev/cciss/c0d0 has state 0
<br />OK Arrayprobe All controllers ok</code>
<br />
<br /><span style="font-weight:bold;">megaRAID</span>
<br />
<br />Utilizaremos la aplicación <a href="http://www.lsi.com/support/downloads/">megaCLI</a>
<br />
<br /><code>
<br />#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -LDInfo -LALL -aALL
<br />
<br />
<br />Adapter 0 -- Virtual Drive Information:
<br />Virtual Disk: 0 (target id: 0)
<br />Name:sistema
<br />RAID Level: Primary-1, Secondary-0, RAID Level Qualifier-0
<br />Size:714880MB
<br />State: Optimal
<br />Stripe Size: 64kB
<br />Number Of Drives:2
<br />Span Depth:1
<br />Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
<br />Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
<br />Access Policy: Read/Write
<br />Disk Cache Policy: Disk's Default
<br />
<br />
<br />#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -PDList -aALL
<br />
<br />Adapter #0
<br />
<br />Enclosure Device ID: N/A
<br />Slot Number: 0
<br />Device Id: 0
<br />Sequence Number: 2
<br />...
<br />Last Predictive Failure Event Seq Number: 0
<br />Raw Size: 715404MB [0x575466f0 Sectors]
<br />...
<br />Inquiry Data: ATA ST3750640NS E 3QD0XYL2
<br />
<br />Enclosure Device ID: N/A
<br />Slot Number: 1
<br />Device Id: 1
<br />Sequence Number: 2
<br />...
<br />Last Predictive Failure Event Seq Number: 0
<br />Raw Size: 715404MB [0x575466f0 Sectors]
<br />...
<br />Connected Port Number: 1
<br />Inquiry Data: ATA ST3750640NS E 3QD0ZKAX</code>
<br />
<br />
<br />Para algunas <span style="font-weight:bold;">ADAPTEC, ADAPTEC DPT, SmartRaid V</span> hay que utilizar <a href="http://i2o.shadowconnect.com/">dpt-i2o-raidutils / raidutils</a>), de estas no tengo ejemplo.
<br />
<br />Y finalmente para el <span style="font-weight:bold;">raid por software</span>:
<br />
<br /><code>~# mdadm --detail /dev/md0
<br />/dev/md0:
<br /> Version : 00.90.01
<br /> Creation Time : Fri Jul 11 11:46:30 2008
<br /> Raid Level : raid1
<br /> Array Size : 995904 (972.73 MiB 1019.81 MB)
<br /> Device Size : 995904 (972.73 MiB 1019.81 MB)
<br /> Raid Devices : 2
<br /> Total Devices : 2
<br />Preferred Minor : 0
<br /> Persistence : Superblock is persistent
<br />
<br /> Update Time : Sat Jul 12 06:25:46 2008
<br /> State : clean
<br /> Active Devices : 2
<br />Working Devices : 2
<br /> Failed Devices : 0
<br /> Spare Devices : 0
<br />
<br /> UUID : cc3a522e:25fd72ba:1f0687a3:f9661a16
<br /> Events : 0.34
<br />
<br /> Number Major Minor RaidDevice State
<br /> 0 8 17 0 active sync /dev/sdb1
<br /> 1 8 33 1 active sync /dev/sdc1</code>
<br />
<br />y otro comando para saber las unidades no óptimas:
<br />
<br /><code>cat /proc/mdstat | egrep '(U_|_U)' | wc -l</code>
<br />
<br />
<br />owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-22676563529266454102008-06-08T02:13:00.000-07:002008-06-08T02:59:55.087-07:00XMLTVEl segundo proyecto en el que colaboro se llama <span style="font-weight:bold;">xmltv</span><br /><br /><span style="font-weight:bold;">xmltv</span> consiste en un conjunto de "grabbers", que generan un fichero XML.<br /><br />¿Pero para qué sirven esos ficheros?<br /><br />Seguramente ya tengáis un aparatito TDT y en el mando habéis visto un botón que pone <span style="font-weight:bold;">"EPG"</span> (guía electrónica de programas), donde os muestra que están emitiendo (nombre, duración entre horas y una descripción), y los programas que se emitirán a continuación y sus horarios correspondientes.<br /><br />Esto es la nueva era digital, poder saber que emitirán, en que horas y poder ponerlo a grabar.<br /><br />Pero en España realmente se pasan a la torera el actualizar la guía de canales a través de TDT, o algunos canales no lo utilizan, o ponen las horas mal, etc..<br /><br />XMLTV hace el mismo trabajo que EPG en la TDT, genera un fichero donde contiene información de lo que echa la televisión, por título, horario, descripción e incluso se puede organizar por distintos tipos de canales (deportes, cines, etc). Una vez generado ese fichero se puede utilizar cualquier frontend para visualizar:<br /> - si tienes un media center: <a href="http://www.mythtv.org/">MythTV</a> o <a href="http://freevo.sourceforge.net/">Freevo</a> (del que he hablado en este mismo blog), podréis acceder a la guía y programar vuestras grabaciones) o <br /> - una aplicacion tipo <a href="http://freeguide-tv.sourceforge.net/">freeguide</a> <br /><br />El formato del fichero es bastante simple: <br /><code><br /> <?xml version="1.0" encoding="ISO-8859-15"?><br /><!DOCTYPE tv SYSTEM "xmltv.dtd"><br /><tv source-info-url="http://www.miguiatv.com/todos-los-canales.html" source-data-url="http://www.miguiatv.com/todos-los-canales.html" generator-info-name="XMLTV" generator-info-url="http://membled.com/work/apps/xmltv/"><br /> <channel id="CLa-20Sexta.miguiatv.com"><br /> <display-name>La Sexta</display-name><br /> </channel><br /><br /><programme start="20080608071000 +0200" channel="CLa-20Sexta.miguiatv.com"><br /> <title lang="es">Apuesta en 20'</title><br /> <desc lang="es">Programa presentado por Javier Mart<ED>n.</desc><br /> <category lang="es">CONCURSO</category><br /> </programme><br /></tv></code><br /><br />No creo que haya que explicar mucho: primero se pone la cabecera <tv> indicando de donde se genera los datos e información del generador. Luego van los <channel> donde se indica un id y el nombre de cada canal. Luego directamente se establecen los programas con <programme>, la fecha de inicio y al canal que corresponda. Dentro de <programa> se indica el título, la descripción y opcionalmente la categoría. Es importante saber que un programa acaba cuando empieza el otro. Es decir, no se establece su duración.<br /><br />En freevo luce tal que así:<br /><img src="http://www.linuxdevcenter.com/linux/2005/01/27/graphics/freevo_tvguide.jpg"><br /><br /><br /><br />La instalación de XMLTV tampoco tiene mucho misterio, en debian:<br /><br /><blockquote>apt-get install xmltv</blockquote><br /><br />Si quereis utilizar el que he creado yo (coge datos de <a href="http://www.miguiatv.com/">miguiatv</a>)<br /><br /><br /><blockquote>tv_grab_es_miguiatv --configure</blockquote><br /><br />Luego elegís los canales que os interesa, y luego ya cada noche sólo teneis que generar el fichero .xml para poder utilizarlo.<br /><blockquote><br />0 0 * * * tv_grab_es_miguiatv > /tmp/TV.xml</blockquote><br /><br />Para decirle a <span style="font-weight:bold;">FreeVO</span> de dónde coger la gúia de televisión, editamos <span style="font-weight:bold;">/etc/freevo/local_conf.py</span> y establecemos:<br /><br /><blockquote>XMLTV_FILE = '/tmp/TV.xml'</blockquote>owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com3tag:blogger.com,1999:blog-3748765271185253537.post-36932318331208275562008-06-01T04:05:00.000-07:002008-06-01T04:49:20.489-07:00ShorewallA veces las cosas complejas y difíciles se pueden hacer simples y fáciles. Esa frase es el ejemplo de <span style="font-weight:bold;">Shorewall</span>, hace fácil y simple el <span style="font-weight:bold;">firewall</span> de Linux.<br /><br /><span style="font-weight:bold;">IPtables</span> sirve para packet filtering y para NAT en linux. El problema es que su sintaxis es bastante engorrosa, y muchas veces en máquinas en producción un cambio puede ocurrer muchos problemas. Un ejemplo para ver la complejidad de iptables:<br /><br /><br /><blockquote>iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10</blockquote><br /><br /><br />Por ello nace el frontend del que hablamos hoy, simplifica la creación de packet filtering, de NAT, de control de tráfico y un sinfín de cosas.<br /><br />Pasemos a la acción:<br /><br /><blockquote>apt-get install shorewall</blockquote><br /><br />La configuración del shorewall se guarda en: /etc/shorewall/, los ficheros principales: <br /><br />- shorewall.conf -> fichero que configura el frontend, la mayoría de las veces el por defecto nos debería servir<br />- zones -> Declara tus zonas de internet (fw, net, loc, dmz)<br />- interfaces -> asocia una zona con un interface (net-> eth0, dmz -> eth1, etc..)<br />- rules -> fichero de reglas (packet filtering, nat, etc)<br />- policy -> las políticas a seguir por defecto<br /><br />Un ejemplo de cada fichero (excepto shorewall.conf seria)<br /><br /><span style="font-weight:bold;">zones:</span><br /><br /><blockquote>fw firewall<br />net ipv4<br />loc ipv4<br />tun ipv4</blockquote><br /><br /><br /><span style="font-weight:bold;">interfaces:</span><br /><br /><blockquote>loc lan detect <br />net eth0 detect dhcp <br />tun tun+ dtect</blockquote><br /><br /><span style="font-weight:bold;"><br />rules:</span><br /><br /><blockquote>ACCEPT net $FW tcp 21<br />ACCEPT net $FW tcp 80<br />ACCEPT net:85.18.14.0 $FW tcp 8080<br />DNAT net loc:192.168.0.10 tcp 81<br />DROP all net tcp 4662</blockquote><br /><br /><span style="font-weight:bold;"><br />policy:</span><br /><br /><br /><blockquote>net all DROP info<br />all all REJECT info</blockquote><br /><br />creo que poco más que hay que explicar, el fichero importante el <strong>rules</strong><br /><br />cuyo formato es <br />(accion: ACCEPT o REJECT o DNAT o DROP o REJECT) (de donde: net, loc) (a donde: $fw, loc) (protocolo: tcp, udp, all) (puerto destino) (puerto origen)<br /><br />Una vez configurado podemos hacer: <span style="font-weight:bold;">shorewall check /etc/shorewall</span> para comprobar que la sintaxis está bien. Una vez que tengamos todo configurado podemos editar <span style="font-weight:bold;">/etc/default/shorewall</span> para establecer <span style="font-weight:bold;">startup=1</span> (para que se ejecute shorewall a través de init.d)<br /><br />Una vez lanzado shorewall, podemos ver su estado con <span style="font-weight:bold;">shorewall status</span>:<br /><br /><span style="font-style:italic;">Shorewall is running<br />State:Started (Sun Jun 1 00:02:21 CEST 2008)</span><br /><br />Si queremos hacer algun cambio, editamos los ficheros de /etc/shorewall/ y podemos hacer "shorewall try /etc/shorewall", yo recomiendo hacer una copia: <span style="font-weight:bold;">cp -a /etc/shorewall /etc/shorewall_pruebas</span>, editar los ficheros de /etc/shorewall_pruebas y hacer el shorewall try (si este falla volverá a la configuración, que debería funcionar bien de /etc/shorewall), una vez que el shorewall try compile las reglas y veas que todo funciona, copia de el fichero rules de /etc/shorewall_pruebas a /etc/shorewall y reinicia el shorewall.<br /><br />Una vez visto más o menos como instalarlo y que ficheros editar, podemos observar que sólo nos debemos preocupar de meter las reglas en el fichero <strong>rules</strong>, y su síntaxis como indicaba arriba es muy fácil. <br /><br />Podemos ver las diferencias:<br />Iptables:<br /><br /><blockquote>iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10</blockquote><br /><br /><br />Shorewall:<br /><br /><blockquote>DNAT net loc:192.168.0.10 tcp 81</blockquote><br /><br /><br />Finalmente comentar algunos comandos de utilidad:<br />- shorewall show connections (muestra el estado de las conexiones activas, los packetes enviados, el origen, destino, etc)<br />- shorewall reject <ip> (rechaza una ip, cuando se reinicie el shorewall no estará bloqueada)<br />- shorewall drop <ip> (bloquea una ip, idem que antes)<br />(tambien existe logreject, logdrop)<br />- shorewall allow <ip> (permite el acceso a una ip bloqueada/rechazada anteriormente)<br />- shorewall try <directorio> [timeout] (compila y prueba las reglas de un directorio, si se establece timeout, pasado ese tiempo si no se reinicia el shorewall, se coge la configuracion de nuevo de /etc/shorewall, util para compilar reglas que te puedan dejar sin conexion)<br />- shorewall check <directorio> (comprueba la sintaxis de un directorio sin compilar las reglas)<br /><br />Además, si establecemos en el policiy o en rules (ejemplo DNAT:info), que se loguee las reglas podemos ver en /var/log/syslog algo asi:<br /><br /><code><br />Jun 1 13:11:25 Atlantis kernel: Shorewall:net2all:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=***.211.***.27 DST=83.**.160.** LEN=485 TOS=0x00 PREC=0x00 TTL=42 ID=0 DF PROTO=UDP SPT=4637 DPT=1027 LEN=465 <br /></code><br /><br />Para finalizar, una regla interesante:<br /><blockquote><br />Limit:info:SSHA,3,60 net $FW tcp 22<br /></blockquote><br /><br />Esta regla establece 3 conexiones cada 60 segundos al puerto 22, si se realizan más, se bloquea durante un tiempo a la ip que supera ese límite, es muy útil para evitar ataques brute-force de contraseñas.<br /><br />Hay que tener un fichero Limit dentro de /etc/shorewall (regla cogida de <a href="http://www.shorewall.net">www.shorewall.net</a>)<br /><code><br />set -- $(separate_list $TAG)<br /><br />[ $# -eq 3 ] || fatal_error "Rule must include <set name>,<max connections>,<interval> as the log tag"<br /><br />run_iptables -A $CHAIN -m recent --name $1 --set<br /><br />if [ -n "$LEVEL" ]; then<br /> run_iptables -N $CHAIN%<br /> log_rule_limit $LEVEL $CHAIN% $1 DROP "" "" -A<br /> run_iptables -A $CHAIN% -j DROP<br /> run_iptables -A $CHAIN -m recent --name $1 --update --seconds $3 --hitcount $(( $2 + 1 )) -j $CHAIN%<br />else<br /> run_iptables -A $CHAIN -m recent --update --name $1 --seconds $3 --hitcount $(( $2 + 1 )) -j DROP<br />fi<br /><br />run_iptables -A $CHAIN -j ACCEPT<br /></code><br /><br />Cuando se intenta 4 conexiones en un periodo menor de 60 segundos podemos ver en el /var/log/syslog algo así:<br /><br /><code><br />May 23 18:39:35 Atlantis kernel: Shorewall:SSHA:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=202.129.37.66 DST=**.***.***.** LEN=60 TOS=0x00 PREC=0x00 TTL=46 ID=24119 DF PROTO=TCP SPT=53578 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0 <br /></code><br /><br />Enlaces:<br /><a href="http://www.shorewall.net">Web oficial de shorewall</a>owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com1tag:blogger.com,1999:blog-3748765271185253537.post-7196661863579688172008-05-17T03:25:00.001-07:002008-05-17T03:35:34.852-07:00Google mapsUna de las cosas más divertidas que he hecho en mi trabajo es un "controlador" de obras. La intención era poder "dibujar" el tramo que está en obras con unos datos específicos (nombre, punto kilométrico, incluir ficheros, etc). Además, una vez introducida debería listarse en el mapa con las otras obras, y al hacer click que se abriera una pequeña ventana (dentro de google maps) con un pequeño resumen.<br /><br /><br />Google maps es muy fácil, sólo necesitas un key para utilizar su API y leer <a href="http://code.google.com/apis/maps/">http://code.google.com/apis/maps/</a>, cualquiera puede hacer virguerías con google maps, con un mínimo conocimiento de JavaScript.<br /><br />Yo tuve que utilizar lo que denominan "polyline" que es algo así como un código (posee encoded polyline y encoded levels) que se genera a través de lo que hay el mapa. Es decir, si dibujas una recta, pues ese código, si lo vuelves a introducir en el mapa en una siguiente sesión, se mostrará tal cual la línea.<br /><br />Eso es útil para los programadores, sólo tienes que preocuparte de guardar ese encoded polyline y el encoded levels para cuando lo quieras mostrar. Además, en mi caso, guardo el Zoom Level último.<br /><br />Luego ya sólo queda que al mostrarlo crear un Marker y un evento que al hacer click te muestre los datos que quieres.<br /><br /><code>function createPointMarker(point, highlighted, idObra2) {<br /> var clr = highlighted ? "yellow" : "blue";<br /><br /> var point_marker = createMarker(point, clr);<br /> point_marker.enableDragging();<br /><br /> GEvent.addListener(point_marker, "drag", function() {<br /> var index = findMarkerIndex(point_marker);<br /><br /> if (index >= 0) {<br /> var nLat = point_marker.getPoint().lat();<br /> var nLng = point_marker.getPoint().lng();<br /><br /> var pLevel = points[index].Level;<br /><br /> var modifiedPoint = {<br /> Latitude: nLat,<br /> Longitude: nLng,<br /> Level: pLevel<br /> };<br /><br /> points[index] = modifiedPoint;<br /> createEncodings(false);<br /> document.getElementById('pointList').options[index]<br /> = new Option('(' + nLat + ',' + nLng + ')', index);<br /> }<br /> });<br /><br /> GEvent.addListener(point_marker, "click", function() {<br /> highlight(findMarkerIndex(point_marker));<br /> if(idObra2) {<br /> GDownloadUrl("wdatos.php?id=" + idObra2, function(data) { point_marker.openInfoWindowHtml(data); });<br /> }<br /> // point_marker.openInfoWindowHtml(result);<br /> });<br /><br /> return point_marker;<br />}<br /></code><br /><br />El resultado: <a href="http://www.nightmare.es/ver.php">http://www.nightmare.es/ver.php</a><br /><br />El crear obra (la parte del mapa, con polyline, etc) es copiado de: <a href="http://code.google.com/apis/maps/documentation/polylineutility.html">http://code.google.com/apis/maps/documentation/polylineutility.html</a> y adaptado para mis fines.owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com1tag:blogger.com,1999:blog-3748765271185253537.post-3431119557791334462008-04-30T01:14:00.000-07:002008-04-30T01:29:51.853-07:00FreevoUno de los dos <span style="font-weight:bold;">proyectos</span> en los que colaboro es un <span style="font-weight:bold;">media center</span> llamado <span style="font-weight:bold;"><a href="http://www.freevo.org">FREEVO</a></span>. <br />Está escrito en <span style="font-weight:bold;">python</span>, y aunque no tenga muchos conocimientos de este lenguaje he podido colaborar con el proyecto:<br /><br />- Creando un plugin para ver videos de youtube, ya sea mediante búsqueda o especificando en la configuración el usuario para ver sus videos.<br />- Creando un plugin para ver imágenes de flickr a través de un id.<br />- Algunos cambios en la pantalla de introducir texto.<br />- Algunos cambios para que se pueda reproducir determinados sonidos al entrar en un menú. (Por ejemplo, al entrar en el menú de noticias, que suene un sonido determinado).<br /><br />http://doc.freevo.org/ImagePlugins<br />http://doc.freevo.org/MoviePlugins<br /><br />Freevo, es un <span style="font-weight:bold;">media center</span> de código abierto para Linux, tiene soporte para: lirc (para mandos a distancia), reproductores de video (mplayer, xine), reproductores de mp3, reproductor de dvd, rss, televisión, visor de imágenes, el tiempo... Además permite distintos skins, montón de configuraciones, carátulas para audio, búsquedas en imdb, información de duración/resolución de películas y un largo etc.<br /><br />Recomiendo utilizar la versión de svn:<br /><br />svn co svn://svn.freevo.org/freevo/branches/rel-1 freevo-1.x<br />svn export svn://svn.freevo.org/kaa/trunk/base kaa/base<br /><br />y dentro de cada directorio <span style="font-weight:bold;">python setup.py install</span><br /><br />luego sólo nos queda configurar <span style="font-weight:bold;">/etc/freevo/freevo.conf</span> y <span style="font-weight:bold;">/etc/freevo/local_conf.py</span> (opcionalmente para lirc, <span style="font-weight:bold;">/etc/freevo/lircrc</span>)<br /><br /><br /><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/mdXcQa5URBE&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/mdXcQa5URBE&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object>owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0tag:blogger.com,1999:blog-3748765271185253537.post-88799873870523132892008-04-19T00:28:00.000-07:002008-04-22T01:12:28.819-07:00Diferencial GPS (I)<span style="font-weight:bold;">"Tengo una solución"</span>, dijo el encargado de informática donde estábamos implementando una solución gps, <span style="font-weight:bold;">"ya sé cómo solucionar el error del GPS"</span>.<br /><br />Todo eso con un papel en la mano y una seguridad en lo que decía sorprendente. <br /><br /><span style="font-weight:bold;">"Como tenemos un mapa de nuestra superficie y tenemos un punto fijo que sabemos las coordenadas, ponemos ahí un aparato GPS y con ello sabemos la diferencia".</span><br /><br />Quizás no se preguntó, el porqué un sistema de <span style="font-weight:bold;">DGPS</span> cuesta más de un millón de pesetas, y quizás más de dos. La contestación fue bastante simple para desmontar su teoría, "<span style="font-weight:bold;">¿y qué pasa si un GPS que dices está cogiendo distintos satélites a los que le aplicaremos la corrección??"</span>. El tema acabó ahí.<br /><br />Un sistema <span style="font-weight:bold;">DGPS</span>, lo que hace a grandes rasgos, es situarse en un punto con coordenadas conocidas. Luego para cada satélite mide su error. <br /><br />Hasta ahí todo genial, tenemos un sistema que nos dice que error tiene cada satélite. <br /><br /><span style="font-weight:bold;">¿Y a mí, con mi aparato GPS, cómo me afecta eso? ¿Cómo puedo utilizarlo?</span><br /><br />Un sistema <span style="font-weight:bold;">DGPS</span>, utiliza un estándar para el uso de correciones. Ese estándar es feo, oscuro y casi imposible de aprender, su nombre es <span style="font-weight:bold;">RTCM</span>.<br /><br /><span style="font-weight:bold;">RTCM </span> te envía distintos fragmentos, indicándote que corrección tienes que aplicar para cada satélite, y algo muy importante: la fecha de esa corrección.<br /><br />¿Por qué es importante la fecha? Imagínate que la corrección fuese de hace 5 segundos, y él, por problemas de red o lo que sea te llega ahora. ¿Qué pasaría? Estarías aplicando una corrección de hace 5 segundos que seguramente ahora sea distinta, y tu <span style="font-weight:bold;">GPS</span> hará un llamado "salto".<br /><br />¿Cómo recogemos las tramas RTCM? Como supongo que no tendrás el <span style="font-weight:bold;">GPS</span> conectado al <span style="font-weight:bold;">DGPS</span>, habrá que utilizar un protocolo de comunicación entre el <span style="font-style:italic;">DGPS</span> y tu aparato <span style="font-style:italic;">GPS</span>. Ese protocolo de comunicación se llama <span style="font-weight:bold;">NTRIP.</span> <br /><br /><span style="font-weight:bold;">Hay tres puntos importantes en NTRIP: NtripServer, NtripCaster y NtripClient.</span><br /><br /><span style="font-style:italic;">NtripServer:</span> Es el que recoge las correcciones <span style="font-style:italic;">RTCM</span> desde el <span style="font-style:italic;">DGPS</span> y los trasmite a un NtripCaster.<br /><span style="font-style:italic;">NtripCaster: </span>Recibe datos de 1 o varios NtripServer, y espera las conexiones de los NtripClients para tramitarles el <span style="font-style:italic;">RTCM.</span><br />N<span style="font-style:italic;">tripClient</span>: Ésta es la parte del cliente, se conecta a un NtripCaster y solicita los datos de un punto de montaje, una vez que pida ese punto de montaje, recibirá las tramas <span style="font-weight:bold;">RTCM</span>.<br /><br />Los puntos de montaje son simplemente los <span style="font-weight:bold;">NtripServer</span> pero etiquetados de una forma u otra.<br /><br />El protocolo Ntrip es basado en el protocolo HTTP, es decir, te conectas a un puerto y utilizas la misma sintaxis que en HTTP: "GET / HTTP/1.0" o "GET /puntomontaje HTTP/1.0".<br /><br />Una vez solicitado recibir tramas <span style="font-weight:bold;">RTCM</span> a través de un punto de montaje (si no existe te devolverá el <span style="font-weight:bold;">SOURCETABLE</span> que es igual que solicitar /), recibirás un stream que irás recibiendo <span style="font-weight:bold;">RTCM</span> hasta que tú cierres la conexión.<br /><br /><br />Un ejemplo de <span style="font-weight:bold;">NtripCaster</span> podemos verlo en: http://catnet-ip.icc.es:8080/<br /><br />Explicación de una línea:<br />STR;MATADGPS;MATA (Matar?);RTCM 2.3;23(11), 24(11), 1,31;0;GPS;Catnet;DEU;41.53;2.41;0;0;GPSNet;None;B;N;640;;<br /><br />Los datos que nos importa de esa línea son: <br /><span style="font-style:italic;">MATADGPS</span>: es el punto de montaje, si pedimos /MATADGPS Nos devolveŕa todos los datos <span style="font-weight:bold;">RTCM</span> para ese <span style="font-weight:bold;">DGPS</span>.<br /><span style="font-style:italic;">RTCM 2.3</span>: La versión de <span style="font-weight:bold;">RTCM</span>, yo sólo he visto la 2.3, pero hay la 3.0 en un libro pero no tuve que verlo.<br /><span style="font-style:italic;">23(11), 24(11), 31</span>: El <span style="font-weight:bold;">tipo de corrección</span> y entre parentésis cada cuanto tiempo se envia.<br />Los demás datos son informativos, en plan si es de pago, las coordenadas donde está, el país, etc.<br /><br /><br />Y ya se me olvidaba decir que hay distintos <span style="font-weight:bold;">tipos de corrección.</span> En la segunda parte os comentaré los que utilicé yo (1, 3, 9 creo recordar) y algunos datos más. E indicaré aplicaciones <span style="font-weight:bold;">NtripClient</span>.<br /><br />Como hablo de un proyecto de hace 7 meses quizás recuerde algunas cosas mal.owenhttp://www.blogger.com/profile/15459394147945029624noreply@blogger.com0