Excel y .NET, malos amigos: Cambiar el rango de datos a un gráfico

Como casi todos los hemos programado algo para .NET, hemos visto la potencia que tiene. Pero cuando ponemos de nuevo los pies en la tierra es cuando tenemos que volver a usar los objetos COM de Windows.

Arrrrggg… Malditos. ¡Luego me preguntarán que porqué odio a muerte el Office!.

Imaginaros el caso: Un excel «plantilla», donde solo hay que rellenar ciertos datos, pero con unas columnas de datos de longitud dinámica, puede haber desde 10 a 300. Como no, la cosa se complica, también quieren un gráfico que sea variable (es decir, si solo hay 5 datos, que muestre 5, y si hay mas pues mas…). Todo esto se arregla fácilmente con una macro o con una complicada función de esas que trae excel.

Pero ya que el excel lo rellena un programa en .NET (C# para ser mas exactos) lo vamos ha hacel elegantemente:

// Elegir el Gráfico a modificar, es curioso pero si tipo lo declarais con "Chart" en vez de "_Chart" también funciona
Microsoft.Office.Interop.Excel._Chart chart = (Microsoft.Office.Interop.Excel._Chart)objWorkbook.Charts["Mi gráfico"];

// Ahora a cambiar las series que tienen que estar definidas, se podria utilizar el nombre tambien
// FILA es un double donde esta la fila donde acaban los datos
serie = (Microsoft.Office.Interop.Excel.Series) chart.SeriesCollection(1);
serie.XValues = objSheet.get_Range("A4", "A" + Math.Floor(Fila));
serie.Values = objSheet.get_Range("C4", "C" + Math.Floor(Fila));
// Otra serie que tiene el gráfico
serie = (Microsoft.Office.Interop.Excel.Series) chart.SeriesCollection(2);
serie.Values = objSheet.get_Range("D4", "D" + Math.Floor(Fila));

Tachán… tus gráficos con datos dinámicos en un par de líneas. Eso si, tras mucho pensar 🙂

Please follow and like us:

.NET: Como hacer una única función de «Close» para multiples paneles

Os pongo en situación: una aplicación escrita en Visual C# 2005 con múltiples paneles a modo de ventanas flotantes en el form principal. Por necesidades del cliente, ahora se necesita que todos estos paneles tengan un botón de «salida», o «close».

Imaginaros, tengo 10 paneles, ¿tengo que hacer 10 funciones?. No hombre… es muy sencillo:

  • Poner los botones en cada panel. Haz doble click sobre uno, y escribe el código siguiente:
    private void btnCerrar_Click(object sender, EventArgs e)
    {
    System.Windows.Forms.Button btn = (Button)sender;
    btn.Parent.Visible = false;
    }
  • Ahora te vas a cada boton y le asignas esta función en cada evento click. Ya está.

Como veras, se puede usar para cerrar panels (en este caso hacerlos invisibles), mover cosas, cerrar un form, y todo lo que se te ocurra que sea muy repetivivo. Espero que os sirva de ayuda.

Please follow and like us:

Sale la versión 3.1.0 de OpenOffice… ¿Incluso con Oracle?

openoffice-logoTras la compra de Sun por parte de Oracle, todo el mundo del software libre se tambaleo, pensando en que iba a ocurrir con el apoyo al software libre que estaba realizando Sun. Sobre todo por MySQL y OpenOffice. Solo hay que ver que Oracle (Ooooracol! :P), se está comiendo medio mercado a base de comprar y comprar, mirar la lista para alucinar.
La respuesta es que parece que todo, por ahora sigue en su cauce, con la salida de OpenOffice 3.1.0 (en castellano, en la web aún no aparece), con ligeras mejoras, sobre todo visuales, y algunas mas que os paso a resumir:

  • Uso general de Anti-Aliasing.
  • Mejor manejo de los bloqueos de ficheros si las maquinas tienen diferente sistema operativo instalado.
  • Comentarios al texto en el Writer y un corrector gramatical completo (ya era hora).
  • Mejoras en el listado, y su mezcla con las cabeceras en el Writer. ¿Hacia falta?.
  • Al fin, digo, al fin. Impress permite cambiar el tamaño del texto con dos botones. Esto si que hacia falta.
  • Resaltado de sentencias SQL en Base, y la inclusión de macros y scripts dentro del fichero .odb

A mi me va ha venir muy bien, ya que tengo que terminar una cosilla en Impress y el cambio introducido me va a facilitar la vida.

Please follow and like us:

Al fin, como lograr que un cliente linux, actualice el DNS de un Windows 2003 server mediante el DHCP

Disclaimer: Desgraciadamente esto solo esta probado en un entorno con clientes Ubuntu, y servidores Windows 2003 Server. Si no es exactamente esta configuración de equipos, no te aseguro que funcione.

¡Por fin!… Un método que funciona, para que tu cliente Linux, metido dentro de una red con un Active Directory, pueda actualizar el DNS cuando recibe una ip a través de la DHCP del servidor.
El escenario en el cual esta solución es aplicable, es cuando tu ordenador Linux, recibe una ip del servidor DHCP de Windows, pero el resto de los equipos no pueden resolver el nombre de la máquina, solo mediante ip pueden contactar con la máquina. Y tras revisar el fichero «/etc/dhcp3/dhcp.conf» es correcto (en teoria no tendrías que tocar nada de fichero por defecto).

Bien… ¡deja de mirar a tu máquina Linux como la culpable!. La culpa esta en el servidor Windows. Tras mucho revisar a nuestro amigo Google, y culpar a mi pobre Linux, al final he visto que solo hay que tocar el servidor Windows en su servicio de DHCP para que todo vaya fino.

Por partes, solo hay que seguir este manual, aunque yo la voy a traducir y anotar:

  • ad_usuarioLo primero de todo es generar un usuario con los suficiente permisos para incluir registros/punteros en el DNS. Ir a «Usuarios y equipos de Active Directory», allí crear un nuevo usuario, pon por ejemplo un nombre muy descriptivo («dhcpTOdns», o «dhcpAdns» o «noBorrarEstePutoUsuario») pon un password que sea sencillo de recordar ya que no lo usaras muy a menudo :).
    Tras generarlo, tienes que incluirlo en el grupo «DnsUpdateProxy», el cual es el que nos concede el permiso para actualizar el DNS. Quitale cualquier otro permiso (quitale del grupo de «usuarios de dominio»).
  • dhcp_configAhora pasamos a la madre del cordero. Configurar el servicio de DHCPdel Windows 2003, para que use este nuevo usuario que hemos incluido. Entramos en la consola de administración del DHCP y pulsamos sobre el arbol de la izquierda sobre el servidor, luego «Propiedades», allí ve a la pestaña «DNS», y dejala tal y como pone en la imagen que te aparece en la derecha. Tras esto, solo queda ir a la pestaña de «Opciones Avanzadas» para allí pulsar sobre el botón de «Credenciales». Pon el usuario/dominio/password del usuario que hemos creado anteriormente.

