Iver's web place

Life is a journey ... taken one shot at a time!

Programación

  • Compartamos código

    Cuando desarrollas aplicaciones de software a distancia, es común querer compartir código pero tenemos la limitante de que al hacerlo por correo no se ve el realzado de sintaxis y por mensajero es limitado el envío por los emoticons, el número de líneas o bien simplemente queremos que persista la información para un post en nuestro blog.
    Claro que algunos blogs como Jaws, permiten compartir un código como el siguiente y con sus respectivos tags.
       1:  ParameterExpression pc = Expression.Parameter(typeof(Customer), "c");
       2:  
       3:  IQueryable<Customer> q3 =
       4:      dc.Customers.Where<Customer>
       5:      (
       6:          Expression.Lambda<Func<Customer, bool>>
       7:          (
       8:              Expression.Equal(
       9:              Expression.Property(pc, typeof(Customer).GetProperty("City")),
      10:              Expression.Constant("London", typeof(string))
      11:          ),
      12:          new ParameterExpression[] { pc }
      13:          )
      14:      );
     
    Read More...
  • How to create custom controls in ASP.NET part 3 of 3

    Deploying Custom Controls

    If you're using the Visual Studio IDE, maybe you don't know the building way from the command line. I have two files (FoxyGridView.cs and FoxyGridView.Methods.cs) and I need to generate the build from the command line. So the sintax is the next:
    C:\Program Files\Microsoft Visual Studio 9.0\VC> csc /t:library /out:FoxyGridView.dll /r:System.dll /r:System.Data /r:System.Drawing /r:System.Web FoxyGridView.cs FoxyGridView.Methods.cs

    Also we can set the control assembly properties, a strong assembly name consists of four parts: assembly name, version, culture, and public token key. Only we need to create a file named AssemblyInfo.css (or maybe other name), with the following code to the file:
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    [assembly: AssemblyCulture("")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyKeyFile("KeyFile.snk")]
     
    Read More...
  • How to create custom controls in ASP.NET part 2 of 3

    State Management

    Previusly in the last post we saw the web custom controls attributes. We can interactive with the web user control through its attributes.
    To implement a custom control, you have to implement a class in procedural lenguages as C# or VB.NET that derives from a base class such as Control. Every server control directly or indirectly derives from the Control base class.
    The base class Control provides server controls with the infrastructure they need to operate as a server control in the ASP.NET framework. One of these infrastructural methods is a method named Render. This method is where a server control generates or renders its HTML markup text.
    For example, if you wish to put a html table into the page, you need to use the next code or similar code:
    Read More...
  • How to create custom controls in ASP.NET part 1 of 3

    This is my first post in English, I need more practice so ... If you find some error in my redaction, feel free to comment about it.
    For understand the topic is necesary to know the basic differences between user controls and custom controls:
    User Control
    • Designed for single-application scenarios
    • Deployed in the source form (.ascx) along with the source code of the application
    • If the same control needs to be used in more than one application, it introduces redundancy and maintenance problems
    Custom control
    • Designed so that it can be used by more than one application
    • Deployed either in the application's Bin directory or in the global assembly cache
    • Distributed easily and without problems associated with redundancy and maintenance
    OK, After that I want to show you how we can create a custom control in ASP.NET for this I split the post in 3 parts:
    Read More...
  • Aprendiendo lenguajes de programación

    Leyendo el blog de Carlos Madrigal encontré unas cuantas ligas interesantes para aprender: Espero les sirvan.
  • Comunidad de .NET

    Hoy quiero comentar que el día de ayer nos dimos a la fuga del trabajo a eso de las 7:00pm, Luis Enrique, Erick Sanchez y su servidor face-wink.png para llegar a una reunión de CSharperos en la ciudad de méxico, teniendo como punto de reunión el WTC.
    A pesar de que se había cancelado la reunión de la comunidad, gracias a que el buen Martín Trejo (Chillicoder) se puso en contacto conmigo, pudimos vernos en el WTC e ir a tomar un café para platicar sobre mono y una idea que ha tenido desde hace tiempo de formar una comunidad de Mono. Por el momento no se ha concretado nada al respecto pero se sigue maquinando para que esto vaya tomando forma.
    Quién también nos acompaño fué el gran akin0, que por cierto me dijo que fueramos, de no haber sido por el buen akin0 tal vez no me hubiera animado a asistir a pesar de no haber reunión de .NET ya que llevaba mi maleta del gimnasio y es algo molesto estarla cargando.
    Chillicoder expuso su tema de introducción a mono para que mis comañeros pudieran adentrarse en el mundo del OpenSource, porque como se imaginaran no lo han hecho, al parecer son windowseros por necesidad, jeje face-wink.png . Realizó varios ejemplos y ejecuto las aplicaciones en ambos entornos (windows y linux) tanto en .NET como en Mono para ver como funciona el desarrollo del equipo de Novell. Como extra también aporto un poco de información sobre Mono Migration Analyzer que es un programa que examina una lista de ensamblados (assemblies) y busca llamadas a métodos de la BCL que no se encuentren implementadas, estén marcadas con el atributo [MonoTodo] o que no tengan una implementación completa además de reportar las llamadas P/Invoke. Para más información sobre esto podemos ver su post en su blog face-smile-big.png .
    Quién llego al poco rato de haber empezado su ponencia Chillicoder fué el buen Raúl Guerrero que apoyo con un poco de código, que por cierto está muy interesante. Resulta que cuando se quiere hacer un envio de un webform a otro en C# es medio compleja la manipulación de envio de datos mediante ViewState. Raúl nos mostró una manera que se me hace muy práctica, útil y elegante.
    Es motivante saber que hay gente que también le agrada compartir conocimientos, código y experiencia.
  • Evitar commits sin comentarios en subversion.

    Cuando estamos desarrollando un sistema con diversos desarrolladores, ya sea de manera informal o formal siempre es bueno seguir las best practice [1] para evitar hacer el trabajo dos veces o complicarnos la existencia con errores comunes.
    Uno de los errores más comunes que tenemos a la hora de subir cambios a un repositorio en subversión es la falta de comentarios, para esto, cuando somos administradores de un respositorio de este tipo bien podemos solicitar al desarrollador que se ingrese un mensaje antes de poder hacer un commit.
    Esto lo encontré en un blog en la red (que por cierto no lo volví a encontrar) y ahora lo posteo aquí para que no se me olvide y espero que a alguién más también le sea de utilidad.
    En el directorio de nuestro repositorio se encuentra un subdirectorio llamado hooks , ahí es donde tenemos que poner el siguiente script para poder evitar los commits:
    :: Evitamos la impresión en pantalla de mensajes.
    @echo off
    setlocal
    set "REPOS=%~1"
    set "TXN=%~2"
    :: Aquí se asegura que el commit contiene algún texto
    :: En este caso se tiene que cambiar la url del svnlook de acuerdo a donde
    :: este instalado el subversion
    for /f "tokens<img src="plugins/Emoticons/images/face-kiss.png" border="0" alt="face-kiss.png " width="16" height="16" />" %%i in ('C:\ARCHIV~1\SUBVER~1\bin\Svnlook.exe log -t "%TXN%" "%REPOS%"') do set "LOGMSG=%%i"
    if not "%LOGMSG%"=="" exit 0
    echo. 1>&2
    echo Tu actualización ha sido cancelada debido a que no ingresaste texto alguno! 1>&2
    exit 1
     
    Por último solo tenemos que guardarlo con el nombre de pre-commit.cmd para que el svn sepa que tiene que ejecutar ese script antes de hacer un commir.
    [1] http://en.wikipedia.org/wiki/Best_practice
    Referencias interesantes:
    http://es.wikipedia.org/wiki/SVN
    http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html
    http://svnbook.red-bean.com/en/1.1/svn-book.html
  • Evitar recompilar por cambios simples.

    El otro día encontré un artículo que citaba al programador de raza y me doy cuenta de que me inclino poco a poco hacia ese perfil y espero algún día llegar a cubrirlo perfectamente, por lo mientras he dedicado un poco de mi tiempo para investigar sobre como realizar un mejor código con pocas modificaciones.
    En esta ocasión me puse a modificar el código para que al subir los datos a producción no se tenga que estar recompilando porque falló una u otra cadena de conexión o que la ip no corresponde o detallitos como esos.
    Primero veamos la conexión a la base de datos, muchas veces por la facilidad y rápidez de copiar y pegar no nos damos cuenta que nuestro código se está duplicando considerablemente y para colmo no nos interesa darle el mentado refactoring. En el caso de las cadenas de conexión de bases de datos bien podemos usar el archivo de configuración que brinda el .NET (web.config).
    Es muy simple, unicamente se tiene que definir lo siguiente:
    <appsettings>
     ...
                    <add key="keyName" value="Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=MiBase;Data Source=MiServer;"></add>
    ...            
    </appsettings>
     
    Después de eso en nuestro código usamos el namespace System.Configuration y asignamos a una variable de tipo string el valor del key que contiene la conexión:
           string _dbConnection = ConfigurationSettings.AppSettings["keyName"];
     
    con esto es más que suficiente para poder utilizar a cadena que viene en el archivo de configuración y además puedes modificarla al vuelo sin tener que compilar nuevamente tu código.
    Otro problema que puede surgir es que constantemente tengas que estar cambiando la URL de la máquina de pruebas a la de producción. Para esto he encontrado una forma simple de hacerlo y claro si alguién más lo ha hecho de una manera diferente por favor comentalo para aprender face-wink.png .
      // Se obtiene el nombre de la máquina
      string hostName = System.Net.Dns.GetHostName();
      // Se obtiene la ip de un array porque puede tener más de una ip asignada
      string stringIP = System.Net.Dns.GetHostEntry(hostName).AddressList[0].ToString();
     
    Después de esto ya puedes usar la variable stringIP para concatenarla en cualquier parte de tu código.
    Simple, ¿o no?, que nos cuesta darle una pulidita a ese código y evitar unas cuantas líneas que no nos serviran de nada. Ya si andas medio inspirado puedes generar una clasesilla y poner tus diversas configuraciones para conectarte a las bases de datos.
    Si, también existen FrameWorks dedicados a eso pero esa es otra historia.
  • Configurando log4net almacenando en archivos.

    Si alguna vez has realizado algun desarrollo y has tenido problemas al ponerlo en produccion sabras que no puedes debuguear en tu servidor de produccion o al menos es algo complicado realizarlo.
    Para este tipo de problemas y sobre todo para una buena administracion de tu sistema es necesario que siempre tengas un log de las cosas que pasan. Recientemente implemente log4net con .NET en el trabajo y a continuacion pretendo poner unas pocas configuraciones que me han sido de ayuda.
    1. Descargar log4net de la siguiente liga: http://logging.apache.org/log4net/downloads.html
    1. Agregar el binario a las referencias, para esto buscamos la dll apropiada que se encuentra en el directorio bin del comprimido obtenido en el paso anterior. De acuerdo con el framework que se trabaje se navega en los directorios y encontraremos una dll y un archivo xml, dichos archivos los copiamos y pegamos en el directorio bin de nuestro proyecto. Si usas un IDE como MonoDevelop o VS solo basta darle boton derecho en el navegador de nuestra solucion y seleccionar agregar referencias.
    1. Para configurarlo se requiere agregar algo como lo siguiente en el archivo web.config si estas desarrollando un sitio web o en app.config si es una aplicacion:
    <configuration>
      <configsections>
        <section type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.0"></section>
      </configsections>
     
      <log4net>
       
        <appender type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <param value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n"></param>
          </layout>
        </appender>
       
        <appender type="log4net.Appender.RollingFileAppender">
          <param value="C:\\log\\MiLog.log"></param>
          <param value="true"></param>
          <param value="10"></param>
          <param value="1000"></param>
          <param value="Size"></param>
          <param value="true"></param>
          <layout type="log4net.Layout.PatternLayout">
            <param value="%d [%t] %-5p %-45c [%x] - %m%n"></param>
          </layout>
        </appender>
       
        <appender type="log4net.Appender.FileAppender">
          <param value="MiArchivoDeLogs.log"></param>      
         
          <param value="true"></param>
          <layout type="log4net.Layout.PatternLayout">
            <param value="%d [%t] %-5p %c [%x] - %m%n"></param>
          </layout>
        </appender>
       
        <root>
          <level value="INFO"></level>
         
        </root>
       
        <logger>
          <level value="INFO"></level>
         
        </logger>
      </log4net>
    </configuration>
     
    1. Por ultimo se deben de agregar los namespaces en tu codigo
    using log4net;
    usgin log4net.Config;
     
    o bien hacer referencia directa a cada metodo con su ruta absoluta. Para poder usar los metodos es necesario que se declare un objeto estatico y de solo lectura para almacenar la referencia al logger:
    private static readonly ILog log = LogManager.GetLogger("NombreDelAppender");
     
    Donde NombreDelAppender es el nombre que le has puesto al appender primario, en este caso ha sido "ConsoleAppender". O bien si agregaron el nodo logger como en el ejemplo, pueden usar:
    private static readonly ILog log = LogManager.GetLogger("MiLogName");
     
    Algo importante y que me causo un poco de dolor de cabeza es que no se menciona en la mayoria de los manuales que se tiene que mandar a llamar el metodo que configura el framework, esto se hace de la siguiente manera y se pone en el constructor de la clase.
    XmlConfigurator.Configure();
     
    Y despues podras usar los metodos del log (Debug, Info, Warning, Error, etc):
    log.Debug("Iniciando aplicacion");
     
    Para mas detalles de la configuracion pueden leer la documentacion.
    http://logging.apache.org/log4net/release/manual/configuration.html
    O bien usar este enlace que creo es mas explicito y contiene un ejemplo completo:
    http://aspalliance.com/557
    Mas adelante posteare una configuracion que hice para sql con SQL Server para aquellos que tengan dudas o interes al respecto. Por el momento es todo porque tengo algo de suenio.
  • Podcast de programacion

    Me imagino que ya muchos conocen el termino de podcast, en dado caso que no pueden consultar el significado en la wikipedia tongue.png .
    Ultimamente he estado escuchando algunos de ellos que me han parecido adecuados para quienes quieren aprender sobre programacion en .NET, a continuacion pongo la url para suscribirse con el iTunes:
    http://feeds.feedburner.com/superneurona (SuperNeurona)
    http://feeds.feedburner.com/pozotecnico/ (PozoTecnico)
    O bien pueden dirigirse al blog de los autores:
    http://www.pozotecnico.com/ (Carlos Madrigal)
    http://www.superneurona.com/podcast/ (Raul Guerrero)
    Para facilitarte la vida puedes usar un programa podcatcher. Los podcatchers, mientras los tengas prendidos, revisan periódicamente todos los podcasts a los cuales estes suscrito, si hay nuevos episodios, los descarga. En lo particular a mi me gusta el iTunes face-wink.png .
    Si alguien esta interesado en realizar un podcast pueden dirigirse a la siguiente liga para ver como funciona:
    http://utilidades.bitacoras.com/archivos/2005/09/13/como_hacer_un_podcast_gratis/
    Como recientemente me han solicitado informacion referente a C#, tambien pongo algunos enlaces que pueden servir para que se documenten al respecto.
    • Mono y .Net
    http://www.mono-project.com/Main_Page
    http://www.go-mono.com/docs/
    http://msdn.microsoft.com/netframework/
    http://www.microsoft.com/spanish/msdn/arquitectura/das/distapp.asp
    • Manuales
    http://www.programacion.com/tutorial/csharp/
    http://www.mono-project.com/Introduction_to_developing_with_Mono
    http://www.mono-project.com/Guide:Running_Mono_Applications
    http://www.mono-project.com/Monkeyguide
    http://unrealspace.com/cartuchoGL/NpgsqlUserManual.html
    • Portales
    "C# Corner" (http://www.c-sharpcorner.com)
    "C# Help"(http://www.csharphelp.com)
    "C# Station" (http://www.csharp-station.com)
    "Codehound C#" (http://www.codehound.com/csharp)
    "csharpindex.com" (http://www.csharpindex.com)
    "Developersdex" (http://www.developersdex.com/csharp)
    ".NET Wire" (http://www.dotnetwire.com)
    • Notas de interes
    http://knocte.blogspot.com/2005/06/antifud-mononet.html
    http://www.go-mono.com/docs/index.aspx
    http://www.ajlopez.net/puntonet/
    http://www.josanguapo.com/
  • Un programador de raza

    Leyendo en una revista encontré este texto, creo que es bueno y lo comparto después de un tiempo de no haber posteado mucho.
    En todos estos años que llevo haciendo programas, usándolos, etc, he tenido
    la oportunidad de relacionarme con una gran cantidad de personajes del mundo
    de la programación, entre los cuales me incluyo.
    Con el correl del tiempo, esta interacción con el mundillo de los programadores
    me fue enseñando más acerca de ellos, "o de mi".
    Cualquiera que estudie algo relacionado a la informática y que tenga algo de
    código que escribir, puede programar, sin importar qué se programe, o en qué
    se programe, o la calidad de lo que se programe.
    Hasta acé no hay nada en especial. Pero si la persona que escribe el código,
    además de solucionar o de crear, va por un poco mas allá , entonces, es un
    "programador de raza".
    Un promgramador de raza es una persona que mezcla lo mejor de un excelente
    programador con lo mejor de un excelente artista.
    Esto implica que, además de ser sistemático y ordenado, y de que lo que está
    creando cumpla con las normas básicas de la codificación, le agrega un toque
    personal , y vive y siente cada desarrollo como una obra de arte.
    Esto no implica que el resto de los programadores sean malos. Pero al igual que
    en el mundo del arte, existen artistas que sobresalen de los demás y que le
    dan a cada obra el toque personal y especial, que los convierte en grandes
    artistas. Esto no quita que los demás artistas no puedan crear, reproducir,
    interpretar, etc.
    Un programador de raza es una persona especial, que se siente diferente del
    resto y que necesita ser comprendida, ya que la única forma con que cuenta para
    hacerse notar es con programas, o sea, con cosas abstractas. Y a diferencia del
    resto de los programadores, lo que está creando es muy importante para él.
    Si en algún momento les toca interactuar con un programador de raza, comprenderán
    esta diferencia de la que les estoy hablando. Si ése es el caso, disfruten sus
    obras.
    GUSTAVO BIOTT.
    SOCIO FUNDADOR DE SYNCROLOGIX.
  • Sobre XML y Flash

    Ahora me toca lidiar un poco con XML y como la información al respecto esta distribuida, a continuación posteo algo de lo que he recolectado y aprendido.
    ¿Que es XML?
    XML, es un lenguaje basado en los principios de HTML, tags que permiten dar formato a un texto o sirven para hacer referencia al mismo. XML es la sigla del inglés eXtensible Markup Language (lenguaje de marcado ampliable o extensible) desarrollado por el World Wide Web Consortium (W3C). [1]
    XML es un lenguaje de transferencia de información, pensado para crear una sintaxis única que pueda usar cualquier programa para leer archivos de otro mediante un estándar.
    Ejemplos del uso de XML
    Un ejemplo del uso de XML lo podemos ver en los webservices, feeds, podcast, etc. Pero no es lo único que puede hacerse, es un lenguaje muy verstatil y permite la manipulación de datos sin importar el origen. Un muy buen proyecto que usa dicha tecnología es NHibernate, hermano mayor de Hibernate de Java pero pensado para usarse con .NET (más adelante haré un ejemplo de esta herramienta depersistencia).
    Ahora un pequeño ejemplo de lo que se puede hacer, tenemos un archivo formado de la siguiente manera:
    Read More...
  • Aprendiendo más que C#

    Esta semana estuvimos trabajando, aprendiendo un poco de C# con Norberto (un buen maestro, digo .. no es por hacerle la barba pero creo que se le entiende y nos motiva a aprender, así que para mi es un buen maestro tongue.png ) y algo del Team System de VS .NET.
    Todo parece estar de maravilla con esto del C#, solo espero que no salga Microsoft con alguna tarugada. También he estado haciendo un par de programillas en mono, digo .. no es la gran ciencia pero poco a poco ire mejorando. El proyecto de mono va creciendo rápidamente pero lógicamente no puede ponerse a la par en IDE con Microsoft* pero si está con el suficiente desarrollo para poder hacer aplicaciones buenas en linux.
    Y bueno, a pesar de siempre estar ocupado con el trabajo, con algo del GULEH
    o de la tesis, pues hoy nos pusimos a jugar un poco de starcraft, sin embargo no me dejan de ganar face-sad.png en definitiva no soy weno para eso, pero puedo mejorar face-smile-big.png .
    * Digo que no puede, por la simple razón de que Microsoft invierte una gran cantidad de dinero para eso, además en este momento sigue en desarrollo; sin embargo no dudo de que mejoraran muy pronto dicho entorno.
  • Que de cosas se aprenden

    Pues desde hace un par de semanas estamos en fase de entrenamiento en el trabajo. Precisamente sobre C#, es muuuy interesante, lo malo es que me he dado cuenta que no sé programar, esto lo digo porque hemos estado aprendiendo a modelar y diseñar nuestro sistema. Resulta que todo programador debe de saber analizar, modelar y diseñar bien una problemática para poder generar un buen código.

    Read More...
  • Un nuevo gadget

    Pues el bien conocido Kalvinet me pasó su gadget de Citas aleatorias para ver aprender algo sobre los gadgets del jaws. Pues me llevo un ratito entender como funciona realmente, pero no es nada del otro mundo a final de cuentas está bien hecho el esquema para poder programarlo, de esa manera el código es muy entendible, me agrada face-smile-big.png .
    Espero poder seguir metiendole manita al jaws tongue.png para aprender más sobre PHP, por lo mientras nada más modifiqué una que otra línea para que se viera bonito, pero todo lo demás ya estaba, si quieres descargarlo puedes hacerlo desde aquí, dentro de poco espero que lo suban al Jaws-user, nada más que dé su Visto Bueno el Kalvin. face-wink.png
    Por cierto ... el gadget funciona bien si nada más lo copias al directorio html/gadgets/ del jaws, esto si lo haces desde una instalación limpia, pero si ya tienes tu blog montado, aparte tienes que meter esté script:
    CREATE TABLE [prefijo_tablas]_quote (
      id int(11) NOT NULL AUTO_INCREMENT,
      author varchar(255) NOT NULL DEFAULT ,
      `text` varchar(255) NOT NULL DEFAULT
    ,
      PRIMARY KEY  (id)
    ) TYPE=MyISAM;
     
    en un archivo de texto y ejecutar la siguiente sentencia:

    mysql -u usuario -p -D base_de_datos < MiScript.sql
    Para que cuando ingreses una cita pueda ser almacenada en la base de datos face-wink.png
    Actualizado: 27-06-2005 6:48pm
    Ya está disponible desde jaws-user, pulsa aquí si quieres para descargarlo.