Navegador de Archivos
Calendario del Blog
General
Programación
-
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:
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.
:: 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
[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:
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:
<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>
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.
string _dbConnection = ConfigurationSettings.AppSettings["keyName"];
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
.
Después de esto ya puedes usar la variable stringIP para concatenarla en cualquier parte de tu código.
// 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();
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.
- Descargar log4net de la siguiente liga: http://logging.apache.org/log4net/downloads.html
- 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.
- 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>
- Por ultimo se deben de agregar los namespaces en tu codigo
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:
using log4net;
usgin log4net.Config;
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("NombreDelAppender");
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.
private static readonly ILog log = LogManager.GetLogger("MiLogName");
Y despues podras usar los metodos del log (Debug, Info, Warning, Error, etc):
XmlConfigurator.Configure();
Para mas detalles de la configuracion pueden leer la documentacion.
log.Debug("Iniciando aplicacion");
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. - Descargar log4net de la siguiente liga: http://logging.apache.org/log4net/downloads.html
-
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
.
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
.
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/ - Mono y .Net
-
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.
Estadísticas de visitantes









Comentarios Recientes