Posts Tagged: C++


24
abr 12

Etiquetas para documentar código en C# .NET

No Gravatar
doc-comment tag

doc-comment tag

Si estas empezando en el mundo de la programación utilizando C# .NET.. o quizás siendo ya un poco experimentado en este ambiente.. seguramente te estarás preguntando como rayos documentar el código, me imagino que en algun momento has utilizado algunas de las etiquetas para este fin, pero las utilizas todas y sabes que significa cada una de ellas ??

Este artículo es una reseña sobre las diferentes etiquetas que se utilizan sobre métodos y clases para generar documentación.. bien puede ser utilizando SandCastle o para documentar los objetos sobre el desarrollo cuando estos son invocados.

Por ejemplo, agregando “///” al inicio de una clase, el entorno de desarrollo de .NET automáticamente genera una secuencia especial de comentarios sobre el código y se ve de esta manera:

/// <summary>
/// Pretendo construir un reloj y esta es la descripcion de este objeto
/// </summary>
public Color reloj
{
    private int hora { get; set; }
}

Y como resultado, al implementar el objeto reloj .. Visual Studio me mostraría como documentación lo que escribí dentro de la etiqueta summary.

Creo que este tipo de etiquetas son llamadas “doc-comments tags” y forman parte del intellisense del editor de código de Visual Studio .. utilicé el ejemplo de “summary” porque virtualmente en cada miembro sea clase, método, propiedad, evento, etc.. se puede utilizar.. A continuación muestro una tabla con todas las etiquetas necesarias para documentar completamente un proyecto de software, veamos.

Continue reading →

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

27
mar 12

Consumiendo REST desde C#.NET

No Gravatar
Consumir RESTful en .NET

Consumir RESTful en .NET

Hace algunos días atras buscaba una forma decente y elegante de crear mi propia api utilizando RESTful para Celestic .. de esa forma fue que llegue a StackOverflow y muchas preguntas de usuarios necesitando código para consumir servicios basados en REST.. En este sitio todavía no colaboro por lo que no quize responder, ya pensándolo bien fue que decidí escribir este artículo.

Sé que hay otra manera de hacerlo.. pero para este ejemplo utilizaremos el objeto HttpWebRequest y HttpWebResponse, entonces comenzamos:

var postString = new {clave1:valor1, clave2:valor2};
byte[] data = UTF8Encoding.UTF8.GetBytes(postString);
 
HttpWebRequest request;
request = WebRequest.Create("http://localhost/ejemplo/api") as HttpWebRequest;
request.Timeout = 10 * 1000;
request.Method = "POST";
request.ContentLength = data.Length;
request.ContentType = "application/json; charset=utf-8";

Básicamente lo que se hace es instanciar de HttpWebRequest y setear algunos parámetros, entre ellos y mas importante el método (Method), la longitud de la petición (ContentLength) y el tipo de dato a enviar (ContentType). No pierdan de vista que estoy enviando postString que a su vez es un objeto tipo Json.

La mayoría de servicios basados en REST requieren autenticación básica.. y pues es una de las más fáciles de utilizar.. inclusive desde el navegador se puede hacer, lo único que se requiere es un usuario y una clave de acceso..

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("usuario:clave"));
request.Headers.Add("Authorization", "Basic " + credentials);

Esto es como algunas páginas en internet que piden autenticación para entrar, donde puedes escribir la url y esperar a que aparezca el formulario de inicio de sesion o escribirlo directamente en la url.. de la forma: “usuario:clave@http://localhost/ejemplo/api”

Ahora lo siguiente y último paso es enviar los datos y obtener la respuesta..

Stream postStream = request.GetRequestStream();
postStream.Write(data, 0, data.Length);
 
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(response.GetResponseStream());
string body = reader.ReadToEnd();

Y para finalizar body es el contenido de lo que ha respondido el servicio, recuerden que la respuesta es tipo Json.. por lo que pueden interpretarla facilmente con javascript o hacer algo más complejo si desean parsearlo desde .NET.

Espero les sirva el código.. y si encuentran algun error, recuerden que el formulario de comentarios no muerde.. :D

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

20
mar 12

Phalcon PHP

No Gravatar
Phalcon PHP

Phalcon PHP

Hace algunos días atras leía sobre un nuevo framework de PHP.. como si no hubieran muchos para elegir.. pero este específicamente tenía algo diferente que llamó mi atención.. lo guarde en mis favoritos y por fin!!! este fin de semana pude probarlo.

