domingo, 19 de abril de 2009

Editar gráficas con c# dentro de word con excel embebido

editing chart with c# inside word with excel embedded

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO.Packaging;
using System.IO;
using System.Xml;
using Word = Microsoft.Office.Interop.Word;


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Create the Word application and declare a document
Word.Application word = new Word.Application();
Word.Document doc = new Word.Document();

// Define an object to pass to the API for missing parameters
object oMissing = System.Type.Missing;

try
{




object oTemplate = @"G:\document.docx";

Package docPackage = Package.Open(oTemplate.ToString(), FileMode.Open, FileAccess.ReadWrite);

PackagePart xlsPackagePart = docPackage.GetPart(new Uri("/word/embeddings/Hoja_de_c_lculo_de_Microsoft_Office_Excel1.xlsx", UriKind.Relative));

Package xlsPackage = Package.Open(xlsPackagePart.GetStream(), FileMode.Open, FileAccess.ReadWrite);

PackagePart hoja1 = xlsPackage.GetPart(new Uri("/xl/worksheets/sheet1.xml", UriKind.Relative));

XmlDocument docxml = new XmlDocument();
docxml.Load(hoja1.GetStream());

XmlNamespaceManager nsManager = new XmlNamespaceManager(docxml.NameTable);
nsManager.AddNamespace("d", docxml.DocumentElement.NamespaceURI);
XmlNode cell = docxml.SelectSingleNode(string.Format("//d:sheetData/d:row/d:c[@r='{0}']/d:v", "D9"),nsManager);
cell.ChildNodes[0].Value = "4";

cell = docxml.SelectSingleNode(string.Format("//d:sheetData/d:row/d:c[@r='{0}']/d:v", "D10"), nsManager);
cell.ChildNodes[0].Value = "5";


docxml.Save(hoja1.GetStream(FileMode.Create, FileAccess.ReadWrite));

PackagePart chart1 = docPackage.GetPart(new Uri("/word/charts/chart1.xml", UriKind.Relative));
docxml.Load(chart1.GetStream());

XmlNodeList nodos = docxml.GetElementsByTagName("c:numCache");
nodos[0].ChildNodes[2].ChildNodes[0].ChildNodes[0].Value= "4";
nodos[0].ChildNodes[3].ChildNodes[0].ChildNodes[0].Value = "5";

docxml.Save(chart1.GetStream(FileMode.Create, FileAccess.ReadWrite));

xlsPackage.Close();
docPackage.Close();







doc = word.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);









word.Visible = true;


}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
//doc.Close(ref missing, ref missing, ref missing);
word.Application.Quit(ref oMissing, ref oMissing, ref oMissing);

}

}
}
}

martes, 3 de febrero de 2009

business days en alfresco

la documentacion de alfresco para ciertas cosas.. es algo lamentable
por ejemplo, para enviar un correo pasado 3 días laborables.
o por ejemplo para que una tarea envie un correo utilizando un template y ese template se asocie a ese documento.

<task-node name="peticion"&rt;
<task name="wf:peticionTask" swimlane="assignee"&rt;
<timer name="sendNotification" duedate="3 business days"&rt;
<action name="sendNotification" class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"&rt;
<script&rt;
var mydoc = bpm_package.children[0];

var mail = actions.create("mail");
var mytemplate = companyhome.childByNamePath("Diccionario de datos/Modelos de Email/retraso_preparacion.ftl");
mail.parameters.to = "something@domain.ext";
mail.parameters.subject = "some text ";
mail.parameters.from = "something@domaint.exe";
mail.parameters.text = mydoc.processTemplate(mytemplate);
mail.execute(bpm_package);

</script&rt;
</action&rt;
</timer&rt;
</task&rt;
</task-node&rt;

domingo, 2 de noviembre de 2008

Sobre el dinero

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.

Paul Auster en "A salto de mata; crónica de un fracaso precoz"

sábado, 18 de octubre de 2008

problema drivers nvidia

Al actualizar el libc6 (o alguna cosa con dist-upgrade), me surgió que no podía reinstalar los drivers de NVIDIA:

WARNING: The symbolic link '/usr/lib/libnvidia-tls.so.1' does not point to
'libnvidia-tls.so.177.80' as is necessary for correct operation of the
NVIDIA Accelerated Graphics Driver for Linux-x86. It is possible that
`ldconfig` has created this incorrect symbolic link because
tls/libnvidia-tls.so.177.80's "soname" conflicts with that of
libnvidia-tls.so.177.80. It is recommended that you remove or rename
the file 'tls/libnvidia-tls.so.177.80' and create the necessary
symbolic link by running `ln -sf libnvidia-tls.so.177.80
/usr/lib/libnvidia-tls.so.1`.
-> done.


cd /usr/lib/
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.

lunes, 18 de agosto de 2008

En un correo spam

Un 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.
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.
¡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”.
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.
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...”

martes, 29 de julio de 2008

AoE

Hoy hablaré como verl estado de un raid (Coraid) a través de ATA Over Ethernet (aoe)

Para ello utilizaremos Coraid Ethernet Console client

Una vez descomprimido, compilado podemos ejecutar para ver el estado:


datos:~/cec-8# ./cec -s 1 eth1
Probing for shelves ... shelf 1 found.
connecting ... done.
Escape is Ctrl-\

SR shelf 1> show -l
1.0 500.108GB up
1.1 500.108GB up
1.2 500.108GB up
1.3 500.108GB up
1.4 500.108GB up
1.5 500.108GB up
1.6 500.108GB up
1.7 500.108GB up
1.8 0.000GB down
1.9 0.000GB down
1.10 0.000GB down
1.11 0.000GB down
1.12 0.000GB down
1.13 0.000GB down
1.14 0.000GB down
SR shelf 1> list
1 2000.431GB online
2 1000.216GB online
SR shelf 1> list -l
1 2000.431GB online
1.0 2000.431GB raid5 normal
1.0.0 normal 500.108GB 1.0
1.0.1 normal 500.108GB 1.1
1.0.2 normal 500.108GB 1.2
1.0.3 normal 500.108GB 1.3
1.0.4 normal 500.108GB 1.4
2 1000.216GB online
2.0 1000.216GB raid5 normal
2.0.0 normal 500.108GB 1.5
2.0.1 normal 500.108GB 1.6
2.0.2 normal 500.108GB 1.7


Yo me he hecho un pequeño script en expect para que compruebe si el estado del raid es "online". Lo que hace es lanzar el "cec", hacer un list y salir.

#!/usr/bin/expect -f
set send_slow {1 .1}
proc send {ignore arg} {
sleep .3
exp_send -s -- $arg
}

set timeout -1
spawn /root/cec-8/cec -s 1 eth1
match_max 100000
expect -exact "Probing for shelves ... shelf 1 found.\r
connecting ... done.\r
Escape is Ctrl-\\\r
"
send -- "\r"
expect -exact "\r\r
SR shelf 1> "
send -- "list\r"
send -- "\r"
expect -exact "\r\r
SR shelf 1> "
send -- ""
expect -exact ">>> "
send -- "q\r"
expect eof

sábado, 12 de julio de 2008

Raid

Hoy hablaré sobre las distintas utilidades para ver el estado de distintas controladoras raid.
No de todas que sería imposible, sino de las que monitorizo a diario y he encontrado aplicaciones para ello.

3ware

Su aplicación es tw_cli:


//backup> /c5 show all
/c5 Driver Version = 2.26.02.008
/c5 Model = 9550SXU-8LP
/c5 Available Memory = 112MB
/c5 Firmware Version = FE9X 3.04.00.005
/c5 Bios Version = BE9X 3.04.00.002
...
/c5 Number of Ports = 8
/c5 Number of Drives = 4
/c5 Number of Units = 1
/c5 Total Optimal Units = 1
/c5 Not Optimal Units = 0
...
/c5 Controller Bus Speed = 66 Mhz

Unit UnitType Status %RCmpl %V/I/M Stripe Size(GB) Cache AVrfy
------------------------------------------------------------------------------
u0 RAID-5 OK - - 64K 2095.44 ON OFF

Port Status Unit Size Blocks Serial
---------------------------------------------------------------
p0 OK u0 698.63 GB 1465149168 5QD0D6RW
p1 OK u0 698.63 GB 1465149168 5QD0D8B5
p2 OK u0 698.63 GB 1465149168 5QD0D6TG
p3 OK u0 698.63 GB 1465149168 5QD0D6TK
p4 NOT-PRESENT - - - -
..


ADAPTEC

Tenemos dos aplicaciones dependiendo la versión de la controladora, si tiene firmware antiguo utilizaremos afacli

Debemos crear primero /dev/afa0, para ello vemos major number con:
grep aac /proc/devices

y luego mknod /dev/afa0 c 0


:# afacli
CLI > open afa0
Executing: open "afa0"

AFA0> container list

Executing: container list
Num Total Oth Chunk Scsi Partition
Label Type Size Ctr Size Usage B:ID:L Offset:Size
----- ------ ------ --- ------ ------- ------ -------------
0 RAID-5 1.09TB 64KB Valid 0:00:0 64.0KB: 279GB
/dev/sda RAID5_5x300 0:01:0 64.0KB: 279GB
0:05:0 64.0KB: 279GB
0:03:0 64.0KB: 279GB
0:04:0 64.0KB: 279GB

1 Volume 279GB Valid 0:02:0 64.0KB: 279GB
/dev/sdb VOLUME_1X300



Para las controladoras con nuevo Firmware (lo sabran porque el afacli dice que la DLL que tiene es antigua) tendrán que usar arcconf utilidad de StorMan

~# /usr/src/prueba/usr/StorMan/arcconf GETCONFIG 1 AD
sh: /bin/sort: No existe el fichero o el directorio
Controllers found: 1
----------------------------------------------------------------------
Controller information
----------------------------------------------------------------------
Controller Status : Optimal
Channel description : SCSI
Controller Model : Adaptec 2020ZCR
Controller Serial Number : BAD0
Physical Slot : 2
Installed memory : 64 MB
Copyback : Disabled
Background consistency check : Disabled
Automatic Failover : Enabled
Defunct disk drive count : 0
Logical devices/Failed/Degraded : 2/0/0
--------------------------------------------------------
Controller Version Information
--------------------------------------------------------
BIOS : 5.1-0 (8458)
Firmware : 5.1-0 (8458)
Driver : 1.1-5 (2409)
Boot Flash : 0.0-0 (0)


Compaq Computer Corporation Smart Array

Utilizaremos arrayprobe

correo:~# /usr/bin/arrayprobe -r|tail -3
Logical drive 0 on controller /dev/cciss/c0d0 has state 0
Logical drive 1 on controller /dev/cciss/c0d0 has state 0
OK Arrayprobe All controllers ok


megaRAID

Utilizaremos la aplicación megaCLI


#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -LDInfo -LALL -aALL


Adapter 0 -- Virtual Drive Information:
Virtual Disk: 0 (target id: 0)
Name:sistema
RAID Level: Primary-1, Secondary-0, RAID Level Qualifier-0
Size:714880MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:2
Span Depth:1
Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk's Default


#:/opt/MegaRAID/MegaCli # /opt/MegaRAID/MegaCli/MegaCli -PDList -aALL

Adapter #0

Enclosure Device ID: N/A
Slot Number: 0
Device Id: 0
Sequence Number: 2
...
Last Predictive Failure Event Seq Number: 0
Raw Size: 715404MB [0x575466f0 Sectors]
...
Inquiry Data: ATA ST3750640NS E 3QD0XYL2

Enclosure Device ID: N/A
Slot Number: 1
Device Id: 1
Sequence Number: 2
...
Last Predictive Failure Event Seq Number: 0
Raw Size: 715404MB [0x575466f0 Sectors]
...
Connected Port Number: 1
Inquiry Data: ATA ST3750640NS E 3QD0ZKAX



Para algunas ADAPTEC, ADAPTEC DPT, SmartRaid V hay que utilizar dpt-i2o-raidutils / raidutils), de estas no tengo ejemplo.

Y finalmente para el raid por software:

~# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.01
Creation Time : Fri Jul 11 11:46:30 2008
Raid Level : raid1
Array Size : 995904 (972.73 MiB 1019.81 MB)
Device Size : 995904 (972.73 MiB 1019.81 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Sat Jul 12 06:25:46 2008
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : cc3a522e:25fd72ba:1f0687a3:f9661a16
Events : 0.34

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1


y otro comando para saber las unidades no óptimas:

cat /proc/mdstat | egrep '(U_|_U)' | wc -l