Ahora en la máquinas Linux, haz un «sudo dhcpclient3 -d ethx» (donde ethx es tu tarjeta de red conectada al dominio) y todo el mundo podrá acceder por tu hostname a la maquina Linux. Huyuuuu….

Please follow and like us:

Como migrar una máquina Linux de dominio

¿Os habeis visto en este problema?. ¿No?, espero que nunca lo tengais que hacer, pero si os toca hacerlo, y migrar vuestra máquina Linux a otro dominio (una vez que lo tengais hecho… claro, si no esta dentro del dominio, pues como si oye llover xD), es tocar lo siguiente (ojo con las mayúsculas que no se ponen porque si):

  • Tocar el «/etc/krb5.conf» (solo marcaré los cambios):
    default_realm = TU.NUEVO.DOMINIO.COM
    [realms]
    TU.NUEVO.DOMINIO.COM = {
      kdc = dcserver.tu.nuevo.dominio.com
      admin_server = dcserver.tu.nuevo.dominio.com
      default_domain = TU.NUEVO.DOMINIO.COM
    }

    En este fichero puede que no tubieras el campo «kdc» ni «admin_server», aunque es recomendable por temas de velocidad.

  • Cambia el fichero «/etc/samba/smb.conf»:
       workgroup = TU # o TU.NUEVO o como lo tengas montado
       netbios name = NOMBRE_MAQUINA
       realm = TU.NUEVO.DOMINIO
       password server = dcserver.tu.nuevo.dominio.com

Con esto ya estaría. Pero dos grandes apuntes, de la experiencia:

  • Mete al servidor de dominio en el «/etc/resolv.conf», primero en la forma FQDN, y luego solo el nombre. Te ahorraras, algunos momentos de espera, que no hacen falta.
  • En «/etc/hosts», mete la siguiente línea:
    127.0.0.1 localhost maquina.tu.nuevo.dominio.com maquina

    Esto, te puede quitar un error, del tipo:  «Failed to set servicePrincipalNames», al unirte de nuevo al nuevo dominio.

Tras todo esto… la linea mágica:

sudo net ads join -U Administrador

Ya estará en el nuevo dominio. O al menos tendría que estarlo… 😛

Please follow and like us:

Usando SQLite en tus aplicaciones

Aveces, te planteas aplicaciones, que necesitarían un lugar donde almacenar mucha información, en muchos casos, simplemente por tenerla ordenada y accesible la incorporación de una base de datos es muy recomendable.
Pero, incluir una base de datos, resulta muy engorroso, de hecho muchas veces incluso es un problema. Os pongo el caso, de necesitar de una pequeña agenda que te vas a instalar en tu PC de casa… Ves sus requisitos y ves que necesita instalar un MySQL o similar. Sencillamente no me lo instalaría (como la mayoría de la gente).

Mucha gente me contestaría, que se podría usar un texto plano, un XML, un archivo binario, o cientos de tipos de soluciones que no necesitaran de tener una base de datos en tu maquina… cierto. ¿Pero y si el volumen de datos empieza a ser un problema?.

