viernes, 11 de marzo de 2016

USB compatible con Mac y Windows

Si eres como yo que usa Mac y Windows, o sólo Mac pero los demás usan Windows, te habrás topado con la necesidad de hacer que sean compatibles pues si la formateas en los formatos comunes de Mac no puede ser leída en Windows y te pedirá formatear o en el caso contrario si es Fat no podrás escribir archivos grandes o si es NTFS sólo podrás leer en Mac pero no escribir.

La solución sencilla a esto es formatearlo con el formato exFat para generar una compatibilidad pero debes saber que tienes que hacerlo desde una máquina Windows ya que si lo haces en una Mac es muy posible que el problema persista así que si es tu caso o estás estrenando USB dale ese formato primero en una Windows y comprueba la compatibilidad en una Mac.

¿Cuándo se llevarán bien estos tipos?

RIP Jobs.

jueves, 10 de marzo de 2016

No se ha podido verificar esta copia de la aplicación Instalar OS X El Capitan.


<<La solución está al final del post pero te recomiendo leer todo por si te ha pasado lo mismo que a mí>>

Pues tengo una Macbook Mid 2012 común y corriente y desde que la quise actualizar a Mavericks me dio algunos problemas.

Se bajaba todo normal desde la tienda y al instalar daba muchos errores. La libré muchas veces haciendo algunas  magias pero ahora pasa que se alenta por algunos ratos. Se pasma, se congela, lo que sea, procesa algunas cosas y después reacciona y sigue como si nada. De repente le pasa de nuevo y después se le quita. Eso sucede unos meses después de formatear.

Al principio creí que era por la memoria RAM que de fábrica son 4Gb y la verdad es que no debiera pasarle pero como uso algunos programas pesados pues pensé que podría ser eso así que decidí comprar 8Gb para expandir pero siguió haciendo lo mismo. Me temo que sea el disco duro pero igual afortunadamente no me da tantos problemas y siempre ando respaldando archivos para evitar desgracias.

Lo que estaba pasando últimamente era que todos los programas "se cerraban de manera inesperada". Al inicio eran los de Adobe y lo atribuía a su procedencia pero al final lo hizo con todos así que decidí formatear.

Ya tenía guardada en aplicaciones una copia de "El Capitan" por lo que procedí hacer una USB booteable con #DiskMakerX (que la verdad sí funciona y no es mentira como esa basura de #TransMac muy inservible que claro, es para hacerlo en Windows), la reconoce automáticamente y todo bien.

Siguiendo los pasos recomendados primero debes borrar de manera superficial (pues existen varias profundidades de borrado) y después pasas a la memoria para instalar. Todo normal hasta que esta pantalla salió a dar batalla:

:(




Lo intenté de nuevo, después reinicié y seguía por que me puse a investigar y en alguna parte de la web recomendaban verificar la fecha de la máquina, que podría estar mal porque después de todo ya habías borrado la información. Intenté tal opción pero no me funcionó.

La opción sugerida es abrir la terminal y escribir date, esto te mostrará la fecha y verás si es eso o no. Leí que le funcionó a muchos pero cuando yo verifiqué la fecha de mi máquina sólo estaba atrasada un minuto, pero pensando lo preciso que este tipo de cosas deben ser pues lo cambié pero NO FUNCIONÓ. Ya estaba medio molesto pues son varias veces que la Mac me da algo de problemas.

¿Por qué? Yo que vengo de Windows, yo que invertí mucho en esta máquina, aaaaah, supongo que así es la vida.

Entonces procedí a encender la máquina sin memoria boot de esta manera te pedirá que la conectes a internet para que veas que se puede hacer. Se muestra esta imagen y se tarda unos 40 min para pasar a las herramientas:




Después de cargar se muestra una pantalla donde puedes restaurar de TimeMachine o Instalar el OS por defecto (y otras opciones) que en mi caso es el tan prestigiado Mountain Lion, WTH, volvamos a la prehistoria :P Nunca usé ese sistema pues ya existía Mavericks por lo que rápido actualicé.

Conecté el Ethernet porque según es más rápido,  elegí la opción de Instalar OS Mountain Lion pero dado que la velocidad de mi Internet es malísima me daba un total de 22 horas por lo que decidí intentar de nuevo la idea de la USB boot. 

Intenté este rollo de #TransMac pero mi PC nunca reconoció mi USB por el formato que le da la MAC al cargar el OS para el boot así que primero tenía que formatearla desde la utilidad de disco que sí te da al cargar desde la USB pero obvio que no se puede formatear mientras está montada y cargando desde ella así que se me ocurrió una idea.

Recordando que El Capitan salió en el 2015 se me ocurrió que la validación podría dar problemas por la fecha actual por lo que puse una fecha del 2015, algo como 01012015XXXXXXX, enero 1 del 2015 y la hora que son las X (o algo así jeje) y vualá, funcionó :) "Procedió a proceder"

Así es como comenzó a instalar y la verdad es que esta pantalla también me daba miedo pues en alguna otra ocasión no pasó de 21 minutos y daba un error de disco pero gracias a Dios siguió sin novedad:








Así es cómo todo funcionó bien y afortunadamente les escribo esto desde la Macbook en cuestión y sólo me queda ver qué pasará con el tiempo.

 En concreto

Cambien la fecha de su máquina a una fecha anterior o próxima a la versión del DMG con el que cuentan y que la fuerza los acompañe.

Sus comentarios son bienvenidos, quizás conocen una mejor manera y si te salvé la vida, buy me a coffe ;)


jueves, 3 de marzo de 2016

Textbox que sólo permita números C# WPF

Es común necesitar un Textbox que sólo permita la inserción de números, por ejemplo si se trata de una caja que contenga un número de teléfono o una cantidad con punto decimal.

Para este caso lo que puedes hace es recorrer el string de lo que se escribió y comparar los caracteres o aplicar el evento KeyDown, el cual ni siquiera permite que se escriba todo lo ajeno a lo que definas. Este código no deja escribir más que números:

 private void tbMovil_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                e.Handled = false;
            else
                e.Handled = true;
        }


Y éste te deja escribir la coma "," porque en mi caso  es el separador decimal.



private void tbPrecio_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                e.Handled = false;
            else if (e.Key == Key.OemComma)
                e.Handled = false;
            else
                e.Handled = true;
        }

Si estás seguro que es el punto usa este. Además, está validado que sólo deje introducir sólo un punto decimal ( "." = Key.OemPeriod).
La variable puntos es global.  

private void tbPrecio_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
           if (e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
                e.Handled = false;
            else if (e.Key == Key.OemPeriod)
            {
                if (puntos == 0)
                {
                    e.Handled = false;
                    puntos = 1;
                }
                else
                {
                    e.Handled = true;
                }
            }
            else
                e.Handled = true;
        }

Cómo saber si debo usar la coma "," o el punto "." como separador decimal por código

Yo sabía que era la coma porque el sistema es para inglés gringo y por lo tanto en el código anterior sólo deja escribir la coma y no el punto pero podrías saber cuál se usa en la región que sea en la que se use el sistema con:
string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
string numero = tbPrecio.Text.TrimEnd(' '); ;
                numero.Replace(".",decimalseparator); //Aquí se remplaza el punto por el separator que está en uso según la región
Por supuesto debes tener cuidado en caso de que lo vayas a guardar en SQL ya que igual debes usar el formato que SQL pide según lo hayas definido.

martes, 1 de marzo de 2016

Convertir una lista de objetos en una lista de strings C#

Me encontraba plácidamente programando en C# cuando de repente me topé con que mi lista de objetos definidos por mí (que contenían string, decimal, int y etc.) tendría que ser exportado en un archivo .txt, por lo que me topé con la primera pregunta:

Cómo exportar una lista a un archivo .txt

Bueno, el código en C# es
 
System.IO.File.WriteAllLines(ruta, lista);

El asunto se torna complicado cuando notas que a lista debe ser en "string" por lo que primero debes convertir tu lista de objetos de algún tipo en una lista de strings. Yo hice algo como esto:
 

 List str = new List();

    foreach(TipoObjeto obj in Lista )
    {
       str.Add(obj.Nombre + " " + obj.Apellido + " " + obj.Sexo + obj.Correo + " " + obj.Monto.ToString());
    }

    System.IO.File.WriteAllLines(ruta, str);

ruta puede ser algo como @"C:\Carpeta\texto.txt
Lista es la lista de objetos con varios tipos en sus propiedades

De esta manera te aseguras que cada propiedad de tu objeto se convierta en string (que en el ejemplo anterior los que ya son string omiten la conversión .ToString(), en el caso del monto que es un decimal tuve que aplicarlo) y como recorre cada propiedad a la vez que las convierte lo que hago es concatenarlas y agregarlas a str. Encontré otras formas que o medio funcionaban, era más laboriosas o que la conversión devolvía textos raros así que hice esta y pues funcionó. Si conoces una mejor puedes compartirla.

Evitar abrir la misma ventana más de una vez WPF C#

En un proyecto de WPF con C# para abrir una ventana secundaria usamos algo como:
Ventana2 v2 = new Ventana2();
v2.Show();

Suponiendo que esto se ejecute cada vez que haces clic en un botón, cada que des ese clic se abrirá la misma ventana. Para evitar eso, agrega esta validación a tu código:
           if (!Application.Current.Windows.OfType().Any())
           {
             Ventana2 v2 = new Ventana2();
             v2.Show();
           }
Lo que hace es buscar si dicha ventana ya ha sido instanciada, de ser así no la abre y es como evitamos tener la misma ventana abierta muchas veces. Por el contrario si no ha sido abierta abre la ventana que especifiques.
Espero que les haya sido útil.