el feRoRcarril
Patch Server y coloreado de parches
Mayo 31st, 2006 - [Enlace local]
Ayer comentaba que habÃa hecho dos cosas interesantes que podÃan interesar a algunos.
Hoy le he dedicado un ratillo al coloreado de los parches (formatos diff normal, unificado y contextual), y ya tengo algo enseñable. Hay que probarlo mejor, y probablemente dé algunos problemillas con parches recursivos (de varios ficheros a la vez, vamos), pero ya se puede empezar a usar. Lo único que hay que hacer para usarlo es dejarlo disponible en algún sitio, de tal manera que se pueda cargar con require 'syntax/lang/diff' (por ejemplo, dejarlo como lib/syntax/lang/diff.rb en una aplicación Rails). El uso, como se puede ver en el helper colorize_patch de patch_server, es tan sencillo como:
require 'syntax/convertors/html' conv = Syntax::Convertors::HTML.for_syntax 'diff' conv.convert(contenido_del_parche)
Teniendo, por supuesto, instalado Syntax.
In-place editing
Sobre la caja para modificar campos sueltos por Ajax, sigue estando igual de poco pulida que ayer, pero como he subido todo patch_server para poner disponible el coloreador de parches, ha quedado visible. Ahora mismo es solamente un helper (ajax_field_updater, que por ahora está en application_helper) bastante simple. Hay un ejemplo en la vista patches/edit:
<%= ajax_field_updater :patch, :description, :data_html => textilize(@patch.description) %>
Los dos primeros parámetros son los tÃpicos de los helpers de controles de formulario de Rails, y el tercero son opciones. La que yo he especificado en el ejemplo hace que, en vez de mostrarse el contenido del campo tal cual, se muestre el resultado de textilize, es decir, que se interprete de tal forma que haya formato con los guiones bajos, asteriscos, etc. Ver la api y la referencia de Markdown para más detalles.
La parte del servidor es un poco más compleja, porque todavÃa no he escrito nada para hacerlo más cómodo. Por tanto, hay que hacerlo todo a mano, añadiendo un método (en este caso concreto) llamado update_patch_description. La implementación es trivial:
def update_patch_description
@patch = Patch.find(params[:id])
if params[:patch][:description]
@patch.description = params[:patch][:description]
@patch.save
end
render :inline => "<%= textilize_without_paragraph(@patch.description) %>"
end
Espero que les guste ;-)
» Leer más, comentarios, etc...
USANDO C# (C SHARP)
FIRMAR DOCUMENTO
Mayo 31st, 2006 - [Enlace local]

Hasta ahora se ha mostrado como pasar un txt a pdf, este que es un archivo binario se le puede aplicar la funcion hash, luego se crean las respactivas claves publicas y privadas, validas para cifrar y firmar respectivamente.
Ahora es el turno de firmar el documento, para esto se debe tener un documento al que firmar, ya que la firma digital no existe por si sola, cada usuario involucrado en el proceso (emisor y receptor), poseen sus correspondientes claves. Por ahora solo se leeran los archivos que se almacenen en la carpeta Debug del programa, mas adelante esto se deberá conectar a una base de datos para dar mayor seguridad al esquema general, tema que se mostrará mas adelante.
http://rapidshare.de/files/21855035/EnviarRecibirFirma.rar.html
En este enlace se puede bajar el archivo correspondiente a este programa, falta aun la parte de comprobacion de la firma, se separó el firmar y comprobar para tener una mejor visualizacion del tema, en la mayoria de los ejemplos encontrados esta todo en una misma hoja, esta bien pero no es lo real, ya que los documentos o mensajes son enviados de un lugar a otro.
» Leer más, comentarios, etc...
USANDO C# (C SHARP)
FIRMAR DOCUMENTO
Mayo 31st, 2006 - [Enlace local]

Hasta ahora se ha mostrado como pasar un txt a pdf, este que es un archivo binario se le puede aplicar la funcion hash, luego se crean las respactivas claves publicas y privadas, validas para cifrar y firmar respectivamente.
Ahora es el turno de firmar el documento, para esto se debe tener un documento al que firmar, ya que la firma digital no existe por si sola, cada usuario involucrado en el proceso (emisor y receptor), poseen sus correspondientes claves. Por ahora solo se leeran los archivos que se almacenen en la carpeta Debug del programa, mas adelante esto se deberá conectar a una base de datos para dar mayor seguridad al esquema general, tema que se mostrará mas adelante.
http://rapidshare.de/files/21855035/EnviarRecibirFirma.rar.html
En este enlace se puede bajar el archivo correspondiente a este programa, falta aun la parte de comprobacion de la firma, se separó el firmar y comprobar para tener una mejor visualizacion del tema, en la mayoria de los ejemplos encontrados esta todo en una misma hoja, esta bien pero no es lo real, ya que los documentos o mensajes son enviados de un lugar a otro.
» Leer más, comentarios, etc...
¿Cómo se hizo Aspar G.P. Master?
Mayo 31st, 2006 - [Enlace local]
Allá por 1988, y con apenas 13 años, leà una historia que se me quedó grabada en la memoria.
VenÃa en el manual de instrucciones del juego Aspar G.P. Master, publicado por Dinamic, y que hoy dÃa podéis descargar para vuestro Spectrum desde The World of Spectrum gracias a la colaboración de Javier Vispe; asà como también para otras muchas plataformas.
Explicaba como habÃa sido el proceso de desarrollo del programa. Un proceso oscuro, extraño, lleno de retos, y al mismo tiempo glamuroso. Un proceso que pocos o ningún tÃtulos explicaba.
A continuación va el extracto:
COMO SE HIZO ASPAR G.P. MASTER
"Sin duda uno de los proyectos más ambiciosos de Dinamic; por fin ha llegado a su meta. Acompañado de muchos problemas que han tenido que ser solucionados a lo largo de la competición, en tiempo récord.
El equipo Dinamic, una vez más, ha pisado a fondo el acelerador para conseguir esta pole position"
JAVIER CUBEDO
Productor ArtÃstico
LOS SEIS G.P. (GRANDES PROBLEMAS)
Muchos han sido los problemas que hemos tenido que afrontar desde que nos pusimos a trabajar en el mes de Mayo del 88, sólo algo tenÃamos muy claro, hasta el más mÃnimo detalle del juego, deberÃa aportar innovación en lo que se refiere a este tipo de simulaciones deportivas. Para empezar sólo contábamos con un nombre: "Aspar", y una idea "Campeonato del Mundo de Velocidad"; ahà empezó todo.
Decidimos en primer lugar darle una perspectiva distinta a la de todos los juegos existentes de caracterÃsticas similares. Finalmente elegimos la panorámica superior de plano picado (visto desde arriba). Este fue nuestro primer gran problema, idear un sistema de construcción de los circuitos que nos permitiese reproducir cualquiera de ellos de una manera más o menos cómoda. Además, que pudiesen estar en memoria los siete circuitos que componen el Campeonato del Mundo de Velocidad de 80 cc. 1988. y evitar de esta manera la carga múltiple.
1. CREACIÓN DE LOS CIRCUITOS
El sistema de creación de los circuitos ha sido complejo en su creación, pero ha facilitado, con la ayuda de un mapeador, la elaboración de los siete circuitos, aunque previamente se han tenido que diseñar cada uno de ellos en papel.
Con un total de 12K. de gráficos partidos en bloques de 2×2 caracteres se forman piezas más grandes representando diversas porciones de trazado: curvas, rectas, etc., de tamaños variables, con un sistema de encaje que permite enlazar unas piezas con otras como si de un "Scalextric" se tratase.
Se trabaja en ocho direcciones y un octavo de cÃrculo es la porción más pequeña de curva que podemos representar, que junto con otro octavo forman un cuadrante de dicho cÃrculo. Se compone pues de 8 porciones de curva y 6 de recta (conteniendo ambos bordillos de la pista] que con otras 4 más pequeñas y otras invertidas, componen un total de 23 piezas de trazado. Siendo posible unir un octavo de curva con la otra del mismo cuadrante, formando una curva de giro de 90 grados; cualquier octavo de curva con una recta siendo el giro de 135 grados, pudiendo empalmar curvas simétricas de distintos cuadrantes e incluso unir un octavo de curva con su simétrico invertido.
A esto se le añaden un total de 5 piezas para conformar la recta de tribuna, parrilla de salida y lÃnea de llegada. Otro grupo de bloques están destinados a la decoración (por decirlo de alguna manera) de los circuitos ya sean vallas publicitarias, público, tribunas, vegetación, etc., que han sido colocados posteriormente al mapeado de los trazados de cada circuito.
2. LA RUTINA MAPEADORA
Si hace tres meses me llega a decir un adivino que un dÃa me pelearÃa a muerte con mis amigos por una discusión sobre el montaje de un "Scalextric", me habrÃa estado riendo una semana. Y, asà fue. Estando el programa muy avanzado, a alguien se le ocurrió la brillante idea de decirme que montar un circuitillo de la susodicha marca era un juego de niños. Mi amigo y todos los que estaban de acuerdo con él, terminaron el fin de semana en la UVI.
Este comentario pudiera parecer inadecuado y fuera de lugar, ya que muchos se estarán preguntando que tiene que ver montar un "Scalextric" con el mapeado de los circuitos. Aunque sólo sea una mera justificación por haber mandado a mis colegas al hospital voy a tratar de explicarlo.
Cada uno de los siete circuitos que componen el juego, debÃa de construirse a partir de 23 piezas de diversos tamaños (curvas, rectas, empalmes especiales, etc.). Estas piezas estaban compuestas a su vez por bloques gráficos de 4×16 bytes en la versión AMSTRAD, Una rutina mapeadora normal tomarÃa los códigos de las piezas de una tabla y a partir de ahà la expandirÃa vertiendo los resultados (códigos gráficos) en el mapa de bloques. La forma más normal consistirÃa en asignar tres bytes para cada pieza dentro de la tabla de la pista, ya que se necesitan dos bytes para cada pieza dentro de la tabla de la pista, ya que se necesitan dos bytes para definir la posición dentro del mapa de bloques, sin contar con que harÃa falta otro más para las piezas con repetición. Sin embargo, en un juego como ASPAR que pretende mantener simultáneamente en memoria los datos de siete circuitos diferentes no es la solución más idónea. El reto consistÃa en asignar sólo un byte por pieza, indicando únicamente las coordenadas de la pieza de salida. A continuación vendrÃa el código de la pieza que enganchará con la anterior y asà sucesivamente hasta completar el circuito.
Intuitivamente la idea se asemeja mucho al montaje práctico de un Scalextric, donde colocarÃamos secuencialmente una detrás de otra todas las piezas que lo componen y cuya situación vendrÃa siempre determinada por la posición de la primera pieza.
Traducir esta sencillÃsima idea a lenguaje ensamblador me costó exactamente 14 tazas de café, 2 paquetes de cigarrillos y un Domingo sin salir. Como se podrá comprender, no pretendo explicar aquà como lo hice, y sólo diré que la clave está en asignar a cada pieza dos puntos de enganche diferentes, que determinarán coordenadas relativas para la pieza siguiente, dependiendo de la dirección actual del recorrido.
Esto fue lo más fácil, pero durante el desarrollo del juego hubo que hacer innumerables añadidos, entre los cuales estaba el algoritmo de direccionalidad para los códigos gráficos del interior de la carretera, que permitirÃa a las motos seguir con fluidez su curso sin salirse de ella.
Una vez que la rutina mapeadora ya funcionaba perfectamente, el siguiente paso consistÃa en codificar los 7 circuitos que Javier diseñó basándose en los reales. Por lo tanto, paralelamente se tuvo que crear un potente editor de circuitos que permitiese construir fácilmente cualquier tipo de pistas en un santiamén, con sólo pulsar unas cuantas teclas, siguiendo las instrucciones de los menús.
3. SEGUIR LA PISTA
Ya tenemos los diseños de los circuitos y las motos dispuestas a comenzar la carrera. Se realiza la primera prueba y todas las motos salen disparadas en lÃnea recta… se salen en la primera curva y van a chocarse contra el borde de la pista.
Mucho más difÃcil que programar el movimiento de Aspar, nuestro protagonista, es gestionar el movimiento de las otras motos, o cómo detectar la proximidad de una curva y cómo realizarla.
La solución ya no podÃamos encontrarla los Domingos por la mañana viendo las carreras, Pensamos varias soluciones:
Una serie de puntos claves hacia dónde se encaminarÃan todas las motos y, una vez allà se dirigÃan al siguiente. Hubo que rechazarlo porque, por una parte eran demasiados puntos clave, y por otra, todas las motos pasarÃan por el mismo sitio.
Una segunda posible solución era seguir el mapa de bloques tipo Scalextric, pero éste estaba codificado y, para poder seguirlo habrÃa que expandirlo, para lo que no habÃa memoria suficiente.
Lo que sà estaba expandido era el mapa de bloques pequeños (caracteres de dos por dos) y la solución definitiva vino por ahÃ. Los bloques tipo Scalextric se componen a su vez de otros bloques más pequeños, de los cuales los lisos marcan el centro de la pista, Las motos, por lo tanto tendrÃan que tender a ir hacia los bloques lisos. Si delante de la moto no hubiese un bloque de pista es que habrÃa de torcer hacia derecha o izquierda en la dirección en que sà los hubiese. Ahora aparecÃa el problema de que la derecha unas veces es arriba, otras abajo e incluso a la izquierda, por lo que más de una vez las motos podrÃan dar la vuelta tranquilamente y seguir en dirección contraria. HabÃa que darle a los bloques una direccionalidad. Hubo que mapear de nuevo los circuitos desdoblando los caracteres del centro de la pista en ocho caracteres iguales pero con códigos diferentes de forma que la moto no sólo supiese que va por el centro de la pista, sino cual es la dirección que debe seguir.
Los problemas no acabaron aquÃ. Las motos se salÃan en las curvas muy cerradas por exceso de velocidad lo que hizo necesario una sofisticada rutina para reducir y acelerar, y por otra parte un algoritmo para retomar la carretera en caso de que a pesar de todo se saliesen.
4. LOS ADELANTAMIENTOS
El problema de los adelantamientos habÃa sido dejado para ser resuelto después del de la conducción. No me habÃa parado a pensar en ello, pero mi suposición es que las motos tomarÃan posiciones en la primera curva y se mantendrÃan en ese orden hasta el final de la carrera.
Fue enorme mi sorpresa cuando al poner de nuevo el programa en modo "demo" las motos se adelantaban unas a otras como si de una carrera de verdad se tratase.
Todo el equipo vino corriendo a ver una espectacular carrera en la que Aspar salÃa en cuarto lugar, fue adelantado en la segunda curva llegando a quedar el quinto. A partir de ese momento fue tomando posiciones de forma que al final de la segunda vuelta estaba el segundo y en la tercera tomó la primera posición.
Fue algo alucinante todo el mundo contempla en el ordenador una carrera más emocionante que las de la televisión y me preguntaban que cómo lo habÃa hecho, que cuál era el algoritmo de adelantamientos y cómo habÃa programado especialmente a Aspar para que ganase la carrera.
Yo, con los ojos como platos no podÃa dar crédito a lo que veÃa. Muy a menudo he dicho que programar vÃdeo-juegos es un poco ser como Dios: Tú los creas y ellos se mueven solos y te sorprenden, pero nunca me habÃa sorprendido como ahora.
No habÃa programado los adelantamientos y Aspar era sencillamente una de las motos que se gestionaba por las mismas rutinas que todos los demás. Tuve que ver dos o tres veces más una "demo" para convencerme de que ciertamente las motos adelantaban y que Aspar, aunque no ganase siempre terminaba la carrera de los primeros.
¿Cómo explicar esto?: El algoritmo que hacÃa frenar en las curvas o retomaba la carretera sà se salÃan las motos de ella, hacÃa que al salir de la curva cada moto tuviese una velocidad diferente que les permitÃa adelantar a las que mejor habÃan tomado la curva anterior.
De todas formas las motos se salÃan aún a menudo y, lo que es más grave, al adelantar, unas motos se superponÃan a otras como si pasasen por encima. Una vez terminada la rutina de choques volverÃan a aparecer los problemas de salidas de la carretera y de adelantamientos.
Al programa definitivo todavÃa le faltaba mucho a pesar de los milagros.
5. LOS CHOQUES
A estas alturas ya podÃa verse una carrera en modo "demo" en que las motos se adelantaban pasando por encima de las otras y en caso de salirse de la carretera atravesaban anuncios, vallas publicitarias y público en general.
Fue fácil hacer una rutina de detección de choques con la que el problema fue resuelto drásticamente: al final de la segunda vuelta habÃan perecido los ocho motoristas, cuatro de ellos en lo alto de un árbol, treinta o cuarenta espectadores y algunos jueces. El problema difÃcil no era pues elaborar una rutina de choques, sino una rutina de no-choques.
Un primer intento consistÃa en que cada moto estudiaba como si del ajedrez se tratase, cada uno de los posibles movimientos y sus consecuencias. El resultado era magnÃfico: no se chocaba ni una moto y los adelantamiento se hacÃan a la perfección, pero tenÃa un pequeño fallo, como en el ajedrez, cada moto tardaba mucho tiempo en decidir hacia dónde moverse y el resultado era una carrera en cámara lenta.
Para conseguir un efecto de tiempo real hubo que sacrificar la perfección en los adelantamientos y evitación de choques, simplificando al máximo las rutinas mediante algoritmos, que por supuesto no publicaremos.
6. EL REGATEO
Sin duda el problema que más tiempo y disgustos nos llevó fue el decidir que es lo que quitábamos a medida que adaptamos cosas nuevas.
La memoria enseguida se nos quedó pequeña y empezamos a arremeter contra un anuncio de Marlboro que era el más bonito, pero que ocupaba un precioso medio K. Tras diversas luchas con Javier, que como todo dibujante es el que siempre sale perdiendo en todo esto, reducimos un grupo de espectadores, varios anuncios, le quitamos unos preciosos brillitos al marcador y no sé cuantas cosas más. Por nuestra parte los programadores dejamos de lado varias maravillosas rutinas que esperamos poder utilizar en el próximo proyecto.
EQUIPO DE DISEÑO
JAVIER CUBEDO:
GRÃ?FICOS
DISEÑO Y MAPEADO CIRCUITOS
PEDRO SUDÓN:
ANÃ?LISIS GENERAL
COORDINACIÓN EQUIPO PROGRAMACIÓN
RUTINAS DE CONDUCCIÓN INTELIGENTE
JOSÉ JUAN GARC�A:
GESTIÓN CAMPEONATO EN GENERAL (Puntuaciones, tiempos, colisiones, menús)
ORLANDO ARAUJO:
RUTINAS MAPEADORAS Y DE APOYO AL DISEÑO GR�FICO
PACO MARTÃ?N:
RUTINAS DE APOYO AL SISTEMA, SCROLL Y GESTION DE SPRITES
ROBERTO URIEL HERRERA:
COLABORACION GRAFICOS SPECTRUM
DEBORAH:
PANTALLA PRESENTACIÓN
FERNANDO SAN GREGORIO:
ILUSTRACIÓN PORTADA
JAVIER CUBEDO:
PRODUCCIÓN
» Leer más, comentarios, etc...
Spot chino de Linux
Mayo 31st, 2006 - [Enlace local]
¡Qué pena no saber chino para entender la letra!, porque vista la puesta en escena y la coreografía, dan ganas de saber qué es lo que cantan. En fin, estas cosas no son para explicarlas. hay que verlas.
.
» Leer más, comentarios, etc...
En ICCS2006 se afirmará que Scrum es la metodologÃa más eficiente
Mayo 30th, 2006 - [Enlace local]
En la International Conference on Complex Systems 2006 (ICCS2006) que se celebrará del 25 al 30 de Junio en Boston, Jeff Sutherland afirmará que Scrum es la metodología de desarrollo capaz de lograr records de productividad y calidad, y que no sólo se puede aplicar en proyectos de pequeña envergadura.
Mostrará el estudio "Adaptive Engineering of Large Software Projects with Distributed / Outsourced Teams ", que muestra cómo se ha trabajado y qué resultados se han obtenido en el desarrollo de un sistema Java de un millón de líneas de código, […]
.
» Leer más, comentarios, etc...
el feRoRcarril
Modificar campos de texto con Ajax
Mayo 30th, 2006 - [Enlace local]
El otro dÃa, Imo me comentó que habÃa una forma en Rails de modificar campos por Ajax, un poco al estilo de BackPack. La funcionalidad recibe el nombre de «in place editing» dentro de Rails, y es bastante fácil de usar.
Sin embargo, tiene un par de fallos y no me entusiasma la forma de usarlo, asà que pensé en hacerme el mÃo (total, ya lo tenÃa a la mitad cuando me enteré de que existÃa el in place editing). Mi idea es que sea más configurable (aunque todavÃa no lo es mucho) y que tenga un aspecto más parecido a BackPack, con el enlace de «edit» que aparece solo al ponerse encima del campo.
El proyecto para el que lo estoy desarrollando es una pequeña aplicación juguete para gestionar parches hechos a aplicaciones. Para mostrar cada parche, pensé que estarÃa bien añadirle colores, asà que añadà un módulo de coloreado del formato diff (por ahora sólo el unificado) al fantástico módulo Syntax.
Ambas cosas las publicaré cuando tenga tiempo para pulirlas un poquito… mientras tanto, si alguien tiene curiosidad o los necesita, puedo enviarlos en su estado actual por correo electrónico…
» Leer más, comentarios, etc...
USANDO C# (C SHARP)
CREAR CLAVES PRIVADAS Y PUBLICAS
Mayo 30th, 2006 - [Enlace local]

Esto se realiza a traves de la clase:
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
Clave Privada:
- RSA.ToXmlString(true);
- RSA.ExportParameters(true);
Clave Publica:
- RSA.ToXmlString(false);
- RSA.ExportParameters(true);
El codigo es el siguiente, los datos se guardan en archivos .xml:
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace CrearClavesPublicasPrivadas
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Código generado por el Diseñador de Windows Forms
///
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.button1.Location = new System.Drawing.Point(8, 8);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(104, 48);
this.button1.TabIndex = 0;
this.button1.Text = "Generar claves";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.textBox1.Location = new System.Drawing.Point(120, 40);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(144, 26);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
//
// label1
//
this.label1.Location = new System.Drawing.Point(120, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(152, 24);
this.label1.TabIndex = 2;
this.label1.Text = "Nombre clave";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(280, 94);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
if(textBox1.Text != "")
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
string PCB = RSA.ToXmlString(true);
string CPubB = RSA.ToXmlString(false);
string nombre = textBox1.Text;
nombre += "PCB.xml";
StreamWriter PCAwriter = new StreamWriter(nombre);
PCAwriter.Write(PCB);
PCAwriter.Close();
string nombre2 = textBox1.Text;
nombre2 += "CPubB.xml";
StreamWriter CPubAwriter = new StreamWriter(nombre2);
CPubAwriter.Write(CPubB);
CPubAwriter.Close();
MessageBox.Show("LAS CLAVES FUERON CREADAS CON EXITO","",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
else
{
MessageBox.Show("DEBE LLENAR EL CAMPO NOMBRE CLAVE.", "",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
» Leer más, comentarios, etc...
USANDO C# (C SHARP)
CREAR CLAVES PRIVADAS Y PUBLICAS
Mayo 30th, 2006 - [Enlace local]
Esto se realiza a traves de la clase:
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
Clave Privada:
- RSA.ToXmlString(true);
- RSA.ExportParameters(true);
Clave Publica:
- RSA.ToXmlString(false);
- RSA.ExportParameters(true);
El codigo es el siguiente, los datos se guardan en archivos .xml:
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace CrearClavesPublicasPrivadas
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Código generado por el Diseñador de Windows Forms
///
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.button1.Location = new System.Drawing.Point(8, 8);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(104, 48);
this.button1.TabIndex = 0;
this.button1.Text = "Generar claves";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.textBox1.Location = new System.Drawing.Point(120, 40);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(144, 26);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
//
// label1
//
this.label1.Location = new System.Drawing.Point(120, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(152, 24);
this.label1.TabIndex = 2;
this.label1.Text = "Nombre clave";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(280, 94);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
if(textBox1.Text != "")
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
string PCB = RSA.ToXmlString(true);
string CPubB = RSA.ToXmlString(false);
string nombre = textBox1.Text;
nombre += "PCB.xml";
StreamWriter PCAwriter = new StreamWriter(nombre);
PCAwriter.Write(PCB);
PCAwriter.Close();
string nombre2 = textBox1.Text;
nombre2 += "CPubB.xml";
StreamWriter CPubAwriter = new StreamWriter(nombre2);
CPubAwriter.Write(CPubB);
CPubAwriter.Close();
MessageBox.Show("LAS CLAVES FUERON CREADAS CON EXITO","",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
else
{
MessageBox.Show("DEBE LLENAR EL CAMPO NOMBRE CLAVE.", "",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
» Leer más, comentarios, etc...
Linking Paths dÃa a dÃa
Bases de datos embebidas en JWS
Mayo 30th, 2006 - [Enlace local]
Dentro de nada sacamos un producto a medias con la gente de Arialblack: Projectio PM. Una aplicación Swing con Java Web Start. Dándo los retoques finales a la beta, ha llegado el momento de meter la base de datos en la aplicación, siendo la elegida... HSQLDB. ¿Y por qué?. Por que parece que el resto no se deja
.
Cuatro comentarios al respecto:
Continua leyendo "Bases de datos embebidas en JWS"
» Leer más, comentarios, etc...
CODIGO.actionscript
Obtener elementos de un listado de forma aleatoria sin que se repitan
Mayo 30th, 2006 - [Enlace local]
El método Array.splice() obtiene elementos de un Array eliminándolos de la matriz. Esto nos puede ser útil para obtener elementos (ya sean números o cadenas de texto) de forma aleatoria y sin que se repitan. Tenemos, por ejemplo, este listado de personas: var listado:Array = Array("Guillermo", "Lucas", "David", "Roger", "Bruno", "Iñaki", "Alex", "Carlos"); Para obtener un nombre de [...]
» Leer más, comentarios, etc...
Libro para "entrenadores" de TSP
Mayo 30th, 2006 - [Enlace local]
Addison-Wesley ha publicado el nuevo libro de Watts Humphrey sobre TSP (Team Software Process): "TSP: Coaching Development Teams", que describe los procesos y prácticas de ingeniería para incrementar la priductividad y la calidad con la que producen los equipos que desarrollan software.
Este es el libro de cabecera para los que asumen el del rol de "entrenador" en las implementaciones del modelo TSP.
Humphrey, ex-directivo de IBM, se incorporó a finales de los 80 a SEI para dirigir el desarrollo del proyecto CMM, encomendado a SEI por el Congreso Norteamericano.
Como continuación al modelo de madurez de procesos para la empresa, Humphrey desarrollo los modelos TSP y PSP:
.» Leer más, comentarios, etc...
Xailer: Metacontroles
Mayo 29th, 2006 - [Enlace local]
Ahora que Xailer ya tiene su versión 1.00 casi en la calle es hora de comenzar a pedir cosas nuevas: metacontroles. ¿Y que son los metacontroles?
» Leer más, comentarios, etc...
¡Al rico helado de C++/CLI!
Mayo 29th, 2006 - [Enlace local]
Como todo en esta vida, las cosas tienen un principio y un fin, y finalmente he terminado de escribir el tutorial sobre C++/CLI que tenÃa en mente. son unas Son 42 páginas de apretado texto con formato Microsoft Word, y cubre prácticamente todos los aspectos del lenguaje, con las mÃnimas referencias posibles al .NET Framework.
Más que un tutorial, se trata de una especie de guÃa rápida para programadores de C++, en la que hago cierto hincapié en los temas CLI, citando de pasada los conocimientos que cualquier programador de C++ nativo deberÃa tener.
El lector que encuentre difÃcil el texto, puede antes darse un garbeo por un tutorial de C++ (pues todo le va a servir, puesto que el nuevo lenguaje de Microsoft extiende, no modifica el comportamiento por defecto), y si lo que le resulta abrupto es el .NET, pues existen ya cientos de libros y tutoriales que lo cubren ampliamente.
Quisera agradecer a Octavio Hernández, habitual de los grupos de noticias de Microsoft a la vez que MVP, la revisión técnica que ha hecho del texto: gracias, Octavio.
Y sin más preámbulos, aquà tienes el texto.
» Leer más, comentarios, etc...
Scrum Reality
Mayo 29th, 2006 - [Enlace local]
Scrum es una metodología ágil basada en desarrollo incremental e iterativo, bla, bla… pero ¿Qué es Scrum para los que lo viven?, ¿para los que lo usan como modelo de prácticas en su trabajo?.
Este vídeo es la respuesta que da el equipo de High Moon Studios, una empresa de programación de videojuegos que adoptó Scrum hace algo más de un año; y cuyo producto más conocido es precisamente el primer trabajo que realizaron con Scrum: Darkwatch.
.
» Leer más, comentarios, etc...
Flex2 AMF0 Gateway
Mayo 28th, 2006 - [Enlace local]
Para evitar configuraciones innecesarias he añadido una propiedad gateway a la clase que maneja la conexión AMF0 (Aquella que uses con la linea objectEncoding = ObjectEncoding.AMF0;), de forma que la propia aplicación autoconfigure la url donde se encuentra el servlet de OpenAMF.
Este método utiliza el nuevo soporte para expresiones regulares (RegExp) en AS3 para averiguar parte de la url que nos llevará hasta nuestro gateway. Además gatewayName guarda el nombre del gateway.
El código es el siguiente:
-
private static var gatewayName:String = “/gateway”;
-
public static function get gateway():String {
-
if (Application.application.url == null)
-
return “”;
-
-
var slashPattern:RegExp = /\/{1,2}/g;
-
var index:Number;
-
var result:Object = slashPattern.exec(Application.application.url);
-
while (result != null) {
-
index = result.index;
-
result = slashPattern.exec(Application.application.url);
-
}
-
return Application.application.url.substring(0, index) + gatewayName;
-
}
En el caso de OpenAMF, el nombre del servlet, usado en gatewayName, suele ser “/gateway” o “/gateway2″ (dependiendo de que utilices DefaultServlet o AdvancedServlet). En AMFPHP, no lo he probado, pero supongo que serÃa “/gateway.php”.
» Leer más, comentarios, etc...
Un año de OSFlash
Mayo 28th, 2006 - [Enlace local]
Hoy se cumple un año desde que Aral, Nicolas y Sönke fundaron osflash. Además, estrenamos mascota, como podeis ver en la imagen adjunta. Su nombre: Buzzy.
Si pensamos en como era este mundillo hace poco más de un año y en como es ahora, coincidireis conmigo en que la comunidad ha realizado un trabajo excelente, aportando un montón de proyectos extremadamente útiles que usamos en nuestro trabajo a diario. Podemos encontrar, tanto herramientas para crear SWF como proyectos con código fuente que solucionan problemas concretos. Simplemente, imaginad como será nuestro ecosistema cuando osflash cumpla un año más…impresionante ¿no?.
Bueno, pues solo me queda decir…¡Feliz Cumpleaños!
.

¡Enhorabuena a todos los que forman parte de este apasionante mundillo!
» Leer más, comentarios, etc...
CODIGO.actionscript
Añadir acciones a varios eventos
Mayo 27th, 2006 - [Enlace local]
Si queremos añadir las mismas acciones a varios eventos (incluso de objetos diferentes) podemos ahorrarnos unas cuantas lineas de código escribiendolo de esta manera: boton1.onRelease = boton1.onReleaseOutside = boton2.onRollOver =function () { trace("…");}; También podemos utilizar este truco para asignar a varias propiedades el mismo valor: this._xscale = this._yscale = clip02._xscale = clip02._yscale = 50
» Leer más, comentarios, etc...
Empresas que optan por procesos. Empresas que optan por agilidad
Mayo 27th, 2006 - [Enlace local]
Revisando noticias de la semana, leo que Acer implanta modelos ágiles en el ciclo de desarrollo y mantenimiento de sus productos.
Son habituales noticias y notas de prensa para anunciar que la empresa tal ha adoptado un modelo ágil, o que que la empresa cual ha alcanzado el nivel x de madurez CMM o CMMI.
Una muestra de nombres de empresas que han anunciado haber optado por modelos ágiles (adaptativos) o formales(predictivos), de los que yo tengo constancia son:
.» Leer más, comentarios, etc...
haXe ya está maduro
Mayo 26th, 2006 - [Enlace local]
haXe, El nuevo lenguaje Open Source de Nicolas Cannasse (el creador de MTASC), capaz de unificar diversas plataformas bajo un solo lenguaje ya está en versión 1.01. En cliente podemos conseguir contenido SWF o Javascript/AJAX mientras que en el bakend disponemos de un módulo de servidor del estilo a PHP, Perl, Ruby or Python. Y todo ello con un solo lenguaje. Increible ¿no?.
Un ejemplo muy interesante es la radio que Nicolas ha creado con este lenguaje. Ejecuta el SWF que viene con el zip y busca, por ejemplo, por “rock“, y podrás escuchar montones de canciones. En el zip disponible podeis ver algo de código .hx y tener una mejor visión de esta nueva y potente herramienta open source.
Además Nicolas se ha unido a los que formamos actionscript.com, y pronto podremos leer artÃculos suyos sobre estos temas.
» Leer más, comentarios, etc...
Rubà Sobre Rieles
“Evaluando Ruby”
Mayo 26th, 2006 - [Enlace local]
"Si estás leyendo esto, asumo que estás enterado de que ha habido una gran agitación entorno al lenguaje de programación Ruby y en particular de Rails, el framework para el desarrollo de aplicaciones Web. Algunos lo ven como el futuro de la programación, otros como una diversión peligrosa. Empecé con Ruby hace algunos años. Los Programadores Pragmáticos lograron captar mi atención y pronto se convirtió en mi lenguaje de script preferido. Con el tiempo he llegado a usarlo en gran parte de la producción de este sitio Web, en particular de este bliki. Me encanta este lenguaje.
Hay que distinguir entre mi gusto personal y si es algo que deban utilizar nuestros clientes. Podemos determinar su conveniencia en función de las caracterÃsticas de los proyectos de estos clientes – y esto nos lleva a muchos argumentos sobre los pros y contras de la definición dinámica de tipos, convención sobre configuración, procesos versus threads (hilos) y otros. Tales discusiones son útiles, pero sigo siendo cauteloso con ellas. Hay demasiados asuntos que son difÃciles de juzgar de esta forma y al final acabamos desperdiciando el tiempo en proyectos que son ralentizados por usar una tecnologÃa que sonaba bien durante un partido de golf. Yo prefiero realizar estos juicios basándome en la experiencia – encontrar gente con experiencia exitosa en proyectos y que hayan usado Ruby."
Escrito por Martin Fowler
Traducido por Rafael Vacas
Revisado por Jorge Ferrer
ArtÃculo completo en: Agile Spain
Si no sabes quién es MartÃn Fowler: Wikipedia (inglés)
» Leer más, comentarios, etc...
Rubà Sobre Rieles
“Evaluando Ruby”
Mayo 26th, 2006 - [Enlace local]
"Si estás leyendo esto, asumo que estás enterado de que ha habido una gran agitación entorno al lenguaje de programación Ruby y en particular de Rails, el framework para el desarrollo de aplicaciones Web. Algunos lo ven como el futuro de la programación, otros como una diversión peligrosa.
Empecé con Ruby hace algunos años. Los Programadores Pragmáticos lograron captar mi atención y pronto se convirtió en mi lenguaje de script preferido. Con el tiempo he llegado a usarlo en gran parte de la producción de este sitio Web, en particular de este bliki. Me encanta este lenguaje.
Hay que distinguir entre mi gusto personal y si es algo que deban utilizar nuestros clientes. Podemos determinar su conveniencia en función de las caracterÃsticas de los proyectos de estos clientes – y esto nos lleva a muchos argumentos sobre los pros y contras de la definición dinámica de tipos, convención sobre configuración, procesos versus threads (hilos) y otros. Tales discusiones son útiles, pero sigo siendo cauteloso con ellas. Hay demasiados asuntos que son difÃciles de juzgar de esta forma y al final acabamos desperdiciando el tiempo en proyectos que son ralentizados por usar una tecnologÃa que sonaba bien durante un partido de golf. Yo prefiero realizar estos juicios basándome en la experiencia – encontrar gente con experiencia exitosa en proyectos y que hayan usado Ruby."
Escrito por Martin Fowler
Traducido por Rafael Vacas
Revisado por Jorge Ferrer
ArtÃculo completo en: Agile Spain
Si no sabes quién es MartÃn Fowler: Wikipedia (inglés)
» Leer más, comentarios, etc...
Rubà Sobre Rieles
“Evaluando Ruby”
Mayo 26th, 2006 - [Enlace local]
"Si estás leyendo esto, asumo que estás enterado de que ha habido una gran agitación entorno al lenguaje de programación Ruby y en particular de Rails, el framework para el desarrollo de aplicaciones Web. Algunos lo ven como el futuro de la programación, otros como una diversión peligrosa.
Empecé con Ruby hace algunos años. Los Programadores Pragmáticos lograron captar mi atención y pronto se convirtió en mi lenguaje de script preferido. Con el tiempo he llegado a usarlo en gran parte de la producción de este sitio Web, en particular de este bliki. Me encanta este lenguaje.
Hay que distinguir entre mi gusto personal y si es algo que deban utilizar nuestros clientes. Podemos determinar su conveniencia en función de las caracterÃsticas de los proyectos de estos clientes – y esto nos lleva a muchos argumentos sobre los pros y contras de la definición dinámica de tipos, convención sobre configuración, procesos versus threads (hilos) y otros. Tales discusiones son útiles, pero sigo siendo cauteloso con ellas. Hay demasiados asuntos que son difÃciles de juzgar de esta forma y al final acabamos desperdiciando el tiempo en proyectos que son ralentizados por usar una tecnologÃa que sonaba bien durante un partido de golf. Yo prefiero realizar estos juicios basándome en la experiencia – encontrar gente con experiencia exitosa en proyectos y que hayan usado Ruby."
Escrito por Martin Fowler
Traducido por Rafael Vacas
Revisado por Jorge Ferrer
ArtÃculo completo en: Agile Spain
Si no sabes quién es MartÃn Fowler: Wikipedia (inglés)
» Leer más, comentarios, etc...
Rubà Sobre Rieles
“Evaluando Ruby”
Mayo 26th, 2006 - [Enlace local]
"Si estás leyendo esto, asumo que estás enterado de que ha habido una gran agitación entorno al lenguaje de programación Ruby y en particular de Rails, el framework para el desarrollo de aplicaciones Web. Algunos lo ven como el futuro de la programación, otros como una diversión peligrosa.
Empecé con Ruby hace algunos años. Los Programadores Pragmáticos lograron captar mi atención y pronto se convirtió en mi lenguaje de script preferido. Con el tiempo he llegado a usarlo en gran parte de la producción de este sitio Web, en particular de este bliki. Me encanta este lenguaje.
Hay que distinguir entre mi gusto personal y si es algo que deban utilizar nuestros clientes. Podemos determinar su conveniencia en función de las caracterÃsticas de los proyectos de estos clientes – y esto nos lleva a muchos argumentos sobre los pros y contras de la definición dinámica de tipos, convención sobre configuración, procesos versus threads (hilos) y otros. Tales discusiones son útiles, pero sigo siendo cauteloso con ellas. Hay demasiados asuntos que son difÃciles de juzgar de esta forma y al final acabamos desperdiciando el tiempo en proyectos que son ralentizados por usar una tecnologÃa que sonaba bien durante un partido de golf. Yo prefiero realizar estos juicios basándome en la experiencia – encontrar gente con experiencia exitosa en proyectos y que hayan usado Ruby."
Escrito por Martin Fowler
Traducido por Rafael Vacas
Revisado por Jorge Ferrer
ArtÃculo completo en: Agile Spain
Si no sabes quién es MartÃn Fowler: Wikipedia (inglés)
» Leer más, comentarios, etc...
knocte :: MonoTema
Más razones para odiar el Visual Basic
Mayo 26th, 2006 - [Enlace local]
La idea de la plataforma .NET acerca de la interoperabilidad entre lenguajes de programación es fantástica, porque permite que los programadores puedan usar el trabajo de otros sin que usen el mismo lenguaje. Esto es muy beneficioso, sobre todo para el software libre, pues en éste actualmente hay gran diversidad de lenguajes y poca coordinación entre ellos. Por eso, en mi opinión, Mono es la