Una solución puede ser SQLite, que es una solución intermedia. Es un desarrollo intermedio, una base de datos en un fichero, sin dependencias y todo en una dll.  Ademas hay un desarrollo para ADO.NET, para integrarlo con el Visual Studio, que hace las cosas muy sencillas.

Es una solución intermedia, ya que yo es recomendable usarlo para cosas que requieran mucha fiabilidad (sobre todo de tiempo respuesta) pero para pequeños proyectos o aplicaciones con poco estrés, te solucionará la vida.

Please follow and like us:

¿Solución definitiva para tener tus RSS en cualquier sitio?

Quizas una de las cosas que mas me ha frustrado desde que tengo que trabajar en varios PCs, y en mi PDA, ha sido lograr tener un control centralizado de mis subscripciones a los sitios web (si, a los clásicos RSS). Para los que no conozcais el RSS, es la forma más cómoda de lograr leer todas la web que sueles visitar en un tiempo mínimo, aparte de avisarte de nuevas publicaciones en las web sin tener que visitarlas. Incluso ya hay gente que analiza las bondades de usar el RSS en vez de visitar las webs.

Logo de RSS

Por poner un ejemplo: si currando, encontraba una web que merecia la pena seguir, tenia que recordar incluirla en el PC de casa, en el portatil, y en la PDA. ¿Como leches centralizaba esto?.

La solución que todo el mundo me recomendaba, Google Reader, no me convencia, ya que me gustaba poder bajarme todos los RSS y luego echarles un vistazo sin tener que estar enchufado a internet. Otra solución fué la exportación a OPML, aunque tampoco me gustaba ya que era demasiado «manual» (soy un vago :P).

Terminé con RSSBandit instalado para los Windows (es algo pesado, pero tiene muchas funcionalidades), pRRSr para mi PDA (en desarrollo, aunque no estaba mal), y Liferea para mi Ubuntu (no se porque, pero aveces tenia problemas y se bloqueaba… pero en general hacia bien su función). Al final, todas tenian los mismo feed subscritos pero todo era muy manual.

Pero hay de mi, un dia caí por este post de Denken Über, y me pregunté que era eso de NewsGator. Investigué y mas o menos, vi que era lo que llevaba buscando para llevar todos mis RSS sincronizados. NewsGator, te ofrece almacenar los RSS online, previo registro gratuito, y varios clientes, tambien gratuitos, para varias plataformas (no esta linux aun :(, aunque ofrecen una API, de manera gratuita, para que los programas puedan sincronizarse con su plataforma, aunque no he encontrado ninguno que lo haga en linux) y si esto fuera poco, tienen una versión online, como Google Reader, para poder utilizarlo en los sistemas que no tienen cliente que es muy funcional. Una vez que leas un post, señales un post para seguirlo o incluyas un nuevo feed a tu lista de RSS, todos tus clientes se actualizaran automaticamente, lo que me permite la tan buscada sincronización.

Aunque realmente tiene el mismo problema que Google Reader inicialmente, tener que estar online para verlo, tenia una parte que me gustó mucho, y que fué  que los  programas que descargaban los post y se podian usar tranquilamente offline, sin tener que ir buscando (o mejor, mendigando) una conexión de internet.

A mi me ha solucionado la papeleta, aunque puede que alguien tenga una solución mejor…

Please follow and like us:

¿Esto es Windows Vista?… mejor que quedo como estoy


Pues si, llevo bastante con un Vista instalado en un equipo nuevo (si, lo siento, es que no me quedaba otra), que en teoria tengo que usar. Como en teoría, nuestros programas tienen que funcionar en Vista, pues tenemos este equipo para hacer pruebas…
Hoy me pensado en hacer el cambio, y usar ese equipo para empezar a desarrollar, pero que ERROR mas grande he tenido (Se que algunos sabeis que soy un linusero convencido, pero en el curro me cambio de bando por comodidad :P). Os aseguro que he perdido mas de media mañana en instalar un Visual Studio (ojo que para todo tenemos licencia… no se para que pero bueno).

Para empezar, al intentar instalar, pulsar 3 veces aceptar para confirmar que si que quiero instalarlo… vamos para cagarse, he tenido que decirle al Vista este 3 veces que si… que es un programa que quiero instalar y que quiero tenerlo. Luego, mientras se instala, me va diciendo antes de instalar que no me va ha funcionar… cojonudo… eso si, me da una opcion de buscar los parches en el instante, pero al intentar meter los parches que me bajo, pues error… ¡¡¡ Como no !!!. Ahora ya tengo los parches que he tenido que buscar por internet ya que el puto Vista no me indicaba bien cuales eran.

Ahora ya viene lo mejor. Tras instalar los nuevos parches, al arrancar el programa, Visual Studio 2005, me vuelve a pedir actualizaciones… Total, otra media hora de bajar e instalar.

Resumiendo:

Visual Studio 2005 + Windows Vista + Pentium QuadCore (Es decir con 4 procesadores) + 4 Gigas + 12 Mbs de ADSL = 4 horas y 1,5 Gigas bajados.

Tocate los cojones… Y no os cuento lo de las actualizaciones criticas porque me da la risa.

PD: Si hoy estoy hasta los cojones.

Please follow and like us: