Ads 468x60px

Perfil

lunes, 11 de febrero de 2013

Primeros pasos en GIT (Creacion y gestion de Repositorios)

Git es un sistema de control de versiones que se centra en la velocidad, “diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.”

Git-logo
Hoy iniciamos una serie de artículos en donde nos concentraremos en conocer el flujo de trabajo (workflow) básico para llevar a cabo el versionado de nuestros proyectos.
El proyecto de ejemplo se puede consultar directamente en su repositorio de GitHub, en el cual colocaré un tag por cada articulo, para que sean fácil de reconocer los avances.

¿COMO LO CONSIGO?

Asumo que ya tenemos instalado Git en nuestro sistema, es fácil conseguirlo si tenemos alguna distribución Linux u OS X, cualquier sistema basado en *nix funciona excelente. Después de instalar Git hay que configurar nuestros datos básicos:
$ git config --global user.name "Mi nombre"
$ git config --global user.email "mi@correo.com"
Considero que los primeros pasos que debemos concretar tienen que ver en la creación y gestión de un repositorio de forma local, a nivel bastante básico veremos como iniciar nuestros repositorios y registrar cambios en el historial de Git.
Por si mismo, Git es una herramienta con una curva de aprendizaje pronunciada, si no disciplinamos nuestro flujo de trabajo a la par de Git es muy posible que nos encontremos en problemas casi todo el tiempo. No hay que temer, si llevamos un orden y aprendemos a registrar nuestros cambios casi de forma atómica es poco probable que ocurra algo que lamentar.

CREANDO NUESTRO REPOSITORIO

Cualquier carpeta de nuestro sistema puede ser un contenedor o repositorio para Git, en dicho lugar se establecerá la configuración e historial bajo una carpeta nombrada .git que se encuentra oculta.
Para crear un repositorio no es necesario empezar desde cero con nuestro proyecto, de hecho podemos iniciar uno aún cuando ya tenemos nuestro código en estado avanzado. Por ejemplo, tenemos la estructura de un sistema o librería sencilla:
/proyectos/mi-libreria
/proyectos/mi-libreria/include
/proyectos/mi-libreria/include/sistema.class.php
/proyectos/mi-libreria/include/funciones.php
/proyectos/mi-libreria/index.php
Solo hay que ubicarnos en la carpeta y ejecutar git init para crear el repositorio:
$ cd /proyectos/mi-libreria
$ git init
Initialized empty Git repository in /proyectos/mi-libreria/.git/

REGISTRAR Y GUARDAR ARCHIVOS

Cada repositorio guarda un historial de los cambios que hemos ido realizando en nuestro proyecto, ejecutando git status podemos verificar los cambios hechos en el estado actual:
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# include/
# index.php
nothing added to commit but untracked files present (use "git add" to track)
En el ejemplo notamos que nos hace falta registrar los archivos contenidos en la raíz de nuestro proyecto, ahora vamos a agregarlos:
$ git add .
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: include/funciones.php
# new file: include/sistema.class.php
# new file: index.php
#
He usado git add . pues el punto indica la ruta actual y, por defecto, Git agrega recursivamente al emplear ésta instrucción con una carpeta como argumento. Desde luego es posible agregar archivos individualmente con solo especificar la ruta relativa con relación a la raíz del repositorio, por ejemplo:
$ git add include/funciones.php
Finalmente debemos dar por hechos los cambios que llevamos en el repositorio, entonces ejecutamos git commit para confirmarlo:
$ git commit -m "Primer commit; agregue la estructura de archivos"
[master (root-commit) 0034116] Primer commit; agregue la estructura de archivos
3 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 include/funciones.php
create mode 100644 include/sistema.class.php
create mode 100644 index.php
Verificamos que todo esté en orden con git status de nuevo:
$ git status
# On branch master
nothing to commit (working directory clean)
Supongamos que la frecuencia de los cambios que realizamos a nuestro código determina la cantidad de commits que podemos efectuar en el repositorio. Lo ideal sería que por cada nuevo cambio significativo en el código o estructura de archivos, registremos lo que hicimos agregando los archivos afectados con una descripción puntual, breve y clara de lo realizado.
Si por ejemplo hay que mover un archivo de lugar, o simplemente le cambiamos de nombre debemos asegurarnos de tener el historial de cambios limpio antes de proceder.