Pues bien, este nuevo framework se llama Phalcon PHP, esta escríto en C y funciona como una extensión adicional al lenguaje PHP utilizando el patrón de diseño MVC .. lo más interesante de que presumen es la velocidad con que este framework funciona a diferencia de la competencia.

Como cultura general, PHP es un lenguaje interpretado, básicamente Apache que es el servidor debe traducir todo el código php y entregarlo al cliente en forma de HTML, lo que hace de PHP un lenguaje algunas veces lento.. buuu!!! si a eso le agregan el uso de frameworks pues puede que el desempeño se vea un poco afectado, ya que los frameworks deben cargar inicialmente un set de librerías para funcionar lo cual se traduce en tiempo de compilación de recursos extras. Phalcon siendo una extensión del lenguaje, se carga automáticamente de tal manera que ofrece casi las mismas funciones que los demás frameworks, o al menos para trabajar utilizando el patrón MVC.

Definitivamente el resultado es muy bueno, la respuesta del servidor es superior en comparación de los frameworks tradicionales, entre los puntos negativos de Phalcon es que quizás le falten muchas cosas para llegar al nivel de CodeIgniter, Zend o Yii .. digamos algunas validaciones sobre los modelos, uso de eventos sobre el controlador, actions, etc..  y sobre todo documentación (porque hay cosas que no estan muy claras como el uso de las relaciones :S), pero la idea es genial.. Si tienen oportunidad de probarlo, no dejen de hacerlo.

Por cierto, el código lo encuentran en github.. hay que descargarlo y compilarlo.. además de la guía de instalación previa.. yo les recomendaría tener instalado build-essential..

Fuente: http://phalconphp.com/

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

24
ene 12

Remover elementos repetidos de un array php ruby java c# vb javascript

No Gravatar
Array remove duplicates items

Array remove duplicates items

Siguiendo la línea de publicar un post técnico y uno intelectual.. esta vez ha llegado el momento del post téncico.. lo que por mi actividad es muy fácil de escribirlo.. Esta entrada esta basada en la experiencia que tengo sobre algunos lenguajes y algo que es muy común de hacer y que muchos programadores escriben a su manera, unos porque no conocen el método y otros porque les gusta tener el control del código.

Este ejemplo se basa en eliminar los elementos duplicados de un arreglo, por ejemplo: (‘a’, ‘b’, ‘c’, ‘b’, ‘c’, ‘d’)

Php

$arreglo = array('a', 'b', 'c', 'b', 'c', 'd');
$filtro = array_unique($arreglo);

Ruby

arreglo = ['a', 'b', 'c', 'b', 'c', 'd']
filtro = arreglo.uniq

Java

Object[] arreglo = {'a', 'b', 'c', 'b', 'c', 'd'};
Set<Object> unst = new HashSet<Object>(Arrays.asList(arreglo));
Object[] filtro = unst.toArray();

C#

string[] arreglo = {'a', 'b', 'c', 'b', 'c', 'd'};
string[] filtro = arreglo.Distinct().ToArray();

Javascript

Array.prototype.unique = function() {
    var el = this.concat().sort();
    for (var i = 1; i < el.length; ) {
        if (el[i-1] === el[i])
            el.splice(i,1);
        else
            i++;
    }
    return el;
}
var filtro = ['a', 'b', 'c', 'b', 'c', 'd'].unique();

MaxScript

arreglo = #('a', 'b', 'c', 'b', 'c', 'd')
for i in arreglo.count to 1 by -1 do
(
    id = findItem arreglo arreglo[i]
    if (id != i) do deleteItem arreglo i
)

Seguramente hay muchas otras maneras de eliminar los elementos duplicados en los arreglos.. para lenguajes como maxscript, javascript o java.. pero al final se trata de lograr desarrollar la funcionalidad deseada.

El maestro de El Castor decia.. “No importa como lo hagas.. lo que importa es que funcione”..

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

17
ene 12

Frameworks, como elegirlos

No Gravatar
Framework como elegirlos

Framework como elegirlos

He pensado en esto unas mil veces y siempre llego a la conclusión de que aunque los frameworks hacen la vida más fácil (en algunos casos), el proceso de desarrollo más rápido y mejora las capacidades de trabajo en equipo, es necesario siempre considerar el uso o no de este tipo de herramientas. Desde mi punto de vista, trataré de explicar que se necesita para elegir un framework.

Características

Basándose en una lista de características del software a desarrollar, un framework debería de cumplir con dicha lista sin agregar complejidad al desarrollo mismo (también conocido como código extra). Suponiendo que quiero desarrollar una aplicación donde básicamente quiero tener usuarios y cada usuario tenga una lista de tareas, pues bien asumo que utilizaré un módulo de usuarios y otro para creación de tareas. Hasta este punto el framework no es necesario.. pero que tal si en mis previsiones esta el realizar funciones más complejas como agregar un calendario para tener un registro de eventos, tomados segun se fueron escribiendo las tareas.. todo esto de forma social y abierta a los demás usuarios .. ok, ya se empieza a complicar y seguro algunos dirían que el framework no se necesita.. pero lo que puede aportar el framework es que aparte de cubrir las características básicas, también se puede adaptar a las características futuras, manteniendo siempre una línea de desarrollo relativamente sencilla de mantener.

Extensible

Con un framework se resuelve más de un problema, de hecho se resuelven problemas que posiblemente no sabías que existian en tu código y eso antes de que te sentaras a codificar. La gran mayoría de frameworks cuentan con repositorios de extensiones mantenidas por la comunidad que extienden funciones y componentes de sus funcionalidades básicas. Es necesario mencionar que extensible no se refiere solamente a la cantidad de extensiones, sino también a la calidad y facilidad con que se pueden mantener y crear tus propias extensiones.

Prototipos que determinen su uso

Creo que experimentar con nuevas tecnologías te hace entender en que momento utilizarlas. Si no has experimentado con nuevas opciones de desarrollo, entonces cada vez que necesites utilizar una nueva herramienta tendrás que gastar algo de tiempo y esfuerzo extra para aprender. Una práctica recomendable es siempre construir un pequeño prototipo donde trates de agrupar por ejemplo interacciones con formularios, almacenamiento en BD y uso de javascript. Me refiero a algo muy simple que quizás con algo de documentación puedas construir en un solo día.

Ayuda

Los frameworks con más tiempo de vida suelen tener muy buena documentación en comparación con los nuevos. Foros, listas de correo, blogs, e incluso sitios como StackOverflow proporcionan una gran cantidad de información. Si hay poca actividad en los foros o listas de correo, definitivamente no es una buena opción la que has elegido por lo que una buena idea sería abandonar ese framework. Encontrar ayuda o ejemplos de código es muy importante en el proceso de aprendizaje de nuevas herramientas. En cuanto a los blogs no dejan de ser útiles porque te dicen que esta pasando alrededor de un framework.

Hay que recordar que el framework aporta agilidad y orden al desarrollo de software, si hace todo lo contrario es porque has metido la pata y debes buscar una mejor herramienta.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

10
ene 12

¿Como formatear un numero con comas en C++?

No Gravatar

Tenia pensado escribir sobre lo que estoy haciendo, pero hoy no tengo cabeza para eso, así que me he puesto en modo automático y les traigo un poco de código.

Problema: Convertir un numero a cadena, insertando comas en cada millar y truncando hasta las decimales.

C++ es un lenguaje muy poderoso, pero a veces cuando se trata de hacer cosas que son muy sencillas en otros lenguajes C++ no hace mas que resistirse. Claro que podríamos ocupar una librería que nos resuelva las cosas, siempre cuidando que sea multiplataforma y que sea opensource y de preferencia que ya este compilada, por ejemplo Boost, la cual recomiendo ampliamente. Pero no parece ser buena idea ocupar una librería para algo que inicialmente parece sencillo.

Entonces te pones a escribir código …

#include
#include 
using namespace std;
 
string ponleComas(double Numero)
{
	stringstream flujo;
	flujo &lt;&lt; fixed &lt;&lt; Numero;
	string s = flujo.str();
 
	string ns;
		if (s.find(".") != string::npos) {
		ns = s.substr(s.find("."), 3);
		s = s.substr(0, s.find("."));
	}
 
	int c = 0;
	for (int i=s.length()-1; i&gt;=0; i--) {
		if (c % 3 == 0 &amp;&amp; c != 0) {
			ns = "," + ns;
		}
		c++;
		ns = s[i] + ns;
	}
	return ns;
}

Listo, se usa así:

	double x = 950123.8384;
	double y = 83838347.123;
	double z = 45027456475345.56345;
 
	cout &lt;&lt; ponleComas (x) &lt;&lt; endl;
	cout &lt;&lt; ponleComas (y) &lt;&lt; endl;
	cout &lt;&lt; ponleComas (z) &lt;&lt; endl;

