Skip to content

Mi defensa de tesis de Maestria..

Uffffff, aqui con la nueva noticia de que el viernes pasado fui a defender mi tesis a FIME (Facultad de Ingenieria Mecanica y Electrica de la Universidad Autonoma de Coahuila) en Monclova. Estuvo muy bien la verdad y estuve menos nervioso de lo que pense que estaria jejej, algo curioso fue que me dijeron que la presentacion duraria 25 min. solamente y que faltando 5 min. me harian una senial para apresurarme con la presentacion,

Empezo la presentacion y yo en espera de la senial pase por cada diapositiva explicando los temas que ya tenia preparados, al final la senial nunca llego y de hecho pense que habia hecho la presentacion muy breve y ni siquiera habia alcanzado los 25 min. de tiempo de la presentacion, procedimos a las preguntas y respuestas que tomarian 10 min. con los sinodales y al final quede asombrado al ver que habia pasado casi una hora y media desde el comienzo jajaj wow que rapido se habia ido el tiempo…

La verdad es una experiencia muy grata y generadora de algo de nervios y estres pues uno o por lo menos yo, no estaba acostumbrado a hacer presentaciones y hablar en publico por lo que siempre es algo raro cuando se hace, al final del dia resulte aprobado por los sinodales para obtener el grado de MAESTRIA EN INFORMATICA CON ESPECIALIDAD EN SISTEMAS DE INFORMACION, ahora solo continuar con el tramite del titulo y de mi cedula que no creo que tarde mucho en tener..

Saludos a mis sinodales, a mi asesor, mi familia, mi novia, amigos, todos los que estuvieron presentes y a todos mis maestros de esta maestria que tanto tiempo tarde en concluir.. :)

Una meta mas lograda, que seguira?? Si!! un PhD, ya estoy pensando en buscar una beca del Conacyt para un Doctorado en Ciencias.. a ver que pasa y que dicta el tiempo..

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Documento detallado sobre Stuxnet – Symantec..

No cabe duda que este virus no deja de fascinarme,

El departamento de respues de seguridad de Symantec ha publicado un documento con detalles sobre el funcionamiento de este virus en el cual se pueden encontrar todos los mecanismos y tecnicas de Stuxnet, me parecio bastante interesante el tenerlo y de hecho lo quise agregar al blog para tenerlo como referencia ya que algunas tecnicas que Stuxnet utiliza son vistas por primera vez en la historia,

Si quieres descargar y ver el documento aqui lo dejo.

W32.Stuxnet – Symantec

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Feliz cumpleaños Beeeeib!!!!

httpv://www.youtube.com/watch?v=_GYAzgn5_WI

Este post va dedicado muy especialmente para mi novia Briseida que cumple años hoy :) , la verdad tengo que agradecerte estos ultimos años que haz estado conmigo ya que he pasado momentos muy padres y experiencias inolvidables, hemos hecho de todo te agradezco que estes a mi lado, te AMO!

Deseo que pases un dia espectacular y feliz, F E L I C I D A D E S !!! te dedico esta cancion que tanto te gusta.

Contigo, quiero estar contigo
Y decirte que ya no puedo vivir sin ti
Contigo quiero ganar, contigo
Y conseguir que todo el tiempo sea estar junto a ti
Contigo, quiero estar contigo
Y decirte que ya no puedo vivir sin ti

Y sólo quiero vivir contigo
Y sólo quiero bailar contigo
Sólo quiero estar contigo
Y quiero ser lo que nunca he sido
Sólo quiero soñar contigo
Sólo voy a cantar contigo
Lo voy a hacer todo contigo
Ya ves, sé lo que me digo

Siento cuando estás, y tú me das tu voz con esa fuerza
Quiero oírte más tu voz gritar ese susurro loco

Contigo, quiero escuchar contigo
Esta canción que solamente habla de ti y de mi
Contigo, lo soy todo contigo
Me haces falta y ya no puedo vivir sin ti

Contigo, quiero estar contigo
Y decirte que ya no puedo vivir sin ti

Siento cuando estás, y tú me das tu voz con esa fuerza
Quiero oírte más tu voz gritar

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Siemens, PlC’s, SCADAS, Stuxnet, Rootkits – Solo el principio???

Navegando como de costumbre por mis feeds (Que por cierto tenia un tiempo que no navegaba), me encontre una noticia que me parecio bastante interesante para compartir,

Resulta que ha salido un nuevo virus bastante sofisticado e interesante llamado Stuxnet, me encontre con este articulo donde describen a alto nivel lo que este virus es capaz de hacer.

Al parecer este virus es el primero en su tipo y afecta principalmente a sistemas industriales, utiliza una vulnerabilidad de windows (No sabia que tenia :) ) para progragarse mayoritariamente por medio de memorias USB’s entre algunas otras tecnicas, hasta el momento afecta directamente a los systemas SCADA de Siemens, una vez infectada una PC utiliza los password default de siemens para tratar de tomar el control de los sistemas que corren WINCC y PCS7 de siemens tambien llamados PLC’s.

El virus sube a un servidor informacion de la PC infectada y abren una puerta trasera para dar a los atacantes el control sobre dispositivos owneados, asi como la posibilidad de enviar codigo que sera implantado en los PLC’s, y esto que significa? pues nada, que si el atacante quiere, puede hacer que un monton de maquinas dejen de funcionar o hagan cosas que ellos quieran hacer, imaginate tener el control de todas las maquinas que construyen aviones, plantas nucleares, o las maquinas militares??, esta de pensarse no??.

Al parecer tambien implanta un rootkit en los PLC’s (Cosa nunca antes vista) para de esta forma ocultar los comandos maliciosos enviados por los atacantes, y un rootkit en windows para esconder los componentes binarios de los que se constituye, y no conforme con eso tambien firma sus archivos con certificados robados de terceras compañias que no tienen relacion con esta worm,

Estas son solo algunas tecnicas dadas a conocer en publico ya que el analisis completo del cifrado del virus todavia no se publica pero con esto se puede ver el nivel de sofisticacion de esta nuevo tipo de virus donde las maquinas y los procesos fisicos podran ser owneados por los hackers creadores de estas obras de arte.

Algunas casas antivirus piensan que por el grado de complejidad del codigo podria tratarse de naciones enteras conspirando para robar informacion intelectual avanzada de los procesos industriales de las grandes compañias pero esto claro solo son especulaciones..

Alguna vez me puse a pensar si seria posible hacer algo asi pero crei que estaba loco y era demasiado complejo, ahora, solo de pensarlo con esta noticia parece un sueño hecho realidad en donde la realidad supera la ficcion..

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Wizard..

Hace poco buscando informacion en algunos foros y por toda la web, me encontre con un mensaje de un tipo dando una posible respuesta  a una pregunta que se hizo en un foro, lo que me llamo la atencion fue su firma y de hecho me parecio muy divertida y cool, tanto que quise grabarla aqui el el blog, aqui les dejo la firma del tipo..

A while ago he asked me what he should have printed on my business cards. I said ‘Wizard’.
I read books which nobody else understand. Then I do something which nobody understands. After that the computer does something which nobody understands. When asked, I say things about the results which nobody understand. But everybody expects miracles from me on a regular basis. Looks to me like the classical definition of a wizard.

wiz·ard: A man who has magical powers, esp. in legends and fairy tales

Saludos! :)
YR

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Flash en pantalla completa en monitores extendidos

Ultimamente he tenido la costumbre de ver muchos webcast o video postcast o peliculas o documentales o video tutoriales y todo tipo de videos que se pueden conseguir en la red asi como youtube y otros sitios de video, siempre habia tenido un problema de que cuando utilizas monitores alternos para ver algun video flash o streaming en pantalla completa automaticamente vuelve al tamanio original al momento de perder el foco por lo que es muy dificil estar viendo un video en pantalla completa y al mismo tiempo trabajando en el otro monitor, una pequenia busqueda con mi amigo google me dijo que al parecer la gente de flash no contemplo o no le parecio correcto el comportamiento de mantener la pantalla completa en el momento de perder el focus,

Las buenas noticias fueron de que no era ni remotamente la unica persona con este problema que mas que un problema era lo molesto de tener que ver el video en tamanio original o utilizar algun tipo de zoom integrado en los navegadores o todo tipo de trucos, bueno, lo primero que encontre fue que alguien habia parchado una dll de flash y logrado suprimir este molesto comportamiento por default en el siguiente enlace:

http://my.opera.com/d.i.z./blog/2009/04/22/watch-fullscreen-flash-while-working-on-another-screen Flash has annoying habit of closing fullscreen mode whenever “anything” happens. Like when wind blows through the window or there is an earthquake on another continent. No seriously, it closes whenever it looses focus. But that is still too sensitive. So here is a version of flash plugin that does not do that. It’s version 10.0.22.87 (latest at this time) with one byte changed (compare with original if you don’t believe me.

Excelente! ya solo era cuestion de descargar la dll parchada y remmplazarla en mi instalacion de flash y todo funcionaria de maravilla, boom! no tan sencillo como eso, cuando me di cuenta que la dll descargada no era compatible con mi version de falsh ya que yo tengo la version 10,1,53,64 y como podemos ver la dll era para versiones 10.0… etc. :( triste situacion, bueno pues como ya no queria batallar con el comportamiento del mendigo flash pues segui mi busqueda del famoso parche para corregir este comportamiento lo que me llevo a la segunda pagina de contenido:

http://bramp.net/blog/full-screen-hack-for-flash

On win32 open
C:\Windows\System32\Macromed\Flash\NPSWF32.dll
On win64 open
C:\Windows\SysWOW64\Macromed\Flash\NPSWF32.dllor if using Google Chrome (as Chrome now comes with the Flash plugin) open
C:\Users\Andrew\AppData\Local\Google\Chrome\Application\6.0.408.1\gcswf32.dll
or if using Google Chrome on Windows XP:
C:\Documents and Settings\Andrew\Local Settings\Application Data\Google\Chrome\Application\6.0.408.1

On version 10.1.53.38
Jump to offset
0×180227 and change bytes 74 2A to 90 90, and voila.

On version 10.1.53.55
Jump to offset
0×180410 and change bytes 74 39 to 90 90, and voila.

On version 10.1.53.64 (Chrome version)
Jump to offset
0×180753 and change bytes 74 39 to 90 90, and voila.

On version 10.1.53.64 (Normal version thanks Medlir)
Jump to offset
0x180A15 and change bytes 74 39 to 90 90, and voila.

Note this method is unsupported, and will most likely break when Flash gets updated again. It is always a good idea to backup any file first, and make sure you are on the same version as me.

For the curious this changes some code that looks like this:

if (msg == WM_KILLFOCUS)
  jump to kill_focus
if (msg == WM_PAINT)
  jump to paint

to

if (msg == WM_KILLFOCUS)
  nop nop
if (msg == WM_PAINT)
  jump to paint

and for some context the version 10.1.53.64 surrounding code looked like this:

74 39 83 E8 07 74 11 83 E8 05 75 13 8B

The 74s and 75 should be the same between versions, but all the other bytes might change.

Excelente! ahora si habia encontrado no un parche sino algo todavia mejor, los pasos para parchar tu dll del flash dependiendo de la version y de esa forma suprimir el comportamiento ya descrito, bueno busque un poco de mas informacion sobre el tema y me tope con un foro el cual describia un procedimiento de hacer el parchado siguiendo los pasos del post descrito arriba por lo que decidi aguegarlo aqui al blog y sumarle algunos screenshots para hacer el proceso accesible para cualquier persona ya que al final resulta sencillo seguir los pasos necesarios.

1. Lo primero que tenemos que hacer es checar nuestra version de flash la que puedes checar en el siguiente enlace http://www.adobe.com/software/flash/about/ el cual te proporcionara un cuadro como se muestra a continuacion con la version de tu flash

2. De acuerdo a la version de tu flash y al plugin que quieras parchar selecciona el path del post de arriba, en mi caso queria parchar el plugin de chrome por lo que la dll se encontraria en un path similar al C:\Documents and Settings\[Usuario]\Local Settings\Application Data\Google\Chrome\Application\[Version de Chrome]\


3. Una vez localizado el path en donde se encuentra la dll a parchar y sabiendo de antemano que el nombre de la dll es gcswf32.dll necesitamos un editor hexadecimal para hacer la modificacion necesaria como no lo indican los pasos arriba

4. El paso siguiente es instalar un editor para la dll yo utilice por recomendacion del foro el Hex Editor XVI32 el cual es freeware y puedes descargar de el siguiente enlace

5. A continuacion proseguimos a instalar el XVI32 Hex Editor y abrir la dll que ya tenemos identificada utilizando la opcion File->Open.. del editor como se muestra a continuacion:

6. Una vez abierta la dll y como lo dice en los pasos del post original nos vamos a la opcion de buscar en nuestro hex editor o simplemente le damos Ctr+F para desplegar el cuadro de dialogo de buscar para despues de eso teclear la siguiente cadena que se nos especifica en los pasos originales: 74 39 83 E8 07 74 11 83 E8 05 75 13 8B y presionamos el boton OK para realizar la busquda como se muestra a continuacion:

7. Despues de la busqueda nos aparecera seleccionado el registro que andamos buscando

8. Y ahora por ultimo tenemos que cambiar los bytes 74 y 39 que aparecen al inicio por 90 y 90 respectivamente, para hacer esto es muy sencillo, seleccionamos la casilla a modificar y nos vamos al menu Edit->Overwrite String->Hex String y tecleamos 90 y damos OK y para la siguiente casilla hacemos los mismo como se muestra a continuacion:

9. Por ultimo guardamos nuestro archivo modificado, es recomendable conservar el archivo dll original y hacer todos estos cambios en una copia del mismo de esta forma si algo no va bien solo restauramos el archivo original y no pasa nada :) .

Al final del dia logre tener mi monitor extendido corriendo el plugin de flash en pantalla completa sin importar si sigo trabajando en la PC, y todo esto gracias a la web, a la gente que hace posible tener este tipo de procedimientos de parchado y a las ganas interminables de encontrar cosas interesantes por resolver..

Este post se extendio un poco pues quise tener registrados los pasos a seguir para lograr modificar el comportamiento del flash y aparte para poderlo compartir con la gente que le interesase, aunque todos estos pasos de hecho ya estaban documentados lo unico que hice fue anadir descripciones mas amplias e imagenes al proceso para hacerlo mas amigable para usuarios que no estan tan relacionados con este tipo de cambios..

Salduos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Jauria Riders..


Bueno esta tarde andando en la calle por los rumbos de mi casa aca en hermosillo me toco ver a un miembro de la jauria riders y por suerte mi novia saco una foto muy chida de este tipo tan personalizado de motocicleta lo que se me hizo algo extraño y raro por que a mi gusto esta demasiado alta para manejar ajajaj bueno solo quise compartir la foto salio muy bien para ser del cel y desde dentro del coche…

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Yohan vs Alexjcaballero

Tenia tiempo de no publicar un juego de ajedrez pero precisamente este fin de semana estaba como de costumbre echandome una partidita de ajedrez online, mi asombro fue cuando buscando una partida alguien que tenia un rating de 1935 en chessbase acepto la partida, yo siempre he sido un jugador empirico a excepcion de el taller que tomamos yo y mi novia Bris cuando vino el gran maestro cubano Juan Carlos Gonzalez (naturalizado mexicano) aqui a Hermosillo lo cual me dio un panorama mucho mas amplio de lo que es una partida de ajedrez,

Creo que parte del exito de esta partida lo debo a eso, pues aqui dejo la partida y cualquier comentario es bienvenido,
Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Caliburn y Silverlight ejemplo sencillo..

Estos ultimos dias he estado checando Caliburn (MVVM framework) debido a la posibilidad de trabajar con el en un futuro cercano, asi que he decidido postear un muy parecido ejemplo al que publique hace poco donde trabajaban un expander y un splitter de manera conjunta, ahora como estoy utilizando Silverlight pues voy a deberles el expander ya que al parecer ese control no es soportado por esta tecnologia :( tal vez en el Silverlight Toolkit venga uno pero ese sera un tema para despues..

Caliburn me ha dejado impresionado con la cantidad de cosas que puedes hacer con tan poco codigo debido a la manera que esta diseniado el framework practicamente te permite enlazar controles y eventos y un monton de cosas que hace por ti detras del telon, lo unico malo es que la documentacion no es muy extensa y no existen tantas aplicaciones como ejemplo o quickstarts (como PRISM por ejemplo) asi que habra que contribuir con un granito de arena en la promocion de este excelente framework.

Bueno para empezar debemos crear un nuevo proyecto de tipo Silverlight, yo estoy utilizando el VS2010 y el Silverlight 4 que es una instalacion separada, una vez creado este proyecto y configurado automaticamente por Visual Studio removemos el control MainWindow.xaml y lo reemplazamos por ShellView.xaml que sera nuestro contenedor de contenido, a continuacion lo configuramos de la siguiente manera en el App.xaml principal para soportar Caliburn,

App.xaml

<am:CaliburnApplication
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:am="clr-namespace:Caliburn.PresentationFramework.ApplicationModel;assembly=Caliburn.PresentationFramework"
    x:Class="ExpanderAndSplitter.Caliburn.App">

    <!--This is a caliburn application -->
    <Application.Resources>
    </Application.Resources>
</am:CaliburnApplication>

Y a continuacion modificamos el code behind para que derive de la clase CaliburnApplication,
App.xaml.cs

using ExpanderAndSplitter.Caliburn.ViewModels;
using Caliburn.PresentationFramework.ApplicationModel;

namespace ExpanderAndSplitter.Caliburn
{
     public partial class App :  CaliburnApplication
    {

        public App()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Creating the root view model of the app, the shell
        /// </summary>
        /// <returns>Root view model (shell)</returns>
        protected override object CreateRootModel()
        {
            return new ShellViewModel();
        }

     }
}

En los pasos anteriores definimos la applicacion como un applicacion Caliburn y a continuacion hacemos Override al CreatRootModel() donde le diremos a Caliburn cual es el objeto de la vista que queremos como Root object o sea como contenedor principal de la aplicacion, cabe mencionar que caliburn es orientado a modelos y majena mucho el concepto de convenciones por lo que el framework detras del telon hara una serie de comprobaciones para ubicar la vista que pertenece al “ViewModel” que especificamos como contenedor principal en el Override por lo que no tendremos que hacer nada especial para que la vista de tal modelo este bindeada al modelo, MAGIA PURA!!!

ShellViewModel.cs

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Caliburn.Core;
using System.Collections.ObjectModel;
using ExpanderAndSplitter.Caliburn.Models;

namespace ExpanderAndSplitter.Caliburn.ViewModels
{
    public class ShellViewModel : PropertyChangedBase
    {

        #region Fields

        private GridLength _masterRowHeight = new GridLength(1, GridUnitType.Star);
        private GridLength _splitterRowHeight = new GridLength(0);
        private GridLength _detailRowHeight = new GridLength(1, GridUnitType.Auto);

        public ObservableCollection<ItemViewModel> _masterItems = null;
        public ObservableCollection<ItemViewModel> _detailItems = null;

        #endregion // Fields

        public ShellViewModel()
        {
            MasterRowHeight = new GridLength(1, GridUnitType.Star);
            SplitterRowHeight = new GridLength(20);
            DetailRowHeight = new GridLength(1, GridUnitType.Star);

            MasterItems = new ObservableCollection<ItemViewModel>();
            DetailItems = new ObservableCollection<ItemViewModel>();

            for (int i = 0; i < 1000; i++)
            {
                ItemModel masterIM = new ItemModel("Master Item Dummy " + i.ToString(), i.ToString());
                ItemModel detailIM = new ItemModel("Detail Item Dummy " + i.ToString(), i.ToString());

                ItemViewModel masterIVM = new ItemViewModel(masterIM);
                ItemViewModel detailIVM = new ItemViewModel(detailIM);

                MasterItems.Add(masterIVM);
                DetailItems.Add(detailIVM);
            }

        }

        #region Properties

        public GridLength MasterRowHeight
        {
            get { return _masterRowHeight; }
            set
            {
                _masterRowHeight = value;
                NotifyOfPropertyChange("MasterRowHeight");
            }
        }

        public GridLength SplitterRowHeight
        {
            get { return _splitterRowHeight; }
            set
            {
                _splitterRowHeight = value;
                NotifyOfPropertyChange("SplitterRowHeight");
            }
        }

        public GridLength DetailRowHeight
        {
            get { return _detailRowHeight; }
            set
            {
                _detailRowHeight = value;
                NotifyOfPropertyChange("DetailRowHeight");
            }
        }

        public ObservableCollection<ItemViewModel> MasterItems
        {
            get { return _masterItems; }
            set
            {
                _masterItems = value;
                NotifyOfPropertyChange("MasterItems");
            }
        }

        public ObservableCollection<ItemViewModel> DetailItems
        {
            get { return _detailItems; }
            set
            {
                _detailItems = value;
                NotifyOfPropertyChange("DetailItems");
            }
        }

        #endregion // Properties

    }
}

Siguiendo las convenciones definidas por el framework por default sabemos que las vistas deberan estar situadas en una carpeta llamada Views, los ViewModels al igual deberan estar en su carpeta llamada ViewModels, siendo todo esto configurable, ademas con el codigo fuente podemos definir nuestras propias convenciones :)

ShellView.xaml

<UserControl x:Class="ExpanderAndSplitter.Caliburn.Views.ShellView"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="MainContainer" Margin="5,5,5,5" VerticalAlignment="Stretch"
          HorizontalAlignment="Stretch" Background="Transparent">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <sdk:Label x:Name="DummyLabel" Content="Dummy Label" />
        <ComboBox x:Name="DummyComboBox" Grid.Column="1" MinWidth="100"
                      Margin="0,0,5,0"/>

        <Button Grid.Column="2" Width="100" Content="Dummy Button" />
        <sdk:Label x:Name="Label" Content="Dummy Label 2" Grid.Column="4" HorizontalAlignment="Right" />

        <Grid Grid.Row="1" Grid.ColumnSpan="5" Margin="0,5,0,0"
              VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Transparent">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition x:Name="MasterRow" Height="{Binding MasterRowHeight, Mode=TwoWay}" />
                <RowDefinition x:Name="SplitterRow" Height="{Binding SplitterRowHeight, Mode=TwoWay}" />
                <RowDefinition x:Name="DetailRow" Height="{Binding DetailRowHeight, Mode=TwoWay}" />
            </Grid.RowDefinitions>

            <Grid Background="Transparent">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <sdk:DataGrid x:Name="MasterGrid"
                            AutoGenerateColumns="False"
                            ColumnWidth="*"
                            HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                            ItemsSource="{Binding MasterItems}">

                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Binding="{Binding Path=Name}" Header="Master Name" />
                        <sdk:DataGridTextColumn Binding="{Binding Path=ID}" Header="ID" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>
            </Grid>

            <sdk:GridSplitter Grid.Row="1" Background="Gray"
                              BorderThickness="1,1,1,1" Width="Auto" HorizontalAlignment="Stretch"
                              Height="6" VerticalContentAlignment="Top"
                              Padding="0,0,0,0" Margin="5,0,5,0" VerticalAlignment="Center"/>

            <Grid Background="Transparent" Grid.Row="2" Margin="0,5,0,0" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <sdk:DataGrid x:Name="DetailGrid"
                            AutoGenerateColumns="False"
                            ColumnWidth="*"
                            HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                            ItemsSource="{Binding DetailItems}">

                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Binding="{Binding Path=Name}" Header="Detail Name" />
                        <sdk:DataGridTextColumn Binding="{Binding Path=ID}" Header="ID" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>
            </Grid>
        </Grid>
    </Grid>
</UserControl>

ItemModel.cs

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace ExpanderAndSplitter.Caliburn.Models
{
    public class ItemModel
    {

        public ItemModel(string name, string id)
        {
            this.Name = name;
            this.ID = id;
        }

        public string Name
        {
            get;
            set;
        }

        public string ID
        {
            get;
            set;
        }

    }
}

Al final la aplicacion luce casi igual que la del post pasado solo que utilizando Caliburn y Silverlight y a excepcion que no se tuvo que utilizar codigo para especificar la relacion entre vista y view model ya que caliburn se encarga de todo esto y muchisimo mas.

Mas adelante si tengo tiempo publicare algo relacionado con los Comandos, Triggers, Efectos y un monton de cosas que puedes aprovechar con caliburn de una manera sencilla, espero les haya gustado y no duden en dejar un comentario pues tal vez hize algo mal ya que apenas son mis inicios con Caliburn.

Puedes bajar el codigo fuente completo y el proyecto del siguiente enlace:  ExpanderAndSplitter.Caliburn

Saludos!
YR

Post to Twitter Post to Delicious Post to Facebook Send Gmail

WPF Expander y Splitter trabajando juntos..

Bueno aqui dejo publicado la solucion de un problemita que recientemente tuve haciendo que funcionarian juntos un Expander y un splitter bueno la meta final era tener 2 expanders separados por 1 splitter y que cada expander contuviera algun tipo de grids o incluso una vista con este aproach ya se puede jugar con lo que uno quiera poner en cada region,

Yo anduve buscando algo similar y no pude encontrar mucho al respecto asi que aqui dejo mi solucion y espero que a alguien pueda servirle..

Aqui tenemos el XAML con el codigo que contiene al expander y al splitter o mas bien dos expander conteniendo un grid cada uno separados por un splitter..

<window x:Class="ExpanderAndSplitter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="MainWdw">

    <grid x:Name="MainContainer" Loaded="MainContainer_Loaded" Margin="5,5,5,5" VerticalAlignment="Stretch"
          HorizontalAlignment="Stretch" Background="Transparent">
        </grid><grid .ColumnDefinitions>
            <columndefinition Width="Auto" />
            <columndefinition Width="Auto" />
            <columndefinition Width="Auto" />
            <columndefinition Width="*" />
            <columndefinition Width="Auto" />
        </grid>
        <grid .RowDefinitions>
            <rowdefinition Height="Auto"/>
            <rowdefinition Height="*"/>
        </grid>

        <label x:Name="DummyLabel" Content="Dummy Label" />
        <combobox x:Name="DummyComboBox" Grid.Column="1" MinWidth="100"
                      Margin="0,0,5,0"/>

        <button Grid.Column="2" Width="100" Content="Dummy Button" />
        <label x:Name="Label" Content="Dummy Label 2" Grid.Column="4" HorizontalAlignment="Right" />

        <grid Grid.Row="1" Grid.ColumnSpan="5"
              VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Transparent">
            </grid><grid .ColumnDefinitions>
                <columndefinition />
            </grid>
            <grid .RowDefinitions>
                <rowdefinition x:Name="MasterRow" Height="{Binding MasterRowHeight, Mode=TwoWay}" />
                <rowdefinition x:Name="SplitterRow" Height="{Binding SplitterRowHeight, Mode=TwoWay}" />
                <rowdefinition x:Name="DetailRow" Height="{Binding DetailRowHeight, Mode=TwoWay}" />
            </grid>

            <expander x:Name="MasterExpander" IsExpanded="True"
                      BorderBrush="Gray" Margin="0,5,0,0"
                      BorderThickness="1"  IsEnabled="True"
                      ExpandDirection="Down" Background="Transparent"
                      Expanded="MasterExpander_Expanded"
                      Collapsed="MasterExpander_Collapsed" >
                </expander><expander .Header>
                    <textblock FontWeight="Bold" Text="Master Region" />
                </expander>

                <grid Background="Transparent">
                    </grid><grid .ColumnDefinitions>
                        <columndefinition Width="*" />
                    </grid>
                    <grid .RowDefinitions>
                        <rowdefinition Height="*"/>
                    </grid>

                    <datagrid x:Name="MasterGrid"
                              Loaded="MasterGrid_Loaded"
                              AutoGenerateColumns="True"
                              CanUserDeleteRows="False"
                              ColumnWidth="*"
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

            <gridsplitter Grid.Row="1" Background="Gray"
                      BorderThickness="1,1,1,1" Width="Auto" HorizontalAlignment="Stretch"
                      Height="6" VerticalContentAlignment="Top"
                      Padding="0,0,0,0" Margin="5,0,5,0" VerticalAlignment="Center"/>

            <expander x:Name="DetailExpander" Grid.Row="2" Margin="0,5,0,0"
                      BorderBrush="Gray" BorderThickness="1"  IsEnabled="True"
                      ExpandDirection="Down" Background="Transparent"
                      Expanded="DetailExpander_Expanded"
                      Collapsed="DetailExpander_Collapsed" >
                </expander><expander .Header>
                    <textblock FontWeight="Bold" Text="Detail Region" />
                </expander>

                <grid Background="Transparent">
                    </grid><grid .ColumnDefinitions>
                        <columndefinition Width="*" />
                    </grid>
                    <grid .RowDefinitions>
                        <rowdefinition Height="*"/>
                    </grid>

                    <datagrid x:Name="DetailGrid"
                              Loaded="DetailGrid_Loaded"
                              AutoGenerateColumns="True"
                              CanUserDeleteRows="False"
                              ColumnWidth="*"
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

</window>

Y su respectivo code behind que se encarga de hacer las operaciones correspondientes de tamanio para que estos controles funcionen armoniosamente uno con el otro..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace ExpanderAndSplitter
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        #region Fields

        private static double _oldMasterHeight = 1;
        private static double _oldDetailHeight = 1;

        #endregion // Fields

        #region Properties

        public GridLength MasterRowHeight
        {
            get { return (GridLength)GetValue(MasterRowHeightProperty); }
            set { SetValue(MasterRowHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MasterRowHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MasterRowHeightProperty =
            DependencyProperty.Register("MasterRowHeight", typeof(GridLength), typeof(MainWindow), new UIPropertyMetadata(new GridLength(1, GridUnitType.Star)));

        public GridLength SplitterRowHeight
        {
            get { return (GridLength)GetValue(SplitterRowHeightProperty); }
            set { SetValue(SplitterRowHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SplitterRowHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SplitterRowHeightProperty =
            DependencyProperty.Register("SplitterRowHeight", typeof(GridLength), typeof(MainWindow), new UIPropertyMetadata(new GridLength(0)));

        public GridLength DetailRowHeight
        {
            get { return (GridLength)GetValue(DetailRowHeightProperty); }
            set { SetValue(DetailRowHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for DetailRowHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DetailRowHeightProperty =
            DependencyProperty.Register("DetailRowHeight", typeof(GridLength), typeof(MainWindow), new UIPropertyMetadata(new GridLength(1, GridUnitType.Auto)));

        public ObservableCollection<DummyItem> MasterItems
        {
            get;
            set;
        }

        public ObservableCollection<DummyItem> DetailItems
        {
            get;
            set;
        }

        #endregion // Properties

        #region Constructors

        public MainWindow()
        {
            InitializeComponent();

            MasterItems = new ObservableCollection<DummyItem>();
            DetailItems = new ObservableCollection<DummyItem>();

            for (int i=0; i<1000; i++)
            {
                MasterItems.Add(new DummyItem("Master Dummy " + i.ToString(), i.ToString()));
                DetailItems.Add(new DummyItem("Detail Dummy " + i.ToString(), i.ToString()));
            }
        }

        #endregion // Constructors

        #region Events

        private void MasterExpander_Expanded(object sender, RoutedEventArgs e)
        {
            DoHandleExpandCollapse();
        }

        private void MasterExpander_Collapsed(object sender, RoutedEventArgs e)
        {
            if (DetailExpander.IsExpanded)
            {
                _oldMasterHeight = MasterRowHeight.Value;
                _oldDetailHeight = DetailRowHeight.Value;
            }
            DoHandleExpandCollapse();
        }

        private void DetailExpander_Expanded(object sender, RoutedEventArgs e)
        {
            DoHandleExpandCollapse();
        }

        private void DetailExpander_Collapsed(object sender, RoutedEventArgs e)
        {
            if (MasterExpander.IsExpanded)
            {
                _oldMasterHeight = MasterRowHeight.Value;
                _oldDetailHeight = DetailRowHeight.Value;
            }
            DoHandleExpandCollapse();
        }

        private void MasterGrid_Loaded(object sender, RoutedEventArgs e)
        {
            if (MasterGrid.ItemsSource == null)
                MasterGrid.ItemsSource = MasterItems;
        }

        private void DetailGrid_Loaded(object sender, RoutedEventArgs e)
        {
            if (DetailGrid.ItemsSource == null)
                DetailGrid.ItemsSource = DetailItems;
        }

        private void MainContainer_Loaded(object sender, RoutedEventArgs e)
        {
            MainContainer.DataContext = this;
        }

        #endregion // Events

        #region Helpers

        private void DoHandleExpandCollapse()
        {
            if (MasterExpander == null || DetailExpander == null)
                return;

            SplitterRowHeight = new GridLength(0);
            if (MasterExpander.IsExpanded && DetailExpander.IsExpanded)
            {
                MasterRowHeight = new GridLength(_oldMasterHeight, GridUnitType.Star);
                DetailRowHeight = new GridLength(_oldDetailHeight, GridUnitType.Star);
                SplitterRowHeight = new GridLength(20);
                return;
            }

            if (MasterExpander.IsExpanded)
                MasterRowHeight = new GridLength(1, GridUnitType.Star);
            else
                MasterRowHeight = new GridLength(1, GridUnitType.Auto);

            if (DetailExpander.IsExpanded)
                DetailRowHeight = new GridLength(1, GridUnitType.Star);
            else
                DetailRowHeight = new GridLength(1, GridUnitType.Auto);
        }

        #endregion // Helpers

    }

    public class DummyItem
    {
        public DummyItem(string name, string id)
        {
            this.Name = name;
            this.ID = id;
        }
        public string Name
        {
            get;
            set;
        }
        public string ID
        {
            get;
            set;
        }
    }
}

Al final asi es como luce la solucion:

La solucion ejemplo esta hecha con Visual Studio 2010 y el codigo fuente lo puedes bajar del siguiente link ExpanderAndSplitter.

Enjoy! :)
Yohan Rodriguez

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Envío de Lifeblog

mié 09/06/2010 20:10 de UNONOTICIAS (SMS):

ASEGURA MARINA 20 KG DE EXPLOSIVO C-4 EN EL DF/AVALA CORTE AMPARO DE COCA CONTRA CFC/MEXICO CONDECORA A MANDELA/RICKY MARTIN SERA EL CHE EN BROADWAY.

No manches como que será el che ese wey!

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Foto de la comer :)

vie 28/05/2010 13:26

Viendo que se pude bajar para ver el fin de semana..

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Mi Cumpleaños, Que Regalo!! :)

Bueno este post es para agradecer a mi Beib el tremendo regalo que me hizo en mi cumpleanios el 18 de diciembre, la verdad me la pase de lo mejor,

En la foto estoy con mi cara de sorpresa al ver que cuando llego a la sala esta lleno todo alrededor de velas con una mesa de centro servida con platos, velas, una botella de vino tinto, unas copas, en medio una rosa y un regalo en una cajita, la verdad me causo una impresion porque es exactamente lo que me hubiera gustado recibir de regalo y la verdad que excedio mis expectativas yo nunca espere nada de esto, Gracias! :D

Entonces quiero agradecer de nuevo a ti Bris y compartir estas fotos para presumir que recibi el mejor regalo que alguien hubiera podido desear, gracias por todo! Love u! :)

[flickr album=72157623058941518 num=23 size=Square]

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Musica para Chambear..

Si al igual que yo tu eres de las personas que gusta de escuchar musica mientras trabaja (no siempre) y estas en busca de canciones y generos musicales que aunque parezca raro podrian ayudar a estimular tu cerebro y pensar con mas claridad  (y no estoy loco ehh)

Entoces aqui les dejo una listita de musica que me estuve escuchando el dia de hoy y que me ha dejado con la boca abierta, son generos entre trance sicodelico y musica progresiva, bastante estimulante (para mi por lo menos) podrias tratar de escuchar algo asi, estos ultimos dias he tenido tanta, tanta, tanta, tanta musica que escuchar que parece imposible lograr oirla toda bueno en fin habra que buscar tiempo, tiempo hay siempre para todo si sabes administrarlo..

Saludos Musicales..

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Tengo una lentium!!

Pues ya no se la verdad si ha sido tanto programa que se le ha instalado a mi PC o sera que le falta agregarle memoria y mas recursos bueno el caso es que esta pc se ha vuelto muuuuy lenta y creo que tendre que tomarme un tiempo para optimizarla a veces tengo que tener 2 o 3 instancias del Visual Studio cada una con soluciones de mas de 50 proyectos asi que tal vez sea eso,

Creo que tendre que investigar algun buen software de optimizacion por que es un infierno tener que estar esperando a que termine de procesar bueno ni modo :(

Luego publicare mi solucion.. Saludos!

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Maldito Spam!!

Ya tenia un buen que no posteaba nada y es que la verdad he andado muy ocupado con mucha chamba en el trabajo y pss no me habia dado mucho tiempo, de todos modos tratare de postear mas seguido tengo muchas fotos que he querido subir y no he tenido tiempo en fin..

Bueno, esta imagen es de un correo que deje de checar como unas 2 semanas masomenos pero es increible la cantidad de spam que puede llegarte si no tienes un filtro adecuado, en esta imagen se muestran 1945 correos recibidos de los cuales NINGUNO de ellos! es rescatable! maldito spam! que molesto es recibir esta cantidad de correos basura para alguien que piensa en el correo como una herramienta esencial e indispensable.

Saludos! :D

pd. y eso que no ando publicando ese correo en todos lados.

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Waveando con mi compa el otto!

Buenos pues primero que nada agradecer a mi compa el otto el que me haya enviado una invitacion para google WAVE y tambien por pasarme el tip de como twettear desde un wave, pues he estado viendo el preview y la verdad es que me tiene impresionado lo que se puede hacer con WAVE en tiempo real y creo que se convertira en una plataforma de comunicacion primordial con la que se puede comodamente trabajar en linea y colaborar,

De nuevo estos de google no dejar de sorprender, quisiera en un tiempo libra ver las herramientas de desarrollo para wave tal vez podamos hacer algo divertido en esa area, por ahora pues seguiremos checando la documentacion y disfrutando de esta nueva herramienta que promete bastante!

Un saludo! a todos y a mi compa el Otto gracias de nuevo!

Lets WAVE!!! :D

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Hay que correr el riesgo…

Aqui dejo una muestra de mi estilo particular de juego, la mayoria los pierdo jajaja, pero pienso pulirlo, asi tal vez algun dia mejore mi juego, o me toque otro pichon jajaja…
Saludos!…

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Alguien quiere una Windows 7 Whopper?

Jajajaj pues que risa me dio al ver esta imagen de una supuesta hamburguesa de 7 carnes pero mas risa me dio que de hecho Burguer King la esta vendiendo como parte de su menu en Japon pues la verdad que es una estrategia de mercadotecnia bastante buena pues he visto promocion por todo internet sin contar que yo mismo la estoy dando jajaj lastima que todavia no haya aqui pero cuando llegue lo mas seguro es que pida una

Saludos!

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Yohan vs Chessmaster Movil

Post to Twitter Post to Delicious Post to Facebook Send Gmail