sábado, 13 de mayo de 2017

GIT


sdf






lo siguiente se tomo del sitio

http://rogerdudler.github.io/git-guide/index.es.html





git - la guía sencilla

Del sitio http://rogerdudler.github.io/git-guide/index.es.html


una guía sencilla para comenzar con git. sin complicaciones ;)
por Roger Dudler (traducido por @lfbarragan y @adrimatellanes)
créditos a @tfnico, @fhd y Namics
disponible en english, deutsch, français, indonesian, italiano, nederlands, polski, português, русский, türkçe,
မြန်မာ, 日本語, 中文, 한국어
por favor, reporta cualquier problema en github
Frontify - Collaboration for Web Designers & Front-End Developers

crea un repositorio nuevo

Crea un directorio nuevo, ábrelo y ejecuta
git init
para crear un nuevo repositorio de git.

hacer checkout a un repositorio

Crea una copia local del repositorio ejecutando
git clone /path/to/repository
Si utilizas un servidor remoto, ejecuta
git clone username@host:/path/to/repository

flujo de trabajo

Tu repositorio local esta compuesto por tres "árboles" administrados por git. El primero es tu Directorio de trabajo que contiene los archivos, el segundo es el Index que actua como una zona intermedia, y el último es el HEAD que apunta al último commit realizado.

add & commit

Puedes registrar cambios (añadirlos al Index) usando
git add <filename>
git add .
Este es el primer paso en el flujo de trabajo básico. Para hacer commit a estos cambios usa
git commit -m "Commit message"
Ahora el archivo esta incluído en el HEAD, pero aún no en tu repositorio remoto.

envío de cambios

Tus cambios están ahora en el HEAD de tu copia local. Para enviar estos cambios a tu repositorio remoto ejecuta
git push origin master
Reemplaza master por la rama a la que quieres enviar tus cambios.

Si no has clonado un repositorio ya existente y quieres conectar tu repositorio local a un repositorio remoto, usa
git remote add origin <server>
Ahora podrás subir tus cambios al repositorio remoto seleccionado.

ramas

Las ramas son utilizadas para desarrollar funcionalidades aisladas unas de otras. La rama master es la rama "por defecto" cuando creas un repositorio. Crea nuevas ramas durante el desarrollo y fusiónalas a la rama principal cuando termines.

Crea una nueva rama llamada "feature_x" y cámbiate a ella usando
git checkout -b feature_x
vuelve a la rama principal
git checkout master
y borra la rama
git branch -d feature_x
Una rama nueva no estará disponible para los demás a menos que subas (push) la rama a tu repositorio remoto
git push origin <branch>

actualiza & fusiona

Para actualizar tu repositorio local al commit más nuevo, ejecuta
git pull
en tu directorio de trabajo para bajar y fusionar los cambios remotos.
Para fusionar otra rama a tu rama activa (por ejemplo master), utiliza
git merge <branch>
en ambos casos git intentará fusionar automáticamente los cambios. Desafortunadamente, no siempre será posible y se podrán producir conflictos. Tú eres responsable de fusionar esos conflictos manualmente al editar los archivos mostrados por git. Después de modificarlos, necesitas marcarlos como fusionados con
git add <filename>
Antes de fusionar los cambios, puedes revisarlos usando
git diff <source_branch> <target_branch>

etiquetas

Se recomienda crear etiquetas para cada nueva versión publicada de un software. Este concepto no es nuevo, ya que estaba disponible en SVN. Puedes crear una nueva etiqueta llamada 1.0.0 ejecutando
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff se refiere a los 10 caracteres del commit id al cual quieres referirte con tu etiqueta. Puedes obtener el commit id con
git log
también puedes usar menos caracteres que el commit id, pero debe ser un valor único.

reemplaza cambios locales

En caso de que hagas algo mal (lo que seguramente nunca suceda ;) puedes reemplazar cambios locales usando el comando
git checkout -- <filename>
Este comando reemplaza los cambios en tu directorio de trabajo con el último contenido de HEAD. Los cambios que ya han sido agregados al Index, así como también los nuevos archivos, se mantendrán sin cambio.
Por otro lado, si quieres deshacer todos los cambios locales y commits, puedes traer la última versión del servidor y apuntar a tu copia local principal de esta forma
git fetch origin
git reset --hard origin/master

datos útiles

Interfaz gráfica por defecto
gitk
Colores especiales para la consola
git config color.ui true
Mostrar sólo una línea por cada commit en la traza
git config format.pretty oneline
Agregar archivos de forma interactiva
git add -i



domingo, 16 de abril de 2017

Visual studio Code


  • Como Instalar Plugins



Angular


http://cursoangularjs.es



Servicio $q

El servicio de $q es un servicio de AngularJS que contiene toda la funcionalidad de las promesas. Tal y como se indica en su documentación, está basado en la implementación de Kris Kowal's Q.. AngularJS ha hecho su propia versión para que esté todo integrado en el propio framework.
Yo suelo comparar el sistema de promesas al problema del productor-consumidor. La similitud es que hay una parte que generará la información , por ejemplo el método $http y otra parte que consumirá la información, por ejemplo nuestro código. Esta separación es importante ya que hay 2 objetos con los que tendremos que tratar.
En la nomenclatura de AngularJS al productor se le llama defered y al consumidor se le llama promise. Mediante el servicio de $q obtenemos el objeto defered llamando el método defer() y a partir de él obtenemos el objeto promise llamando a la propiedad promise.
En el siguiente diagrama UML podemos ver las distintas clases que forman parte de las promesas:
PlantUML Graph
Una vez creada mediante el método defer(), una promesa se puede encontrar en alguno de los siguiente 3 estados:
PlantUML Graph
  • Pendiente: Aún no se sabe si se podrá o no obtener el resultado.
  • Resulta: Se ha podido obtener el resultado. Se llega a este estado llamando al método defered.resolve()
  • Rechazada: Ha habido algún tipo de error y no se ha podido obtener el resultado. Se llega a este estado llamando al método defered.reject()
Debido a que la promesa debe acabar en el estado Pendiente o Rechazado es obligatorio que siempre llamemos al método defered.resolve() o defered.reject().

$q.defer()

Para explicar las promesas vamos a hacer un ejemplo de una función que acepta como parámetro dos valores y de forma asíncrona los retorna. Obviamente para hacer una simple suma no es necesario usar promesas ni retornarlo de forma asíncrona, pero servirá como ejemplo.
Lo primero es crear los 2 objetos que se necesitan en las promesas.
?
1
2
3
4
5
6
function sumaAsincrona(a,b) {
   var defered=$q.defer();
   var promise=defered.promise;
    
   return promise;
}
  • Línea 1: La función acepta como argumentos 2 números , llamados a y b.
  • Línea 2: Usando el servicio de $q obtenemos el objeto defered llamando al métdo defer(). Por supuesto el servicio $q debe ser inyectado de alguna forma pero aquí lo hemos obviado para simplificar la explicación.
  • Línea 3: Desde el objeto defer se obtiene el objeto promise.
  • Línea 5: Al que nos llama le devolvemos la promesa.
Ya tenemos los 2 objetos preparados y listos para ser usados. Ahora explicaremos más sobre cada uno de ellos.

defered

El objeto defered sólo se usa desde dentro de la función asíncrona, por lo tanto el que llama a sumaAsincrona no sabe nada del objeto defered. Como ya hemos dicho, el objeto defered hará las funciones de productor de la información 1).
Este objeto tiene 2 métodos. Uno de ellos para indicar que se ha obtenido la información y por lo tanto hacer que la promesa pase al estado “Resuelto” y un segundo método para indicar que algo ha fallado y que no se ha podido obtener la información y por lo tanto hacer que la promesa pase al estado “Rechazado”.
MétodoParámetrosDescripción
resolveresolve(resultado)Llamaremos a este método para indicar que ya tenemos la información que se solicitó y por lo tanto que la promesa está resuelta, siendo el parámetro resultado el que contiene la información solicitada.
rejectreject(error)Llamaremos a este método para indicar que no ha sido posible obtener la información que se solicitó y por lo tanto que la promesa está rechazada, conteniendo el parámetro error información relativa a la naturaleza del error.
Hay que fijarse que el objeto defered no dice nada relativo al tipo de información que se retorna ni a la estructura de la misma. Éso ya dependerá de cada uno de los métodos que creemos que usen promesas. Tampoco se permite retornar más de un dato. Si queremos retornar más de uno simplemente debemos crear un objeto que contenga la información que queramos.
Sigamos ahora con el ejemplo y usemos el servicio de $timeout para simular una respuesta asíncrona de la función.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function sumaAsincrona(a,b) {
   var defered=$q.defer();
   var promise=defered.promise;
    
   $timeout(function() {
      try{
         var resultado=a+b;
         defered.resolve(resultado);
      } catch (e) {
         defered.reject(e);
      }  
   },3000);
    
   return promise;
}
  • Línea 5: Ponemos un timeout para que pasados 3 segundos 2) se ejecute la función.
  • Línea 7: Aqui es donde calculamos la información que sea necesaria. Lo único que hacemos es sumar los 2 valores que nos pasaron.
  • Línea 8: Indicamos que todo ha ido bien y retornamos el resultado.
  • Línea 10: Si algo ha fallado lo indicamos llamando a reject. En este caso pasamos como valor de retorno la propia excepción que se ha generado.

promise

Acabamos de ver lo que hay que hacer internamente para producir la información en la función sumaAsincrona. Ahora pasemos al otro lado del problema. Veamos qué ocurre al llamar a nuestra función asíncrona, es decir en la parte del consumidor.
Lo primero que debemos hacer es llamar a la función asíncrona y guardarnos la promesa que nos retorna.
?
1
var promise=sumaAsincrona(5,2);
  • Línea 1: Llamar a la función asíncrona y guardarnos la promesa que nos retorna.
¿Cómo podemos saber ahora si se ha podido o no obtener el dato? ¿Y cómo obtenemos el dato? El objeto promise tiene un método llamado then, el cual acepta que le pasemos 2 funciones de callback para saber lo que ha ocurrido. La primera función se llamará si se ha obtenido la información y por lo tanto si la promesa ha sido resuelta. La segunda función 3) se llamará si algo ha fallado y por lo tanto si la promesa ha sido rechazada.
?
1
2
3
4
5
6
7
var promise=sumaAsincrona(5,2);
promise.then(function(resultado) {
  $scope.mensaje="El resultado de la promesa es:" + resultado;
}, function(error) {
  $scope.mensaje="Se ha producido un error al obtener el dato:"+error;
});
  • Línea 3: Llamamos al método then del objeto promise y le pasamos las 2 funciones.
  • Línea 4: La promesa ha sido resuelta y aquí nos guardamos en el $scope el resultado que nos ha llegado a través de la promesa.
  • Línea 5: Especificamos la función de error para cuando no se puede obtener la información.
  • Línea 6: La promesa ha sido rechazada ya que algo ha fallado y en este caso generamos en mensaje de error.

Ejemplo


?
index.html
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html ng-app="app">
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"></script>
    <script src="//code.angularjs.org/1.2.19/i18n/angular-locale_es-es.js"></script>
    <script src="script.js"></script>
  </head>
  <body ng-controller="PruebaController">
    {{mensaje}}
  </body>
</html>
?
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var app = angular.module("app", []);
app.controller("PruebaController", ['$scope', '$q', '$timeout',function($scope, $q, $timeout) {
    $scope.mensaje = "Esperando a que se resuelva la promesa"
    function sumaAsincrona(a, b) {
      var defered = $q.defer();
      var promise = defered.promise;
      $timeout(function() {
        try {
          var resultado = a + b;
          defered.resolve(resultado);
        } catch (e) {
          defered.reject(e);
        }
      }, 3000);
      return promise;
    }
    var promise = sumaAsincrona(5, 2);
    promise.then(function(resultado) {
      $scope.mensaje = "El resultado de la promesa es:" + resultado;
    }, function(error) {
      $scope.mensaje = "Se ha producido un error al obtener el dato:" + error;
    });
}]);
Normalmente, para abreviar, en vez de guardarnos la variable de la promesa y luego llamar al método then se suele hacer todo junto de la siguiente manera:
?
1
2
3
4
5
sumaAsincrona(5, 2).then(function(resultado) {
  $scope.mensaje = "El resultado de la promesa es:" + resultado;
}, function(error) {
  $scope.mensaje = "Se ha producido un error al obtener el dato:" + error;
});