ESPERA!!! , tranquilo, no copies código aun. ¿Por que hacernos la vida fácil? Aquí va la segunda versión de este código:

#include 
#include 
#include 
class coma_numpunct : public std::numpunct
{
	protected:
	virtual char do_thousands_sep() const { return ','; }
	virtual std::string do_grouping() const { return "\03"; }
};
 
string ponleComas2 (double Numero)
{
	locale coma_locale(locale(), new coma_numpunct());
	stringstream flujo;
	flujo.imbue(coma_locale);
	flujo &lt;&lt; setprecision(2) &lt;&lt; Numero;
	string s = flujo.str();
	return s;
}

Mira que bonito código !! se ve bien PRO … y ademas funciona :D

¿Y como funciona? Pues lo primero que vemos es la clase coma_numpunct la cual sobre escribe algunos metodos de la clase numpunct, si juegas un poco puedes cambiar el caracter de separacion y el numero de caracteres que van entre una coma y la siguiente.

Luego, en la función ponleComas2, instanciamos un objeto de tipo locale y usamos en el constructor una instancia de la clase coma_numpunct que habiamos creado anteriormente.

Los objetos locale definen varias características de la forma en que se presentan los datos, con respecto a la cultura. Por ejemplo en algunos países se usa el punto en lugar de la coma para separar las decimales, o en las fechas se pone el mes/dia/año en lugar de dia/mes/año.

Creamos un objeto de tipo stringstream, que nos sirve como una especie de buffer, en el cual podemos imprimir cosas como si fuera cout, pero no se imprimiran en pantalla.

Ahora viene la impresion del numero, y vemos que aparece un setprecision(2) que es muy obvio y ademas un fixed que evita que se use la notacion cientifica, ya sabes 9.5e+05 en lugar de 950,123.83.

Finalmente usamos el método str() para convertir el stringstream a string y retornamos el valor.

Seria muy interesante medir tiempos, para ver cual de las dos implementaciones funciona mejor, pero eso ya es de verdad no tener nada que hacer :P . Espero que el código les sirva. Si conocen otra forma de hacerlo póngalo en los comentarios, sera interesante darle un vistazo.

 

 

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

20
dic 11

Asp.net MVC 2 Model List<> DropdownListFor

No Gravatar

ASP.NET MVC

En mi experiencia recorrindo diferentes lenguajes de programación y sus respectivos frameworks de desarrollo ágil para aplicaciones web, esta vez tocó el turno a asp mvc 2 y para iniciar esperaba crear un lista de selección.. Se que la versión actual de asp mvc es la 3, pero solamente se puede utilizar con visual studio 2010, el cual aun no hemos comprado, por eso este mini how to lo hago con la versión 2.

Leí muchos tutoriales y ejemplos sobre como lograr hacer un dropdownlist con información de un modelo, la mayoría de los ejemplos mostraban lo siguiente:

Crear un modelo y luego una propiedad de tipo List conteniendo SelectListItem que básicamente es una estructura de textos y valores.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class EjemploModel
{
   [DataType(DataType.Text)]
   [Required(ErrorMessage = "Selecciona un mes")]
   [DisplayName("Mes")]
   [UIHint("List")]
   public List<SelectListItem> meses { get; set; }
 
   // Constructor para llenar la lista en la instancia
   public EjemploModel()
   {
      meses= new List<SelectListItem>();
      for(int i=1; i<=12; i++)
      {
         meses.Add(new SelectListItem() { Value =i.ToString(), Text = i.ToString() });
      }
   }
}

Hasta esta punto todo parece tener sentido.. creando una propiedad de tipo lista y luego pasándola a la  vista:

1
2
3
<%= Html.LabelFor(model => model.mes) %>
<%= Html.DropDownListFor(Model.mes, Model.mes, "-------")%>
<%= Html.ValidationMessageFor(model => model.mes, "*")%>

Y seguramente funciona.. el problema venía cuando hacia submit del formulario.. ya que el valor seleccionado del dropdownlist nunca era tomado como parametro en el action donde la enviaba.. Leí muchos post donde a novatos como yo les ocurría el mismo error.. claro, en los tutoriales nunca decían como resolverlo por lo que la respuesta viene a continuación, sencilla para serles sincero..

En los otros frameworks no es necesario definir una propieda de tipo lista, simplemente lo que se hace es definir una propiedad que en este caso sería Int .. y la lista crearla por aparte sin necesidad de hacerla propiedad del modelo. Sé que hay más de una manera de hacer esto y mi forma es la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class EjemploModel
{
   [DataType(DataType.Text)]
   [DisplayName("Mes")]
   [UIHint("List")]
   public List<SelectListItem> mesLista { get; set; }
 
   [DataType(DataType.Text)]
   [Required(ErrorMessage = "Debe de seleccionar un mes de vencimiento.")]
   [DisplayName("Mes")]
   public int mes{ get; set; }
 
   // Constructor para llenar la lista en la instancia
   public EjemploModel()
   {
      mesLista= new List<SelectListItem>();
      for(int i=1; i<=12; i++)
      {
         mesLista.Add(new SelectListItem() { Value =i.ToString(), Text = i.ToString() });
      }
   }
}

Y en la vista quedaría de la siguiente manera:

1
2
3
<%= Html.LabelFor(model => model.mes) %>
<%= Html.DropDownList("mes", new SelectList(Model.mesLista, "Value", "Text"), "-------")%>
<%= Html.ValidationMessageFor(model =>; model.mes, "*")%>

Ahora al momento de hacer submit, el valor seleccionado se pasará hacia la propiedad mes y no a mesLista como ocurría anteriormente. Espero les sirva de ejemplo y guía..

Suerte

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

11
feb 09

Una nueva herramienta en desarrollo SICAP

No Gravatar

SICAP es una herramienta de colaboración para llevar el control, manejo y ejecución de proyectos de construcción civiles, hidroelectricos, mecanicos e hidráulicos.. El sistema como tarea básica es el encargado de administrar la documentación completa desde que se inicia un proyecto hasta su fin..

Puede que esto nos mantenga ocupados un par de meses, esta desarrollado para la web.. Realizado con C# para ASP.NET y componentes de DevExpress es una chulada visual.. Quizás con algo más de tiempo mientras se continua trabajando en su desarrollo podamos filtrar algunas capturas de pantalla..

Usando un potente motor de BD (Oracle) y como complemento el desarrollo de modelos tridimensionales por ahora solamente como aplicación de escritorio (quizas en un futuro para la web con cualquier engine 3D de flash), es una herramienta muy completa.. competitiva y confiable.. jejeje.!! vaya comercial el que me he lanzado.. n_n

, , , , , , , , , , ,

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

28
oct 08

BEA Tuxedo

No Gravatar

Tuxedo es un producto de la empresa BEA recientemente en proceso de fusión con Oracle.

Tuxedo es un framework que se encarga de administrar transacciones, te permite concentrarte en la funcionalidad y no tener que inventar la parte de transacciones que es muy compleja. Imagina que requieres hacer un proceso compuesto de 4 o 5 pasos, cada paso es ejecutado en sitios distintos, cada paso hace algo muy particular como actualizar un archivo, insertar un registro en una base de datos, dar aviso a otro proceso, etc etc. Si alguno e estos pasos falla, la transacción debe ser deshecha, por ejemplo si el paso 4 falla, el paso 3, 2 y 1 no sirven de nada y debe hacerse un rollback. Ideal para usarse en bancos. Actualmente es muy utilizado en instituciones financieras donde se tiene alto flujo transaccional.

Tuxedo es va bastante viejo, existe desde hace mas de 10 años, lo cual no es necesariamente malo. Otra cualidad importante es que puede ser accesado desde distintos lenguajes y se puede comunicar con otros procesos mediante IPC.

¿Que tiene que ver todo esto con Qbit? A uno de nuestros cliente le fue encargada la tarea de substituir Tuxedo por … otra cosa. Pero… uno de los requerimientos es no reescribir el conjunto de procesos actuales, escritos en C y que están hecho especialmente para poder ser invocados y administrados por Tuxedo. Es decir, lo que se pretende es prácticamente, hacer un clon de Tuxedo, por supuesto únicamente de la parte de Tuxedo que sea esencial, pues sustituirlo todo seria muy complicado, Tuxedo es enorme.

Nuestro cliente nos ha encargado la parte de C y C++, mientras que ellos se encargaran de la parte en Java. Hay que reescribir un subconjunto del API de Tuxedo y recompilar los procesos escritos en C, haciendolos creer que estan en Tuxedo. Hasta al momento vamos muy bien, es un trabajo muy interesante.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

Qbit Mexhico Blog is using WP-Gravatar