<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XFIGUE</title>
	<atom:link href="http://xfigue.milaweb.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://xfigue.milaweb.com</link>
	<description></description>
	<lastBuildDate>Mon, 14 Apr 2014 02:13:56 +0000</lastBuildDate>
	<language>es-ES</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Mi opinión sobre Angular.JS</title>
		<link>http://xfigue.milaweb.com/mi-opinion-sobre-angular-js/</link>
		<comments>http://xfigue.milaweb.com/mi-opinion-sobre-angular-js/#comments</comments>
		<pubDate>Mon, 14 Apr 2014 02:13:56 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://xfigue.milaweb.com/?p=181</guid>
		<description><![CDATA[Apenas un par de días atrás terminé de leer el libro Angular.JS (de los autores Brad Green y Shyam Seshadri) y puedo decir que lo que pude ver sobre este framework me gusto mucho. Yo venia utilizando knockout.js en algunos &#8230; <a href="http://xfigue.milaweb.com/mi-opinion-sobre-angular-js/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p><img src="http://xfigue.milaweb.com/assets/AngularJS-large.png" alt="" width="383" height="108" class="alignnone size-full wp-image-195" /></p>
<p>Apenas un par de días atrás terminé de leer el libro <a href="http://www.amazon.com/AngularJS-Brad-Green/dp/1449344852/">Angular.JS (de los autores Brad Green y Shyam Seshadri)</a> y puedo decir que lo que pude ver sobre este framework me gusto mucho.</p>
<p>Yo venia utilizando knockout.js en algunos proyectos pero quería buscar algún framework js que implemente el <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">patrón MVC</a> y no MVVM. Buscando en la red pude encontrar mucha información sobre <a href="http://angularjs.org/">Angular.js</a> que si implementa MVC y es impulsado por la empresa Google.</p>
<p>El libro Angular.js aborda la tecnología desde el principio, explicando como funciona y con ejemplos muy claros.</p>
<p><img src="http://xfigue.milaweb.com/assets/51otttrGWaL.jpg" alt="51otttrGWaL" width="381" height="500" class="alignnone size-full wp-image-197" /></p>
<p>Para los que estén familiarizados con el patrón MVC no les sera complicado entender como funciona este framework. La manera que decidieron implementar la declaración de controllers en el html me pareció muy buena, es posible tener varios controllers por pagina y a su vez, estos controllers pertenecen a módulos.</p>
<p>Pero veamos algunos ejemplos de código.</p>
<pre class="brush: jscript; title: ; notranslate">&lt;html ng-app&gt;
	&lt;head&gt;
		&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js&quot;&gt;&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div ng-controller=&quot;HelloController&quot;&gt;
			&lt;p&gt;{{helloObj.text}}&lt;/p&gt;
		&lt;/div&gt;
		&lt;script&gt;
			function HelloController($scope, $location){
				$scope.helloObj = { text: &quot;Hello World!&quot; };
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Este seria nuestro ejemplo base, el famoso Hello World de Angular.js. Veamos en detalle que hace. El atributo ng-app del tag html indica que esta pagina sera administrada por Angular.JS. Un poco mas abajo, en la linea 6 comunicamos al framework que ese div sera manejado por el controlador HelloController. Abajo con {{}} hacemos el data binding y en la linea 10 definimos nuestro controlador que recibe $scope, que vendría a ser nuestro punto de conexión entra el controlador y la vista.</p>
<p>Veamos un ejemplo un poco mas complejo:</p>
<pre class="brush: jscript; title: ; notranslate">&lt;html ng-app&gt;
	&lt;head&gt;
		&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js&quot;&gt;&lt;/script&gt;
		&lt;title&gt;Agenda&lt;/title&gt;
	&lt;/head&gt;
	&lt;body ng-controller=&quot;AgendaController&quot;&gt;
		&lt;h1&gt;Agenda&lt;/h1&gt;
		&lt;table&gt;
			&lt;tr&gt;
				&lt;td&gt;FirstName&lt;/td&gt;
				&lt;td&gt;LastName&lt;/td&gt;
				&lt;td&gt;Phone&lt;/td&gt;
				&lt;td&gt;Action&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr ng-repeat=&quot;item in items&quot;&gt;
				&lt;td&gt;{{item.firstname}}&lt;/td&gt;
				&lt;td&gt;{{item.lastname}}&lt;/td&gt;
				&lt;td&gt;{{item.phone}}&lt;/td&gt;
				&lt;td&gt;&lt;button ng-click=&quot;remove($index)&quot;&gt;Remove&lt;/button&gt;&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;
		&lt;script&gt;
			function AgendaController($scope){
				$scope.items = [
					{ firstname: &quot;Juan&quot;, lastname: &quot;Flores&quot;, phone: &quot;443-21234&quot; },
					{ firstname: &quot;Pedro&quot;, lastname: &quot;Ramirez&quot;, phone: &quot;551-01010&quot; },
					{ firstname: &quot;Horacio&quot;, lastname: &quot;Tevez&quot;, phone: &quot;643-22312&quot; },
					{ firstname: &quot;Esther&quot;, lastname: &quot;Clom&quot;, phone: &quot;231-11111&quot; },
					{ firstname: &quot;Nelson&quot;, lastname: &quot;Haha&quot;, phone: &quot;111-43245&quot; },
					{ firstname: &quot;Jack&quot;, lastname: &quot;Fuentes&quot;, phone: &quot;123-12123&quot; },
					{ firstname: &quot;Monchito&quot;, lastname: &quot;Merlo&quot;, phone: &quot;112-3323&quot; }
				];

				$scope.remove = function(index) {
					$scope.items.splice(index, 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Y en el navegador veremos esto:</p>
<p><img src="http://xfigue.milaweb.com/assets/aggendjs.png" alt="" width="365" height="289" class="size-full wp-image-187" /></p>
<p>Con ng-repeat solicitamos al framework que repita el tag por cada elemento de array Items. En la linea 19 es donde creamos el botón, utilizamos la propiedad ng-click para indicar que función se ejecutara al hacer click, en este caso borramos el item del array.</p>
<p>Otra característica interesante de este framework es que soporta inyección de dependencias, esto hace que nuestros componentes sean fácilmente testeables.<br />
En Angular.js podemos crear servicios para luego poder ser injectados en nuestros controladores. El framework viene por defecto con algunos servicios, por ejemplo $Provider con el que podemos registrar nuestros servicios fácilmente, como se ve en el siguiente ejemplo.</p>
<pre class="brush: jscript; title: ; notranslate">
app.config(function($provide) {
  $provide.provider('greeting', function() {
    this.$get = function() {
      return function(name) {
        alert(&quot;Hello, &quot; + name);
      };
    };
  });
});
</pre>
<p>Otra forma de registrar servicios es por medio de la función factory, mas abajo vemos un ejemplo completo.</p>
<pre class="brush: jscript; title: ; notranslate">&lt;html ng-app=&quot;angularApp&quot;&gt;
	&lt;head&gt;
		&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js&quot;&gt;&lt;/script&gt;
		&lt;title&gt;AngularJS Services Example&lt;/title&gt;
	&lt;/head&gt;
	&lt;body ng-controller=&quot;NgController&quot;&gt;
		&lt;h1&gt;AngularJS Services Example&lt;/h1&gt;
		&lt;ul ng-repeat=&quot;item in items&quot;&gt;
			&lt;li&gt;
				{{item.value}}
			&lt;/li&gt;
		&lt;/ul&gt;
		&lt;script&gt;
			var angularAppModule = angular.module('angularApp', []);

			angularAppModule.factory(&quot;Items&quot;, function(){
				var items = {};

				items.getAll = function(){
					return [
						{ value: 0 },
						{ value: 2 },
						{ value: 4 },
						{ value: 6 },
						{ value: 8 },
						{ value: 10 },
						{ value: 12 },
						{ value: 14 }
					];
				};

				return items;
			});

			angularAppModule.controller('NgController',
					function($scope, Items){
						$scope.items = Items.getAll();
					}					
				);
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Sin lugar a dudas este framework promete mucho, lamentablemente esta en sus comienzos y faltan muchas cosas por hacer. Por ejemplo no existen grids comparables a DataTables compatibles con Angular.js. Con la ayuda de este framework podemos hacer aplicaciones js mas modularizadas y testeables. Uno de los puntos fuertes de Angular.JS es su compatibilidad con test unitarios permitiéndonos testear nuestros controladores, servicios y vistas.</p>
<p>Si quieren ver mas ejemplos de código con Angular.js, subi algunos en mi repositorio en github <a href="https://github.com/xfigue/angularjs-examples">angularjs-examples</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/mi-opinion-sobre-angular-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemas al reiniciar el servicio MongoDB en Debian</title>
		<link>http://xfigue.milaweb.com/problemas-al-reiniciar-el-servicio-mongodb-en-debian/</link>
		<comments>http://xfigue.milaweb.com/problemas-al-reiniciar-el-servicio-mongodb-en-debian/#comments</comments>
		<pubDate>Mon, 10 Feb 2014 04:55:57 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=168</guid>
		<description><![CDATA[Generalmente luego de un apagón donde el sistema se apaga sin hacer el shutdown correspondiente quedan algunos archivos lockeados y algunas bases de datos pueden quedarse corruptas. logs: Esto me pasó con una db de mongodb, no había forma de &#8230; <a href="http://xfigue.milaweb.com/problemas-al-reiniciar-el-servicio-mongodb-en-debian/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>Generalmente luego de un apagón donde el sistema se apaga sin hacer el shutdown correspondiente quedan algunos archivos lockeados y algunas bases de datos pueden quedarse corruptas.</p>
<p><b>logs:</b></p>
<pre class="brush: bash; title: ; notranslate">
Sun Feb  9 23:16:17.935 [initandlisten] allocator: system
Sun Feb  9 23:16:17.935 [initandlisten] options: { repair: true }
Sun Feb  9 23:16:17.935 [initandlisten] exception in initAndListen: 10296
***********************************************
 ERROR: dbpath (/data/db/) does not exist.
 Create this directory or give existing directory in --dbpath.
 See http://dochub.mongodb.org/core/startingandstoppingmongo
***********************************************
, terminating
</pre>
<p>Esto me pasó con una db de mongodb, no había forma de reiniciar. Pero con los siguientes comandos pude reiniciar el servicio sin problemas.</p>
<pre class="brush: bash; title: ; notranslate">
rm /var/lib/mongodb/mongod.lock
mongod --repair
service mongodb start
</pre>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/problemas-al-reiniciar-el-servicio-mongodb-en-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kubuntu &#8211; eth0 con problemas de conexión</title>
		<link>http://xfigue.milaweb.com/kubuntu-eth0-con-problemas-de-conexion/</link>
		<comments>http://xfigue.milaweb.com/kubuntu-eth0-con-problemas-de-conexion/#comments</comments>
		<pubDate>Sat, 28 Sep 2013 06:16:25 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kubuntu]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=150</guid>
		<description><![CDATA[En estos días estuve experimentando algunos problemas de red en Ubuntu. El problema era que después de un determinado tiempo de uso de la red empezaban unos cortes de red por algunos segundos, estos cortes eran aleatorios y ocurrían bastante &#8230; <a href="http://xfigue.milaweb.com/kubuntu-eth0-con-problemas-de-conexion/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>En estos días estuve experimentando algunos problemas de red en Ubuntu. El problema era que después de un determinado tiempo de uso de la red empezaban unos cortes de red por algunos segundos, estos cortes eran aleatorios y ocurrían bastante seguido.</p>
<p>Luego de investigar los Logs y leer un poco por internet pude darme cuenta que estas fallas de red se producían por el Router y no por mi maquina. Estos problemas surgen porque el router por algun motivo no puede procesar todo el ancho de banda de la tarjeta.</p>
<p><strong>Logs:</strong></p>
<pre class="brush: bash; title: ; notranslate">Sep 28 02:26:58 Fabian-PC NetworkManager[1090]: info (eth0): carrier now OFF (device state 100, deferring action for 4 seconds)
Sep 28 02:26:58 Fabian-PC NetworkManager[1090]: info (eth0): carrier now ON (device state 100)
Sep 28 02:26:58 Fabian-PC kernel: [16679.404000] atl1c 0000:03:00.0: irq 44 for MSI/MSI-X
Sep 28 02:26:58 Fabian-PC kernel: [16679.404117] atl1c 0000:03:00.0: atl1c: eth0 NIC Link is Up&amp;lt;100 Mbps Full Duplex
Sep 28 02:44:49 Fabian-PC kernel: [17747.076316] atl1c 0000:03:00.0: atl1c: eth0 NIC Link is Up&amp;lt;10 Mbps Full Duplex</pre>
<p>Una solución simple y drástica es setear nuestra tarjeta de red a 10MB (mi tarjeta es de 100MB), para realizar esto necesitamos correr el siguiente comando.</p>
<pre class="brush: bash; title: ; notranslate">sudo ethtool -s eth0 speed 10 duplex full autoneg off</pre>
<p>Y listo! Problema solucionado.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/kubuntu-eth0-con-problemas-de-conexion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad en SSH con autenticación (PublicKey) en Servers Linux</title>
		<link>http://xfigue.milaweb.com/seguridad-en-ssh-con-autenticacion-publickey-en-servers-linux/</link>
		<comments>http://xfigue.milaweb.com/seguridad-en-ssh-con-autenticacion-publickey-en-servers-linux/#comments</comments>
		<pubDate>Sun, 15 Sep 2013 05:10:37 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=138</guid>
		<description><![CDATA[El protocolo SSH es el mas recomendado para el acceso remoto a servidores. Para mejorar la seguridad en el server y también para el propio usuario se utilizan unas llaves encriptadas. Se trata de un par de llaves (siempre son &#8230; <a href="http://xfigue.milaweb.com/seguridad-en-ssh-con-autenticacion-publickey-en-servers-linux/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-139 alignright" alt="" src="http://xfigue.com.ar/assets/ssh37op.jpg" width="320" height="188" />El protocolo SSH es el mas recomendado para el acceso remoto a servidores. Para mejorar la seguridad en el server y también para el propio usuario se utilizan unas llaves encriptadas. Se trata de un par de llaves (siempre son pares), una llave publica y otra privada.</p>
<p>La clave privada esta en poder del usuario y la llave publica puede ser compartida en los distintos servers SSH donde quieran acceder. (Ver imagen.)</p>
<p><strong>Generación de llaves SSH</strong></p>
<p>Primero deberemos generar nuestro par de llaves SSH.</p>
<p>(Si el directorio ~/.ssh/ no existe, deberás crearlo.)</p>
<pre class="brush: bash; title: ; notranslate">
cd ~/.ssh/
ssh-keygen -t rsa
</pre>
<p>Este comando dará inicio a un pequeño asistente que realizara algunas preguntas, si deseamos que las claves no posean password podemos dejar en blanco la pregunta “Enter passphrase”.</p>
<pre class="brush: bash; title: ; notranslate">
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
be:12:11:e3:2a:dc:a6:a6:7e:e9:5c:2b:1f:12:23:40 root@
The key’s randomart image is:
+–[ RSA 2048]—-+
| o |
| . o |
| E o |
| . . + |
| . S o |
| . o = |
| . *.o |
| =+o.o . |
| .o+=o .o |
+—————–+
</pre>
<p>Al finalizar este asistente estarán generadas nuestro par de llaves en ~/.ssh/.</p>
<pre class="brush: bash; title: ; notranslate">
ls
~/.ssh/id_rsa.pub
~/.ssh/id_rsa
</pre>
<p><strong>Copiando clave publica al servidor SSH</strong></p>
<p>Una vez que tengamos nuestras claves generadas necesitamos subir nuestra clave publica al servidor SSH al que queremos acceder. Es necesario tener acceso root a este servidor, en caso que no tengamos acceso root deberemos enviarle el archivo .pub al usuario administrador del servidor para que el haga esta tarea.</p>
<p>Para copiar nuestra clave publica al servidor deberemos correr el siguiente comando:</p>
<pre class="brush: bash; title: ; notranslate">
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.1.152
</pre>
<p>Este comando copiara nuestra clave publica al archivo ~/.ssh/authorized_keys en el servidor remoto 192.168.1.152.</p>
<p><strong>Testeando nuestras llaves</strong></p>
<p>Ahora solo deberemos probar que todo se haya concluido correctamente iniciando una seccion ssh en el servidor remoto.</p>
<pre class="brush: bash; title: ; notranslate">
ssh root@192.168.1.152
</pre>
<p>En teoria nos deberiamos conectar al server SSH utilizando nuestra llave privada.</p>
<p><strong>Deshabilitar acceso SSH con passwords en el server</strong></p>
<p>Si tenemos acceso al server remoto y queremos deshabilitar los accesos a SSH con password, permitiendo solamente acceso utilizando claves publicas deberemos deberemos hacer lo siguiente.</p>
<pre class="brush: bash; title: ; notranslate">
vim /etc/ssh/sshd_config
</pre>
<p>Buscamos el texto AuthorizedKeysFile y la descomentamos.<br />
Luego buscamos el texto RSAAuthentication y asignamos &#8220;no&#8221;.</p>
<pre class="brush: bash; title: ; notranslate">
RSAAuthentication no
AuthorizedKeysFile      %h/.ssh/authorized_keys
</pre>
<p>Luego reiniciamos el servicio.</p>
<pre class="brush: bash; title: ; notranslate">
service sshd restart
</pre>
<p><strong>Requerimientos de seguridad en carpeta .ssh</strong></p>
<p>OpenSSH requiere permisos específicos en la carpeta .ssh, estos permisos protegen la carpeta y sus archivos evitando el acceso a otros usuarios.</p>
<pre class="brush: bash; title: ; notranslate">
cd
chmod 700 .ssh
cd .ssh
chmod 600 authorized_keys
</pre>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/seguridad-en-ssh-con-autenticacion-publickey-en-servers-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NHIbernate 3.2 &#8211; Mapeando por código</title>
		<link>http://xfigue.milaweb.com/nhibernate-3-2-mapeando-por-codigo/</link>
		<comments>http://xfigue.milaweb.com/nhibernate-3-2-mapeando-por-codigo/#comments</comments>
		<pubDate>Mon, 21 May 2012 01:39:16 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DotNet]]></category>
		<category><![CDATA[NHIbernate]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=61</guid>
		<description><![CDATA[Una de las cosas que no me gustaba de NHIbernate era hacer los mappings a mano en formato XML, es tedioso y siempre lo intento evitar. Por suerte con la versión 3.2 de NHIbernate introdujo una herramienta para mapear por &#8230; <a href="http://xfigue.milaweb.com/nhibernate-3-2-mapeando-por-codigo/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>Una de las cosas que no me gustaba de NHIbernate era hacer los mappings a mano en formato XML, es tedioso y siempre lo intento evitar.<br />
Por suerte con la versión 3.2 de NHIbernate introdujo una herramienta para mapear por código, esta herramienta al principio se llamaba ConfORM y luego los desarrolladores decidieron incluirla en el core del Framework.</p>
<p>Ahora les mostraré como mapear un pequeño conjunto de clases y generar el esquema de la base de datos.</p>
<p><strong>Referencias:</strong><br />
Antes que nada necesitamos agregar un par de referencias a nuestro proyecto para trabajar con NHIbernate utilizando la herramienta NuGet.</p>
<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-1.jpg"><img class="alignnone size-full wp-image-62" title="" src="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-1.jpg" alt="" width="431" height="269" /></a></p>
<p>Luego buscaremos la palabra &#8220;NHIbernate&#8221;, después presionamos &#8220;Install&#8221; en el primer ítem del resultado de la búsqueda.</p>
<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-2.png"><img class="alignnone size-full wp-image-63" title="" src="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-2.png" alt="" width="879" height="558" /></a></p>
<p>Luego podremos observar que las dlls ya estan en la listas de referencias.</p>
<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-3.png"><img class="alignnone size-full wp-image-64" title="" src="http://xfigue.com.ar/wp-content/uploads/2012/05/nhibernate-3.png" alt="" width="271" height="260" /></a></p>
<p><strong>El modelo:</strong></p>
<p>El modelo tiene 3 clases que representa a un pequeño (ultra pequeño)  sistema de blog.</p>
<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/05/nhiber-model.png"><img class="alignnone size-full wp-image-65" title="" src="http://xfigue.com.ar/wp-content/uploads/2012/05/nhiber-model.png" alt="" width="649" height="384" /></a></p>
<p>Entidades en C#</p>
<pre class="brush: csharp; title: ; notranslate">
public class Entrada
{
	public virtual int Id { get; set; }
	public virtual string Titulo { get; set; }
	public virtual string Cuerpo { get; set; }
	public virtual Usuario Usuario { get; set; }
	public virtual IList Etiquetas { get; set; }
}
public class Etiqueta
{
	public virtual int Id { get; set; }
	public virtual string Nombre { get; set; }
}
public class Usuario
{
	public virtual int Id { get; set; }
	public virtual string Nombre { get; set; }
	public virtual string Password { get; set; }
	public virtual IList Entradas { get; set; }
}
</pre>
<p><strong>Configuración NHibernate:<br />
</strong><br />
En la clase <strong>Configuration</strong> de NHIbernate podemos especificar la conexión de la base de datos que utilizaremos, en este caso vamos a usar Sql Server.</p>
<pre class="brush: csharp; title: ; notranslate">
var configuration = new Configuration();

configuration.DataBaseIntegration(db =&gt;
{
	db.ConnectionProvider&lt;DriverConnectionProvider&gt;();
	db.Dialect&lt;MsSql2005Dialect&gt;();
	db.Driver&lt;SqlClientDriver&gt;();
	db.ConnectionString = @&quot;Server=.\SQLEXPRESS;Database=nhtest;User=sqluser;Password=sqluser;&quot;;
	db.BatchSize = 30;
	db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
	db.Timeout = 10;
	db.LogFormattedSql = true;
	db.LogSqlInConsole = false;
	db.HqlToSqlSubstitutions = &quot;true 1, false 0, yes 'Y', no 'N'&quot;;
});
</pre>
<p><strong>Los mappings:</strong></p>
<pre class="brush: csharp; title: ; notranslate">
public class UserMap : ClassMapping&lt;Usuario&gt;
{
	public UserMap()
	{
		Id(x =&gt; x.Id, map =&gt; map.Generator(Generators.HighLow,
			                                gmap =&gt; gmap.Params(new { max_low = 100 })));
		Property(x =&gt; x.Nombre, map =&gt; map.NotNullable(true));
		Property(x =&gt; x.Password, map =&gt; map.NotNullable(true));

		Bag(p =&gt; p.Entradas, map =&gt;
			                    {
			                     	map.Key(k =&gt; k.Column(&quot;UsuarioId&quot;));
			                     	map.Table(&quot;UsuarioEntradas&quot;);
			                     	map.Inverse(true);

			                    }, rel =&gt; rel.ManyToMany(x =&gt; x.Column(&quot;EntradaId&quot;)));

	}
}
public class EtiquetaMap : ClassMapping&lt;Etiqueta&gt;
{
	public EtiquetaMap()
	{
		Id(x =&gt; x.Id, map =&gt; map.Generator(Generators.HighLow,
			                                gmap =&gt; gmap.Params(new { max_low = 100 })));
	}
}
public class EntradaMap : ClassMapping&lt;Entrada&gt;
{
	public EntradaMap()
	{
		Id(x =&gt; x.Id, map =&gt; map.Generator(Generators.HighLow,
			                                gmap =&gt; gmap.Params(new { max_low = 100 })));
		ManyToOne(p =&gt; p.Usuario, map =&gt; map.Column(&quot;UsuarioId&quot;));

		Bag(p =&gt; p.Etiquetas, map =&gt;
			                    {
			                      	map.Key(k =&gt; k.Column(&quot;EntradaId&quot;));
			                      	map.Table(&quot;EntradaEtiquetas&quot;);
			                      	map.Inverse(true);

			                    }, rel =&gt; rel.ManyToMany(x =&gt; x.Column(&quot;EtiquetaId&quot;)));
	}
}
</pre>
<p>Por ultimo necesitamos agregar estos mappings a la configuración de NHIbernate y generar el esquema.</p>
<pre class="brush: csharp; title: ; notranslate">
var mapper = new ConventionModelMapper();
var mappings = new[]
			    {
			        typeof(UserMap),
					typeof(EtiquetaMap),
					typeof(EntradaMap),
			    };
mapper.AddMappings(mappings);

configuration.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
new SchemaExport(configuration).Execute(false, true, false);
</pre>
<p>Con todo esto, NHIbernate tiene los mappings y genero automáticamente todas las tablas necesarias en la base de datos como se puede observar en el siguiente esquema.<br />
<a href="http://xfigue.com.ar/wp-content/uploads/2012/05/nhiber-sql-23.png"><img class="alignnone size-full wp-image-70" title="" src="http://xfigue.com.ar/wp-content/uploads/2012/05/nhiber-sql-23.png" alt="" width="840" height="541" /></a><br />
Si quieres ver el código fuente de este ejemplo puedes entrar a mi repositorio: <a href="https://bitbucket.org/xfigue/nhibernatetests/src">https://bitbucket.org/xfigue/nhibernatetests/src</a></p>
<p>También hice un video tutorial con todos estos pasos:</p>
<p><iframe width="853" height="480" src="http://www.youtube.com/embed/tJ49yXWXwow" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/nhibernate-3-2-mapeando-por-codigo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalación de Redis en Linux Centos</title>
		<link>http://xfigue.milaweb.com/instalacion-de-redis-en-linux-centos/</link>
		<comments>http://xfigue.milaweb.com/instalacion-de-redis-en-linux-centos/#comments</comments>
		<pubDate>Tue, 08 May 2012 02:36:07 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Redis]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=58</guid>
		<description><![CDATA[Si estas intentando compilar redis en Linux Centos de 32 bits es probable que obtengas algunos errores, para solucionar esto es necesario editar el archivo src/.make-settings. Ahora descargamos el código fuente de Redis y compilamos Creamos las carpetas necesarias para &#8230; <a href="http://xfigue.milaweb.com/instalacion-de-redis-en-linux-centos/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>Si estas intentando compilar redis en Linux Centos de 32 bits es probable que obtengas algunos errores, para solucionar esto es necesario editar el archivo src/.make-settings.</p>
<pre class="brush: bash; title: ; notranslate">
nano src/.make-settings
## Modificar la variable OPT asi.
OPT=-O2 -march=i686
</pre>
<p>Ahora descargamos el código fuente de Redis y compilamos</p>
<pre class="brush: bash; title: ; notranslate">
cd /usr/src
wget  http://redis.googlecode.com/files/redis-2.6.0-rc3.tar.gz
tar -xvf redis-2.6.0-rc3.tar.gz
cd redis-2.6.0-rc3
make &amp;&amp; make install
</pre>
<p>Creamos las carpetas necesarias para Redis y el archivo de configuración.</p>
<pre class="brush: bash; title: ; notranslate">
mkdir /etc/redis /var/lib/redis
sed -e &quot;s/^daemonize no$/daemonize yes/&quot; -e &quot;s/^dir \.\//dir \/var\/lib\/redis\//&quot; -e &quot;s/^loglevel debug$/loglevel notice/&quot; -e &quot;s/^logfile stdout$/logfile \/var\/log\/redis.log/&quot; redis.conf &gt; /etc/redis/redis.conf
</pre>
<p>Y por ultimo instalamos el servicio.</p>
<pre class="brush: bash; title: ; notranslate">
wget https://raw.github.com/gist/257849/9f1e627e0b7dbe68882fa2b7bdb1b2b263522004/redis-server
sed -i &quot;s/usr\/local\/sbin\/redis/usr\/local\/bin\/redis/&quot; redis-server
chmod u+x redis-server
mv redis-server /etc/init.d
/sbin/chkconfig --add redis-server
/sbin/chkconfig --level 345 redis-server on
/sbin/service redis-server start
</pre>
<p>Fuente: <a href="http://www.ebrueggeman.com/blog/install-redis-centos-56">http://www.ebrueggeman.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/instalacion-de-redis-en-linux-centos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Closure y Scope</title>
		<link>http://xfigue.milaweb.com/closure-y-scope/</link>
		<comments>http://xfigue.milaweb.com/closure-y-scope/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 18:35:29 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DotNet]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=54</guid>
		<description><![CDATA[Esta mañana aproveché que tenia unas horillas libres para leer algo sobre Closure. En pocas palabras.. Los closure son porciones de código que pueden ser pasados como argumento a una función. Esto en C# es ampliamente soportado gracias a los &#8230; <a href="http://xfigue.milaweb.com/closure-y-scope/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>Esta mañana aproveché que tenia unas horillas libres para leer algo sobre <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Closure</a>. </p>
<p>En pocas palabras.. Los closure son porciones de código que pueden ser pasados como argumento a una función. Esto en C# es ampliamente soportado gracias a los delegados y las lambda expressions.</p>
<p>Un ejemplo clásico de Closure es crear una función dentro de otra, y lo mas importante es que la función que esta dentro puede acceder a las variables que están en la función contenedora.</p>
<p>Otra cosa muy importante es que las variables de la función contenedora mantiene el estado aunque esta función se haya terminado. </p>
<p>Para que quede mas claro les muestro un ejemplo simple de Closure:</p>
<pre class="brush: csharp; title: ; notranslate">
static void Main(string[] args)
{
	var func = SumarFunc();

	Console.WriteLine(func(1));
	Console.WriteLine(func(2));
	Console.WriteLine(func(3));
	Console.ReadKey();

}

public static Func&lt;int, int&gt; SumarFunc()
{
	var a = 1;
	return delegate(int b)
			{
				a = a + 1;
				return a + b;
			};
}
</pre>
<p>Y esto es la salida en consola:</p>
<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/04/closuer23.jpg"><img src="http://xfigue.com.ar/wp-content/uploads/2012/04/closuer23.jpg" alt="" title="Closure" width="386" height="166" class="alignnone size-full wp-image-55" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/closure-y-scope/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalación de MONO desde el repositorio</title>
		<link>http://xfigue.milaweb.com/instalacion-de-mono-desde-el-repositorio/</link>
		<comments>http://xfigue.milaweb.com/instalacion-de-mono-desde-el-repositorio/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 22:13:53 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DotNet]]></category>
		<category><![CDATA[MONO]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=42</guid>
		<description><![CDATA[Instalación de MONO Instalación de XSP Para poner en marcha fastcgi mono: (De este modo arrancamos manualmente, si queres evitar esto y que lo haga automáticamente, deberías incluir este comando en /etc/rc.local) Configuración MONO con NGINX http://quepagina.es/linux/aspnet-en-linux-nginx-mono-xsp.html Scripts de instalacion &#8230; <a href="http://xfigue.milaweb.com/instalacion-de-mono-desde-el-repositorio/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p><strong>Instalación de MONO</strong></p>
<pre class="brush: bash; title: ; notranslate">
cd /usr/src
git clone git://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=/usr/local
make
make install
</pre>
<p><strong>Instalación de XSP</strong></p>
<pre class="brush: bash; title: ; notranslate">
cd /usr/src
git clone git://github.com/mono/xsp.git
cd xsp
git checkout 2.10.2
 ./configure --prefix=/usr/local --with-runtime=/usr/local/bin/mono
make
make install
</pre>
<p><strong>Para poner en marcha fastcgi mono:</strong></p>
<pre class="brush: bash; title: ; notranslate">
fastcgi-mono-server4 /applications=/:/var/www/asptest /socket=tcp:127.0.0.1:9002 &amp;
</pre>
<p>(De este modo arrancamos manualmente, si queres evitar esto y que lo haga automáticamente, deberías incluir este comando en /etc/rc.local)</p>
<p><strong>Configuración MONO con NGINX</strong></p>
<p><a href="http://quepagina.es/linux/aspnet-en-linux-nginx-mono-xsp.html">http://quepagina.es/linux/aspnet-en-linux-nginx-mono-xsp.html</a></p>
<p><strong>Scripts de instalacion (GitHub)</strong></p>
<p><a href="https://github.com/nathanb/iws-snippets/tree/master/mono-install-scripts">iws-snippets</a></p>
<p>(Si corres estos scripts quizás sea necesario que agregues a mano el path del mono en la variable $PATH)</p>
<pre class="brush: bash; title: ; notranslate">
## incluir estas lineas en .bash_profile
export PATH=/opt/mono-2.11/bin:$PATH
export PKG_CONFIG_PATH=/opt/mono-2.11/lib/pkgconfig:$PKG_CONFIG_PATH
export MANPATH=/opt/mono-2.11/share/man:$MANPATH
export LD_LIBRARY_PATH=/opt/mono-2.11/lib:$LD_LIBRARY_PATH
#Debug mode
export MONO_OPTIONS=&quot;--debug&quot;
</pre>
<p>Video tutorial:</p>
<p><iframe width="853" height="480" src="http://www.youtube.com/embed/fK99ZSNJJGE" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/instalacion-de-mono-desde-el-repositorio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monitoreando NGINX con Nodejs</title>
		<link>http://xfigue.milaweb.com/monitoreando-nginx-con-nodejs/</link>
		<comments>http://xfigue.milaweb.com/monitoreando-nginx-con-nodejs/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 09:27:55 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Nodejs]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=36</guid>
		<description><![CDATA[Hace unos meses en Genwise, empresa en donde trabajo, lanzaron un desafio al equipo, que consistía en crear un pequeño monitor para una aplicación que desarrolla la empresa. Este desafio era personal, a cada programador se le daba como meta &#8230; <a href="http://xfigue.milaweb.com/monitoreando-nginx-con-nodejs/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://xfigue.com.ar/wp-content/uploads/2012/01/nginx.jpg"><img title="Nginx" src="http://xfigue.com.ar/wp-content/uploads/2012/01/nginx.jpg" alt="" width="550" height="288" /></a></p>
<p>Hace unos meses en <a href="http://www.genwise.com/">Genwise</a>, empresa en donde trabajo, lanzaron un desafio al equipo, que consistía en crear un pequeño monitor para una aplicación que desarrolla la empresa. Este desafio era personal, a cada programador se le daba como meta desarrollar una aplicación de monitoreo con una serie de especificaciones sobre las tecnologías a utilizar.</p>
<p>A mí me tocó desarrollar con <strong>PhoneGap</strong> para Android (utilizando librerías Jquery y Jquery Mobile). En ese momento se me ocurrió que quizás sería importante realizar una aplicación de monitoreo en tiempo real. Pero luego de discutirlo con el equipo, llegamos a la conclusión de que utilizar tecnologías como websockets no resultaban necesarias.</p>
<p>Y como desde hace un tiempo, vengo leyendo sobre <a href="http://nodejs.org/">nodejs</a>, quise crear algo similar al monitor de Genwise pero para <a href="http://nginx.org/">nginx</a> (un server web para linux).</p>
<p>Decidí llamar a la aplicación <strong>Nginx Monitoring Tool</strong> que, por supuesto, <a href="https://bitbucket.org/xfigue/nginx-monitor">es open source</a>.</p>
<p>Básicamente -como ya les comente- su principal tarea será monitorear en tiempo real un server nginx.</p>
<p><strong>¿Qué debemos monitorear?</strong></p>
<p>La idea es monitorear un server web Nginx, y para esto deberemos habilitar la opción de status que se hace de la siguiente manera.</p>
<pre class="brush: bash; title: ; notranslate">
location /nginx_status {
  stub_status  on;
  access_log   off;
  allow SOME.IP.ADD.RESS;
  deny all;
}
</pre>
<p><strong>Faye para el server</strong></p>
<p>Primero debía crear el server <a href="http://faye.jcoglan.com/">Faye</a>, en donde pueda implementar los distintos canales de monitoreo. Crear un server FAYE en nodejs es muy fácil. Miren estas líneas.</p>
<pre class="brush: jscript; title: ; notranslate">
var Faye = require('faye'),
jsdom = require('jsdom'),
server = new Faye.NodeAdapter({mount: '/'});

server.listen(1337, &quot;localhost&quot;);

console.log(&quot;Server faye corriendo...&quot;);
</pre>
<p>Con eso ya tenemos un server faye corriendo en el puerto 1337, pero esto no es todo. Debemos crear los distintos canales de monitoreo (visitas, lecturas, esperas, etc.) que veremos más adelante. También vamos a obtener los fuentes del status de nginx y realizar un pequeño &#8220;parseo&#8221;.</p>
<pre class="brush: jscript; title: ; notranslate">
setInterval(sendData, 3000);

function sendData(){
        jsdom.env(
                &quot;http://localhost/nginx_status&quot;,
                [ 'http://code.jquery.com/jquery-1.5.min.js' ],
                function (errors, window){
                        var $ = window.jQuery;

                        var lines = $('body').text().split(&quot;\n&quot;);

                        //visits (active connections)
                        var visitsPieces = lines[0].split(&quot; &quot;);
                        var visits = visitsPieces[visitsPieces.length - 2];

                        server.getClient().publish('/act', {
                          text:       visits
                        });
                        //

                        var lastLinePieces = lines[3].split(&quot; &quot;);

                        //Readings
                        var readings = lastLinePieces[1];

                        server.getClient().publish('/rea', {
                          text:       readings
                        });

                        //Writing
                        var writing = lastLinePieces[3];

                        server.getClient().publish('/wri', {
                          text:       writing
                        });

                        //Wainting
                        var waiting = lastLinePieces[5];

                        server.getClient().publish('/wai', {
                          text:       waiting
                        });

                }
        );
}
</pre>
<p><strong>El cliente</strong></p>
<p>Los datos obtenidos del server lo representaremos en forma de gráficos estadísticos, usando una librería javascript muy utilizada llamada jqplot.</p>
<p>También necesitaremos la librería browser de Faye para poder inscribirnos a los distintos canales de monitoreo. Ver codigo completo del archivo <a href="https://bitbucket.org/xfigue/nginx-monitor/src/d84642bc9fc0/client.js">client.js</a></p>
<p><strong>Conclusión:</strong></p>
<p>Si bien existen muchas cosas por solucionar y mejorar en Nginx Monitoring Tool. Podemos decir que se encuentra en una fase pre-alpha ;). Nunca pensé que diría esto, pero JS me está gustando mucho. Y todo gracias a nodejs <img src="http://xfigue.milaweb.com/wp-includes/images/smilies/icon_razz.gif" alt=":P" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/monitoreando-nginx-con-nodejs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como actualizar TAR en Centos 5.7</title>
		<link>http://xfigue.milaweb.com/como-actualizar-tar-en-centos-5-7/</link>
		<comments>http://xfigue.milaweb.com/como-actualizar-tar-en-centos-5-7/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 14:40:35 +0000</pubDate>
		<dc:creator><![CDATA[Fabián Figueredo]]></dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://xfigue.com.ar/?p=32</guid>
		<description><![CDATA[Hoy cuando quería instalar socket.io utilizando el siguiente comando&#8230; .. solo obtenía un error y es porque Centos 2.7 tiene una versión vieja de la aplicación TAR (una del 2004!). Bueno, para solucionar esto hay que actualizar TAR. Estos son &#8230; <a href="http://xfigue.milaweb.com/como-actualizar-tar-en-centos-5-7/">Continuado</a>]]></description>
				<content:encoded><![CDATA[<p>Hoy cuando quería instalar socket.io utilizando el siguiente comando&#8230;</p>
<pre class="brush: bash; title: ; notranslate">
npm install socket.io
</pre>
<p>.. solo obtenía un error y es porque Centos 2.7 tiene una versión vieja de la aplicación TAR (una del 2004!). Bueno, para solucionar esto hay que actualizar TAR.</p>
<p>Estos son los pasos necesarios para actualizar TAR.</p>
<pre class="brush: bash; title: ; notranslate">
wget http://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
gunzip tar-1.26.tar.gz
tar -xvf tar-1.26.tar
cd tar-1.26
./configure FORCE_UNSAFE_CONFIGURE=1
make
make install
cp -f src/tar /usr/local/bin/tar
</pre>
<p>Ahora el comando npm debería funcionar <img src="http://xfigue.milaweb.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://xfigue.milaweb.com/como-actualizar-tar-en-centos-5-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Database Caching using disk
Object Caching 618/641 objects using disk

 Served from: xfigue.milaweb.com @ 2014-04-14 02:14:16 by W3 Total Cache -->