RESUMEN

  • Un repositorio en Git es un registro de cambios hechos a través del tiempo que sirve para llevar un orden progresivo con respecto al desarrollo de algún proyecto, básicamente código fuente y documentos.
  • Cada archivo agregado, renombrado, editado o eliminado debe ser registrado para no perder el orden de los cambios en nuestro proyecto; pensar en un cambio a la vez es fundamental.
En los siguientes artículos iremos viendo estos dos puntos a detalle, sobre todo el manejo de ramas a nivel básico usando branchcheckoutrebase y merge para lograr un flujo de trabajo mas flexible así como diversas técnicas y recomendaciones para un registro de cambios mas efectivo con commitcherry-pickresetdiffshow y log.
Una vez tengamos dominado el flujo de trabajo básico de manera local podremos continuar con la obtención, publicación y actualización de repositorios con remote,fetchpull y push.
Github: Mi libreria

Empezar a programar para blackberry


programar para blackberry
Aprovechando la novedad de que blackberry y android van a compartir aplicaciones y market no nos vendria mal aprender un poco a programar para blackberry ya que al ser en java podemos perfectamente programar aplicaciones para android y blackberry sin necesidad de aprender nada nuevo (aunque los rumores apuntan a que pronto saldra una maquina virtual que podra correr aplicaciones de android en nuestra blackberry, nunca esta de mas tener unos conocimientos basicos).

Aqui os dejos algunas webs y algunos videotutoriales para empezar, recomiendo usar eclipse ya que si estamos familiarizados con un programa como eclipse para android nos sera mas facil empezar, aunque RIM dispone de un programa especial para programar para blackberry el cual tiene muchas ventajas respecto a usar eclipse con el plugin.

VideoTutoriales programar para blackberry

Imagen de previsualización de YouTubeImagen de previsualización de YouTubeImagen de previsualización de YouTubeImagen de previsualización de YouTube

Aplicación – Memory Booster, mejora el rendimiento y rapidez de tu BlackBerry


Memory Booster recuperará lo perdido/utilizado en la memoria del dispositivo, a consecuencia de las aplicaciones que se ejecutan en primer o segundo plano, de esta manera podrá dejar el equipo más rápido. Memory Booster refuerza la memoria Ram y optimiza el impulso de su Blackberry! Se trata de la aplicación de la utilidad del número 1 en todo el mundo para mejorar el rendimiento de su Blackberry. Ahora que los dispositivos son multitarea, se convirtió en una aplicación que  deber tener siempre. Enseguida notará la diferencia.
 ¿Si el dispositivo bloquea mucho más que el dispositivo Blackberry de tu amigo, o su teléfono tiene ese retraso leve es molesto lo suficiente por las normas de Blackberry? Aquí es una aplicación muy útil para tu Blackberry precioso. Memoria bien administrada disminuye la frecuencia de accidente y posiblemente extiende la vida del dispositivo. un toque en la pantalla es todo tarda y there you go, su memory(RAM) libre da un paso de darle.

Características de Memory Booster:

    Aplicación - Memory Booster, mejora el rendimiento y rapidez de tu BlackBerry
  • Optimiza el uso de la memoria de tu BlackBerry ®.
  • No es necesario reiniciar el dispositivo, por lo tanto es mucho más rápido que otras aplicaciones!
  • No es necesario instalar ningún nuevo hardware: la única solución es Software. No se necesita hardware adicional! No influye en otras aplicaciones.
  • Efectos visuales: Fancy bar/línea gráficos e información general de memoria de alto rendimiento textual.
  • Aumento de fondo automático: Asegúrese de que el BlackBerry ® nunca este perdiendo memoria a causa de otras aplicaciones!
  • Estadísticas: Extensos datos estadísticos para efectividad de seguimiento.

¿Cómo funciona Memory Booster?

Si se pierde la memoria, MemoryBooster mejora la gestión de memoria de la BlackBerry ®

Requerimientos para Instalar Memory Booster:

  • Funciona con todos los modelos BlackBerry
  • Se Requiere Sistema Operativo 4.6.0 o Superior
  • Compatible con Sistemas Operativos 7.0+

Descargar Memory Booster

Desarrollando con la cámara de Windows Phone


Desarrollando con la cámara de Windows Phone
Silverlight para Windows Phone incluye varias herramientas de fácil uso para la cámara y el uso de fotos.  Aquí vamos a mostrar cómo tomar y guardar fotos con la cámara de Windows Phone y seleccionar y mostrar fotos de la galería interna de Windows Phone.

Este artículo se divide en las siguientes secciones:

·         Creando una interfaz de usuario para la cámara y visualización de fotos
·         Tomando, seleccionando y visualizando imágenes
·         Guardando imágenes en la Biblioteca de Imágenes

Descarga el código fuente completo de este tutorialhospedado en la galería de código de Silverlight para Windows Phone.

Creando una interfaz de usuario para la cámara y visualización de fotos
Inicia Visual Studio y comienza un proyecto de tipo "Silverlight para Windows Phone".  A continuación, crea una interfaz de usuario (UI) que tiene los siguientes elementos:
·         Dos campos TextBlock - uno con un nombre significativo que mostrará los mensajes de estado y una etiqueta TextBlock que dice simplemente: "Desconecte el teléfono delsoftware de Zune para ejecutar!".
·         Un Image con un nombre significativo que tendrá su fuente dinámicamente actualizada para reflejar la nueva imagen que fue tomada o elegida.
·         Tres botones con nombres significativos que se utilizarán para tomar una nueva foto,mostrar una foto existentey guardar en el almacenamiento del teléfono la foto mostrada. En este artículo, estos botones se llaman takePhotoButtonchoosePhotoButton ysavePhotoButtonrespectivamente.
Una distribución propuesta de estos elementos se muestra a continuación:
clip_image002
XAML
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Take Photo" Height="72" HorizontalAlignment="Left"
Margin="12,6,0,0" Name="button1" VerticalAlignment="Top"
idth="189" Click="button1_Click" />
<Image Height="308" HorizontalAlignment="Left" Margin="27,275,0,0"
Name="myImage" Stretch="Fill" VerticalAlignment="Top"
Width="406"/>
<Button Content="Choose Existing" Height="72" HorizontalAlignment="Left"
Margin="194,6,0,0" Name="button2" VerticalAlignment="Top"
Width="239" Click="button2_Click" />
<TextBlock Height="30" HorizontalAlignment="Left" Margin="27,162,0,0"
Name="textBlock1" Text="Disconnect phone from Zune software to run!"
VerticalAlignment="Top" Width="406" />
<Button Content="Save Current Photo to Library" Height="72"
HorizontalAlignment="Left" Margin="12,84,0,0" Name="savePhotoButton"
VerticalAlignment="Top" Width="419" IsEnabled="False"
Click="savePhotoButton_Click" />
<TextBlock Height="71" HorizontalAlignment="Left" Margin="29,197,0,0"
Name="statusText" Text="" VerticalAlignment="Top" Width="402"
Foreground="Red" TextWrapping="Wrap" />
</Grid>

Como último paso antes de la codificaciónagrega una referencia a Microsoft.Xna.Framework.Vamos a usar el espacio de nombres Microsoft.Xna.Framework.Media en este ensamblado con el fin de guardar las imágenes en la biblioteca de medios del teléfonoy éste debe ser referenciado por tu proyecto antes que cualquiera de sus tipos, eventos o métodos sean utilizados en tu aplicación.

Para agregar Microsoft.Xna.Framework en tu aplicación:
·         En el Explorador de solucioneshaz derecho en el nodo References en tu proyecto y acontinuación, selecciona Add Reference.
·         Selecciona Microsoft.Xna.Framework de la lista y a continuación haz clic en OK.

Tomando, Seleccionando y visualizando imágenes
En el Explorador de soluciones, abre el archivo MainPage.xaml.csy agrega las siguientes líneas decódigo en la parte superior de la páginadejando las referencias por defecto en su lugar.
C#
using Microsoft.Phone.Tasks; using System.Windows.Media.Imaging; using System.IO; using System.IO.IsolatedStorage; using Microsoft.Xna.Framework.Media;

Esto le da acceso a tu código a los espacios de nombres necesarios para abrir la aplicación de lacámara en el teléfono y tomar una imagen, usar un objeto de mapa de bits de re-escritura paraalmacenar los datos de la imagen temporal, usar un stream de memoria para convertir la imagenen un archivoguardar la imagen en el almacenamiento interno del teléfonoy mover una imagendel almacenamiento aislado del teléfono a la biblioteca multimedia del teléfono,respectivamente.

La selección de fotos y el uso de la cámara requerirán la coordinación entre algunos métodosasí que vamos a añadir algunos miembros de datos a la clase principal.  Dos de ellos serán objetos Selectores, que permiten a las aplicaciones ceder el control a la funcionalidad integrada en el sistema operativo del teléfono a fin de facilitar las cosas como la elección de un contacto de una lista, tomar una foto, o seleccionar una foto de la galería de fotos del teléfono.  Otro será una imagen de mapa de bits que se estará utilizando para almacenar la información de la imagen temporal, es decir, imágenes que hemos elegido ya sea desde la galería en el teléfono o simplemente tomadas con la cámara.
C#
public partial class MainPage : PhoneApplicationPage
{
// Declarar el objeto CameraCaptureTask con ámbito de la página.
CameraCaptureTask cameraCaptureTask;
PhotoChooserTask photoChooserTask;
BitmapImage bmp;

cameraCaptureTask y photoChooserTask van a necesitar conectar los manejadores de eventos que se disparan cuando se toma una fotografía o cuando se elige de la  biblioteca de imágenes del teléfono, respectivamente.  Esto significa que los dos eventos deben ser manejados:
  1. Evento Completed de cameraCaptureTask.
  2. Evento Completed de photoChooserTask.
Este tutorial tiene una peculiaridad: porque en ambos casos sólo queremos mostrar la imagen en pantallay porque los eventos Completed envían el mismo tipo de objeto a sus manejadores (unPhotoResult), usaremos un método para manejar ambos eventos.  Vamos a llamar a este métodophotoCaptureOrSelectionCompletedy obtendrá la foto que ha sido tomada por la cámara o seleccionada de la biblioteca de imágenesy la mostrará en la pantalla.  La conexión de ambos eventos Completed para este nuevo método se realiza en la función de inicio de la página,MainPage, dando como resultado lo siguiente:
C#

public MainPage()
{
InitializeComponent();
// Inicializa los objetos Selectores y asigna los manejadores para los eventos "Completed"
cameraCaptureTask = new CameraCaptureTask();
cameraCaptureTask.Completed += new EventHandler<PhotoResult>(photoCaptureOrSelectionCompleted);
photoChooserTask = new PhotoChooserTask();
photoChooserTask.Completed += new EventHandler<PhotoResult<(photoCaptureOrSelectionCompleted);
}

Anteriormente, cuando creamos la interfaz de usuario, agregamos un Image llamado myImage en la pantalla, pero no estableció su propiedad Source, dejándola en blanco.  EnphotoCaptureOrSelectionCompleted, sabemos que el usuario ha tomado o seleccionado una imagen así que es momento de establecer la propiedad Source de myImage a esa imagen, después escalar la imagen de modo que quepa la zona de visualización de myImage.  También actualizaremos el TextBlock statusText si es necesario.  Por último, vamos a activar el botón que permite al usuario guardar la imagen mostrada.

La propiedad Stretch del objeto Image determina cómo la imagen será escalada para ajustarla a las dimensiones de myImageutilizaremos Stretch.Uniform para preservar la relación de aspecto de la imagen original.

Así que podemos reservar la opción de guardar esta imagen si el usuario lo deseautilizando elmapa de bits que hemos creado antesllamado bmppara recibir los datos de esta nueva imagen,entonces lo asignaremos a la propiedad Source de myImage de modo que se muestre en la pantalla.  (En otro método que implementaremos después, el contenido de bmp se puede guardar en el almacenamiento interno del teléfono). El aspecto final dephotoCaptureOrSelectionCompleted será así:
C#
void photoCaptureOrSelectionCompleted(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
bmp = new BitmapImage();
bmp.SetSource(e.ChosenPhoto);
myImage.Source = bmp;
myImage.Stretch = Stretch.Uniform;
// Intercambio los estados de los elementos en la IU
savePhotoButton.IsEnabled = true;
statusText.Text = "";
}
else
{
savePhotoButton.IsEnabled = false;
statusText.Text = "Task Result Error: " + e.TaskResult.ToString();
}
}
Ahora conectamos los botones que colocamos en la interfaz de usuario para iniciar un Selector que nos permitirá tomar o seleccionar una imagen.  Regresa al diseñador de la interfaz de usuario y haz doble clic en el botón "Take Photo".   Esto crea un manejador de evento que será disparado cuando se haga clic en el botón.  Nuestro botón se llama takePhotoButtony sólo necesita una línea decódigo para iniciar el Selector.  El evento Completed se disparará cuando la foto sea tomada, manejando el resto.  El resultado es una función muy simple llamada takePhotoButton_Click:
C#
// La cámara muestra el Choosers en respuesta a un clic del botón.
private void takePhotoButton_Click(object sender, RoutedEventArgs e)
{
cameraCaptureTask.Show();
}

Ahora haz doble clic en el botón "Choose Existing", que nombramos choosePhotoButton.  Una vezmás, es sólo una línea de código para iniciar el Selector que selecciona una foto, lo que resulta enun choosePhotoButton_Click que tiene este aspecto:
C#
// El selector de foto en respuesta a un clic del botón
 private void choosePhotoButton_Click(object sender, RoutedEventArgs e)
{
photoChooserTask.Show();
}

Ahora la aplicación es capaz de capturar y seleccionar imágenes existentes y mostrarlas en la pantalla en su relación de aspecto correcto.
Como la advertencia en la interfaz de usuario dice, el teléfono debe estar desconectado delsoftware de Zune para que los Selectores sean lanzados correctamente.

Guardando imágenes en la Biblioteca de Imágenes
Con el fin de guardar la imagen a la biblioteca de imágenes del teléfono, debe ser primerocodificada como un JPEG mediante la clase Extensions del espacio de nombresSystem.Windows.Media.Imaging.  Entoncesel ensamblado XNA que hemos importado se utilizarápara usar la clase MediaLibrarycuyo método SavePicture finalmente escribe la imagen a la biblioteca de imágenes del teléfono, donde puede ser sincronizada con la computadora,visualizada en una presentación, etc.

Debido a que este proceso implica ambos pasos: guardar la imagen como JPEG y luego importarla ala bibliotecavamos a escribir un archivo JPEG temporal en el almacenamiento interno del teléfonoconocido como el Almacenamiento Aislado.  Entre otras cosasel Almacenamiento Aislado para Windows Phone asigna un espacio exclusivo y seguro de archivos para cada aplicaciónen el teléfono.  No vamos a entrar en detalles aquí con el uso del Almacenamiento Aisladosólo tenemos que utilizar el espacio de almacenamiento de nuestra aplicación para escribir nuestroarchivo JPEG temporal.  Se trata de crear primero un archivo vacíoluego asignarle contenido.  Eltipo WriteableBitmap será usado para esta tarearecibiendo el contenido de bmp, nuestros datos de imagen que creamos con anterioridad.  Por últimoqueremos actualizar el Textblock statusTextcuando tenemos un resultado al guardar la imagen.

Regresa al diseñador de la interfaz de usuario y haz doble clic en el botón "Save Current Photo to Library", al que llamamos savePhotoButton.  Al igual que con los otros botones, esto conecta un manejador de eventos en blanco al evento Click en el botón.  Una vez implementado para cubrir todas las funcionalidades descritas, la versión final de savePhotoButton_Click se verá así:



private void savePhotoButton_Click(object sender, RoutedEventArgs e)
{
try
{
// Crea un nombre de archivo para el archivo JPEG en el almacenamiento aislado.
String tempJPEG = "TempJPEG";
// Crea el almacenamiento virtual y el stream del archivo. Compruebe si hay archivos duplicados tempJPEG.
var myStore = IsolatedStorageFile.GetUserStoreForApplication();
if (myStore.FileExists(tempJPEG))
{
myStore.DeleteFile(tempJPEG);
}
IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempJPEG);
/ / Se crea un stream del archivo JPEG
/ / En lugar de MyQuickApp en la URIutilice el nombre de proyecto correcto
/ / El uso de TempJPEG se estableció anteriormente.

Uri uri = new Uri("MyQuickApp;component/TempJPEG.jpg", UriKind.Relative);
// Crear un nuevo objeto WriteableBitmap y establece el stream de JPEG.
WriteableBitmap wb = new WriteableBitmap(bmp);
/ / Codifica un objeto WriteableBitmap a un stream  JPEG
/ / SaveJpeg (mapa de bits WriteableBitmaptargetStream Stream, targetWidth int
/ / targetHeight intint orientaciónla calidad int)Extensions.SaveJpeg(wb, myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);

myFileStream.Close();
/ Se crea un nuevo stream en el almacenamiento aisladoy guarda el archivo JPEG 
/ / en la biblioteca de medios de Windows Phone.

myFileStream = myStore.OpenFile(tempJPEG, FileMode.Open, FileAccess.Read);
MediaLibrary library = new MediaLibrary();
Picture pic = library.SavePicture("SavedPicture.jpg", myFileStream);
myFileStream.Close();
savePhotoButton.IsEnabled = false;
statusText.Text = "Saved!";
}
catch (Exception myError)
{
statusText.Text = myError.Message;
}
}

Este tutorial se ha completado, y ahora tienes un ejemplo de un programa que controla la entrada de la cámara, además de leer y escribir en la biblioteca de fotos.  Recuerda desconectar el teléfono del software Zune para que los Selectores en el método Start se puedan ejecutar.