<?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>(code segment)</title>
	<atom:link href="http://oldblog.ideseg.com/feed" rel="self" type="application/rss+xml" />
	<link>http://oldblog.ideseg.com</link>
	<description>se acabarón las espinacas</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:27:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PolarShow 0.70</title>
		<link>http://oldblog.ideseg.com/2010/polarshow-0-70</link>
		<comments>http://oldblog.ideseg.com/2010/polarshow-0-70#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:29:00 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[net]]></category>

		<guid isPermaLink="false">/post/PolarShow-070.aspx</guid>
		<description><![CDATA[Mi pequeño proyecto PolarShow ha tomado un poquito más de cuerpo, estoy ya en la versión 0.70 y prácticamente tiene ya todas las características que se pueden encontrar en polarpersonaltrainer.com En esta versión hay un calendario con un resumen semanal de las sesiones de entrenamiento También he ajustado algunos de los gráficos para que se [...]]]></description>
			<content:encoded><![CDATA[<p>Mi pequeño proyecto <strong>PolarShow </strong>ha tomado un poquito más de cuerpo, estoy ya en la versión 0.70 y prácticamente tiene ya todas las características que se pueden encontrar en polarpersonaltrainer.com</p>
<p>En esta versión hay un calendario con un resumen semanal de las sesiones de entrenamiento</p>
<p style="text-align: center;"><img src="http://oldblog.ideseg.com/content/polar_070_1.png" alt="" width="650" /></p>
<p>También he ajustado algunos de los gráficos para que se muestren más claramente, el gráfico de sesiones por defecto muestra las 10 últimas sesiones salvo que se seleccionen otras</p>
<p style="text-align: center;"><img src="http://oldblog.ideseg.com/content/polar_070_2.png" alt="" width="650" /></p>
<p>Una cosa interesante es la agregación, en el momento que hemos seleccionado un conjunto de sesiones podemos ver agregados los resultados, mostrando el total de Km, el total de entrenamiento y las medias de velocidad y pulsaciones,</p>
<p style="text-align: center;"><img src="http://oldblog.ideseg.com/content/polar_070_3.png" alt="" width="650" /></p>
<p>Las “Auto Laps” quedan agregadas de modo que podemos ver un gráfico completo por ejemplo de una semana completa.</p>
<p>Una cosa interesante es que ahora se pueden editar los archivos xml que hemos extraído del reloj pudiendo añadir notas, una clasificación de cómo te has sentido en el entrenamiento y una url (por ejemplo a GPSSies) con la ruta que has seguido.</p>
<p style="text-align: center;"><img src="http://oldblog.ideseg.com/content/polar_070_5.png" alt="" /></p>
<p>También como no he solucionado un montonazo de bugs…</p>
<p>Podeís descargar esta versión desde <a href="/software">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2010/polarshow-0-70/feed</wfw:commentRss>
		<slash:comments>523</slash:comments>
		</item>
		<item>
		<title>Fuzzy Logic y expresiones lambda</title>
		<link>http://oldblog.ideseg.com/2010/fuzzy-logic-y-expresiones-lambda</link>
		<comments>http://oldblog.ideseg.com/2010/fuzzy-logic-y-expresiones-lambda#comments</comments>
		<pubDate>Sat, 16 Jan 2010 01:33:00 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[net]]></category>

		<guid isPermaLink="false">/post/Fuzzy-Logic-y-expresiones-lambda.aspx</guid>
		<description><![CDATA[Para un proyecto que estoy realizando, he realizado una prueba de concepto probado a aplicar l&#243;gica difusa con el fin de realizar ciertas acciones a partir de una serie de datos imprecisos. A la hora de expresar las reglas encargadas de modelar nuestro sistema de l&#243;gica difusa, (IF-THEN) la mayor&#237;a de los sistemas que he [...]]]></description>
			<content:encoded><![CDATA[<p>Para un proyecto que estoy realizando, he realizado una prueba de concepto probado a aplicar l&oacute;gica difusa con el fin de realizar ciertas acciones a partir de una serie de datos imprecisos.</p>
<p>A la hora de expresar las reglas encargadas de modelar nuestro sistema de l&oacute;gica difusa, (IF-THEN) la mayor&iacute;a de los sistemas que he visto requer&iacute;an de un peque&ntilde;o y simple analizador sint&aacute;ctico para interpretar las reglas, en este punto me he preguntado si en vez de un analizador sint&aacute;ctico, podr&iacute;amos usar expresiones lambda y una interfaz fluida.</p>
<p><strong>FuzzySystem (improvisado)</strong></p>
<p>De modo que he construido un peque&ntilde;o motor de l&oacute;gica difusa que tiene la particularidad de usar expresiones lambda y una interfaz fluida para definir el conjunto de reglas.<br />Este peque&ntilde;o motor incorpora un par de funciones miembro, una de tipo Trapezoide y otra Triangular, b&aacute;sicamente su uso es el siguiente.<br />Definimos el sistema, a&ntilde;adimos las variables con sus estados y funciones miembro&hellip;</p>
<pre class="brush: c-sharp;">    public class FuzzyTest
    {
        private readonly FuzzySystem _engine = new FuzzySystem();

        public FuzzyTest()
        {
            FuzzyVariable varA = new FuzzyVariable("A");
            varA.Memberships.Add(new TrapezoidMembership("Cerrado", 0, 0, 5, 5));
            varA.Memberships.Add(new TrapezoidMembership("Medio", 4, 4, 6, 6));
            varA.Memberships.Add(new TrapezoidMembership("Abierto", 7, 7, 9, 9));
            _engine.Variables.Add(varA);

            FuzzyVariable varB = new FuzzyVariable("B");
            varB.Memberships.Add(new TrapezoidMembership("Cerrado", 0, 0, 5, 5));
            varB.Memberships.Add(new TrapezoidMembership("Medio", 4, 4, 6, 6));
            varB.Memberships.Add(new TrapezoidMembership("Abierto", 7, 7, 9, 9));
            _engine.Variables.Add(varB);

            FuzzyVariable varR = new FuzzyVariable("R");
            varR.Memberships.Add(new TrapezoidMembership("Frio", 0, 0, 3, 3));
            varR.Memberships.Add(new TrapezoidMembership("Templado", 3, 3, 6, 6));
            varR.Memberships.Add(new TrapezoidMembership("Caliente", 7, 7, 9, 9));
            _engine.Variables.Add(varR);</pre>
<p>&nbsp;</p>
<p><strong>La definici&oacute;n de reglas mediante expresiones Lambda</strong></p>
<p>El beneficio en este punto es que el sistema no requiere del analizador sint&aacute;ctico para evaluar las expresiones si no que ser&aacute; el CLR quien se encargue de ello.<br />Para llevar a cabo esta evaluaci&oacute;n de las reglas he definido una clase <em>FuzzyExpresion </em>que tiene definidos&nbsp; los operadores &amp;&amp; y || para as&iacute; como el true y el false para poder evaluar las reglas en consecuencia.</p>
<pre class="brush: c-sharp;">    public class FuzzyExpression
    {
        private readonly FuzzyVariable _variable;
        private string _state;
        private double? _value;

        public double Value
        {
            get
            {
                if (_value.HasValue)
                    return _value.Value;
                _value = _variable.Fuzzify(State);
                return _value.Value;
            }
        }

        public string State
        {
            get { return _state; }
        }

        public FuzzyExpression(FuzzySystem engine, string literal)
        {
            _variable = engine.Variables[literal];

            if (_variable == null)
            {
                throw new FuzzyException("variable not found.");
            }
        }

        public FuzzyExpression(double value)
        {
            _value = value;
        }

        public FuzzyExpression Is(string state)
        {
            _state = state;
            _value = _variable.Fuzzify(_state);
            return this;
        }

        public FuzzyExpression Set(string newState)
        {
            _state = newState;
            return this;
        }

        public static FuzzyExpression operator |(FuzzyExpression a, FuzzyExpression b)
        {
            return new FuzzyExpression(Math.Max(a.Value, b.Value));
        }

        public static FuzzyExpression operator &amp;(FuzzyExpression a, FuzzyExpression b)
        {
            return new FuzzyExpression(Math.Min(a.Value, b.Value));
        }

        public static bool operator false(FuzzyExpression a)
        {
            return 0 &gt; a.Value;
        }

        public static bool operator true(FuzzyExpression a)
        {
            return a.Value &gt; 0;
        }
    }</pre>
<p>&nbsp;</p>
<p>Las reglas en la l&oacute;gica difusa sirven para combinar las distintas proposiciones, no son reglas excesivamente complicadas, y son del tipo IF-THEN, b&aacute;sicamente hay 4 reglas (Implicaci&oacute;n Conjunci&oacute;n, Disyunci&oacute;n&nbsp; y negaci&oacute;n) que se corresponden con:</p>
<p>-&nbsp;&nbsp;&nbsp; Implicaci&oacute;n IF variable==estado THEN variable = estado<br />-&nbsp;&nbsp;&nbsp; Conjunci&oacute;n, equivalente al AND, si dos proposiciones son ciertas simult&aacute;neamente <br />-&nbsp;&nbsp;&nbsp; Disyunci&oacute;n, cualquiera de las dos proposiciones es cierta OR<br />-&nbsp;&nbsp;&nbsp; Negaci&oacute;n, invierte la proposici&oacute;n</p>
<p>Finalmente podemos definir las reglas de este modo</p>
<pre class="brush: c-sharp;">            _engine.AddRule(x =&gt;
                            x.Variable("A").Is("Abierto") &amp;&amp;
                            x.Variable("B").Is("Abierto"))
                            .Then(x =&gt; x.Variable("R").Set("Caliente"));

            _engine.AddRule(x =&gt;
                            x.Variable("A").Is("Abierto") &amp;&amp;
                            (x.Variable("B").Is("Cerrado") || x.Variable("B").Is("Medio")))
                            .Then(x =&gt; x.Variable("R").Set("Templado"));

            _engine.AddRule(x =&gt;
                            x.Variable("B").Is("Abierto") &amp;&amp;
                            (x.Variable("A").Is("Cerrado") || x.Variable("A").Is("Medio")))
                            .Then(x =&gt; x.Variable("R").Set("Templado"));

            _engine.AddRule(x =&gt;
                            x.Variable("A").Is("Cerrado") &amp;&amp;
                            x.Variable("B").Is("Cerrado"))
                            .Then(x =&gt; x.Variable("R").Set("Frio"));</pre>
<p><strong>&iquest;C&oacute;mo funciona?</strong></p>
<p>Una regla tiene una condici&oacute;n (IF) y una consecuencia (THEN), la condici&oacute;n es una funci&oacute;n que recibe el sistema y debe devolver una FuzzyExpresion, (<em>Func&lt;FuzzySystem,FuzzyExpression&gt;</em>), esto es parte de la magia ya que una expresi&oacute;n condicional es siempre reducida a una &uacute;nica expresi&oacute;n y finalmente a un &uacute;nico valor.<br />Y curiosamente la consecuencia de la regla, es exactamente igual, solo que en este caso la expresi&oacute;n no devuelve nada porque la consecuencia es una acci&oacute;n, aqu&iacute; hay otro peque&ntilde;o truco que es que la propia regla contiene los dos elementos separados (condici&oacute;n y consecuencia) fijaros en que:</p>
<pre class="brush: c-sharp;">   _engine.AddRule(x =&gt;
                        x.Variable("A").Is("Abierto") &amp;&amp;
                        x.Variable("B").Is("Abierto"))</pre>
<p>Est&aacute; devolviendo una regla y el m&eacute;todo <em>Then</em> es aplicado sobre la regla, y cuando se eval&uacute;a la regla si la condici&oacute;n es cierta se eval&uacute;a la consecuencia, que lo que hace es &uacute;nicamente cambiar el estado (ver el m&eacute;todo <em>Set </em>de <em>FuzzyExpression</em>)</p>
<pre class="brush: c-sharp;">    public class FuzzyRule
    {
        private readonly FuzzySystem _engine;
        private readonly Func _condition;
        private Func _then;

        public double Value { get; set; }

        public FuzzySystem Engine
        {
            get { return _engine; }
        }

        public FuzzyRule(FuzzySystem engine, Func condition)
        {
            _engine = engine;
            _condition = condition;
        }

        public FuzzyExpression Eval()
        {
            Value = _condition(Engine).Value;

            if (Value &gt; 0)
            {
                return _then(Engine);
            }

            return null;
        }

        public void Then(Func then)
        {
            _then = then;
        }
    }</pre>
<p><strong>Defuzzyficando</strong></p>
<p>Para evaluar nuestro sistema ..</p>
<p>&nbsp;</p>
<pre class="brush: c-sharp;">            for (int a = 0; a &lt; 10; a++)
            {
                for (int b = 0; b &lt; 10; b++)
                {
                    _engine.Variables["A"].InputValue = a;
                    _engine.Variables["B"].InputValue = b;
                    _engine.Consecuent = "R";

                    var r = _engine.Defuzzy();

                    Console.WriteLine(string.Format("A {0} - B {1} = {2,-6} [{3,-10}][{4,-10}] = {5}",
                        a,
                        b,
                        r,
                        _engine.GetVariableState("A",a),
                        _engine.GetVariableState("B",b),
                        _engine.GetVariableState("R", r)));
                }
            }
        }</pre>
<p><strong>Mejoras de dise&ntilde;o </strong></p>
<p>Hay una cosa que no me gusta mucho y es el hecho de que mi clase FuzzyExpression, tiene tanto el m&eacute;todo Is como el m&eacute;todo Set y esto habr&iacute;a que dividirlo en dos para no llevar a errores a la hora de la usar la interfaz fluida.</p>
<p><strong>Errores de dise&ntilde;o </strong></p>
<p>Pero no todo es de color de rosa, cuando planifique el sistema, pens&eacute; en la posibilidad de guardar las expresiones lambda como texto y despu&eacute;s compilarlas usando CodeDom, bien tengo que deciros que cuando me he puesto a ello me he llevado la desagradable sorpresa de que CodeDom no soporta expresiones lambda, de modo que mi gozo en un pozo.</p>
<p>Y digo esto porque es de vital importancia el poder mantener las reglas fuera del c&oacute;digo, bien un archivo de configuraci&oacute;n, un archivo XML, lo que sea&hellip; de este modo podemos realizar ajustes sin tener que recompilar todo &hellip; <br /><strong></strong></p>
<p><strong>Para una futura versi&oacute;n </strong></p>
<p>Completar estas cositas &hellip;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2010/fuzzy-logic-y-expresiones-lambda/feed</wfw:commentRss>
		<slash:comments>243</slash:comments>
		</item>
		<item>
		<title>Polar Rs300x &#8211; GUI</title>
		<link>http://oldblog.ideseg.com/2010/polar-rs300x-gui</link>
		<comments>http://oldblog.ideseg.com/2010/polar-rs300x-gui#comments</comments>
		<pubDate>Fri, 08 Jan 2010 14:34:00 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[miscelanea]]></category>
		<category><![CDATA[net]]></category>

		<guid isPermaLink="false">/post/Polar-Rs300x-GUI.aspx</guid>
		<description><![CDATA[Estas navidades el Olentzero, Santa Claus, Papa Noel &#243; uno mismo, vaya ud. a saber &#8230; me dejo un pulsometro Polar RS300x, uno de esos aparatitos que te miden las pulsaciones (para evitar que a los que nos vamos haciendo mayores nos d&#233; un chunguito) La verdad es que no est&#225; nada mal, viene con [...]]]></description>
			<content:encoded><![CDATA[<p>Estas navidades el Olentzero, Santa Claus, Papa Noel &oacute; uno mismo, vaya ud. a saber &hellip; me dejo un pulsometro Polar RS300x, uno de esos aparatitos que te miden las pulsaciones (para evitar que a los que nos vamos haciendo mayores nos d&eacute; un chunguito)</p>
<p><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/RS300X_5F00_blk_5F00_front_5F00_240x298.jpg"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/RS300X_5F00_blk_5F00_front_5F00_240x298.jpg" border="0" alt="" /></a><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/FlowLink_5F00_front_5F00_115x115.jpg"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/FlowLink_5F00_front_5F00_115x115.jpg" border="0" alt="" /></a><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/s1_5F00_115x115.jpg"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/s1_5F00_115x115.jpg" border="0" alt="" /></a><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/wearlink_2B005F00_31coded_5F00_front_5F00_115x115.jpg"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/wearlink_2B005F00_31coded_5F00_front_5F00_115x115.jpg" border="0" alt="" /></a></p>
<p>La verdad es que no est&aacute; nada mal, viene con el transmisor WearLink que es la cinta que te atas en el pecho que se encarga de enviar la frecuencia cardiaca al reloj, con un sensor S1 que es un pod&oacute;metro que te pones en la zapatilla y una vez calibrado, mide la distancia y la velocidad, y finalmente con el FlowLink que es un dispositivo USB a trav&eacute;s del cual puedes enviar la informaci&oacute;n a una web para (www.polarpersonaltrainer.com) para mantener un hist&oacute;rico de las sesiones de entrenamiento.</p>
<p>El domingo d&iacute;a 3 calibre el sensor S1 recorriendo una distancia de 1km y despu&eacute;s prob&eacute; por los alrededores de mi casa a correr una distancia conocida y me quede impresionado, tan solo medio metro de diferencia. Una maravilla.</p>
<p>El lunes d&iacute;a 4 realice una sesi&oacute;n de entrenamiento y despu&eacute;s sub&iacute; los datos la web, usando el FlowLink y el software de sincronizaci&oacute;n que viene con el aparato.</p>
<p>Bueno, no es que este mal del todo, pero no se puede decir que la web sea una pasada. La cosa es que me pico el gusanito ese &ldquo;f-geek&rdquo; (freak-geek) que llevo dentro ..</p>
<p>De modo que me puse a buscar todo tipo de informaci&oacute;n acerca de c&oacute;mo sacar los datos del dichoso relojito &hellip; y no encontr&eacute; absolutamente nada (y mira que ha sido f&aacute;cil) </p>
<p>Revisando el software de sincronizaci&oacute;n di con unas .dlls curiosas .. Polar.Transport.dll y Polar.Monitor.dll &hellip; que curiosamente est&aacute;n en .Net &hellip; tambi&eacute;n hay una biblioteca de m&aacute;s bajo nivel llamada libpolar.dll a la que las otras dos hacen refencia (Interop) .. </p>
<p>Bueno tras una revisi&oacute;n con el reflector encontr&eacute; muchas, muchas cosas interesantes .. lo mejor es que me pod&iacute;a conectar al relojito y obtener los datos de las sesiones, de modo que en un primer paso realice un sencillo programita para exportar los datos a XML </p>
<p>Que bonito &hellip; en poco m&aacute;s de una hora ten&iacute;a los datos &hellip; </p>
<p>B&aacute;sicamente basta con crear un proyecto en VS y referenciar Polar.Monitor.dll (como internamente usa libpolar.dll) deb&eacute;is aseguraros que libpolar.dll est&aacute; tambi&eacute;n localizable.</p>
<p>Pero para no perder detalle aqu&iacute; os dejo un video de c&oacute;mo hacerlo&hellip;</p>
<p>
<object width="580" height="360"><param name="movie" value="http://www.youtube.com/v/pztlLRI9koA&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="580" height="360" src="http://www.youtube.com/v/pztlLRI9koA&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;border=1" allowscriptaccess="always"></embed></object></p>
<p>La cosa es que me he liado un poco (&iquest;C&oacute;mo no?) y me he metido a hacer un GUI que por el momento tiene este aspecto.</p>
<p>Permite ver un resumen de las sesiones</p>
<p><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/polar0.png"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/polar0.png" border="0" alt="" /></a></p>
<p>Permite analizar cada sesi&oacute;n (yo le he activado el modo Auto Lap, de modo que el pulsometro toma datos a cada KM) me muestra el tiempo empleado, la velocidad, la FC Max, y la FC Media. Adem&aacute;s emparejo cada dato de FC con la Zona de trabajo. </p>
<p><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar1.png"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar1.png" border="0" alt="" /></a></p>
<p>En el gr&aacute;fico, se puede ver la FC , la FC Max (puntitos rojos) y ambas dentro de sus zonas correspondientes. En el gr&aacute;fico de velocidad, se puede ver la velocidad en Km/h y en min/km adem&aacute;s la vuelta m&aacute;s r&aacute;pida queda en verde y la m&aacute;s lenta en rojo.</p>
<p><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar2.png"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar2.png" border="0" alt="" /></a></p>
<p>Por &uacute;ltimo el gr&aacute;fico de las Zonas, con el tiempo empleado en cada una de ellas en la sesi&oacute;n de entrenamiento.</p>
<p><a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar3.png"><img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/csegura/Polar3.png" border="0" alt="" /></a></p>
<p>Os dejo otro bonito video del programita &hellip; (que me he emocionaooo &#8230;)</p>
<p>
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/OThHSK1R_18&amp;hl=es_ES&amp;fs=1&amp;rel=0" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/OThHSK1R_18&amp;hl=es_ES&amp;fs=1&amp;rel=0" allowscriptaccess="always"></embed></object>
</p>
<p>Ya sabes si eres un f-geek de los ordenadores que adem&aacute;s te gusta el running el Rs300x es una magnifica opci&oacute;n</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2010/polar-rs300x-gui/feed</wfw:commentRss>
		<slash:comments>228</slash:comments>
		</item>
		<item>
		<title>ASP.NET Mvc Delete Link usando DELETE method</title>
		<link>http://oldblog.ideseg.com/2009/asp-net-mvc-delete-link-usando-delete-method</link>
		<comments>http://oldblog.ideseg.com/2009/asp-net-mvc-delete-link-usando-delete-method#comments</comments>
		<pubDate>Sun, 01 Nov 2009 11:53:19 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[net]]></category>

		<guid isPermaLink="false">/post/ASPNET-Mvc-Delete-Link-usando-DELETE-method.aspx</guid>
		<description><![CDATA[Realmente he llegado tarde (seguro que estaba haciendo alguna que otra mala cosa) al MVC de ASP.Net, lo digo porque aunque había jugueteado un poco no me había tenido que poner a hacer cosas un poco serias. Bueno, la verdad es que estoy encantado ya voy haciendo mis pinitos poco a poco … una de [...]]]></description>
			<content:encoded><![CDATA[<p>Realmente he llegado tarde (seguro que estaba haciendo alguna que otra mala cosa) al MVC de ASP.Net, lo digo porque aunque había jugueteado un poco no me había tenido que poner a hacer cosas un poco serias.</p>
<p>Bueno, la verdad es que estoy encantado ya voy haciendo mis pinitos poco a poco … una de las cosas con las que estaba más a disgusto ha sido el tema de hacer las eliminaciones vía POST (cosas de los que hemos jugado con Ruby)</p>
<p><a href="http://stephenwalther.com">Sthephen Walter</a> (autor de ASP.NET MVC Framework Unleashed) tiene un post en su blog con una <a href="http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx">muy buena descripción del problema</a> en su blog.  Resumo.</p>
<ul>
<li>Realizar un borrado mediante HTTP GET es un error de seguridad como la copa de un pino.</li>
<li>Realizar un borrado usando Ajax y HTTP DELETE es dependiente del JavaScript.</li>
<li>Realizar un borrado usando HTTP POST, según Sthephen es la manera más idónea para no ser dependiente de JavaScript.</li>
</ul>
<blockquote>
<blockquote>
<ul>
<li>Problema, un link no puede hacer un HTTP POST</li>
<li>Tenemos que usar una imagen o un botó</li>
</ul>
</blockquote>
</blockquote>
<ul>
<li>Propone una solución para realizar la eliminación mediante AJAX y java script (demasiado dependiente)</li>
</ul>
<p>Mi problema (y seguro que el de otros) &#8211; Requisitos</p>
<ul>
<li>Quiero realizar un borrado</li>
<li> Quiero hacerlo usando un link</li>
<li>Quiero que sea seguro</li>
<li>Quiero que use HTTP DELETE</li>
<li> Quiero poder validar “¿Esta Ud. Seguro?”</li>
<li> Quiero poder personalizar el mensaje</li>
<li> Quiero que tras borrar pueda dirigirme a una página concreta</li>
<li> Quiero controlar los errores</li>
<li>Quiero que sea versátil y no tener que escribir JavaScript cada vez</li>
</ul>
<p>Extendiendo jQuery</p>
<p>Ya está más que dicho, pero jQuery es grande, muy grande. Y una de las cosas que más me gustan es la facilidad con que puede extenderse, básicamente hay dos formas de hacerlo, una añadiendo nuevos métodos que son aplicables a los elementos (jQuery.fn.extend) y otra a través de la cual se pueden añadir nuevos métodos a  jQuery (jQuery.extend).</p>
<p>En este caso, vamos a extender jQuery añadiéndole un nuevo método, un método llamado mvcDelete que podremos usar desde el onclick de un link.</p>
<p>He preferido la este modo de extensión para poder escribir un sencillo HtmlHelper que me ayude a no tener que escribir prácticamente nada de JavaScript cada vez que quiero poner un link para eliminar un elemento.</p>
<p>&lt;%= Html.DeleteLink(“Delete”, new { action=”Delete”, controller=”Page”, id=Model.Id, redirectToController=”Page”}, null) %&gt;</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>jQuery.extend({</pre>
<pre><span class="lnum">   2:  </span>        mvcDelete: <span class="kwrd">function</span>(options) {</pre>
<pre class="alt"><span class="lnum">   3:  </span>            var defaults = {</pre>
<pre><span class="lnum">   4:  </span>                controller: <span class="str">""</span>,</pre>
<pre class="alt"><span class="lnum">   5:  </span>                action: <span class="str">"delete"</span>,</pre>
<pre><span class="lnum">   6:  </span>                onComplete: <span class="kwrd">function</span>(xhr, status) { },</pre>
<pre class="alt"><span class="lnum">   7:  </span>                onSuccess: <span class="kwrd">function</span>(data) { },</pre>
<pre><span class="lnum">   8:  </span>                onError: <span class="kwrd">function</span>(xhr, status) { alert(<span class="str">"Error"</span>); },</pre>
<pre class="alt"><span class="lnum">   9:  </span>                message: <span class="str">"Are you sure you wish to delete this item?"</span>,</pre>
<pre><span class="lnum">  10:  </span>                confirmAlert: <span class="kwrd">true</span>,</pre>
<pre class="alt"><span class="lnum">  11:  </span>                id: 0,</pre>
<pre><span class="lnum">  12:  </span>                redirectToController: <span class="str">""</span>,</pre>
<pre class="alt"><span class="lnum">  13:  </span>                redirectToAction: <span class="str">"index"</span></pre>
<pre><span class="lnum">  14:  </span>            }</pre>
<pre class="alt"><span class="lnum">  15:  </span>            var ajaxError = <span class="kwrd">false</span>;</pre>
<pre><span class="lnum">  16:  </span>            var opt = $.extend(defaults, options);</pre>
<pre class="alt"><span class="lnum">  17:  </span>            var deleteRequest = <span class="kwrd">function</span>() {</pre>
<pre><span class="lnum">  18:  </span>                var deleteUrl = <span class="rem">'/' + opt.controller + '/' + opt.action + '/' + opt.id;</span></pre>
<pre class="alt"><span class="lnum">  19:  </span>                $.ajax({</pre>
<pre><span class="lnum">  20:  </span>                    type: <span class="str">"DELETE"</span>,</pre>
<pre class="alt"><span class="lnum">  21:  </span>                    url: deleteUrl,</pre>
<pre><span class="lnum">  22:  </span>                    async: <span class="kwrd">false</span>,</pre>
<pre class="alt"><span class="lnum">  23:  </span>                    success: opt.onSuccess(data),</pre>
<pre><span class="lnum">  24:  </span>                    complete: opt.onComplete(xhr,status),</pre>
<pre class="alt"><span class="lnum">  25:  </span>                    <span class="kwrd">error</span>: <span class="kwrd">function</span>(xhr, status) { opt.onError(xhr, status); ajaxError = <span class="kwrd">true</span>; }</pre>
<pre><span class="lnum">  26:  </span>                });</pre>
<pre class="alt"><span class="lnum">  27:  </span>            };</pre>
<pre><span class="lnum">  28:  </span></pre>
<pre class="alt"><span class="lnum">  29:  </span>            <span class="kwrd">if</span> (opt.controller.length &gt; 0 &amp;&amp; opt.id &gt; 0) {</pre>
<pre><span class="lnum">  30:  </span>                <span class="kwrd">if</span> (opt.confirmAlert) {</pre>
<pre class="alt"><span class="lnum">  31:  </span>                    <span class="kwrd">if</span> (confirm(opt.message))</pre>
<pre><span class="lnum">  32:  </span>                        deleteRequest();</pre>
<pre class="alt"><span class="lnum">  33:  </span>                    <span class="kwrd">else</span></pre>
<pre><span class="lnum">  34:  </span>                        <span class="kwrd">return</span> <span class="kwrd">false</span>;</pre>
<pre class="alt"><span class="lnum">  35:  </span>                } <span class="kwrd">else</span></pre>
<pre><span class="lnum">  36:  </span>                    deleteRequest();</pre>
<pre class="alt"><span class="lnum">  37:  </span></pre>
<pre><span class="lnum">  38:  </span>                <span class="kwrd">if</span> (!ajaxError &amp;&amp; opt.redirectToController.length &gt; 0) {</pre>
<pre class="alt"><span class="lnum">  39:  </span>                    var redirect = <span class="rem">'/' + opt.redirectToController + '/' + opt.redirectToAction;</span></pre>
<pre><span class="lnum">  40:  </span>                    window.location.replace(redirect);</pre>
<pre class="alt"><span class="lnum">  41:  </span>                }</pre>
<pre><span class="lnum">  42:  </span>            }</pre>
<pre class="alt"><span class="lnum">  43:  </span>            <span class="kwrd">return</span> <span class="kwrd">false</span>;</pre>
<pre><span class="lnum">  44:  </span>        }</pre>
<pre class="alt"><span class="lnum">  45:  </span></pre>
<pre><span class="lnum">  46:  </span>    });</pre>
</div>
<p>En donde vamos a poder pasar:</p>
<p><em>controller </em>-&gt; controlador de la acción de borrado (requerido)<br />
<em>action </em>-&gt; acción de borrado, por defecto delete<br />
<em>id </em>-&gt; elemento a borrar (requerido)<br />
<em>onComplete </em>-&gt; una función a realizar tras completarse el borrado<br />
<em>onError </em>-&gt; una función a realizar si se producen errores<br />
<em>confirmAlert </em>-&gt; si se mostrará o no el mensaje de advertencia<br />
<em>message </em>-&gt; el mensaje de seguridad<br />
<em>redirectToController </em>-&gt; el controlador de salida (por defecto el mismo que de entrada)<br />
<em>redirectToAction </em>-&gt; la acción de la salida por defecto (Index)</p>
<p>Después el helper que se encargará de realizar el link será</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> DeleteLink(<span class="kwrd">this</span> HtmlHelper helper,</pre>
<pre><span class="lnum">   2:  </span>                                <span class="kwrd">string</span> text,</pre>
<pre class="alt"><span class="lnum">   3:  </span>                                <span class="kwrd">object</span> deleteOptions,</pre>
<pre><span class="lnum">   4:  </span>                                <span class="kwrd">object</span> linkHtmlAttributes)</pre>
<pre class="alt"><span class="lnum">   5:  </span>{</pre>
<pre><span class="lnum">   6:  </span>    var linkTagBuilder = <span class="kwrd">new</span> TagBuilder(<span class="str">"a"</span>);</pre>
<pre class="alt"><span class="lnum">   7:  </span></pre>
<pre><span class="lnum">   8:  </span>    linkTagBuilder.Attributes.Add(<span class="str">"href"</span>, <span class="str">"#"</span>);</pre>
<pre class="alt"><span class="lnum">   9:  </span>    linkTagBuilder.SetInnerText(text);</pre>
<pre><span class="lnum">  10:  </span></pre>
<pre class="alt"><span class="lnum">  11:  </span>    var serializer = <span class="kwrd">new</span> JavaScriptSerializer();</pre>
<pre><span class="lnum">  12:  </span>    var mvcDeleteOptions = serializer.Serialize(deleteOptions);</pre>
<pre class="alt"><span class="lnum">  13:  </span></pre>
<pre><span class="lnum">  14:  </span>    linkTagBuilder.MergeAttribute(<span class="str">"onclick"</span>,</pre>
<pre class="alt"><span class="lnum">  15:  </span>                                  <span class="kwrd">string</span>.Format(<span class="str">"$.mvcDelete({0}); return false;"</span>, mvcDeleteOptions));</pre>
<pre><span class="lnum">  16:  </span>    linkTagBuilder.MergeAttributes(<span class="kwrd">new</span> RouteValueDictionary(linkHtmlAttributes));</pre>
<pre class="alt"><span class="lnum">  17:  </span></pre>
<pre><span class="lnum">  18:  </span>    <span class="kwrd">return</span> linkTagBuilder.ToString();</pre>
<pre class="alt"><span class="lnum">  19:  </span>}</pre>
</div>
<p>Aquí lo más destacable es como pasamos las opciones a nuestro plugin, usando un método anónimo, convertimos el objeto usando el serializador de javascript de este modo nuestro plugin, recibe los parámetros.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/asp-net-mvc-delete-link-usando-delete-method/feed</wfw:commentRss>
		<slash:comments>217</slash:comments>
		</item>
		<item>
		<title>NavarraDotNet &#8211; Independencia</title>
		<link>http://oldblog.ideseg.com/2009/navarradotnet-independencia</link>
		<comments>http://oldblog.ideseg.com/2009/navarradotnet-independencia#comments</comments>
		<pubDate>Wed, 21 Oct 2009 16:40:05 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[navarradotnet]]></category>

		<guid isPermaLink="false">/post/NavarraDotNet-Independencia-.aspx</guid>
		<description><![CDATA[Ayer tuvimos una sesión de arquitectura que dedicamos por completo a la inyección de dependencias (la llamamos Independencia), en esta ocasión contamos con gente que está trabajando con Java, e incluso con PHP, la verdad es que fue una autentica pasada ya que tras ver algunas demos, (yo flipo con la gente de PHP) mantuvimos [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer tuvimos una sesión de arquitectura que dedicamos por completo a la inyección de dependencias (la llamamos Independencia), en esta ocasión contamos con gente que está trabajando con Java, e incluso con PHP, la verdad es que fue una autentica pasada ya que tras ver algunas demos, (yo flipo con la gente de PHP) mantuvimos una conversación realmente interesante, buen rollito a pasar de las diferentes tecnologías.</p>
<p>•&nbsp;&nbsp; &nbsp;En Java vimos PicoContainer, NanoContainer, Spring y MicroSpring.<br />•&nbsp;&nbsp; &nbsp;En PHP vimos como ejemplo Substrate (y Manu, se llevo el premio arquitecto-friki del día)<br />•&nbsp;&nbsp; &nbsp;En .Net vimos StructureMap, Unity, Ninject, Autofac y más…. </p>
<p>No obstante y para variar, terminamos con algunas discusiones un poco más acaloradas, y es que hay que ver como se ponen algunos.<br />Haciendo un resumen discutimos sobre:</p>
<p>-&nbsp;&nbsp; &nbsp;Cuando se debe usar IoC. <br />-&nbsp;&nbsp; &nbsp;Pros y contras <br />-&nbsp;&nbsp; &nbsp;Alternativas de configuración XML/Código<br />-&nbsp;&nbsp; &nbsp;Sugerencias para la elección de un framework<br />-&nbsp;&nbsp; &nbsp;Rendimiento</p>
<p>En cuanto al rendimiento, pudimos hacer una serie de benchmarks con las herramientas de .Net, usamos un sencillo test preparado por (gracias Torkel [http://www.codinginstinct.com]), en donde lo más destacable fue el poder ver cómo se comportan los distintos frameworks, dejo los enlaces abajo, esta prueba es realmente interesante </p>
<p>•&nbsp;&nbsp; &nbsp;<a href="http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html">http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html</a> <br />•&nbsp;&nbsp; &nbsp;<a href="http://www.codinginstinct.com/2008/04/ioc-benchmark-revisited-ninject.html">http://www.codinginstinct.com/2008/04/ioc-benchmark-revisited-ninject.html</a><br />•&nbsp;&nbsp; &nbsp;<a href="http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html">http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html</a></p>
<p>Os sugiero variar el número de objetos que se crean y el modo en que se instanciaran.</p>
<p>Bueno, lo próximo serán los <a href="http://www.cesnavarra.net/Lists/Eventos%20CES/DispForm1.aspx?List=05834153%2Deec1%2D4089%2Da40e%2D5355dbd305f4&amp;ID=156&amp;Source=http%3A%2F%2Fwww%2Ecesnavarra%2Enet%2FLists%2FEventos%2520CES%2FEventos%2520CES%2Easpx%3FCalendarDate%3D21%252F11%252F2009">talleres de integración continua</a> que haremos en el CES, <u>estos se han llenado en apenas 24 horas</u>. De modo que tendremos que pensar en organizar más </p>
<p><a href="http://www.cesnavarra.net/Lists/Eventos%20CES/Eventos%20CES.aspx?CalendarDate=21%2F11%2F2009">Calendario de eventos del CES para Noviembre </a></p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/navarradotnet-independencia/feed</wfw:commentRss>
		<slash:comments>520</slash:comments>
		</item>
		<item>
		<title>MailToSharePoint outlook addin</title>
		<link>http://oldblog.ideseg.com/2009/mailtosharepoint-outlook-addin</link>
		<comments>http://oldblog.ideseg.com/2009/mailtosharepoint-outlook-addin#comments</comments>
		<pubDate>Thu, 27 Aug 2009 03:38:04 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[SPSPro]]></category>

		<guid isPermaLink="false">/post/MailToSharePoint-outlook-addin.aspx</guid>
		<description><![CDATA[As part of our MailToList webparts we are finishing this free outlook addin to export mail messages from outlook to SharePoint. You can see this how-to video about how to install and configure. The Camtasia Studio video content presented here requires a more recent version of the Adobe Flash Player. If you are you using [...]]]></description>
			<content:encoded><![CDATA[<p>As part of our MailToList webparts we are finishing this free outlook addin to export mail messages from outlook to SharePoint.</p>
<p>You can see this how-to video about how to install and configure.</p>
<div id="media">             <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="640" height="495" id="csSWF"><param name="movie" value="/images/videos/MailtoSharePointBeta/MailToSharePointBeta.swf" /><param name="quality" value="best" /><param name="bgcolor" value="#1a1a1a" /><param name="allowfullscreen" value="true" /><param name="scale" value="showall" /><param name="allowscriptaccess" value="always" /><param name="flashvars" value="autostart=false&amp;color=0x1A1A1A,0x1A1A1A" /><!--[if !IE]>&#8211;>                 <object type="application/x-shockwave-flash" data="/images/videos/MailtoSharePointBeta/MailToSharePointBeta.swf" width="640" height="495"><param name="quality" value="best" /><param name="bgcolor" value="#1a1a1a" /><param name="allowfullscreen" value="true" /><param name="scale" value="showall" /><param name="allowscriptaccess" value="always" /><param name="flashvars" value="autostart=false&amp;color=0x1A1A1A,0x1A1A1A" /><!--<![endif]-->
<div id="noUpdate">
<p>The Camtasia Studio video content presented here requires a more recent version of the Adobe Flash Player. If you are you using a browser with JavaScript disabled please enable it now. Otherwise, please update your version of the free Flash Player by <a href="http://www.adobe.com/go/getflashplayer">downloading here</a>.</p>
</p></div>
<p>                 <!--[if !IE]>&#8211;>                 </object>                 <!--<![endif]-->             </object>         </div>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/mailtosharepoint-outlook-addin/feed</wfw:commentRss>
		<slash:comments>235</slash:comments>
		</item>
		<item>
		<title>Cuestiones sobre el diseño de soluciones en SharePoint (4)</title>
		<link>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-4</link>
		<comments>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-4#comments</comments>
		<pubDate>Sat, 25 Jul 2009 19:21:14 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Cuestiones-sobre-el-diseno-de-soluciones-en-SharePoint-(4).aspx</guid>
		<description><![CDATA[Continuando con el tema de la organización, como ya he dicho las colecciones de sitios son un punto muy importante a tener en cuenta. Alguna de las limitaciones las podemos superar por medio de la instalación de soluciones y características a través de las cuales podemos hacer un despliegue más rápido sobre distintas colecciones de [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el tema de la organización, como ya he dicho las colecciones de sitios son un punto muy importante a tener en cuenta. Alguna de las limitaciones las podemos superar por medio de la instalación de soluciones y características a través de las cuales podemos hacer un despliegue más rápido sobre distintas colecciones de sitios.</p>
<p>A la hora de organizar, yo, personalmente tengo en cuenta dos cosas, que creo son muy importantes, la primera es el tema de la seguridad.</p>
<p><b>Seguridad</b></p>
<p>SharePoint cuenta con una serie de roles, grupos y acciones con las que hay que familiarizarse para poder desenvolverse correctamente. </p>
<p>Establecer a que información debe acceder cada cual, que puede ver y que puede editar, nos va a ayudar a tener una idea clara de cómo debemos organizar otras cosas.</p>
<p>Yo primero suelo hacer esto en dos pasos, en un primer paso repaso la información que va a contener la aplicación y los usuarios que van a acceder a ella; establezco una correspondencia creando una serie de grupos de usuarios. En un segundo paso, una vez tenemos clara la estructura que va a tener nuestra aplicación, colecciones de sitios, sitios y subsitios y la información que va a contener cada uno de ellos, vuelvo a ajustar los permisos.</p>
<p>Por ejemplo en el caso que comente anteriormente en donde teníamos el dilema de si establecer la jerarquía por Delegación o por Departamento, si hemos optado por establecerla por Delegación, tenemos que asegurarnos de que el jefe de almacén pueda acceder al departamento de almacén en cualquiera de las delegaciones, pero no podrá entrar en otros departamentos. </p>
<p>Cuando pensemos en la seguridad y los permisos de acceso también hay que tener en cuenta quien administrará los sitios ¿hay un departamento de sistemas encargado de ello? ¿Van a poderse crear nuevos subsitios? ¿Quién se va a encargar de mantener los permisos?</p>
<p>Existe también una jerarquía de permisos, de modo que podemos asignar permisos que se irán heredando en los distintos subsitios. Hay que recordar que los permisos no son como los de NTFS, es decir que no podemos heredar y tener permisos únicos al mismo tiempo, es o una cosa o la otra.</p>
<p><b>Acceso y Agregación de la información<br /></b><br />La segunda cosa que suelo tener en cuenta es donde se va a localizar la información dentro de la aplicación, aspectos a tener en cuenta como el hecho de cómo se quieren agregar los datos y donde van a estar localizados los mismos son de vital importancia.</p>
<p>En MOSS disponemos del “Cotent Query Web Part” que nos va a permitir agregar datos de la misma colección de sitios, pero en WSS debemos hacerlo nosotros mismos, hay que tener en cuenta que información debemos agregar y como deseamos verla, para poder pensar cómo vamos a hacerlo.</p>
<p><b><i>Cuestiones que me han preguntado estos días </i></p>
<p>Bases de datos de Contenido</b></p>
<p>Como comente anteriormente cada aplicación web al menos contiene una base de datos de contenido, en ella se almacenará la colección de sitios principal y si lo deseamos otras colecciones. También una aplicación web puede tener más de una base de datos de contenido, que contendrán una o más colecciones de sitios, pero una colección de sitios no puede usar más de una base de datos.</p>
<p>Finalmente todo el almacenamiento de SharePoint recae en una base de datos, tenemos que tener en cuenta la capacidad de almacenamiento que esperamos tengan nuestras colecciones de sitios, no es lo mismo una aplicación web pública realizada con las características de CMS, que una intranet en donde vamos a almacenar miles de documentos de office. </p>
<p>Además y como es lógico debemos prever un plan de contingencias y de mantenimiento para nuestras bases de datos, pensad no es lo mismo una base de datos de 50GB que de 500GB, tiempo de respaldo, soportes necesarios, mantenimiento, horarios, etc…</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-4/feed</wfw:commentRss>
		<slash:comments>549</slash:comments>
		</item>
		<item>
		<title>Cuestiones sobre el diseño de soluciones en SharePoint (3)</title>
		<link>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-3</link>
		<comments>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-3#comments</comments>
		<pubDate>Thu, 23 Jul 2009 16:14:53 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Cuestiones-sobre-el-diseno-de-soluciones-en-SharePoint-(3).aspx</guid>
		<description><![CDATA[Uno de los primeros puntos a tener en cuenta cuando se desarrolla una solución para SharePoint es cómo vamos a organizar el contenido y la información. SharePoint nos ofrece distintas posibilidades que veremos a continuación, pero también hay que tener en cuenta algunos factores importantes. Granjas, Aplicaciones Web, Colecciones de Sitios, Sitios y SubsitiosEn primer [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los primeros puntos a tener en cuenta cuando se desarrolla una solución para SharePoint es cómo vamos a organizar el contenido y la información.</p>
<p>SharePoint nos ofrece distintas posibilidades que veremos a continuación, pero también hay que tener en cuenta algunos factores importantes.</p>
<p><b>Granjas, Aplicaciones Web, Colecciones de Sitios, Sitios y Subsitios<br /></b><br />En primer lugar tenemos que comprender las opciones que nos brinda SharePoint para estructurar nuestra solución. </p>
<p>Debemos de tener claro que todos los datos de SharePoint son almacenados en distintas bases de datos en un servidor de SQL. Con lo cual desde el punto de vista del diseño de aplicaciones de SharePoint, tenemos que contemplar cuando menos un plan de contingencias y de mantenimiento de las bases de datos que conforman nuestra instalación.</p>
<p><a href="http://www.ideseg.com/MantenimientoDeBasesDeDatosSharePoint2007.aspx">Bases de datos de SharePoint 2007</a></p>
<p>Dicho esto tenemos que entender ahora 5 piezas fundamentales. No quiero extenderme más de lo necesario, a modo de resumen: </p>
<p>Una granja de servidores es un conjunto de servidores que trabajan en unidos, donde podemos dividir distintas responsabilidades entre distintos servidores. Podemos tener una granja de un único servidor donde todos los servicios funcionen sobre una única máquina (servidor web, búsquedas, Excel services, Forms services, SQL Server …) lo más lógico desde el principio es dividir en dos partes la granja, es decir dejar un servidor para el SQL Server y otro con el resto de servicios. Conforme van aumentando los clientes o la demanda de servicios podemos ir añadiendo servidores y establecer las nuevas funcionalidades de las cuales se ocuparan esos servidores, así por ejemplo podemos añadir un nuevo servidor a nuestra granja que se ocupe únicamente del servicio de búsquedas de modo que descargaremos a otros servidores de dicha responsabilidad. <br />En el caso de una granja pequeña en crecimiento, pongamos por ejemplo 3 servidores, los roles podrían ser los siguientes, servidor de SQL, servidor Web Front End, y un servidor que se ocupara del resto de los servicios, búsquedas, Excel services, Form Services, Shared Services etc…</p>
<p>En el caso de una instalación de Windows SharePoint Services, también es recomendable dividir siempre que sea posible al menos los roles de SQL Server y de Web Front End.</p>
<p>Obviamente todo esto pasa por un estudio de las licencias necesarias, para montar la infraestructura que deseemos, esto lo dejaremos al margen.</p>
<p>Una vez que tenemos clara la estructura de nuestra granja, tenemos todavía una importante labor, establecer cómo será la jerarquía de nuestros sitios. </p>
<p>En la terminología de SharePoint, tenemos otro punto importante, el de la aplicación web. Una aplicación web será el punto raíz de la estructura de una solución, cuando creamos una aplicación web, SharePoint crea un nuevo sitio de IIS en una dirección y un puerto de nuestra máquina, así como una base de datos en donde albergará el contenido de dicha aplicación web.</p>
<p>Una aplicación web, no es más que un vinculo o una dirección y una base de datos de almacenamiento con el objetivo de albergar cuando menos una colección de sitios. Es por esto que una vez creada una aplicación web a través de la administración central de SharePoint, lo siguiente es crear una colección de sitios que quedará enlazada con la raíz de la aplicación web.</p>
<p>Una aplicación web como mínimo contiene una colección de sitios, pudiendo a través de de la administración central fijar un punto de anclaje para nuevas colecciones de sitios.</p>
<p>En una granja de servidores podemos tener distintas aplicaciones web como una intranet, una extranet, o un sitio web publico), ahora bien, aunque podemos usar la misma dirección web, cada aplicación web deberá tener su propio puerto; no podemos tener dos aplicaciones corriendo sobre el mismo puerto.</p>
<p>Una colección de sitios, es como un árbol, del cual pueden colgar sitios y subsitios, una colección de sitios es el inicio de una jerarquía de sitios, y al igual que en árbol una colección de sitios tiene un sitio raíz. Todo esto es importante porque debemos de tener en cuenta diversos factores como veremos luego que afectan en su conjunto a una colección de sitios.</p>
<p>Antes de continuar, terminaré de matizar que es un sitio y que es un subsitio. Un sitio es un apartado o nivel en el cual encontraremos contenido (entender aquí, páginas, listas, bibliotecas de documentos, subsitios, etc…) y un subsitio es un sitio que tiene padre.</p>
<p>La importancia de las colecciones de sitios consiste en que dentro de una colección de sitios existen ciertos elementos y recursos comunes dentro de la colección y este es un aspecto muy importante a la hora de diseñar una solución de SharePoint.</p>
<p>Dentro de esos elementos comunes estan:</p>
<blockquote><p>-&nbsp;&nbsp; &nbsp;Flujos de trabajo<br />-&nbsp;&nbsp; &nbsp;Tipos de contenido<br />-&nbsp;&nbsp; &nbsp;Columnas de sitio<br />-&nbsp;&nbsp; &nbsp;Seguridad por grupos<br />-&nbsp;&nbsp; &nbsp;Ámbito de búsquedas (WSS)<br />-&nbsp;&nbsp; &nbsp;Características (features)<br />-&nbsp;&nbsp; &nbsp;Papelera de reciclaje<br />-&nbsp;&nbsp; &nbsp;Informes de uso<br />-&nbsp;&nbsp; &nbsp;Web Parts<br />-&nbsp;&nbsp; &nbsp;Páginas maestras<br />-&nbsp;&nbsp; &nbsp;Plantillas de sitios<br />-&nbsp;&nbsp; &nbsp;Plantillas de listas<br />-&nbsp;&nbsp; &nbsp;Quotas (limites de espacio)<br />-&nbsp;&nbsp; &nbsp;Copias de seguridad</p></blockquote>
<p>Para que quede claro, dentro de una aplicación web como he dicho anteriormente puede haber más de una colección de sitios, pero todos estos elementos son dependientes de la colección de sitios, de modo que en una colección podemos tener una plantilla personalizada para crear listas de tipo “Pedido” pero en la otra colección esta plantilla puede no existir.</p>
<p><b>Organización</b></p>
<p>Al igual que las empresas y corporaciones tienen una estructura determinada debemos establecer cómo queremos estructurar nuestras aplicaciones web en SharePoint. Esto aunque puede parecer sencillo, es sin duda una de las cosas más complicadas.</p>
<p>Veamos un pequeño ejemplo, tomemos una organización dedicada a la fabricación de muebles, supongamos que tiene tres fábricas ó delegaciones en Madrid (central), Barcelona y Sevilla. Dentro de cada delegación, hay diversas divisiones&nbsp; ó departamentos, Almacén, Fabricación, Ventas, Financiero y Postventa.</p>
<p>Podemos hacer una estructura por delegación </p>
<p>-&nbsp;&nbsp; &nbsp;Madrid<br />
<blockquote>o&nbsp;&nbsp; &nbsp;Almacén<br />o&nbsp;&nbsp; &nbsp;Fabricación<br />o&nbsp;&nbsp; &nbsp;Ventas<br />o&nbsp;&nbsp; &nbsp;…</p></blockquote>
<p>-&nbsp;&nbsp; &nbsp;Barcelona<br />
<blockquote>o&nbsp;&nbsp; &nbsp;Almacén<br />o&nbsp;&nbsp; &nbsp;…</p></blockquote>
<p>-&nbsp;&nbsp; &nbsp;Sevilla<br />
<blockquote>o&nbsp;&nbsp; &nbsp;Almacén</p></blockquote>
<p>O bien podemos hacerla por departamentos</p>
<p>-&nbsp;&nbsp; &nbsp;Almacén<br />
<blockquote>o&nbsp;&nbsp; &nbsp;Madrid<br />o&nbsp;&nbsp; &nbsp;Barcelona<br />o&nbsp;&nbsp; &nbsp;Sevilla</p></blockquote>
<p>-&nbsp;&nbsp; &nbsp;Fabricación<br />
<blockquote>o&nbsp;&nbsp; &nbsp;Madrid<br />o&nbsp;&nbsp; &nbsp;Barcelona<br />o&nbsp;&nbsp; &nbsp;Sevilla</p></blockquote>
<p>-&nbsp;&nbsp; &nbsp;….</p>
<p>Aquí empieza el dilema, ¿Cómo estructuramos nuestra aplicación web?.</p>
<p>Cada organización es muy particular, de modo que no existen formulas magistrales. Por proponer un comienzo, deberíamos analizar qué información es la que va almacenar cada sitio y que seguridad ha de tener cada elemento. ¿Los usuarios de Sevilla solo deben ver lo de Sevilla o pueden ver también lo de Barcelona y Madrid? ¿Deben los del departamento de Almacén ver los datos de Ventas? ¿Le interesan al departamento de Posventa los incidentes de las tres delegaciones?</p>
<p>¿Debo crear una colección de sitios por cada delegación? ¿Por cada departamento? ¿Debería una delegación ser un sitio y un departamento un subsitio? ¿Debería ser al revés? ¿Debería tener dos estructuras, por departamento y por delegación? ¿En colecciones de sitios diferentes o en la misma colección?</p>
<p>A la hora de desarrollar una solución debemos tener en cuenta un montón de aspectos, cuestiones como la seguridad, la información y su flujo, las búsquedas y los recursos con los que va a contar son algunas de las más importantes.</p>
<p>Debemos empezar haciendo un análisis muy cuidadoso de todos estos aspectos para no llevarnos sorpresas luego.</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-3/feed</wfw:commentRss>
		<slash:comments>296</slash:comments>
		</item>
		<item>
		<title>Cuestiones sobre el diseño de soluciones en SharePoint (2)</title>
		<link>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-2</link>
		<comments>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-2#comments</comments>
		<pubDate>Tue, 21 Jul 2009 15:37:15 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Cuestiones-sobre-el-diseno-de-soluciones-en-SharePoint-(2)-.aspx</guid>
		<description><![CDATA[Como comentaba en el post anterior, me gustaría dedicar una serie de artículos a algunas de las consideraciones sobre el diseño de soluciones en SharePoint, el en titulo olvide mencionar que me voy a centrar básicamente en el área empresarial. FeedBack Uno de los aspectos que considero más importante es el feedback de los usuarios. [...]]]></description>
			<content:encoded><![CDATA[<p>Como comentaba en el post anterior, me gustaría dedicar una serie de artículos a algunas de las consideraciones sobre el diseño de soluciones en SharePoint, el en titulo olvide mencionar que me voy a centrar básicamente en el área empresarial.</p>
<p><b>FeedBack</b></p>
<p>Uno de los aspectos que considero más importante es el feedback de los usuarios. Como mencione anteriormente muchos de sus problemas a veces se resuelven con imaginación y creatividad, siempre hay que estar atentos a lo que dicen los usuarios. </p>
<p>Por ello una de las partes principales de un desarrollo en SharePoint, puede comenzar por un simple foro de discusión en donde los usuarios puedan dejar sus opiniones tanto críticas como de mejora. </p>
<p>Evidentemente aquí no hay mucho de diseño, pero esto será un pilar fundamental si se hace un buen uso del mismo.</p>
<p>Para poder categorizar los temas que se tratarán en el foro, a la lista se le puede añadir un tipo de contenido o un campo que contenga los diversos asuntos a los que hace relación un post, así como otro campo que indique si el post es referente a una crítica o a una mejora.</p>
<p>En la mayoría de las organizaciones dinamizar un simple foro como este suele ser un problema si no existe una cultura de colaboración, en ocasiones a la gente le da vergüenza comentar cosas, pensando que lo único que van a decir son estupideces, bien, esto es una labor interna en la que hay que concienciar a la gente (y este es un buen punto de arranque) aludir a que jamás mejoraran las herramientas de las que disponen si ellos no hacen nada por mejorarlas; atacar ese pequeño orgullo que todos tenemos, tocar esa fibra, suele dar un buen resultado.</p>
<p>Esto tiene su contrapartida, si el usuario se expresa y pide cosas hay que dárselas (y rápido) si no toda labor anterior habrá caído en balde. Por parte del departamento de IT, habrá que valorar las peticiones de los usuarios y como mencione (y no dejaré de mencionar en lo sucesivo) deberemos realizar una valoración de dichas mejoras de modo que podamos encontrar quórum para llevarlas a cabo y que encajen en tiempo, coste y complejidad.</p>
<p>Según mi experiencia, el usuario tiende a pedir en ocasiones cosas como ¿no podríamos tener un botón aquí que hiciera tal o cual cosa?, nosotros tenemos que pensar en que es lo que el usuario quiere hacer realmente, ¿Por qué, quiere hacerlo?, ¿Qué ventajas encuentra en ello? Y de qué modo podemos ofrecerle algo que le ayude sin que ello suponga demasiada complejidad; Igual el botón no pude estar allí, pero tal vez podamos poner un hipervínculo aquí para hacer lo mismo o casi lo mismo.</p>
<p>El vocabulario del usuario y el nuestro es distinto, hay que hacer un esfuerzo por entenderle, comprenderle y dar a entender lo que nosotros podemos hacer por él.</p>
<p>Una pequeña encuesta en donde los usuarios voten ó valoren las mejoras, puede ser de gran ayuda a la hora de determinar por dónde empezar, así como de tener una idea de a cuanta gente vamos a contentar y/o enfadar con la realización de los cambios.</p>
<p>Un escenario como este puede complicarse todo lo que uno quiera, pero en la práctica debe ser algo sencillo, empecemos dando algo con lo que todos podamos trabajar, un foro en SharePoint y dos o tres campos personalizados (diseño 0%, evangelización y concienciación sobre el uso 100%) pongámoslo en marcha y escuchemos a nuestros usuarios, <u>ellos tienen cosas importantes que decir.</u></p>
<p><b>Vigilancia del Entorno</b></p>
<p>La rapidez con que una empresa sea capaz de reaccionar a los acontecimientos de su entorno, es una medida de los reflejos corporativos.</p>
<p>Sin duda es una parte muy importante, vigilar nuestro entorno; diseñar un portal de vigilancia del entorno dentro de una empresa es algo que aporta gran valor. Hace algún tiempo ayude a un amigo a realizar un portal de vigilancia del entorno y tuve la oportunidad de aprender algunas cosas importantes.</p>
<p>Gracias a internet tenemos a nuestro alcance una ingente cantidad de datos, muchos de ellos nos pueden ayudar a ver qué es lo que está ocurriendo en nuestro entorno, pero identificar la información que nos es útil entre tantos datos puede ser un problema.</p>
<p>Cuando mi amigo me pidió ayuda él había hecho gran parte del trabajo, el había buscado las fuentes de datos que consideraba más relevantes para el entorno de su empresa, clientes, proveedores, mercado, producto, marketing, competencia, tendencias y noticias del sector, incluso encontró algunos foros donde se mencionaba su empresa, todo ello estaba dentro de un site en donde había usado el web part de transformación de XSLT, para recuperar las feeds que él había considerado importantes y poderlas visualizar en varias páginas en función de las distintas categorías a las que hacían referencia.</p>
<p>El site, era útil, de un plumazo tenia agregadas muchas de las noticias que eran relevantes para la empresa, sin embargo la gran cantidad de noticias apabullaba a los usuarios; la gente entraba veía la ingente cantidad de noticias, leía una o dos y salía.</p>
<p>El site resolvía un problema, pero desde luego no lo hacía de la mejor manera posible, pero había algo por dónde empezar lo cual es como ya hemos comentado, bueno. </p>
<p>Le sugerí, que antes de hacer nada, hablara con los usuarios y les preguntará como se podría mejorar el site de vigilancia, tras unas cuantas sugerencias (feedback) por parte del personal de la empresa, había varios puntos en común, la focalización (o audiencia) de la información y la posibilidad de escalar noticias.</p>
<p><u>La focalización de la información</u> hace referencia al hecho de donde se debe encontrar la información,&nbsp; en vez de tener un site en donde concentrar toda la información, los usuarios opinaban que era mejor que cada web de departamento se viese un resumen de esas noticias, de este modo se orienta la información a una audiencia determinada.</p>
<p>En segundo lugar, debería existir un mecanismo de <u>escalar las noticias importantes</u>; cuando se cuenta con mucha información alguien debe poner está en su contexto, y valorarla de manera adecuada. En la empresa de mi amigo fabrican piezas con plásticos inyectados, de modo que la invención de un nuevo compuesto o mecanismo puede parecerle muy importante a la gente de producto pero a alguien de dirección un artículo más bien técnico puede parecerle intrascendente o un autentico coñazo. De modo que la información ha de ser valorada por alguien de las trincheras que la ponga en su contexto y le de la importancia que debe tener y luego la transmita dentro de su contexto al resto de la organización.</p>
<p>Eso dio pie a la creación de un site DAFO, (Debilidades, Amenazas, Fortalezas y Oportunidades).</p>
<p>Se hicieron los cambios necesarios para que cada departamento visualizara la información pertinente a su área, y como complemento de esa información con un simple click se podía llevar la información del agregador de noticias al sistema DAFO, con eso la noticia podía crear una alerta en el sistema, periódicamente se examina el site DAFO y se toman decisiones en función del contenido.</p>
<p>En un primer momento el sistema funcionaba de manera manual, es decir junto a cada noticia existía un enlace a la web DAFO, en donde el usuario debía crear un breve resumen de la noticia, el tipo de alerta Debilidad, Amenaza, Fortaleza o Oportunidad y un comentario personal de ¿Por qué? Se contempla la noticia como una alerta.</p>
<p>La gerencia de la empresa usa la web de DAFO de forma periódica en una reunión quincenal de seguimiento de diversos asuntos, se analizan todas las alertas y se hace un pequeño acta que se deja en ese mismo sitio. </p>
<p>Más adelante cuando el sistema demostró su utilidad, se mejoró sustancialmente incluyendo algo de programación y ahora permite que tras valorar la noticia, esta incluya un enlace a la fuente original, también el site DAFO cuenta ahora con una serie de gráficos y resúmenes quincenales de las alertas que se han producido así como una lista por cada departamento que permite introducir las fuentes desde donde cada departamento va a recibir las noticias así como los filtros que ha de pasar el contenido para ser agregado; de este modo se su pueden añadir y suprimir fuentes y filtros sin necesidad de programar absolutamente nada.</p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-2/feed</wfw:commentRss>
		<slash:comments>498</slash:comments>
		</item>
		<item>
		<title>Cuestiones sobre el diseño de soluciones en SharePoint (1)</title>
		<link>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-1</link>
		<comments>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-1#comments</comments>
		<pubDate>Mon, 20 Jul 2009 20:58:14 +0000</pubDate>
		<dc:creator>cseg</dc:creator>
				<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">/post/Cuestiones-sobre-el-diseno-de-soluciones-en-SharePoint-(1).aspx</guid>
		<description><![CDATA[Una de las incuestionables capacidades de SharePoint, es la de poderse adaptarse rápidamente a muchas de las problemáticas que surgen en las empresas. Sin embargo a la hora de diseñar estas soluciones no todo es tan sencillo, con esto me estoy refiriendo al hecho de que nos encontramos en innumerables ocasiones con problemáticas empresariales que [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las incuestionables capacidades de SharePoint, es la de poderse adaptarse rápidamente a muchas de las problemáticas que surgen en las empresas. </p>
<p>Sin embargo a la hora de diseñar estas soluciones no todo es tan sencillo, con esto me estoy refiriendo al hecho de que nos encontramos en innumerables ocasiones con problemáticas empresariales que no son excesivamente complejas pero que sin embargo a la hora de trasladarlas a SharePoint, se convierten en un verdadero infierno.</p>
<p>Durante estos años que llevo trabajando con SharePoint, me he encontrado con multitud de casos en los que cosas que parecían relativamente sencillas por que el 80% del trabajo ya estaba hecho, funcionalidades que de por sí contempla SharePoint el 20% restante ha supuesto una cantidad de trabajo terrible. Donde ese 20% has supuesto una cantidad de tiempo y un coste tan elevado que es casi imposible de justificar.</p>
<p>Vamos a dejar al margen las ocasiones en que el diseño de una solución debe ser estrictamente fiel a un procedimiento empresarial, y debe reflejar de manera completa y exacta dicho procedimiento; en este punto la postura es clara; tendremos que hacer lo que sea para que la solución cumpla al 100% los requerimientos del procedimiento.</p>
<p>En el resto de ocasiones, tenemos la disyuntiva de hasta qué punto debemos ser flexibles en el desarrollo de la solución. Según mi experiencia debemos ser flexibles y agiles. </p>
<p>Muchos de estos procesos requieren que seamos agiles, no podemos esperar meses a tener una herramienta para poder gestionar eficazmente. A esto debemos añadir el hecho de que muchos de estos procesos están vivos, es decir se empieza haciendo cosas de una manera, y tras evaluaciones sucesivas del procedimiento así como de la experiencia que se va adquiriendo del uso del mismo, se va optimizando, suprimimos, añadimos y cambiamos pasos, información y flujos de la información. </p>
<p>Tenemos que contemplar el diseño como una negociación Win-to-Win, en donde todos ganamos por una parte tendremos que adaptar los requisitos o los procedimientos para que estos sin perder en esencia su objetivo sean los menores para no tener que realizar complejos sistemas para sustentarlos. De esta manera y solo de esta manera seremos capaces de diseñar sistemas cuyo ROI, sea positivo desde el comienzo.</p>
<p>En esta negociación, se deben poner sobre la mesa los requerimientos y los recursos de que disponemos para trasladar estos a la plataforma. </p>
<p>Un sencillo ejercicio de ponderación, donde valoramos los requisitos de modo que los que más valor aportan tendrán una puntuación más elevada y los que menos valor aportan una puntuación inferior y del mismo modo, evaluamos la complejidad que entrama desarrollar cada una de las partes del sistema, valorando en términos de tiempo, coste y complejidad cada uno de los pasos necesarios para cumplimentar dichos requisitos.</p>
<p>A través de un ejercicio de esta índole, debemos suprimir todo aquello que en esencia sea superfluo y buscar alternativas a aquellas partes del sistema que por su tiempo, coste o complejidad vayan a ser cuellos de botella tanto en el uso como en el desarrollo de las mismas.</p>
<p>Otro punto importante, es el de la rapidez; cuanto antes demos a nuestros usuarios una herramienta y algo básico con lo que trabajar empezaremos a recibir feedback que deberemos tener en cuenta, muchas de las propuestas del usuario final son imaginativas y creativas (y generalmente más baratas).</p>
<p>En muchas ocasiones esto conlleva exprimir lo que tenemos al máximo, más adelante siempre tendremos oportunidades de realizar esas complejas partes que harán de nuestra solución una solución perfecta.</p>
<p>En próximos posts me gustaría comentar algunas experiencias tanto mías como de algunos colegas sobre el diseño de soluciones con SharePoint. </p>
<p><b>Cualquier comentario o aportación será bienvenido.</b></p>
]]></content:encoded>
			<wfw:commentRss>http://oldblog.ideseg.com/2009/cuestiones-sobre-el-diseno-de-soluciones-en-sharepoint-1/feed</wfw:commentRss>
		<slash:comments>204</slash:comments>
		</item>
	</channel>
</rss>

