tag:blogger.com,1999:blog-36314007459662212642024-03-14T00:10:07.559-07:00MoztroDevDeveloping something...originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.comBlogger83125tag:blogger.com,1999:blog-3631400745966221264.post-31177238278882935722020-05-09T13:31:00.000-07:002020-05-09T17:45:41.627-07:00<div style="line-height: 100%; margin-bottom: 0cm;">
<b>AWS Cloud Watch</b></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-2rQCnw6WApQ/XrcSZXvALWI/AAAAAAAAJow/gTh6XOrnu80NVpK_Wl39smtUwHWHceaUQCNcBGAsYHQ/s1600/CloudWatch.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="415" data-original-width="396" height="200" src="https://1.bp.blogspot.com/-2rQCnw6WApQ/XrcSZXvALWI/AAAAAAAAJow/gTh6XOrnu80NVpK_Wl39smtUwHWHceaUQCNcBGAsYHQ/s200/CloudWatch.PNG" width="190" /></a></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Es un servicio que permite monitorear nuestros recursos de AWS así
como nuestras aplicaciones en tiempo real. La forma en que trabaja
esta basada en la definición de métricas, básicamente existen
métricas para cualquier servicio de AWS. Si bien podemos revisarlas
en cualquier momento la idea es automatizar el monitoreo creando
alarmas y enviando notificaciones basadas en las alarmas. </div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Hablando un poco más sobre las métricas estas pertenecen a un
namespace y tienen un timestamp asociado a ellas. Ademas las métricas
cuentan con atributos específicos llamados dimensiones, cada métrica
puede tener hasta 10 dimensiones. También podemos crear nuestras
propias métricas para monitorear nuestro servicios como lo puede ser
información especifica del sistema operativo. Los datos de nuestras
métricas son conservados por 2 semanas y en caso de que quisiéramos
conservarlos por más tiempo podemos exportarlos a S3.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Las ofertas de monitoreo son basic y detailed. El monitoreo básico
envía datos a CloudWatch cada 5 minutos para un limitado número de
métricas previamente seleccionadas sin cargo. Esta opción es la que
se usa por default. El monitoreo detallado envía datos cada minuto y
permite agregar más datos por un costo adicional. Usando esta opción
podemos tener mejores tiempos de respuesta frente a algunas
eventualidades que puedan presentar nuestros servicios.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Adicionalmente los CloudWatch Dashboards nos permite visualizar de
manera simple y práctica nuestras métricas. Estos Dashboards son
globales y permiten personalizar valores como husos horarios o
periodos de tiempo de visualización. Es la forma más rápida de
ver comportamientos de nuestras métricas.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Amazon CloudWatch Logs</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Nuestras
aplicaciones, instancias u otros servicios pueden enviar logs a
CloudWatch usando el SDK, pero los más comunes son los siguientes:</div>
<ul>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Elastic
Beanstalk
</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
EC2</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
AWS Lambda</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
VPC Flow Logs</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
API Gateway</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
CloudTrail</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
CloudWatch Log
agents</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Route 53</div>
</li>
</ul>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Los logs
generalmente son exportados a S3 para archivarlos o enviados a
clusters de ElasticSearch para ser analizados.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Existen la
posibilidad de definir filtros para nuestros logs usando filter
expressions, así como el uso de consultas definidas para
exploraciones más concretas usando Insights.<br />
<br />
CloudWatch usa log streams para almacenar lo log events de una sola fuente. Y estos son agrupados en log groups.Todo log stream debe estar asociado a un grupo y el periodo de retención de los log groups determina el tipo que se conservaran esos streams. Es posible eliminar log streams, pero no entradas individuales.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Es importante
otorgar los permisos pertinentes para el IAM que utilizaremos para el
correcto envió de logs a CloudWatch Logs.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Para nuestras
instancias es posible instalar un agente que se encargue de enviar
los datos directamente a CloudWatch Logs. Usando Amazon Linux es muy
simple solo hay que acceder a nuestra instancia usando <b>ssh</b> y
con una cuenta con los permisos suficientes instalar <b>awslogs</b>,
posteriormente habrá que revisar que la información sobre la región
de nuestra instancia es correcta revisando el archivo
“/etc/awslogs/awscli.conf”. Una vez instalado y revisado que la
configuración es correcta es necesario iniciar el servicio <b>awslogsd</b>.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
AWS CloudWatch
Alarms</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Son usadas para
provocar notificaciones en base a nuestras métricas definidas.
Generalmente los receptores de estas notificaciones son ASC, EC2
Actions o SNS.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Existen tres tipos
de alarmas: OK, INSUFFICIENT_DATA y ALARM.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
AWS CloudWatch
Events</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Crea JSON con
información relevante sobre los cambios ocurridos. Hay 2 tipos de
Eventos:</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<ul>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Scehdule
</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Event pattern</div>
</li>
</ul>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-82574832023974476852020-05-08T21:20:00.000-07:002020-05-09T17:40:42.038-07:00<b>AWS Cloud Trail</b><br />
<br />
Registra todas las llamadas que se realizan a las API de AWS en tu cuenta ya sea desde la consola, SDK,CLI u otros servicios AWS. Por default esta habilitado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-XnsPQSUYgOo/XrYu_P3vFpI/AAAAAAAAJoY/kyKp4JDxq2gS51UXHaPGrpnykYTEnpWRACNcBGAsYHQ/s1600/AWSTrail.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="352" height="191" src="https://1.bp.blogspot.com/-XnsPQSUYgOo/XrYu_P3vFpI/AAAAAAAAJoY/kyKp4JDxq2gS51UXHaPGrpnykYTEnpWRACNcBGAsYHQ/s200/AWSTrail.PNG" width="200" /></a></div>
<br />
<br />
El registro de las llamadas varia pero según la documentación oficial el periodo de registro oscila los 15 minutos después de realizarse la llamada. En verdad que es útil ver el el historial de llamadas y la información que registran los eventos es muy amplia. Este es el servicio que nos permite de la manera más sencilla saber cuando se modifico una función lambda o cuando se elimino algún recurso.<br />
<br />
Los logs que genera CloudTrail puede ser puestos en CloudWatch Logs y por default se cifran usando Amason S3 SSE. Es importante decir que CloudTrail no transmite eventos superiores a 256 KB de tamaño.<br />
<br />
Un trail es una configuración que nos permite enviar logs de actividad de las llamadas a las API de AWS. Existe 2 tipos de trail para todas las regiones (default) o para una sola región. La recomendación es tenerlos siempre habilitados y asociados a todas las regiones. Aunque la configuración default registra eventos para todas las regiones, solo se pueden ver los eventos para la región particular en la que estamos en ese momento.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-wPDMIJjzyyw/XrYusZfuvaI/AAAAAAAAJoQ/dG7ay1NIG3obljVLZo-7lZBC9-f0yqBwgCNcBGAsYHQ/s1600/trail.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="1120" height="126" src="https://1.bp.blogspot.com/-wPDMIJjzyyw/XrYusZfuvaI/AAAAAAAAJoQ/dG7ay1NIG3obljVLZo-7lZBC9-f0yqBwgCNcBGAsYHQ/s320/trail.PNG" width="320" /></a></div>
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-38631901737927937352020-04-06T21:53:00.001-07:002020-04-06T22:11:07.339-07:00Amazon Elastic Compute Cloud EC2<br /><div style="line-height: 100%; margin-bottom: 0cm;">
Web Service que provee capacidad de computo en la nube.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Las instancias son
la base de EC2. Estas son servidores virtuales que pueden ser
adquiridos mediante múltiples opciones disponibles. La estrategia
asociada al cobro esta directamente relacionada a las hora de uso de
dicha instancia.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Cuando una instancia
es lanzada hay que tomar en cuenta 2 factores muy relevantes: El
hardware virtual asociado a la instancia así como el software que
será cargado en ella.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Se clasifican y
diferencian mediante los siguientes factores:</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<ul>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
CPUs virtuales.</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Memoria.</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Almacenamiento(tipo
y tamaño).</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Rendimiento de
red.</div>
</li>
</ul>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Las instancias son
agrupadas en familias que se definen en base a los criterios antes
mencionados. Para cada familia hay múltiples opciones que pueden ser
seleccionadas y que son escaladas linealmente. Por ejemplo para la
familia m4 podemos considerar una instancia tipo m4.large definida
por 2 vCPUs siendo así la siguiente instancia m4.xlarge escala a 4
vCPus y para m4.2xlarge contaremos con 8 vCPUs. Este comportamiento
es consistente en todas las familias.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Existe una gran
variedad de familias. A continuación mencionaremos algunas de las
más populares.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
<table border="1" cellpadding="5" style="width: 100%;">
<tbody>
<tr><td>R</td><td>Optimizadas en memoria RAM.</td><td>Caches en memoria.</td></tr>
<tr><td>C</td><td>Optimizadas en computo .</td><td>Computo y Base de Datos.</td></tr>
<tr><td>M</td><td>Balanceadas.</td><td>Uso general y aplicaciones web.</td></tr>
<tr><td>I</td><td>Optimizadas para almacenamiento, I/O.</td><td>Base de Datos, almacenamiento</td></tr>
<tr><td>G</td><td>Basadas en GPU.</td><td>Machine Learning, render de videos.</td></tr>
</tbody>
</table>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<a href="https://www.blogger.com/null" name="tw-target-text"></a>
El rendimiento de red es muy relevante al momento de seleccionar
nuestra instancia, este rendimiento se ve incrementado con forme las
instancias crecen dentro de una familia. En caso de requerir un
desempeño mayor para algunas instancias existe la posibilidad de
utilizar el concepto de “<i>enchanced networking</i>”. Su uso
reduce el impacto de la <span lang="es-ES">virtualización</span> en
el rendimiento de red permitiendo la transferencia de un mayor número
de paquetes por segundo (PPS) y bajar la latencia. Sin embargo ademas
de que la instancia permita el uso de “enchanced networking”
estas instancias deberán estar contenidas dentro de una VPC.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Amazon Machine
Images <b>AMI</b></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="font-weight: normal; line-height: 100%; margin-bottom: 0cm;">
Es el encargado de definir el software que va a estar presente en la
instancia al momento de ser iniciada, como es el Sistema Operativo,
aplicaciones o software de sistema.
</div>
<div style="font-weight: normal; line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="font-weight: normal; line-height: 100%; margin-bottom: 0cm;">
Al momento existe 4 tipos de orígenes para las AMIs</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
<table border="1" cellpadding="5" style="width: 100%;">
<tbody>
<tr><td>Publicadas por AWS</td><td>Múltiples distribuciones de Linux,Windows 2008 y Windows 2012.</td></tr>
<tr><td>AWS Marketplace</td><td>Tienda en línea con instancias que pueden contener software especializado que a su vez puede generar cargos extras.</td></tr>
<tr><td>Generadas desde instancias existentes</td><td>Generadas basadas en instancias existentes que ya cumplen con algún tipo de requisito.</td></tr>
<tr><td>Servidores virtuales subidos</td><td>Utiliza el servicio de AWS VM para importar o exportar imágenes a partir de varios formatos.</td></tr>
</tbody>
</table>
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Abordar una
instancias</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Public Domain Name
System (DNS) name
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Al momento de
iniciar la instancia AWS crea un nombre DNS automáticamente que
puede ser usado para acceder a la instancia. Este nombre no puede ser
especificado por el usuario y persiste solo mientras la instancia
este corriendo, así mismo no puede ser transferido a otra instancia.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
IP pública</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Opcionalmente una
instancia puede ser asociada a una dirección IP pública. Esta IP es
asignada por AWS de una reserva de IP que administra y no puede ser
especificada por el usuario. Persiste mientras la instancia este
corriendo y no puede ser transferida a otra instancia.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Elastic IP</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Es una clase
especial de dirección IP pública que puede ser asociada a nuestra
instancias. Estas son persistentes para un mismo usuario hasta que el
usuario decida. Está si puede ser transferida entre múltiples
instancias (una a la vez) y generalmente es usada en casos de fallas
de instancias.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Acceso inicial
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
EC2 usa criptografía
de llave pública para cifrar y descifrar la información de login.
Particularmente usa la llave pública para cifrar y la privada para
descifrar. Este par de llaves es conocido como<i> key pair </i><span style="font-style: normal;">la
llave pública es conservada por AWS y la privada por el cliente. Al
momento de crear nuestra instancia la consola nos pregunta si
requerimos generar un key pair nuevo o si vamos a usar un par de
llaves ya existente. Es importante administrar correctamente este
archivo. </span>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">El
usuario inicial para instancias con Sistema Operativo Linux es
ec2-user, y para hacer este primer acceso es necesario conectarse
mediante SSH dando como parámetro nuestro key pair.</span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">Es
importante ubicar el archivo *.pem </span><span style="font-style: normal;">y
otorgarle los permisos necesario de lectura.</span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">>
chmod 400 {nombre}.pem</span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">Una
vez otorgado el permiso de lectura, ya podemos ejecutar SSH.</span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">>
ssh -i {nombre}.pem ec2-user@{ip-pública asociada}</span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;">Francamente
no he generado ninguna instancia Windows así es que no detallo los
pasos. :p </span>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
</div>
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-33370063818572904352020-03-16T19:19:00.002-07:002020-04-05T22:30:40.501-07:00Amazon Simple Storage Service (S3)<div style="line-height: 100%; margin-bottom: 0cm;">
Función principal: Almacenamiento seguro, durable y altamente
escalable en la nube.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Ejemplos de casos de
uso populares:</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<ul>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Backups.</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Almacenamiento
y distribución de contenido (software, media).</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Big data.</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Web hosting
estático.</div>
</li>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
Recuperación
de desastres.</div>
</li>
</ul>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Storage classes: <i>General purpose, infrequent access y archive.</i></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Servicios similares: Amazon Glacier</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Detalles:</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">S3
utiliza un sistema de almacenamiento llamado </span><i><span style="text-decoration: none;">cloud
object storage, </span></i><span style="font-style: normal;"><span style="text-decoration: none;">el
almacenamiento es independiente de un servidor y se accede a tráves
de Internet. Todos los datos almacenados se consideran objetos y
estos son administrados usando una API basada en verbos HTTP. Los
objetos están compuestos por datos y metadatos. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">Los
metadatos pueden ser de tipo </span></span><i><span style="text-decoration: none;">system</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
creados por Amazon o </span></span><i><span style="text-decoration: none;">user</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
que son opcionales. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">Cada
objeto es identificado por una llave que nosotros proporcionamos,
esta llave hace a su vez la función de nombre del archivo. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">Los
objetos son automáticamente replicados en </span></span><span style="font-style: normal;"><span style="text-decoration: none;">múltiples</span></span><span style="font-style: normal;"><span style="text-decoration: none;">
instalaciones y dispositivos dentro de una misma región. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">El
tamaño de los objetos puede variar entre 0 bytes y 5TB.</span></span><span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">Cada</span></span></span><span lang="es-ES"><span style="font-style: normal;"><span style="text-decoration: none;">
objeto puede ser dirigido por un</span></span></span><span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">a</span></span></span><span lang="es-ES"><span style="font-style: normal;"><span style="text-decoration: none;">
únic</span></span></span><span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">a
URL formada por el endpoint del webservice + el nombre del </span></span></span><span lang="es-MX"><i><span style="text-decoration: none;">bucket</span></i></span><span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">
+ el la llave del objeto.</span></span></span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">Ejemplo:</span></span></span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<b><span lang="es-MX"><span style="font-style: normal;"><span style="text-decoration: none;">http://nombreBucket.s3.amazonaws.com/llave</span></span></span></b></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;"><span style="text-decoration: none;">Los
objetos mencionados son almacenados en una estructura llamada </span></span><i><span style="text-decoration: none;">bucket.
</span></i><span style="font-style: normal;"><span style="text-decoration: none;">Los
</span></span><i><span style="text-decoration: none;">buckets</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
son simplemente carpetas planas que no tiene ningún tipo de
estructura jerárquica. Virtualmente cada </span></span><i><span style="text-decoration: none;">bucket</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
puede almacenar la cantidad de objetos que queramos. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">Los
nombres de los </span></span><i><span style="text-decoration: none;">bucktes</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
son globales, así es que los nombres tienen que ser únicos y pueden
contener hasta 63 caracteres incluyendo números, guiones y puntos.
La sugerencia es basarse en un sistema similar a las reglas de los
DNS. Cada </span></span><i><span style="text-decoration: none;">bucket</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
se crea en una región especificada seleccionada por nosotros.</span></span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;"><span style="text-decoration: none;">S3
esta altamente optimizado para lecturas y sus características
min</span></span><span style="font-style: normal;"><span style="text-decoration: none;">i</span></span><span style="font-style: normal;"><span style="text-decoration: none;">malistas
son intencionales con el fin de brindar mayor escalabilidad y
durabilidad. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">
Ahora mencionamos las operaciones permitidas.</span></span></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<ul>
<li><div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;"><span style="text-decoration: none;">Crear
y eliminar </span></span><i><span style="text-decoration: none;">buckets.</span></i></div>
</li>
<li><div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Escribir objetos.</span></div>
</li>
<li><div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Leer objetos.</span></div>
</li>
<li><div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Borrar objetos.</span></div>
</li>
<li><div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Listar llaves en un </span><i><span style="text-decoration: none;"><span style="font-weight: normal;">bucket</span></span></i><span style="text-decoration: none;">.</span></div>
</li>
</ul>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Durabilidad
: 99.999999999%</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Disponibilidad:
99.99%</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Consistencia
de datos:</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Se
basa en un sistema eventual de consistencia debido a la replicación
en múltiples servidores y localidades los cambios realizados pueden
tardar un poco en propagarse. </span><span style="text-decoration: none;">Para
</span><i><span style="text-decoration: none;">PUTs</span></i><span style="text-decoration: none;">
nuevos no existe ninguna consideración ya que se garantiza
consistencia de lectura después de escritura. Sin embargo cuando
utilizamos </span><i><span style="text-decoration: none;">PUT</span></i><span style="text-decoration: none;">
o </span><i><span style="text-decoration: none;">DELETE</span></i><span style="text-decoration: none;">
para un objeto ya existente se aplica la estrategia de consistencia
eventual. Esto quiere decir que podríamos recibir la información no
actualizada pero nunca una mezcla inconsistente de datos.</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">Control
de acceso:</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;"><span style="text-decoration: none;">Por
default cuando creamos un </span></span><i><span style="text-decoration: none;">bucket</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
solo el creador tiene acceso a el. Después de eso es nuestra
responsabilidad utilizar alguno de los mecanismos que se ofrecen para
dar acceso a terceros. Podemos hacer uso de ACLs para dar acceso a
nivel de </span></span><i><span style="text-decoration: none;">bucket</span></i><span style="font-style: normal;"><span style="text-decoration: none;">
ó podemos hacer uso de la recomendación de Amazon y usar políticas
especificas para cada </span></span><i><span style="text-decoration: none;">bucket. </span></i><br />
<br />
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm;">
<span style="text-decoration: none;">W</span><span style="text-decoration: none;">eb
hosting </span><span style="text-decoration: none;">estático</span><span style="text-decoration: none;">:</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Rápido, muy escalable y mucho más seguro que un sitio web dinámico.</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Prefijos y delimitadores:</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-style: normal;"><span style="text-decoration: none;">Debido
a la estructura plana la utilización de prefijos y delimitadores
permite organizar y navegar simulando una estructura jerárquica. Es
común utilizar “/” y ”\”. </span></span><span style="font-style: normal;"><span style="text-decoration: none;">Utilizando
IAM o políticas aplicadas a los buckets podemos filtrar accesos a
distintos usuario.</span></span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Ejemplos:</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Nombre del objeto: 2008/septiembre/foto1.jpg</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Es importante recalcar que es una simple emulación ya que S3 no es
un sistema de archivos.</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
Storage classes:
</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<i>General purpose, infrequent access y archive.</i></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<i>S3 Standard –</i><span style="font-style: normal;"> </span><span style="font-style: normal;">P</span><span style="font-style: normal;">ara
la mayoría de los casos de uso general. </span>
</div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<i>S3 Standard </i><i>I</i><i>nfrequent </i><i>A</i><i>ccess – </i><span style="font-style: normal;">Para
archivos que </span><span style="font-style: normal;">persisten</span><span style="font-style: normal;">
por un tiempo más largo </span><span style="font-style: normal;">(más
de 30 días) </span><span style="font-style: normal;">y que su acceso
no es tan frecuente. </span><span style="font-style: normal;">Su costo
depende de uso en GB que se haga.</span></div>
<div style="font-style: normal; line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<i>S3 Reduced Redundancy Storage – </i><span style="font-style: normal;">Ideal
para datos que puedes ser calculados o recuperados fácilmente.</span><br />
<br />
<span style="font-style: normal;"> Utilizar el API SDK de AWS para Java es realmente muy sencillo, imagino que debe de ser igual de sencillo para otro lenguaje soportado. <br /><br />Particularmente realice el ejemplo que viene en la documentación y adicionalmente realice un PUT usando un InputStream, en ese caso la firma requiere de un ObjectMetada en cual agregue la información de tamaño del contenido. <br /></span></div>
<div style="line-height: 100%; margin-bottom: 0cm; text-decoration: none;">
<br /></div>
<pre class="western" style="text-decoration: none;"><code class="western"><span style="font-style: normal;"><a href="https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-objects.html">https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-objects.html</a> </span></code></pre>
<i><span style="text-decoration: none;"> </span></i>
</div>
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-73463353961110243872017-09-26T13:57:00.000-07:002017-09-26T13:57:09.434-07:00Ready Player OneUna avalancha de referencias culturales adecuadas a una buena historia da como resultado “Ready Player One”. Nunca he visto una laptop llena de calcomanías que no se vea culera por más chidas que estén y en este caso este libro logra llenarse de calcomanías y verse genial. Las referencias culturales son inmensas, pero en ningún momento están de más, si bien algunas pueden no ser completamente de tu agrado o son desconocidas seguramente alguna de ellas si marco tú vida.
<div class="separator" style="clear: both; text-align: center;"><a href="https://vignette.wikia.nocookie.net/camp-halfblood-roleplay/images/4/47/Macbook_sticker.jpg/revision/latest?cb=20130411192126" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://vignette.wikia.nocookie.net/camp-halfblood-roleplay/images/4/47/Macbook_sticker.jpg/revision/latest?cb=20130411192126" width="320" height="240" data-original-width="420" data-original-height="315" /></a></div>
Otro aspecto a destacar es el contraste que marca entre la vida real y la virtual, me pareció muy adecuado como logra mezclar y sacar provecho de sus características particulares. Me logro recordar un poco los cambios que ocurrían en la historia sin fin.
El libro está separado por niveles y luego por capítulos iniciando con una breve introducción de la situación que vive el protagonista. Para el final del primer nivel yo ya estaba completamente enganchado en la historia y solo quería leer el siguiente capítulo. Si bien sentí un ligero bajón en la historia después de esa primera explosión de emociones posteriormente en los capítulos intermedios y finales todo va para arriba, la emoción se mantiene viva en todo momento.
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-oF_kwQpO0nY/Wcq-p1U4LlI/AAAAAAAACQk/eYsnejb2VKE6q5E-wNrJH_wgBDz5Kh_owCLcBGAs/s1600/enganche.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-oF_kwQpO0nY/Wcq-p1U4LlI/AAAAAAAACQk/eYsnejb2VKE6q5E-wNrJH_wgBDz5Kh_owCLcBGAs/s320/enganche.png" width="320" height="178" data-original-width="1085" data-original-height="605" /></a></div>
Los personajes son otro acierto de la novela los protagonistas son muy agradables, el muy fácil sentir empatía con el personaje principal obviamente supero mis expectativas generadas al principio de la novela Art3mis es lo mejor, es la nerd que todos los nerds hemos deseado alguna vez, trae todo. Ache cumple también con creces en su rol como gran compañero en la aventura. Incluso los villanos están muy bien logrados y a las pocas páginas ya empiezas a aborrecer a los Sixers.
El sabor que me dejo al final fue muy agradable, el desenlace está bien logrado incorporando un mensaje moral y de reflexión, es como debía ser. Solo me queda recomendarlo y esperar a ver la película que se viene en 2018. El tráiler luce genial y solo puedo esperar que sea una gran película.
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-38440318746077749972017-01-14T22:45:00.001-08:002017-01-15T20:39:26.464-08:00Compañeros<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0cm;">
Esos compañeros de
los cuales unos días o semanas después puedes llamar amigos y que
les puedes decir que no traen nada o que son bien putos y simplemente
te la regresan o se mueren de risa.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Para mi todo comenzó
con mi primer trabajo que fue para una pequeña empresa de software
fundada por un grupo de amigos. El equipo estaba conformado
aproximadamente por 8 desarrolladores, 2 diseñadores, una persona
encargada de temas administrativos y 2 personas de ventas. El
ambiente laboral era fantástico y entre los desarrolladores era aún
más cercano gracias a que la mayoría nos habíamos conocido
previamente. Hacíamos muchas actividades en conjunto tanto dentro
como fuera de la oficina, pero claro que la mayoría de estas pasaban
dentro de la oficina. Las platicas de sobremesa eran fascinantes y
siempre divertidas, cualquier tema era valido. Solo un par de
ocaciones hubo algunos roces y claro que había mejores relaciones
entre algunos, pero sinceramente puedo asegurar que todos nos
convertimos en amigos. Había una particularidad en la oficina, la
chica de administración junto con los de ventas salían temprano
siempre y los diseñadores a las 6 en punto aplicaban el famoso "Yaba
daba doooo"! A partir de ese momento todo era permitido, las 6 marcaba
la línea en la que no había reglas nos expresábamos como queríamos
nos convertíamos en una bola de patanes que no teníamos limites.
Las bromas eran muy pesadas, los apodos y burlas eran cosa de todos
los días que en lugar de desgastar nuestra relación solo hacia más
grande nuestro lazo afectivo, claro algunas veces si era necesario
quedarse a trabajar, pero gran parte de las veces nos quedábamos
simplemente para cotorrear. Otras veces había retas de PES
obviamente estaba instalado en el server XD, pero se ponía mejor
cuando se armaba la reta 3 vs 3. Toda la noche dejábamos bajando
“material” que ese día entre la mayoría habíamos decidido
bajar y solo puedo decir que al poco tiempo llenamos el disco duro.
Así fue poco más de un año, con grandes sonrisas y buenos
momentos.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Bm2aFZT2-tA/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Bm2aFZT2-tA?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Mi carrera ha sido
larga y diversa y en todos siempre he podido encontrar grandes amigos
sin embargo hay 2 trabajos que merecen una mención honorífica. Mi
primer trabajo en Guadalajara marco mi primera vez fuera de casa,
afortunadamente así también lo fue para varios compañeros que
pronto nos acoplamos y apoyamos para esa nueva aventura. Hoy en día
gran parte de mis relaciones personales están basadas en ese
trabajo. Las condiciones laborales se prestaban para salir a
desayunar diario y hacer múltiples visitas al OXXO. La empresa era
muy grande y se daba pie para formar muchos grupos y conocer gente
nueva con cada ingreso. En total fueron casi 3 años de una
experiencia social muy grata y que como mencione anteriormente que
gran parte de esas personas siguen afortunadamente cerca de mi hasta
la fecha.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Mi regreso a
Guadalajara marco el ultimo trabajo en el que se genero un grupo
realmente especial y aunque seguimos en contacto por medio de un chat
lamentablemente el tiempo de convivencia personal fue muy breve. En
el papel las condiciones sonaban un poco adversas, no existe ningún
parecido entre nosotros, somos de distintas edades y distintas
ciudades, ahora cuanto a gustos a algunos nos gustan Los Simpsons a
otro no, a unos nos gusta el fut a otro no, ellos son putos yo no. El
chiste es que entramos a la empresa el mismo día y eso fue
suficiente para crear ese gran grupo en el que me siento privilegiado
de estar.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0cm;">
Debo decir que he
sido demasiado afortunado en cuanto compañeros se refiere y no ha
habido un trabajo en el que no saliera ganando un buen amigo. Espero
que ustedes tengan la misma fortuna que yo. </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
Manuhttp://www.blogger.com/profile/15268868863058079966noreply@blogger.com1tag:blogger.com,1999:blog-3631400745966221264.post-28473156159224585942014-06-10T12:53:00.003-07:002014-07-14T14:01:06.520-07:00Lo que nos dejó el #WWDC2014 <br />
El día lunes de la semana pasada en San Francisco se llevó a cabo la Conferencia Mundial de Desarrolladores, que se realiza anualmente por Apple Inc o como muchos conocen "WWDC".<br />
<br />
Como cada año los Apple FanBoys , siempre están al pendiente de lo que depara en esta edición por eso en <a href="http://moztrodev.blogspot.com/">MoztroDev </a>nos pusimos a seguir la transmisión para poder hacer este post mas detalladamente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-9-gP3zB3TUQ/U5dhMZVxe-I/AAAAAAAABtA/qvEGtRFgprM/s1600/wwdc2014.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-9-gP3zB3TUQ/U5dhMZVxe-I/AAAAAAAABtA/qvEGtRFgprM/s1600/wwdc2014.jpg" height="30%" width="70%" /></a></div>
<!--StyleSheet Link--><br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
</div>
<!--StyleSheet Link--><br />
<!--StyleSheet Link--><!--StyleSheet Link--><!--StyleSheet Link--> El Primer Tema abordado fue OSX con su nueva actualización nombrada Yosemite. La interfaz cambia un poco , obteniendo cada vez un poco más el diseño de iOS (vaya parece que enserio unificaran el estilo de los sistemas operativos) y lo que ofrece esta nueva versión del sistema operativo para sobremesas o portátiles de Apple es lo siguiente : <br />
<br />
<table style="width: 100%;">
<tbody>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-j2MgHYIbgd4/U5XwdwMLPsI/AAAAAAAABpg/WcC3iEyCJZ0/s1600/icloudDrive2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-j2MgHYIbgd4/U5XwdwMLPsI/AAAAAAAABpg/WcC3iEyCJZ0/s1600/icloudDrive2.jpg" height="100%" target="_blank" width="100%" /></a></div>
</td>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-oSGqg94kgxA/U5XzZ5GT3LI/AAAAAAAABps/SkjSmVuvras/s1600/osx_design_spotlight_wikipedia.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-oSGqg94kgxA/U5XzZ5GT3LI/AAAAAAAABps/SkjSmVuvras/s1600/osx_design_spotlight_wikipedia.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Z8Xxm32ahi0/U5X0S2yofMI/AAAAAAAABp0/lK4udQcH8tw/s1600/osx_design_view_mail.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Z8Xxm32ahi0/U5X0S2yofMI/AAAAAAAABp0/lK4udQcH8tw/s1600/osx_design_view_mail.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 40%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-IIqaIUkOnfI/U5X0nGUgnnI/AAAAAAAABp8/_ilgt66GfuM/s1600/osx_design_toolbars.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-IIqaIUkOnfI/U5X0nGUgnnI/AAAAAAAABp8/_ilgt66GfuM/s1600/osx_design_toolbars.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
</tr>
</tbody></table>
<br />
<ul>
<li>iCloudDrive: Querían un DropBox de la manzanita?, pues ya lo tienen, con esta nueva herramienta podremos guardar un documento, editarlo en un lugar y continuarlo en cualquier dispositivo Apple o incluso una máquina con Windows, por que si, así es , apple sacara su aditamento para que funcione incluso en la competencia.</li>
</ul>
<ul>
<li>Spotlight: Búsquedas más rápidas y amigables (ahora se incluyen resultados de internet), con la ventaja de poder pre visualizar lo encontrado.</li>
</ul>
<ul>
<li>Safari: Carga de una manera más rápida(6.5 veces más en páginas con javascript) y deja a la barra superior como el centro de todo parta tener mas espacio en la pantalla. </li>
</ul>
<ul>
<li>MailDrop: Ahora podremos enviar adjuntos de hasta 5Gb de espacio. Para evitar que el servidor destino rechace el correo, en caso de ser muy pesado para el , se enviara un link en lugar del archivo, de esta manera descargar el contenido como si de un sitio de descarga habitual se tratase (como FireDrive o Mega), </li>
</ul>
<ul>
<li>Continuity: Nueva aplicación que permitirá funcionar Airdrop entre Mac´s y iOS.</li>
</ul>
<ul>
</ul>
<ul><ul>
<li>Handoff : Un nuevo sistema que permitiría pasar rápidamente lo que hagas en tu dispositivo móvil a tu Mac.</li>
</ul>
<ul>
<li>Llamadas: Ahora se podrá usar tu Mac como un altavoz, podrás contestar la llamada desde sin tener que tocar tu iPhone.</li>
</ul>
</ul>
<ul>
</ul>
Les dejo un video hecho por <a href="http://www.mac4ever.com/">Mac4Ever.com</a> con la demostración de OSX Yosemite y iOS 8 integrados con Handoff<br />
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/X5POI6nDR_k/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/X5POI6nDR_k&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="70%" height="50%" src="https://youtube.googleapis.com/v/X5POI6nDR_k&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />
Y por supuesto la actualización que esta apunto de llegar <u><i><b>it´s Free!</b></i></u><br />
Mas Información : <a href="http://www.apple.com/osx/preview/" target="_blank">Apple</a> <br />
<br />
<br />
<br />
Siguiendo el itinerario fue presentado iOS 8, pues bien, muchos esperaban otro cambio drástico en la interfaz, ya que la actual no a todos les agrado(en lo personal no me molesta esta nueva interfaz , era hora de un cambio en el aspecto, pero cada quien tiene sus propias conclusiones), sin embargo no fue así. Las mejoras de este sistema operativo recaen en la funcionalidad pues son lo que necesitábamos y llevamos pidiendo desde hace un buen tiempo, ahora con esta actualización podemos hacer los siguiente:<br />
<table style="width: 100%;">
<tbody>
<tr>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Pw9GJHJ87gA/U5YJLwJp24I/AAAAAAAABqM/Bu8g_9ifYRc/s1600/interactive_notifications_gallery_screen_messages.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Pw9GJHJ87gA/U5YJLwJp24I/AAAAAAAABqM/Bu8g_9ifYRc/s1600/interactive_notifications_gallery_screen_messages.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-HkZBRj5aqqM/U5YJSa-RrGI/AAAAAAAABqU/Vo_BAYvFRQ4/s1600/interactive_notifications_gallery_screen_third_party_apps.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-HkZBRj5aqqM/U5YJSa-RrGI/AAAAAAAABqU/Vo_BAYvFRQ4/s1600/interactive_notifications_gallery_screen_third_party_apps.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-o-_FI7cE1jU/U5YJmxjIKFI/AAAAAAAABqc/aVW14hbqRiY/s1600/voice_record.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-o-_FI7cE1jU/U5YJmxjIKFI/AAAAAAAABqc/aVW14hbqRiY/s1600/voice_record.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cFtI_xW8yK0/U5YJqgXmhyI/AAAAAAAABqk/Dk7yageBS_I/s1600/predicts_screen_messages.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-cFtI_xW8yK0/U5YJqgXmhyI/AAAAAAAABqk/Dk7yageBS_I/s1600/predicts_screen_messages.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qleIvOlgWpE/U5YJue70wII/AAAAAAAABqs/rWdY0b6b7dk/s1600/permission.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-qleIvOlgWpE/U5YJue70wII/AAAAAAAABqs/rWdY0b6b7dk/s1600/permission.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 14%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-79dDM2hLYMI/U5YKakECHTI/AAAAAAAABq4/gIvapElbwfY/s1600/notification.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-79dDM2hLYMI/U5YKakECHTI/AAAAAAAABq4/gIvapElbwfY/s1600/notification.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
<td style="width: 16%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-myVq24Hu65A/U5YMLuLyrFI/AAAAAAAABrE/ycjNLxDZpZM/s1600/important_hero.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-myVq24Hu65A/U5YMLuLyrFI/AAAAAAAABrE/ycjNLxDZpZM/s1600/important_hero.jpg" height="100%" target="_blank" width="100%" /></a></div>
<br /></td>
</tr>
</tbody></table>
<br />
<ul>
<li>Notificaciones Interactivas: Responder un mensaje desde cualquier aplicación, dar "like" a las notificaciones de facebook o comentar directamente, sin dejar lo que estamos haciendo, es ahora una realidad, una ventaja que desde hace mucho los usuarios pedían, muy bien Apple.</li>
</ul>
<ul>
<li>Contactos Recientes en la pantalla de Multitarea : los contactos que recién hemos llamado, ahora se muestran en la multitarea y además se les puede llamar o enviar un mensaje desde la misma pantalla.</li>
</ul>
<ul>
<li>Como se menciona arriba, con Continuity es posible contestar las llamadas del iPhone en el iPad o Mac, de forma natural. </li>
</ul>
<ul>
<li>La App de Mensajes(iMessages) ahora se parece más a Whatsapp, permite enviar mensajes de voz ,se ha agregado un nuevo modo de "no molestar" y permite la creación de grupos, así como enviar vídeos cortos.</li>
</ul>
<ul>
<li>iCloud Drive, ahora tenemos un administrador de archivos, podemos trabajar cualquier archivo que este enlazado a nuestro iCloud y trabajarlo en otro dispositivo Apple.</li>
</ul>
<ul>
<li>Healt, como se suponía se ha lanzado una aplicación completa para la Salud y Fitness, esta aplicación se encargara de mostrarnos todos los datos obtenidos por los sensores de apple y accesorios compatibles y de esta manera conocer mas sobre nuestro desempeño físico.</li>
</ul>
Solo resta esperar hasta el próximo otoño para que todo el mundo pueda disfrutar del nuevo sistema, pues por el momento solo esta disponible para los desarrolladores.<br />
En mi opinión, se escucharon algunas llamadas de emergencia hechas por los usuarios, fueron aplicadas de manera correcta y aunque el cambio no es tan drástico, las mejoras obtenidas son muy buenas, que sin duda cumplen con su objetivo, tener mejor facilidad al utilizar el celular.<br />
<br />
PD. La única mala noticia es para aquellos que cuenten con un iPhone 4 o menor, pues esta nueva versión de iOS no será compatible con nuestros dispositivos (ok, tengo que cambiar urgentemente mi iPhone). <br />
Mas información : <a href="https://www.apple.com/ios/ios8/" target="_blank">Apple</a><br />
<br />
Y finalmente este año se dio un segmento completo a los desarrolladores, pues Apple lo hiso en grande. Si bien programar para iOS no es algo que todo el mundo esta hablando y por ello se requiere llamar la atención de los programadores, pues además de incluir nuevas librerías para poder utilizar, se ha introducido un nuevo lenguaje de programación, pero aquí les dejamos los detalles :<br />
<ul>
<li>Fiesta para los desarrolladores, pues ahora se han introducido los siguientes Kits para desarrollar:</li>
<ul>
<table style="vertical-align: middle; width: 100%;">
<tbody>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1tFtfuhhLT4/U5YjyzZ9OII/AAAAAAAABrU/sWFBORb0zuY/s1600/developer_capabilities_icon_touchid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-1tFtfuhhLT4/U5YjyzZ9OII/AAAAAAAABrU/sWFBORb0zuY/s1600/developer_capabilities_icon_touchid.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>Touch ID : Con esta API, las aplicaciones de terceros podran usar ahora el detector de huellas y poder usarlo en vez de contraseñas.</li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Uzof4jS_Xng/U5YmnxbfxJI/AAAAAAAABrg/vw3dLH_1qew/s1600/developer_capabilities_icon_photokit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Uzof4jS_Xng/U5YmnxbfxJI/AAAAAAAABrg/vw3dLH_1qew/s1600/developer_capabilities_icon_photokit.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>Photo Kit : Apliaciones dedicadas a la fotografia podran editar directamente de la galeria sin tener que importarlas.</li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-jdY9QTR0k3g/U5Ym9_nJaGI/AAAAAAAABro/1l3gObE5coc/s1600/developer_capabilities_icon_camera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-jdY9QTR0k3g/U5Ym9_nJaGI/AAAAAAAABro/1l3gObE5coc/s1600/developer_capabilities_icon_camera.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>Camera API : Ahora las aplicaciones tendran mejor acceso a las funciones y sensores de la cámara. </li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-PRYGKdWF84g/U5YnUWa4hNI/AAAAAAAABrw/83nqG9j-2Iw/s1600/developer_capabilities_icon_healthkit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-PRYGKdWF84g/U5YnUWa4hNI/AAAAAAAABrw/83nqG9j-2Iw/s1600/developer_capabilities_icon_healthkit.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>HealthKit : Aplicaciones que se centren en en la salud y el fitness, podran compartir sus datos con la nueva aplicación de iOS 8 y de esta manera tener un lugar completo con todos nuestros datos. </li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-i7WzjBv607Q/U5YnfLznSyI/AAAAAAAABr4/fPaUsfPrRz0/s1600/developer_capabilities_icon_homekit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-i7WzjBv607Q/U5YnfLznSyI/AAAAAAAABr4/fPaUsfPrRz0/s1600/developer_capabilities_icon_homekit.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>HomeKit : Controlar una casa desde el SmarthPhone no esta muy lejos y con este kit cada vez esta mas cerca.</li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rHrJihF59Uk/U5YnmC8q-6I/AAAAAAAABsA/FH0iaNnBGzE/s1600/developer_capabilities_icon_cloudkit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-rHrJihF59Uk/U5YnmC8q-6I/AAAAAAAABsA/FH0iaNnBGzE/s1600/developer_capabilities_icon_cloudkit.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td style="width: 70%;"><br />
<br />
<li>CloudKit : Ahora los desarrolladores, podran acceder a todo el potencial de iCloud y utilizarlo en sus aplicaciones .</li>
</td>
</tr>
<tr>
<td style="width: 20%;"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-dBqvU0U4Cj4/U5YnsDBWCKI/AAAAAAAABsI/dRbItYe77nQ/s1600/developer_gaming_icon_sprite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-dBqvU0U4Cj4/U5YnsDBWCKI/AAAAAAAABsI/dRbItYe77nQ/s1600/developer_gaming_icon_sprite.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td li="" style="width: 70%;">SpriteKit : Este kit permite a los desarrolladores crear juegos en 2D que mantengan un gran performance y una mejor duración de la bateria.
</td>
</tr>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-sahIjG7nX0c/U5YnyJFWDkI/AAAAAAAABsQ/3KWSwE0Kogc/s1600/developer_gaming_icon_scene.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-sahIjG7nX0c/U5YnyJFWDkI/AAAAAAAABsQ/3KWSwE0Kogc/s1600/developer_gaming_icon_scene.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td><br />
<br />
<li>SceneKit : Creado para poder desarrollar mejores juegos en 3D.</li>
</td>
</tr>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-0V-DZF3Yvoc/U5Yn30jJvfI/AAAAAAAABsY/afbmsVuGcDE/s1600/developer_gaming_icon_agp5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-0V-DZF3Yvoc/U5Yn30jJvfI/AAAAAAAABsY/afbmsVuGcDE/s1600/developer_gaming_icon_agp5.png" height="50%" target="_blank" width="50%" /></a></div>
</td>
<td><br />
<br />
<li>Metal : Herramienta útil para aquellos que deseen construir juegos mas robustos, permitiendo utilizar al máximo el potencial de la CPU y GPU.</li>
</td>
</tr>
</tbody></table>
</ul>
</ul>
<ul>
<li>Swift , este nuevo lenguaje de programación diseñado para el desarrollo de aplicaciones en iOS o OSX, de la misma manera se puede utilizar y crear todo tipo de Appliaciones, desde las basicas hasta juegos en 3D. Con el se puede seguir utilizando todas las caracteristicas nativas que los desarrolladores utilziaban en Cocoa y Coca Touch , ademas de contar con el soporte de XCode 6 beta. Si esto no fuera suficiente, se incorpora "PlayGround" mediante el cual al cambiar una linea de codigo , el resultado se muestra en la aplicación en tiempo real. Para comenzar con el pie derecho en este nuevo lenguaje de programación, Apple ah puesto la documentación en formato iBook para <a href="https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11" target="_blank">descargar</a>. </li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-LhJNk8RFSCA/U5ckAQ_Kh7I/AAAAAAAABso/ApKDM45TxiE/s1600/swift-screenshot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-LhJNk8RFSCA/U5ckAQ_Kh7I/AAAAAAAABso/ApKDM45TxiE/s1600/swift-screenshot.jpg" height="50%" target="_blank" width="70%" /></a></div>
Para mas informacion del <a href="https://www.apple.com/ios/ios8/developer/" target="_blank">Nuevo SDK</a><br />
Para mas informacion de <a href="https://developer.apple.com/swift/" target="_blank">Swift</a><br />
<br />
Por lo pronto es todo, nos vemos en la proxima entrada, Saludos y que tengan un feliz development!!.<br />
<br />Anonymoushttp://www.blogger.com/profile/17098303040694152958noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-71619718887090204852014-05-30T07:53:00.000-07:002014-05-30T07:53:58.768-07:00Open Source y su mantenimiento<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-iZNH-t84dIY/U4iPywjVneI/AAAAAAAACpE/_v0wHkWnoyY/s1600/how+open+source+is+really+maintained.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-iZNH-t84dIY/U4iPywjVneI/AAAAAAAACpE/_v0wHkWnoyY/s1600/how+open+source+is+really+maintained.jpg" /></a></div>
<br />originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-3303915810837265912014-05-19T10:31:00.001-07:002014-05-19T10:31:25.173-07:00Vota para elegir el tráiler de JavaZone 2014JavaZone es la mas grande conferencia de Java realizada en Noruega, y se ha hecho famosa alrededor del mundo gracias a sus siempre divertidos trailers promocionales. Han conseguido videos tan geniales como <a href="https://www.youtube.com/watch?v=znTKuCyMrsk" target="_blank">Java 4-Ever</a> y <a href="https://www.youtube.com/watch?v=E3418SeWZfQ" target="_blank">Javapocalypse</a>. Para el evento de este año, nos presentan 3 propuestas para que el público elija el trailer que se publicará en Agosto. Veamos cuáles son.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pbs.twimg.com/media/BmZ5AE5CIAIOd2K.png:large" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://pbs.twimg.com/media/BmZ5AE5CIAIOd2K.png:large" width="640" /></a></div>
<br />
<a name='more'></a>Los tres videos promocionales a elegir son los siguientes:<br />
<br />
<b>Game of Codes</b><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/UvyTf5xvaXM?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<b>House of Codes</b><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/WUAzr-3DVP8?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<b>Writing Bad</b><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/DGa6MAibjzA?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
El último es mi favorito, así que ya hice mi parte. Y ustedes ¿Por cuál votarán?originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com1tag:blogger.com,1999:blog-3631400745966221264.post-35636369825250410182014-05-19T10:05:00.000-07:002014-05-19T10:05:13.424-07:00Creando una API REST con ASP.NET Web Api<div style="background-color: white; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; margin-top: 20px;">
<div style="text-align: justify;">
El internet es un mundo muy grande, cambiante y revolucionario, pero todo gracias a las personas que hacen uso de él y de quienes ayudan a mejorarlo a través de las tecnologías y el software. En éste último tema es en donde nos enfocaremos, en el que día con día se construyen mejores sistemas y servicios basados en <a href="http://es.wikipedia.org/wiki/Arquitectura_orientada_a_servicios" target="_blank">SOA</a>, y una de las cosas que lo ha permitido son las API's, tanto SOAP como REST (aunque las primeras han ido perdiendo terreno), siendo éstas últimas las de más auge recientemente. En este tutorial veremos como crear una API REST en .NET usando Web Api y EntityFramework.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://media.tumblr.com/80557ab388cf3e087f01f88031a6a3eb/tumblr_inline_mwmo0abIJ81rghs7f.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://media.tumblr.com/80557ab388cf3e087f01f88031a6a3eb/tumblr_inline_mwmo0abIJ81rghs7f.png" height="270" width="600" /></a></div>
</div>
<div style="background-color: white; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; margin-top: 20px;">
</div>
<a name='more'></a><span style="background-color: white; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;"><b>Lo que debes saber antes:</b></span><br />
<br />
<ul>
<li><a href="http://www.ddw.com.ar/blog/tecnologia-software-aplicaciones-y-servicios-web/331-que-es-y-para-que-sirve-una-api" style="font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;" target="_blank">¿Qué es una API?</a></li>
<li><a href="http://qbit.com.mx/blog/2012/02/14/rest-vs-soap/" style="font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;" target="_blank">SOAP vs REST</a></li>
</ul>
<br />
<span style="background-color: white; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;"><b>Lo que haremos</b></span><br />
<span style="background-color: white; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;">Desarrollaremos una API con los métodos CRUD usuales (get, post, put, delete) para una aplicación de colecciones de carritos. Para ello utilizaremos las siguientes herramientas: </span><br />
<div style="background-color: white; margin-top: 20px;">
</div>
<ul>
<li style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;">Herramientas</li>
<ul style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<li style="text-align: justify;">Visual Studio 2013, MS Sql Server 2008, Fiddler Web Debugger.</li>
</ul>
<li style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;">Frameworks</li>
<ul style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<li style="text-align: justify;">ASP.NET Web Api, Entity Framework.</li>
</ul>
<li style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: justify;">Programación</li>
<ul style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<li style="text-align: justify;">C#, Linq</li>
</ul>
</ul>
<div style="text-align: justify;">
<span style="color: #333333; font-family: Lucida Grande, Arial, Helvetica Neue, sans-serif;"><span style="font-size: 14px; line-height: 24px;"><b>¡Let's start!</b></span></span></div>
<div style="background-color: white; margin-top: 20px;">
<div style="text-align: justify;">
<span style="color: #333333; font-family: Lucida Grande, Arial, Helvetica Neue, sans-serif;"><span style="font-size: 14px; line-height: 24px;"><b>Modelo en BD</b></span></span></div>
<div style="text-align: justify;">
<span style="color: #333333; font-family: Lucida Grande, Arial, Helvetica Neue, sans-serif;"><span style="font-size: 14px; line-height: 24px;">Lo primero que haremos será crear una pequeña base de datos (yo la llamaré HWdatabase) de la siguiente manera:</span></span></div>
</div>
<code>
</code>
<br />
<div style="background-color: white; margin-top: 20px;">
<pre class="lang-sql prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">CREATE TABLE</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> Users(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">UserId <span style="color: darkblue;">INT PRIMARY KEY IDENTITY, </span><span style="background-color: transparent; white-space: inherit;">UserName </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">NVARCHAR(100), </span><span style="background-color: transparent; white-space: inherit;">UserLogin </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">NVARCHAR(50), </span><span style="background-color: transparent; white-space: inherit;">UserPassword </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">NVARCHAR(20),</span></span></code><span style="background-color: transparent; white-space: inherit;"> Activo</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span style="background-color: transparent; color: darkblue; white-space: inherit;"> BIT)</span></span></pre>
</div>
<code>
</code>
<br />
<div style="background-color: white; margin-top: 20px;">
<pre class="lang-sql prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">CREATE TABLE</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> Cars(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">CarId <span style="color: darkblue;">INT PRIMARY KEY IDENTITY, </span><span style="background-color: transparent; white-space: inherit;">CarName </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">NVARCHAR(50), </span><span style="background-color: transparent; white-space: inherit;">Tags </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">TEXT, </span></span></code><span style="background-color: transparent; white-space: inherit;">Activo</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span style="background-color: transparent; color: darkblue; white-space: inherit;"> BIT)</span></span></code></pre>
</div>
<code>
</code>
<br />
<div style="background-color: white; margin-top: 20px;">
<pre class="lang-sql prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">CREATE TABLE</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> CarCollection(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">CarCollectionId <span style="color: darkblue;">INT PRIMARY KEY IDENTITY, </span><span style="background-color: transparent; white-space: inherit;">CarId </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">INT FOREIGN KEY REFERENCES Ca</span></span></code><span style="background-color: transparent; white-space: inherit;">rs(CarId)</span><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; color: darkblue; white-space: inherit;">, </span><span style="background-color: transparent; white-space: inherit;">UserId </span><span style="background-color: transparent; color: darkblue; white-space: inherit;">INT FOREIGN KEY REFERENCES </span><span style="background-color: transparent; white-space: inherit;">Users(UserId)</span></span></code><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; color: darkblue; white-space: inherit;">,</span></span></code><span style="background-color: transparent; white-space: inherit;"> Activo</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span style="background-color: transparent; color: darkblue; white-space: inherit;"> BIT)</span></span></code></pre>
</div>
<code>
</code>
<br />
<div style="background-color: white; margin-top: 20px;">
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code>Los datos que he ingresado a la BD son los siguientes:</code></div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-QZdJxlml2WA/U20U1xDFDlI/AAAAAAAACkk/MotHyM6yJbs/s1600/Screen+Shot+2014-05-09+at+12.47.16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-QZdJxlml2WA/U20U1xDFDlI/AAAAAAAACkk/MotHyM6yJbs/s1600/Screen+Shot+2014-05-09+at+12.47.16.png" height="228" width="320" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code><b>Creando un proyecto Web Api</b></code></div>
</div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>Ahora que ya tenemos nuestros datos abramos nuestro Visual Studio. Creamos un nuevo proyecto de ASP.NET MCV 4 y denle el nombre que quieran, yo lo llamaré HWwebApi.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-L4jp_XyypFE/U20XQBXGkCI/AAAAAAAACkw/WlxMrm47e0Y/s1600/Screen+Shot+2014-05-09+at+12.56.52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-L4jp_XyypFE/U20XQBXGkCI/AAAAAAAACkw/WlxMrm47e0Y/s1600/Screen+Shot+2014-05-09+at+12.56.52.png" height="283" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>En la siguiente pantalla seleccionamos Web Api, y clickamos en OK.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-Gvz6Ps-LLuE/U20XVgW-f5I/AAAAAAAACk4/ErJOmN1EceE/s1600/Screen+Shot+2014-05-09+at+12.57.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Gvz6Ps-LLuE/U20XVgW-f5I/AAAAAAAACk4/ErJOmN1EceE/s1600/Screen+Shot+2014-05-09+at+12.57.22.png" height="361" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code><b>Creando el modelo con Entity Framework</b></code></div>
</div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>A continuación utilizaremos las tablas de la base de datos para crear nuestro modelo. Haciendo click derecho sobre nuestro proyecto->Add->New Item y en la sección Data seleccionamos ADO.NET Entity Data Model, le damos un nombre y continuamos.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-frScxq1NAcE/U20Y8iYrAzI/AAAAAAAAClE/SdDjP6uG5No/s1600/Screen+Shot+2014-05-09+at+13.05.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-frScxq1NAcE/U20Y8iYrAzI/AAAAAAAAClE/SdDjP6uG5No/s1600/Screen+Shot+2014-05-09+at+13.05.22.png" height="283" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>En la siguiente pantalla seleccionamos "Generate from database", y luego Next.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-rn4CTIDt4B8/U20ZM_UnpsI/AAAAAAAAClM/JerCxJp-EVA/s1600/Screen+Shot+2014-05-09+at+13.06.29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-rn4CTIDt4B8/U20ZM_UnpsI/AAAAAAAAClM/JerCxJp-EVA/s1600/Screen+Shot+2014-05-09+at+13.06.29.png" height="358" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>A continuación clickamos sobre New Connection para añadir la conexión con nuestra base de datos.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://2.bp.blogspot.com/-BHN8UxQCDPs/U20ZgVwLKtI/AAAAAAAAClU/H6-43KEZtjc/s1600/Screen+Shot+2014-05-09+at+13.07.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-BHN8UxQCDPs/U20ZgVwLKtI/AAAAAAAAClU/H6-43KEZtjc/s1600/Screen+Shot+2014-05-09+at+13.07.47.png" height="357" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>Introducimos los datos de nuestro servidor y el nombre de la base de datos. Seleccionamos OK.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://3.bp.blogspot.com/-Uikip_5-0ug/U20aMCj7gOI/AAAAAAAAClg/aboLptZJR3Q/s1600/Screen+Shot+2014-05-09+at+13.10.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Uikip_5-0ug/U20aMCj7gOI/AAAAAAAAClg/aboLptZJR3Q/s1600/Screen+Shot+2014-05-09+at+13.10.40.png" height="400" width="272" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>Ahora solo le damos un nombre a nuestra conexión (en mi caso HWEntities) y click en Next</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://3.bp.blogspot.com/-w6sDuK4RDiE/U20as5IcjjI/AAAAAAAAClo/pdVF-e8O_WI/s1600/Screen+Shot+2014-05-09+at+13.12.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-w6sDuK4RDiE/U20as5IcjjI/AAAAAAAAClo/pdVF-e8O_WI/s1600/Screen+Shot+2014-05-09+at+13.12.40.png" height="358" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>Por último, seleccionamos todas las tablas de nuestra base de datos, y también la opción que dice "Pluralize or singularize generated object names", esto es para que cree nuestras entidades de manera singularizada, esto si sus tablas las crearon con nombres pluralizados, es opcional. Damos click en Finish.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://4.bp.blogspot.com/-I0jWxzJhlpk/U20bc52dv6I/AAAAAAAAClw/Mdmk0e-dXoA/s1600/Screen+Shot+2014-05-09+at+13.16.01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-I0jWxzJhlpk/U20bc52dv6I/AAAAAAAAClw/Mdmk0e-dXoA/s1600/Screen+Shot+2014-05-09+at+13.16.01.png" height="357" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code><b>Creando el API Controller</b></code></div>
</div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>Ya que tenemos el modelo, vayamos a crear el controlador con los métodos necesarios. Sobre la carpeta Controllers de nuestro proyecto damos click derecho->Add->Controller.</code></div>
</div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<div style="text-align: justify;">
<code>En la pantalla que aparece le damos un nombre a nuestro controlador (elijan un nombre y denle la terminación Controller), en Template asegurense de escoger el API Controller que usa Entity Framework, en Model class seleccionamos nuestra entidad CarCollection y en DataContext nuestra cadena de conexión (en mi caso era HWEntities). Deben tener algo como lo que se ve en la imagen. Una vez que tengan todo listo, dan click en Add.</code></div>
</div>
<div class="separator" style="clear: both; color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px; text-align: center;">
<code><a href="http://1.bp.blogspot.com/-rw1od-amzb8/U20hhLTd57I/AAAAAAAACmA/GxZ40k0rZFM/s1600/Screen+Shot+2014-05-09+at+13.41.58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-rw1od-amzb8/U20hhLTd57I/AAAAAAAACmA/GxZ40k0rZFM/s1600/Screen+Shot+2014-05-09+at+13.41.58.png" height="260" width="400" /></a></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code>Como pueden ver les genera una clase controlador con los métodos de la API utilizando el modelo que creamos anteriormente con Entity Framework.</code></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: center;">
<a href="http://2.bp.blogspot.com/-Nk7xopQWGLM/U3oXkh3TamI/AAAAAAAACmY/v_Z_vWk-8vY/s1600/Screen+Shot+2014-05-19+at+9.38.30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Nk7xopQWGLM/U3oXkh3TamI/AAAAAAAACmY/v_Z_vWk-8vY/s1600/Screen+Shot+2014-05-19+at+9.38.30.png" height="281" width="400" /></a></div>
<div style="color: #333333; font-family: 'Lucida Grande', Arial, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 24px;">
<code><br /></code></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><b>Probando la AP... Pero antes una sola cosita</b></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Recordemos que estamos construyendo una API REST con EF y que devuelve datos en JSON, y recordemos que JSON no soporta referencias circulares (aquello de que una colección referencia a un carro, y el carro a su vez referencia a la colección a la que pertenece y ésta a su vez... entienden?), pueden encontrar mucha información en internet sobre este problema y muy buenas soluciones. Lo que haremos nosotros será especificar los datos que queremos devolver y, de ésta manera, evitar las referencias circulares que pudiesen haber.</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><b>Evitando referencias circulares</b></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Sooooooo, let's go Linq!!! Cambiaremos un poco los métodos GET, ya que los problemas de referencia circular se dan en las consultas. </span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">El primer método GET nos queda de la siguiente manera:</span></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: center;">
<a href="http://1.bp.blogspot.com/-71kpNXAOO0s/U3ofobKnyII/AAAAAAAACm4/LKWsOXjemTU/s1600/Screen+Shot+2014-05-19+at+10.13.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-71kpNXAOO0s/U3ofobKnyII/AAAAAAAACm4/LKWsOXjemTU/s1600/Screen+Shot+2014-05-19+at+10.13.22.png" height="400" width="326" /></a></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: left;">
<span style="font-family: monospace; text-align: justify;"><br /></span></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: left;">
<span style="font-family: monospace; text-align: justify;">Y el segundo así</span></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: center;">
<a href="http://2.bp.blogspot.com/-DzRG5zsn00I/U3oi0DTBCBI/AAAAAAAACnE/KhkUxwu9bcc/s1600/Screen+Shot+2014-05-19+at+10.26.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-DzRG5zsn00I/U3oi0DTBCBI/AAAAAAAACnE/KhkUxwu9bcc/s1600/Screen+Shot+2014-05-19+at+10.26.04.png" height="151" width="400" /></a></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: left;">
<span style="font-family: monospace; text-align: justify;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: justify;"><span style="color: #333333; font-family: monospace;"><span style="font-size: 14px; line-height: 24px;">Con esto devolvemos datos específicos y evitamos el problema de las referencias circulares. Otra manera de resolverlo sería usando un <a href="http://en.wikipedia.org/wiki/Model_View_ViewModel" target="_blank">ViewModel</a>, aunque el método sigue siendo el mismo.</span></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: justify;"><span style="color: #333333; font-family: monospace;"><span style="font-size: 14px; line-height: 24px;"><br /></span></span></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><b>Ahora sí... Probando la API</b></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Ahora pasaremos a probar nuestra API, para esto primero necesitamos descargarnos el <a href="http://www.telerik.com/download/fiddler" target="_blank">Fiddler Web Debugger</a> e instalarlo.</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Lo siguiente será correr nuestra aplicación, una vez que la tengamos corriendo en nuestro navegador, copiamos la URL que nos da IIS, en mi caso es localhost:8614, y nos dirigimos a nuestro Fiddler y en la pestaña Composer pegamos la URL que recién copiamos.</span></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: center;">
<a href="http://3.bp.blogspot.com/-KL0Dpp5FMN4/U3oY6j0wdNI/AAAAAAAACmk/LeauQ7MZrdY/s1600/Screen+Shot+2014-05-19+at+9.44.30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-KL0Dpp5FMN4/U3oY6j0wdNI/AAAAAAAACmk/LeauQ7MZrdY/s1600/Screen+Shot+2014-05-19+at+9.44.30.png" height="231" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Ahora, en la misma pestaña, probemos alguno de los métodos de nuestra API. Probemos primero los métodos GET, seleccionando este verbo de la lista de verbos seleccionables y colocando lo siguiente en la casilla de la URL:</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: center;">
<a href="http://1.bp.blogspot.com/-biamNsPDnHM/U3oZ36THyiI/AAAAAAAACms/DuFLp9HwkR0/s1600/Screen+Shot+2014-05-19+at+9.48.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-biamNsPDnHM/U3oZ36THyiI/AAAAAAAACms/DuFLp9HwkR0/s1600/Screen+Shot+2014-05-19+at+9.48.49.png" height="32" width="400" /></a></div>
<div class="separator" style="clear: both; color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<br /></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Ahora presionamos Execute y Fiddler hará una llamada a nuestra aplicación, concretamente al método <i>GetCarCollections</i>. Del lado izquierdo de la ventana podemos observar las respuestas a nuestras llamadas, si fueron exitosas o no.Ahora si nos movemos a la casilla Inspector y en una de las ventanas de abajo, donde dice JSON podemos observar los datos devueltos por la llamada a nuestra API.</span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DmMueTpPnPY/U3om5APkafI/AAAAAAAACnY/Rn5LxGgPp4E/s1600/Screen+Shot+2014-05-19+at+10.44.23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-DmMueTpPnPY/U3om5APkafI/AAAAAAAACnY/Rn5LxGgPp4E/s1600/Screen+Shot+2014-05-19+at+10.44.23.png" height="258" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Ahora haremos una llamada a una colección por id, por lo que el método que usaremos será el de <i>GetCarCollection</i>. La llamada queda de la siguiente manera:</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-t4-fxp9toKc/U3os7HZbJvI/AAAAAAAACos/dsPRvt3NP70/s1600/Screen+Shot+2014-05-19+at+11.10.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-t4-fxp9toKc/U3os7HZbJvI/AAAAAAAACos/dsPRvt3NP70/s1600/Screen+Shot+2014-05-19+at+11.10.10.png" height="27" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;">Y la respuesta</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-8HN0DSCeF5U/U3on1oNM1PI/AAAAAAAACno/jnDrBPekdU8/s1600/Screen+Shot+2014-05-19+at+10.48.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-8HN0DSCeF5U/U3on1oNM1PI/AAAAAAAACno/jnDrBPekdU8/s1600/Screen+Shot+2014-05-19+at+10.48.22.png" height="257" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Ahora probemos a insertar una nueva colección, cambiaremos el verbo a POST y la URL de la siguiente manera:</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-PPxXhGoIa9g/U3oovXnuBgI/AAAAAAAACn0/TviNPQU8OeQ/s1600/Screen+Shot+2014-05-19+at+10.52.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-PPxXhGoIa9g/U3oovXnuBgI/AAAAAAAACn0/TviNPQU8OeQ/s1600/Screen+Shot+2014-05-19+at+10.52.19.png" height="31" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Además en la parte de abajo de la ventana Composer, se activará la casilla de Request Body, aquí es donde debemos colocar el objeto JSON a insertar. Enviemos un objeto sencillo y la pantalla nos debe quedar como se ve en la imagen: </span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_nfx53uIRS0/U3oqc-TQLsI/AAAAAAAACoQ/ca81DMbmBhk/s1600/Screen+Shot+2014-05-19+at+10.59.34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-_nfx53uIRS0/U3oqc-TQLsI/AAAAAAAACoQ/ca81DMbmBhk/s1600/Screen+Shot+2014-05-19+at+10.59.34.png" height="308" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><b>NOTA</b>: No olviden colocar en los headers "<b>Content-type: application/json</b>" para indicar que estamos enviando un objeto de este tipo.</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">A continuación presionamos Execute y se ejecutará la llamada devolviendo lo siguiente:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-E0moMjYKX24/U3orT_gvcPI/AAAAAAAACoY/BzxXF3Xp4-M/s1600/Screen+Shot+2014-05-19+at+11.03.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-E0moMjYKX24/U3orT_gvcPI/AAAAAAAACoY/BzxXF3Xp4-M/s1600/Screen+Shot+2014-05-19+at+11.03.19.png" height="258" width="400" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Y en la base de datos, en nuestra tabla de colecciones:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-N5icvGs0dfA/U3orvNUhMYI/AAAAAAAACog/GCch3MSCA68/s1600/Screen+Shot+2014-05-19+at+11.04.59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-N5icvGs0dfA/U3orvNUhMYI/AAAAAAAACog/GCch3MSCA68/s1600/Screen+Shot+2014-05-19+at+11.04.59.png" /></a></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Los métodos PUT y DELETE funcionan de manera similar.</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Y de ésta manera tan sencilla, ya tenemos creada una simple API REST con ASP.NET. Espero les sea de utilidad.</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;"><br /></span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px; text-align: justify;">
<span style="font-family: monospace;">Saludos ;)</span></div>
<div style="color: #333333; font-size: 14px; line-height: 24px;">
<span style="font-family: monospace;"><br /></span></div>
</div>
<code>
</code>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-16810741504444915572014-05-12T10:01:00.000-07:002014-05-12T10:01:28.251-07:00Humor: ¿Porqué hay pocas mujeres ingenieras?<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-zjx6vbzLxfQ/U2FaDAwSpSI/AAAAAAAACkQ/XmuIazeTo6s/s1600/boy-toys-vs-girl-toys.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-zjx6vbzLxfQ/U2FaDAwSpSI/AAAAAAAACkQ/XmuIazeTo6s/s1600/boy-toys-vs-girl-toys.png" /></a></div>
<br />originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-11060061703004813842014-05-07T08:00:00.000-07:002014-05-07T08:00:33.661-07:00Code Babes, programación, sexo y polémicaLa programación es una habilidad que toma años perfeccionar, no existe edad muy tarde ni temprana para iniciarse en esta disciplina. Y en internet podemos encontrar infinidad de material, cursos, videos y otras tantas herramientas para aprender. Pero de vez en vez sale algo como lo que les traigo hoy, diferente si, pero incluso al hablar de algo diferente no nos esperamos algo como esto. El sitio en cuestión es Code Babes, y su "fórmula" es utilizar mujeres desnudas y el deseo sexual como incentivo para aprender. ¿Alguien dijo polémica?<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://static02.mediaite.com/geekosystem/uploads/2014/04/codebabes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://static02.mediaite.com/geekosystem/uploads/2014/04/codebabes.png" /></a></div>
<br />
<a name='more'></a>El objetivo de Code Babes es ofrecer tutoriales de programación, utilizando mujeres desnudas para motivar el aprendizaje del usuario.<br />
<br />
<b>¿Y cómo funciona?</b><br />
La mecánica puede parecer muy compleja, pero trataré de explicarlo lo mas claro posible para que no quede ninguna duda<br />
<br />
<ol>
<li>El usuario responde preguntas de manera correcta.</li>
<li>La profesora se quita una prenda de ropa</li>
<li>Repetir pasos 1 y 2.</li>
</ol>
<br />
¿No queda claro? Que tal así.<br />
<pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><pre class="lang-java prettyprint prettyprinted" style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">while</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">respuestaCorrecta</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">){</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">profesora.Prendas</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Remove</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">prenda</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">);</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">}</span></code></pre>
</pre>
Como pueden ver, el sitio y su "método" de enseñanza son bastante polémicos y es casi seguro que se vean asediados en corto tiempo por protestantes acusándolos de sexistas y misóginos. En mi opinión particular, no considero que sea una manera correcta de enseñanza, pero de que es diferente, lo es, y de que funcione, no lo dudo, y de que tendra muchos suscriptores, los tendrá.<br />
<br />
Video promocional<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' src='https://www.youtube.com/embed/qDrrIUujxsw?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
Enlace al sitio oficial: <a href="https://codebabes.com/">Code Babes</a><br />
<br />
Saludos y muy feliz training ;)originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-51982356527603207142014-05-04T20:35:00.001-07:002014-05-04T20:35:20.913-07:00Herramientas: Sql Complete Cuando uno esta trabajando con Bases de Datos en SQL Server y no recuerda muy bien los nombres de las tablas o los campos necesarios para realizar una sentencia, tendemos a buscar dentro de la misma BD, lo cual nos lleva poco tiempo , pero se multiplica si lo hacemos a cada instante, ya sea por una o varias consultas, entonces... ¿Que hacemos para evitar esto?.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-0rX_09p5oK4/U2bRRfZ_3wI/AAAAAAAABoo/_Zr2rSg60hE/s1600/sql-complete-free-express2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-0rX_09p5oK4/U2bRRfZ_3wI/AAAAAAAABoo/_Zr2rSg60hE/s1600/sql-complete-free-express2.jpg" /></a></div>
<br />
<a name='more'></a><br />
Hoy les platicare sobre una pequeña pero muy fuerte herramienta "SQL Complete", muchos necesitamos un complemento para auto-completar nuestras sentencias en SQL Server, a pesar que el entorno ya cuenta con intellisense , este no es suficiente pues no siempre se puede visualizar o muestra el auto-completado que necesitamos.<br />
<br />
SQL Complete es un complemento muy útil para SQL Server Management Studio y Microsoft Visual Studio; Un avanzado formateador de código SQL que nos ayuda a escribir de manera mas rapida las sentencias que deseamos ejecutar.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-JOv7LXA8MI0/U2bUsQwrDZI/AAAAAAAABo0/7X_ziQtrCxM/s1600/sql-complete-animation.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-JOv7LXA8MI0/U2bUsQwrDZI/AAAAAAAABo0/7X_ziQtrCxM/s1600/sql-complete-animation.gif" height="50%" width="50%" /></a></div>
<br />
<ul>
<li>Pregunta = ¿Como lo consigo?</li>
<li>Respuesta = Muy fácil solo entra <a href="http://www.devart.com/dbforge/sql/sqlcomplete/sqlcomplete.exe" target="_blank">Aquí</a> y podrás descargarlo, lo instalas y listo ya puedes iniciar SQL Server con esta magnifica herramienta.</li>
<ul>
<li>Los únicos requerimientos son , que tengas instalado el NET Framework 3.5 SP1 o Superior y tener instalado el SQL Server Management Studio</li>
<li>Esta Herramienta tiene 2 Versiones una Express(Gratuita) y la Standart(De Pago, pero con una prueba de 30 días), en lo personal la version gratuita es muy completa, pero si quieres mas puedes adquirir una licencia y disfrutar a FULL de los beneficios.</li>
<li>Me pondría a escribir las ventajas de esta herramienta pero en esta <a href="http://www.devart.com/dbforge/sql/sqlcomplete/editions.html" target="_blank">Liga</a> puedes ver la comparación entre versiones y ver las ventajas que ofrece</li>
</ul>
</ul>
<div>
Esta herramienta sustituye al Intellisense que trae por defecto SQL Server , pero es realmente superior, me ah sido de mucha ayuda y mas cuando comienzas a trabajar en nuevos proyectos de los cuales no conoces completamente las tablas o los campos que contienen.</div>
<br />
Sin mas que decirles, solo resta que la prueben. Saludos!.<br />
<br />Anonymoushttp://www.blogger.com/profile/17098303040694152958noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-5329554536357150742014-04-30T13:01:00.002-07:002014-04-30T13:20:03.602-07:00Feliz Día del Niño, Nostalgia? Donde?.... Series de la Infancia<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-wJCo_PrFyMY/U2FU9RYrEuI/AAAAAAAABn8/xPxOd_TF9S4/s1600/dia+del+ni%C3%B1o.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-wJCo_PrFyMY/U2FU9RYrEuI/AAAAAAAABn8/xPxOd_TF9S4/s1600/dia+del+ni%C3%B1o.png" height="80%" width="80%" /></a></div>
<br />
<br />
Hoy 30 de abril , en México se celebra el día del niño, del infante, chilpayate , chamaco o como gusten llamarle , por ello dejare a un lado el ambiente laboral y de programación para tener un flashback a la infancia que sin duda es de los mejores momentos por que casualmente muchas personas se sienten nostálgicas (:okay:) especialmente en este día.<br />
<a name='more'></a><br />
Recordando aquellos tiempos en los que solo nos dedicábamos a jugar y estar en la escuela , salir al recreo y correr por todos lados con nuestros amigos y al terminar las clases ir corriendo a casa para disfrutar aquellas caricaturas que no podíamos perdernos.<br />
<br />
Anteriormente mi compañero <a href="http://www.blogger.com/profile/05286876591828313434" target="_blank">Kasper</a> había publicado un post <a href="http://moztrodev.blogspot.mx/2013/05/101-series-que-me-volvieron-el-geek-que.html" target="_blank">con las 10 + 1 Series</a> que lo volvieron un completo Geek, ahora es mi turno de poner las 7 series que me volvieron el otaku que soy (por que 10 ya esta muy choteado), para muchos serán conocidas para otros no tanto, pero sin duda se disfrutaban en aquella epoca, cuando el anime no estaba en auge y mucho menos había gente diciendo ser "otaco xD".<br />
<br />
1.- SuperCampones<br />
SuperCampeones , a quien no gusto una serie de fútbol donde los partidos eran eternos y las canchas interminables, sin duda logro hacer que muchos niños salieran de su casa , se pelearan por ser el famoso Olive Atom o Steve Hyuga y correr por toda la calle para luego gritar "Gooooooool, Goooool de Oliver Atom".<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/oD1AY2kSL2I?feature=player_embedded' frameborder='0'></iframe></div>
<br />
2.- Slam Dunk<br />
Ya entrando en Deportes , otra serie tal vez no voy recordada pero si muy vista en su tiempo, es Slam Dunk, pues en vez de ser fútbol, por que no Baloncesto?, solo que en esta Hanamichi un pelirrojo es nuestro protagonista que para nada le gusta el deporte, pero con tal de gustarle a una chica se mete a este deporte y vaya resulto ser bueno.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/euW71JOlKy0?feature=player_embedded' frameborder='0'></iframe></div>
3.- Ranma 1/2<br />
Muchas personas recordaran esta serie y no es por las artes marciales que involucran o por el viejo pervertido del maestro Happosai, si no por las ocurrencias que tenia Ranma quien a pesar de ser hombre , se puede transformar en mujer y no, no es trasvesti, si no por que cayo a unos lagos malditos y por ello con el agua fría se puede transformar en mujer , pasando de ser un hombre experto en artes marciales de cabello negro en una excelente peleadora pelirroja.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/Gp3rCZyxMhc?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
4.- Mazinger Z<br />
Robots Robots y mas Robots, Mazinger Z sin duda es un gran icono de los Mechas, mas de a uno soñó con tener una piscina y que de esta saliera un robot gigante para vencer a los malos, una serie de mucha acción y sobre todo Robots y muchos Robots.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/J9n4-4AEu3U?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
5.- Bt´X </div>
<div class="separator" style="clear: both; text-align: left;">
Siguiendo con los robots, quien no quisiera un fenix o un pegaso con el cual poder volar y combatir el mal, pues Bt´X puede no ser tan recordada , pero igual fue una muy buena serie, esperando con ansias llegara el futuro en el que para las guerras utilicemos robots en forma de animales, un fénix, un pegaso, un dragón o una tortuga ( si una tortuga).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/CO9XCUu7Nm0?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
6.- Caballeros del Zodiaco</div>
<div class="separator" style="clear: both; text-align: left;">
1..2... 3... y dice ... los guardianes del universo al trinfudel maaaal, sin duda los salen a combatir por un mundo ideaaaaaal, caaaaballeros del zodiaco cuando lanzan su ataaaque, entonando su canción, la canción de los héroes... o algo asi hiba la cancion </div>
<div class="separator" style="clear: both; text-align: left;">
Sin duda de las canciones que muchos recordaran, cuando llegando a casa solo esperaban el momento de poder cantarla en voz alta o incluso levantarse muy temprano en fines de semana para ver a Seiya y compañia pelear contra los malvados y luego jugar luchitas peleando ser Ikki del Fenix.</div>
<div style="text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/1mrZkb_vs2U/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/1mrZkb_vs2U&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/1mrZkb_vs2U&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />
<br />
7.- Dragon Ball<br />
Vamos a buscar .... las esferas del dragon!!!....<br />
Dragon Ball que decir, que decir, esta gran serie junto con "Los Caballeros del Zodiaco" sin duda son de las mas populares en su tiempo que hasta ahora se siguen recordando. Ver a Goku de niño con la inocencia por todos lados junto a bulma y krilin buscando las esferas del dragon , para luego llegar a comvertirse es uno si no es que de los mas grandes iconos del Anime, deferira en gustos, pero sin duda de las mejores caricaturas que pasaban.<br />
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/L0_2Di0cWuM/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/L0_2Di0cWuM&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/L0_2Di0cWuM&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
Extra!!.<br />
1.-Sailor Moon<br />
Y si hablamos de Reinas del Anime y para todas aquellas peques , Sailor Moon fue la mejor, una protagonista algo torpe , pero que haría lo que fuera por salvar a sus amigas , incluso ahora sigue gustando a muchas adolescentes y niñas de nueva generación, serena y sus amigas son un claro ejemplo de que incluso las mujeres pueden salvar al mundo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/Zq8_XppDXdk/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/Zq8_XppDXdk&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/Zq8_XppDXdk&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
En fin habrá mas series que muchos recordaran como Zenki o Sakura Card Captors y yo solo di el inicio a la nostalgia , les toca a ustedes recordar su infancia... Nos vemos y recuerden .. No dejen de ser niños.... Saludos!...</div>
<div class="separator" style="clear: both; text-align: left;">
Y tu que serie veías?</div>
<br />Anonymoushttp://www.blogger.com/profile/17098303040694152958noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-30408202612799289612014-04-29T08:18:00.000-07:002014-04-29T08:18:11.871-07:00Genymotion, un emulador para android simple, rápido y multiplataforma<div style="text-align: justify;">
No hay quien dude que una de las peores cosas (quizás la peor) dentro del desarrollo de aplicaciones para Android (en caso de no contar con un dispositivo) es probar nuestras aplicaciones en el emulador ¡LENTO!... ¿Quién dijo lento? Pues si, la lentitud del emulador es una de las cosas mas frustrantes con la que nos encontramos al querer correr nuestra app y nos aleja mucho de la experiencia real de los usuarios hacia nuestra aplicación. ¡LENTO! Bueno creo que ya todos entendimos el verdadero problema, pero no todo esta tan mal en esta vida, ya que hoy les traigo una solución que los aliviará del estrés provocado por esos supuestos emuladores, y esa solución es Genymotion ¿LENTO? La verdad es que para nada.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-xwO4XCAeg5Q/UzUZbIpEmwI/AAAAAAAACMw/d5UeVsjW1jo/s1600/coverg_g+_2013_v2_2120x1192.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-xwO4XCAeg5Q/UzUZbIpEmwI/AAAAAAAACMw/d5UeVsjW1jo/s1600/coverg_g+_2013_v2_2120x1192.png" height="360" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<br />
<a name='more'></a><div style="text-align: justify;">
A Genymotion podemos resumirlo en una sola palabra: Rápidez. Y cuando les digo esto no estoy exagerando, el emulador es ridiculamente rápido. Realmente Genymotion no es nada nuevo, sino una nueva versión de un proyecto que ya tiene sus años rondando por internet y de nombre <a href="http://androvm.org/blog/">AndroVM</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>¿Porqué Genymotion es tan rápido?</b></div>
<div style="text-align: justify;">
El emulador de Genymotion es una virtualización para maquinas con arquitectura x86, es decir que realmente es una máquina virtual, por lo que se vale de VirtualBox (incluido en la descarga, y que se instala por default en caso de no tenerlo) para alojar el sistema operativo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>¿Porqué usarlo?</b></div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Rápidez</b></div>
<div style="text-align: justify;">
Es rápido, rápido, muy rápido, en serio, ese debería ser el único pretexto para tan siquiera darle una oportunidad.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Gratuito </b><a href="http://img1.wikia.nocookie.net/__cb20120501141411/es.warhammer40k/images/b/b0/Meme_its_free.jpg"><img border="0" src="http://img1.wikia.nocookie.net/__cb20120501141411/es.warhammer40k/images/b/b0/Meme_its_free.jpg" height="25" width="35" /></a> <b>y Open Source</b></div>
<div style="text-align: justify;">
La descarga es totalmente gratuita (incluye el genymotion y virtual box), por lo que ahi tienes otra excusa para probarlo.<br />
<br />
<b>Multiplataforma</b><br />
Tiene versiones para Windows, Mac y Linux.</div>
<br />
<b>Control Total</b><br />
El emulador te da acceso a muchas características de un dispositivo real: control de la batería, GPS, acelerómetros, cámara, etc.<br />
<br />
<b>Simplicidad</b><br />
La instalación es realmente sencilla, lo único que tenemos que hacer es crear una cuenta y loguearnos una vez instalado el emulador*, además la integración con los IDE's es realmente sencilla (eclipse, ADT, Xamarin).<br />
*Por cierto, para crear maquinas virtuales debemos estar logueados.<br />
<br />
Les dejo el enlace al sitio oficial para que descarguen y prueben:<br />
<ul>
<li><a href="http://www.genymotion.com/">Genymotion</a></li>
</ul>
Denle una oportunidad, les aseguro que no se arrepentirán (tampoco es que el emulador de google sea una maravilla).<br />
<br />
Saludos ;)<br />
<br />originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-49918293966087528052014-04-24T15:36:00.000-07:002014-04-25T07:38:00.813-07:00¿Has jugado al Planning Poker?<div style="text-align: justify;">
Sin duda alguna, una de las tareas mas desafiantes en la planeación de proyectos de software es la estimación. El prever cuánto tiempo te tomará llevar a cabo determinada actividad es muy difícil, aún para profesionales con varios años de experiencia a cuestas. Pero también existen técnicas y herramientas para facilitarnos la vida, y en ésta ocasión lo que les traigo es un juego, si, un juego llamado Planning Poker. ¡Aprendamos a jugarlo!</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-GFdjnNv7Ce8/U1mCc7V-9yI/AAAAAAAACkA/z6sD4OIUkAY/s1600/planning+poker+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-GFdjnNv7Ce8/U1mCc7V-9yI/AAAAAAAACkA/z6sD4OIUkAY/s1600/planning+poker+2.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
Planning poker es una técnica de estimación basada en <a href="http://www.stellman-greene.com/aspm/content/view/23/26/">Wideband Delphi</a> y que se utiliza para estimar el esfuerzo necesario de las tareas a realizar, usualmente medido en horas. Este tipo de técnica es utilizada comúnmente en metodologías ágiles de software.<br />
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.ytimg.com/vi/UJ-NnDficnE/0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.ytimg.com/vi/UJ-NnDficnE/0.jpg" height="300" width="400" /></a></div>
<br /></div>
<b>¿Cómo se juega?</b><br />
<br />
<div style="text-align: justify;">
1. Los participantes se dividen de la siguiente manera:</div>
<br />
<ul>
<li style="text-align: justify;">Los estimadores: Formado por un pequeño grupo de participantes (el tamaño normal de un equipo de trabajo, sin ser mas de 10, entre developers, testers, UI/UX, etc.) donde cada uno tendrá un mazo de cartas con la siguiente numeración: <span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;">0, ½, 1, 2, 3, 5, 8, 13, 20, 40, 100 y ??. Estos participantes serán los encargados de estimar.</span></li>
<li style="text-align: justify;"><span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.399999618530273px;">El moderador: Es el que preside la reunión, y no puede participar ni estimar. Generalmente es el manager del proyecto.</span></span></li>
<li style="text-align: justify;"><span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.399999618530273px;">El product owner: Es el cliente, él si puede participar pero no puede ser un estimador.</span></span></li>
</ul>
<span style="color: #252525; font-family: sans-serif;"></span><br />
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;"><br /></span></span></div>
<span style="color: #252525; font-family: sans-serif;">
<div style="text-align: justify;">
<span style="font-size: 14px; line-height: 22.399999618530273px;">2. El moderador elige una tarea de una lista (product backlog) y lee la descripción a los participantes.</span></div>
</span><br />
<div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">3. El product owner deberá contestar las preguntas que le hagan los estimadores acerca de la tarea.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">4. Los estimadores deben seleccionar una carta de su mazo la cual representa su estimación, y colocarla sobre la mesa boca abajo. </span></span><span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;">Una vez que todas las estimaciones hayan sido realizadas, las cartas se voltean.</span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">5. Si las estimaciones son muy variadas, los dueños de los puntajes mas alto y más bajo discuten la razón de su estimación. Aquí deben participar todos los estimadores.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">6. Repetir desde el paso 4 hasta que las estimaciones converjan.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">Como ven toda decisión se basa en el diálogo grupal y en una sucesión de múltiples estimaciones. El planning poker también puede ser jugado acompañado de un reloj, manejado por el moderador y de ésta manera hacer el juego mas estructurado.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.399999618530273px;">Por cierto, pueden probar el juego desde el sitio oficial y aprender un poco mas acerca de él (solamente necesitan crear una cuenta).</span></span></div>
<div style="text-align: justify;">
</div>
<ul>
<li><a href="http://www.planningpoker.com/" style="font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;">Planning Poker</a></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.scrumshortcuts.com/blog/wp-content/gallery/scrumtrooper-posters/Scrum-Planning-Poker-1.jpg?d9c344" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.scrumshortcuts.com/blog/wp-content/gallery/scrumtrooper-posters/Scrum-Planning-Poker-1.jpg?d9c344" height="514" width="640" /></a></div>
<br />
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;">Que les parece ¿Están dispuestos a jugarlo?</span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.399999618530273px;"><br /></span></div>
</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-87310635740721650912014-04-14T16:00:00.000-07:002014-04-14T16:00:26.168-07:00Qué hacer y qué no en una entrevista de trabajo<div style="text-align: justify;">
Al final no fue un secuestro extraterrestre, ni tampoco fuimos parte de una investigación por la NSA, mucho menos nos fuimos de mochileros por algún lejano continente, y no, ni estábamos muertos ni tampoco de parranda. Lo que ocurrió con el equipo de Moztrodev durante esta larguísima ausencia, fue un simple cambio de aires en cuestiones laborales y todo lo que ello conlleva: aclimatación, reubicaciones, compenetración con nuevos compañeros, pero sobre todo nuevos retos y búsqueda de rutas óptimas de autobús para llegar a tiempo a la oficina. Sin embargo queremos hacerle saber a nuestra comunidad que a pesar de los nuevos proyectos, no hemos olvidado del todo el blog y en ésta ocasión les traigo un post sobre las cosas que se deben y no se deben hacer al momento de tener una entrevista laboral (a nosotros mismos nos hubiese sido útil).</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://expertoencoaching.files.wordpress.com/2013/04/pregun1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://expertoencoaching.files.wordpress.com/2013/04/pregun1.jpg" height="425" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<br />
<a name='more'></a><br /><br />
<div style="text-align: justify;">
<b>Lo que NO: Ser mentiroso</b></div>
<div style="text-align: justify;">
Empezamos por la que yo pienso es la mas obvia, y pues si bien es cierto que en ocasiones nos sentimos desesperados por resaltar entre los demás candidatos para poder conseguir el empleo, el hecho de mentir diciendo que dominamos todas y cada una de las tecnologías requeridas por el entrevistador es una mala decisión. Primero que nada por que dichas tecnologías son las que usaremos en el día a día en el trabajo y si no somos buenos en ellas, esto se verá reflejado en nuestro rendimiento, lo que puede repercutir en que la empresa decida prescindir de tus servicios y esto ocasionaría una mancha negra en nuestro perfil laboral. Y por otro lado es 100% seguro que nos realicen una entrevista técnica, por lo que si a la persona de RH le dijiste que dominas el mas nuevo y mejor framework de X plataforma, es muy probable que tu test técnico sea sobre ello.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Lo que SÍ: Resalta tus skills</b></div>
<div style="text-align: justify;">
Quizás no poseamos un nivel senior en alguna tecnología, pero si consideramos que tenemos buena experiencia podemos presumir de ello, realmente es muy difícil dominar una tecnología completamente sino tenemos una gran cantidad de años trabajando sobre ella, pero si la usamos en algún proyecto trascendente podemos hacer alarde de ello resaltando la importancia de nuestra participación o el porque se decidió usar dicha tecnología para llevar a cabo dicho proyecto. Y aún si utilizamos algún lenguaje o framework en especial pero no lo dominamos, hay que ser honestos, muchas veces los reclutadores no buscan un experto pero si alguien que posea un entendimiento sobre dicha tecnología y sepa las ventajas que significa y el cómo aplicarla. Reitero, muchas veces de lo que digas es de lo que tratará tu examen técnico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Lo que NO: Fanfarronear</b></div>
<div style="text-align: justify;">
Esto considero que va un poco de la mano con los anteriores puntos, si bien no estas mintiendo y te consideras demasiado bueno en algo, esta bien presumirlo pero nunca fanfarronear, ya que a nadie le agrada un fanfarrón, y sobre todo en esta profesión donde el trabajo en equipo es esencial para sacar adelante un proyecto, y los reclutadores de TI muchas veces buscan más la compatibilidad entre las personas que seleccionan (saber trabajar en equipo, respaldar a tus compañeros, etc.) debido a que la meta es formar un equipo de profesionales capaces de dar soluciones a la empresa, pero sobre todo a los clientes.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que SI: Mostrar interés en aprender</b></div>
<div style="text-align: justify;">
Muchos reclutadores y sobre todo los que realizan los test técnicos, buscan siempre que uno tenga las bases bien cimentadas. Esto se debe a que existen muchísimos proyectos y es muy probable que termines utilizando tecnologías que nunca has manejado, por ejemplo si eres un desarrollador con buena experiencia en Hibernate, pero te asignan a un proyecto donde se manejará iBatis, o resulta que toda tu carrera profesional has manejado bases de datos SQL y el proyecto exige el manejo de NoSQL, etc. Por lo que siempre debes estar dispuesto a aprender nuevas tecnologías.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que NO: Desviarte de tu career path</b></div>
<div style="text-align: justify;">
Quizás este punto sea mas bien un consejo que algo que tengas que evitar en una entrevista. Retomando el punto anterior, si bien debemos estar dispuestos a aprender una que otra tecnología, no les aconsejo que se desvíen de su career path, es decir, si tienen un background de 2 años en .Net y los reclutadores les dicen que tienen algunas vacantes en Java (suponiendo que también cuenten con nociones en dicha tecnología) o si estarían dispuestos en algún momento a entrar de lleno en dicha tecnología, no es algo que yo recomiende y esto es debido a que en nuestra humilde profesión uno vale por la especialización (llámese iOS, android, net, java, oracle, sap, etc.) y el hecho de cambiar a otra tecnología estaríamos prácticamente tirando a la basura toda nuestra experiencia previa en .Net. Esto no es tan común pero puede pasar en ocasiones y muchas veces el candidato con tal de obtener el puesto termina por cambiar de tecnología.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que SI: Sentirte seguro y confiado en tus habilidades</b></div>
<div style="text-align: justify;">
No hay nada peor que ponerse nervioso durante una entrevista, sea o no de carácter técnico, ya que da pie a equivocaciones y comentarios inoportunos. A decir verdad los reclutadores siempre tratarán de hacerte sentir cómodo durante la entrevista, ya sea sacando alguna plática cotidiana o con algún chiste (tú también puedes hacerlo), esto debido a que uno siempre tiene las ideas mas claras cuando se está tranquilo. Pero si eres de aquellos que sudan la gota gorda, entonces te recomiendo practicar frente al espejo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Lo que NO: Nunca te olvides del nombre de tu entrevistador</b></div>
<div style="text-align: justify;">
Muy, pero muy importante. Si bien puedes haber estado excelente durante la entrevista técnica, muchas veces te pueden sorprender con una última pregunta al estilo de: "Ok, muy bien, ahora ¿Recuerdas cual es mi nombre?". Y si les digo esto es porque a mi me pasó, y por suerte mi memoria me funcionó en el momento en que más la necesitaba jajaja. Y quizás no sea la única pregunta de esta clase, casi siempre los reclutadores tratan de analizar tu capacidad de atención, lo cual es una habilidad muy importante.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Lo que NO: ¿Tienes algunas preguntas? - No</b></div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que SI: ¿Tienes algunas preguntas? - Si</b></div>
<div style="text-align: justify;">
Nunca te quedes sin preguntar. Siempre, siempre haz preguntas, esto muestra tu grado de interés tanto en la empresa, en el trabajo, como en la persona que te entrevista. Te recomiendo antes de la entrevista, preparar una serie de preguntas hacia el reclutador. Éstas pueden ser acerca de la empresa (la manera de trabajar, tecnologías y metodologías que utilizan, etc.), acerca del reclutador (si es entrevista técnica puedes preguntarle acerca de su expertise, o incluso que piensa él/ella acerca de la empresa) e incluso puedes pedir un feedback sobre tu entrevista (que piensa el reclutador sobre tus habilidades y/o personalidad, cuando tendrías una respuesta positiva/negativa sobre la entrevista, etc).</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que SI: Sé cordial</b></div>
<div style="text-align: justify;">
Quizás esté de más pero siempre es bueno tenerlo en cuenta. Trata de ser gentil con tu entrevistador, a final de cuentas son personas y pueden sentirse muy heridos si no les das tan siquiera los buenos días. Recuerda, de ellos depende tu contratación.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que NO: Ser un adulador</b></div>
<div style="text-align: justify;">
¿Necesito decir más?</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que SI: Investiga la empresa</b></div>
<div style="text-align: justify;">
Esto es muy importante. El tener un conocimiento previo de la empresa puede demostrar que tienes interés en ella y en lo que hace, además de que demuestras que eres una persona curiosa y a quién le gusta estar informada sobre los terrenos que pisa.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Lo que NO: Preguntar por el sueldo</b></div>
<div style="text-align: justify;">
Quizás algunos me debatan en este punto pero yo no soy partidario de preguntar el sueldo desde el principio, sino hasta el final del proceso. Lo que acostumbro al principio es preguntar si el sueldo es abierto a capacidades y experiencia, o si tienen un presupuesto fijo para la vacante (aquí si vendría bien preguntar la cantidad aproximada). El porqué pregunto el sueldo hasta el final del proceso es simple, después de haber pasado filtros y entrevistas significa que te consideran un candidato serio para ocupar la vacante, por lo que te encuentras en una excelente posición para negociar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un último consejo, las ofertas laborales pueden venirse abajo por cualquier motivo, a pesar de aprobar satisfactoriamente todas las pruebas y entrevistas. Recordemos que esto es un negocio y siempre hay un cliente que tiene que poner dinero de su bolsa para que la vacante exista, por lo que no es de extrañar que se cierren vacantes (a veces solo temporalmente) por falta de presupuesto, o quizás porque la oferta final no nos convenía y terminamos rechazándola. El consejo que les doy es que siempre terminen agradeciendo al reclutador(a) y a la empresa por el tiempo que le dedicaron a tu proceso y pedirles que mantengan tus datos en cartera por alguna futura vacante, la mayor parte de ellas lo harán si les pareciste un buen candidato y por fuerzas mayores no pudieron cerrar contrato.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Espero esta información les sea útil.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Saludos y es un placer escribir nuevamente ;)</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com1tag:blogger.com,1999:blog-3631400745966221264.post-61808501609693500412013-11-28T09:49:00.000-08:002013-11-28T09:49:29.556-08:00Házlo fácil: Logs en ASP.NET con log4net<div style="text-align: justify;">
Los bugs reportados por usuarios son de lo más común en nuestra humilde profesión y aunque aseguren lo contrario, todos sabemos que la mayor parte de ellos son errores de usuario... ¿o no?... bueno, dejemoslo así, no es culpa <strike>nuestra</strike> de nadie. Pero lo que si es una realidad es que hay que afrontarlos y corregirlos, y como se trata de sistemas en producción es imposible debuggear el momento exacto del bug, y también sabemos que entre nuestro ambiente y el de producción hay una brecha enorme, y ni se hable de mandar a imprimir la excepción en pantalla (User Experience, de puta madre). Entonces, se escucha el sonido de las trompetas, el redoble de los tambores... y aparecen los logs.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-3jKFm_Reh8c/UoKvKwLNwjI/AAAAAAAACd4/duvehVRhVb8/s1600/log.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="http://3.bp.blogspot.com/-3jKFm_Reh8c/UoKvKwLNwjI/AAAAAAAACd4/duvehVRhVb8/s640/log.png" width="640" /></a></div>
<br /></div>
<div style="text-align: justify;">
</div>
<a name='more'></a>El uso de logs es una manera efectiva de monitorear los procesos que ocurren en nuestra aplicación cuando está en producción, así de esta manera podemos verificar que fue lo que desató determinado bug y en que momento ocurrió, claro, además de toda la información útil que nos pueda brindar el usuario.<br />
<br />
Sin más rollo, veamos como utilizar los logs en una aplicación ASP.NET.<br />
<br />
<b>Paso 1. Referenciar la librería de log4net</b><br />
Al crear una aplicación en ASP.NET, Visual Studio ya nos añade la referencia a <i>log4net</i>, lo cual podemos comprobarlo en nuestra carpeta <i>References</i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-16aPBBsarJ0/UpeAy2I3r-I/AAAAAAAACg0/wXffJO6OIqk/s1600/log4net.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-16aPBBsarJ0/UpeAy2I3r-I/AAAAAAAACg0/wXffJO6OIqk/s1600/log4net.png" /></a></div>
<br />
Si por algún motivo no se encuentra la referencia, bastará con descargarnos la librería de <a href="http://logging.apache.org/log4net/download_log4net.cgi">log4net</a>. Una vez descargado, descomprimimos el archivo para poder visualizar la DLL y la importamos desde Visual Studio dando click derecho en <i>References</i>-><i>Agregar Referencias</i>.<br />
<br />
<b>Paso 2. Archivos de configuración</b><br />
A continuación nos dirigimos a nuestro Web.Config y dentro de las tags <i>configSections </i>definimos la sección para los logs.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-NAPAIBt_7uQ/UpeBAgnz38I/AAAAAAAACg8/NCqtF5iNQJY/s1600/configSections.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-NAPAIBt_7uQ/UpeBAgnz38I/AAAAAAAACg8/NCqtF5iNQJY/s1600/configSections.png" /></a></div>
<br />
Y dentro de la sección <i>log4net </i>ponemos lo siguiente (esto debe estar dentro de las tags de <i>configuration</i>)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-nCwv5mYAiEY/UpeBJlefeVI/AAAAAAAAChE/nGWOIwiY6vM/s1600/section+log4net.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-nCwv5mYAiEY/UpeBJlefeVI/AAAAAAAAChE/nGWOIwiY6vM/s1600/section+log4net.png" /></a></div>
<br />
Entonces nos dirigimos a nuestro archivo <i>Global.asax.cs</i> y dentro del método <i>Application_Start</i> ponemos lo siguiente:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-QVvb97DfQwU/UpeBPf97ZLI/AAAAAAAAChM/bCs_068fk98/s1600/global+asax.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-QVvb97DfQwU/UpeBPf97ZLI/AAAAAAAAChM/bCs_068fk98/s1600/global+asax.png" /></a></div>
<br />
<b>Paso 3. Crear y utilizar nuestro objeto logger</b><br />
Por último solo necesitamos crear nuestro objeto que escribirá los logs.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-kCCnTheCNNI/UpeBYny0z-I/AAAAAAAAChU/tfBWbjItRlc/s1600/logger+instance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-kCCnTheCNNI/UpeBYny0z-I/AAAAAAAAChU/tfBWbjItRlc/s1600/logger+instance.png" /></a></div>
Un ejemplo de su uso<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-gOGXrzlygG4/UpeBeeEnkYI/AAAAAAAAChc/JFuR2D0lXgI/s1600/generateData.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-gOGXrzlygG4/UpeBeeEnkYI/AAAAAAAAChc/JFuR2D0lXgI/s1600/generateData.png" /></a></div>
<br />
Y todo lo que escriba el log se guardará en un archivo en la ruta que especificamos en el Web.config.<br />
<br />
Hasta la próxima. ;)<br />
<br />originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-73218722441349707522013-11-27T12:33:00.000-08:002013-11-28T11:36:14.636-08:00Hazlo fácil: autocomplete con jQuery<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet"></link>
<script>
$(document).ready(function() {
var lenguajes = [
"JavaScript",
"Java",
"PHP",
"C",
"C++",
"C#",
"Ruby",
"Python",
"Perl",
"Visual Basic",
"Cobol",
"Groovy"
];
$( "#mAutocomplete" ).autocomplete({
source: lenguajes,
minLength: 1,
delay: 10
});
});
</script>
<br />
<div style="text-align: justify;">
Soy yo o esta serie de tutoriales de "<a href="http://moztrodev.blogspot.mx/search/label/hazlo%20facil">Hazlo fácil</a>" se está convirtiendo en el sello de la casa. Pero, ¿Y no es, al fin y al cabo, lo que muchas veces buscamos al momento de escribir código?, es decir ¿Cuál es la manera más fácil de codificar ese requerimiento? o ¿Cuál tecnología me puede ayudar a implementarlo de una manera simple, elegante y eficaz? Pues bueno, hoy le toca el turno a uno de los frameworks front-end más populares de la actualidad: jQuery, y la tarea a realizar será: un campo de texto autocomplete.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-kif-NsVUuic/UoFE0NUP-WI/AAAAAAAACcU/CU-puirrIfA/s1600/autocomplete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="http://2.bp.blogspot.com/-kif-NsVUuic/UoFE0NUP-WI/AAAAAAAACcU/CU-puirrIfA/s400/autocomplete.png" width="400" /></a></div>
<div>
<a name='more'></a>Pues bueno, dejando las formalidades a un lado, empecemos. Primero el html donde visualizaremos nuestro proyectito.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-A1mfwfNoa-E/UoFRDNJfNxI/AAAAAAAACc4/jtEtVIZHIN8/s1600/autocompletar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-A1mfwfNoa-E/UoFRDNJfNxI/AAAAAAAACc4/jtEtVIZHIN8/s1600/autocompletar.png" /></a></div>
<div>
</div>
<div>
A continuación importamos las librerías necesarias:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-pnBSe5FdDuk/UoFQhJ7CAyI/AAAAAAAACcw/bPp7S7jPciI/s1600/autocompletar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-pnBSe5FdDuk/UoFQhJ7CAyI/AAAAAAAACcw/bPp7S7jPciI/s1600/autocompletar.png" /></a></div>
<div>
</div>
<div>
Ahora empezamos a codificar, para este ejemplo utilizaré una lista que contiene distintos lenguajes de programación:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-XHstQ2Gkvg4/UoFRnvvm-SI/AAAAAAAACdA/q3N56ck7AIc/s1600/autocompletar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-XHstQ2Gkvg4/UoFRnvvm-SI/AAAAAAAACdA/q3N56ck7AIc/s1600/autocompletar.png" /></a></div>
<div>
</div>
<div>
Con esto ya tendremos la lista con la información que se mostrará al momento de teclear en el campo de texto. Ahora veamos como enlazarlo al nuestro control.<br />
<br /></div>
<div>
Para ello usaremos la función autocomplete de jquery, la cuál acepta 3 parámetros:</div>
<div>
</div>
<div>
-<b>source</b>: es la fuente de los datos a mostrar, en nuestro caso, la lista de lenguajes,</div>
<div>
-<b>minLenght</b>: es la longitud mínima de caracteres que tendremos que introducir para que se desplieguen los resultados.</div>
<div>
-<b>delay</b>: el tiempo de respuesta entre el momento en que dejamos de introducir texto y la petición, mientras menos tiempo, más rápido reaccionará nuestro autocomplete.</div>
<div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sdtYlG-3rPQ/UoFTNnIClYI/AAAAAAAACdM/Yh05GXWRF_k/s1600/autocompletar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-sdtYlG-3rPQ/UoFTNnIClYI/AAAAAAAACdM/Yh05GXWRF_k/s1600/autocompletar.png" /></a></div>
<div>
</div>
<div>
Y listo, eso es todo. Pueden probar el autocomplete aquí mismo.<br />
<br /></div>
<div>
<label for="mAutocomplete">Lenguajes: </label>
<input id="mAutocomplete" />
<br />
<br />
Hasta la próxima. Saludos ;)</div>
<div>
</div>
<div>
</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-88835055927070917682013-11-19T12:28:00.000-08:002013-11-20T13:10:32.747-08:00Literatura para Informáticos: El Tao de la Programación<div style="text-align: justify;">
Estoy de acuerdo en que a muchos nos gusta nuestra profesión y que más de uno la convierte en su pasión, pero siempre he recomendado que la balanza debe estar equilibrada: trabajo, familia y salud. En el trabajo podemos hacer lo que nos gusta y cobrar por ello; los momentos en familia hacerlos únicos; y por supuesto, cuidar nuestra salud, y para la salud mental que mejor que una <a href="http://moztrodev.blogspot.mx/search/label/literatura%20para%20informaticos">buena dosis de literatura</a>, que si va de programación, nos caerá mucho mejor.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-51wdtnA3HN8/Uo0lPCCp5JI/AAAAAAAACgk/xKhPhLAe7tI/s1600/tao.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-51wdtnA3HN8/Uo0lPCCp5JI/AAAAAAAACgk/xKhPhLAe7tI/s1600/tao.png" /></a></div>
<br />
<a name='more'></a><br />
<div style="text-align: justify;">
El libro que hoy les traigo es de una lectura muy rápida (ya que es muy, muy corto), pero está considerado como una lectura obligatoria para todo programador que guste de una lectura de 10 minutos y que goze de un buen sentido del humor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El Tao de la Programación, fue escrito en 1987 por Geoffrey James, y habla sobre diversos tópicos de la programación y el desarrollo de software, pero relatados por el autor con un toque místico, filosófico y por supuesto, con mucho humor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Les dejo unos cuantos pasajes del libro, mis favoritos:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Del libro 4: Codificación</div>
<div style="text-align: justify;">
<i>Un maestro estaba explicando la naturaleza del Tao a uno de sus novicios, "El Tao está </i></div>
<div style="text-align: justify;">
<i>encarnado en todo software -- sin importar cuán insignificante sea", dijo el maestro. </i></div>
<div style="text-align: justify;">
<i>"¿Está el Tao en una calculadora portátil?", preguntó el novicio. </i></div>
<div style="text-align: justify;">
<i>"Está", fué la respuesta. </i></div>
<div style="text-align: justify;">
<i>"¿Está el Tao en un videojuego?", continuó el novicio. </i></div>
<div style="text-align: justify;">
<i>"Está hasta en un videojuego", dijo el maestro. </i></div>
<div style="text-align: justify;">
<i>"¿Y está el Tao en el DOS de una computadora personal?" </i></div>
<div style="text-align: justify;">
<i>El maestro tosió y cambió ligeramente su posición. "La lección se acabó por hoy", dijo. </i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Del libro 6: Administración</div>
<div style="text-align: justify;">
<i>¿Por qué los Desarrolladores no son productivos? Porque pierden su tiempo en juntas. </i></div>
<div style="text-align: justify;">
<i>¿Por qué los Desarrolladores se vuelven rebeldes? Porque la administración interfiere mucho. </i></div>
<div style="text-align: justify;">
<i>¿Por qué los Desarrolladores renuncian uno a uno? Porque han sido explotados. </i></div>
<div style="text-align: justify;">
<i>Habiendo trabajado para una pobre administración, ellos ya no valoran sus empleos.</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>Un gerente fué con sus Desarrolladores y les dijo: "Con respecto a sus horas de trabajo: ustedes </i></div>
<div style="text-align: justify;">
<i>van a tener que venir a las nueve de la mañana e irse a las cinco de la tarde." Con esto, todos se </i></div>
<div style="text-align: justify;">
<i>enojaron y varios renunciaron en el momento. </i></div>
<div style="text-align: justify;">
<i>Entonces el gerente dijo: "Está bien, en ese caso ustedes pueden fijar sus propias horas de </i></div>
<div style="text-align: justify;">
<i>trabajo, siempre y cuando terminen sus proyectos a tiempo." Los Desarrolladores, ahora </i></div>
<div style="text-align: justify;">
<i>satisfechos, comenzaron a llegar a mediodía y trabajar hasta la madrugada. </i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enlace: <a href="http://www.etnassoft.com/biblioteca/el-tao-del-programador/">El Tao de la programación </a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Espero que disfruten la lectura. Saludos y Happy Reading!!!</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com1tag:blogger.com,1999:blog-3631400745966221264.post-28524725331318700162013-11-14T11:30:00.000-08:002013-11-14T11:30:56.116-08:00Algunos tips para protegerte de SQL Injection<div style="text-align: justify;">
Seguridad... que tema tan delicado, y aún más en una profesión donde lo importante es el manejo de la información, esa responsabilidad de escribir código y más código para manipular dicha información, hacerla llegar de un lado a otro, presentarla de distintas formas, encriptarla, desencriptarla, etc. Sin duda alguna la seguridad de la información es un tema para hablar horas y horas, y que implica muchas técnicas para salvaguardarla, y quizás nosotros no seamos unos eruditos en seguridad, pero podemos aplicar alguna que otra técnica para hacer que nuestros sistemas sean menos vulnerables, sobre todo para el tema que encabeza este post: SQL Injection.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Bj26KlhHtdM/UoPCbpM9wSI/AAAAAAAACeI/a65nIEVtc88/s1600/sql-injection2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="329" src="http://1.bp.blogspot.com/-Bj26KlhHtdM/UoPCbpM9wSI/AAAAAAAACeI/a65nIEVtc88/s640/sql-injection2.jpg" width="640" /></a></div>
<br />
<a name='more'></a><br />
<div style="text-align: justify;">
¿Qué no sabes que es SQL Injection? Pues pasa primero por <a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL">aqui</a>. Ahora que ya lo tenemos captado continuemos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un ejemplo clásico de cómo nos pueden inyectar SQL es en los formularios de login. La mecánica es muy sencilla, si tenemos un formulario como el siguiente: </div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-_Q2jDugRc1g/UoPgU6efBGI/AAAAAAAACeY/CP84Mr2cQ6o/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-_Q2jDugRc1g/UoPgU6efBGI/AAAAAAAACeY/CP84Mr2cQ6o/s1600/login.png" /></a></div>
<br />
<div style="text-align: justify;">
Lo normal es que para validar las credenciales introducidas por el usuario, en nuestro código realicemos un procedimiento como el siguiente:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-E_2TiE_rVls/UoPinbSxGEI/AAAAAAAACes/BkiyEh9ZIJc/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-E_2TiE_rVls/UoPinbSxGEI/AAAAAAAACes/BkiyEh9ZIJc/s1600/login.png" /></a></div>
<br />
La instrucción sql que se formaría al introducir los datos sería algo como esto:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-6Q6e2I3zBe4/UoPjNlX-6eI/AAAAAAAACe0/GPF3OkKvHto/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-6Q6e2I3zBe4/UoPjNlX-6eI/AAAAAAAACe0/GPF3OkKvHto/s1600/login.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
Precisamente, aquí es donde radica el error, el hecho de concatenar las cadenas en la instrucción sql es lo que lo hace vulnerable a sql injection. Veamos que pasa si introducimos los siguiente datos: En usuario <span style="color: red;">1</span> y en contraseña <span style="color: red;">' or 1=1--</span></div>
<span style="color: red;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Av6h6dw5qKI/UoPkLAY0bsI/AAAAAAAACfA/Bfy2OArPLpI/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Av6h6dw5qKI/UoPkLAY0bsI/AAAAAAAACfA/Bfy2OArPLpI/s1600/login.png" /></a></div>
<span style="color: red;"><br /></span>
<br />
<div style="text-align: justify;">
Como vemos la instrucción sql formada evaluará si existe un Id en base de datos con las credenciales introducidas pero a su vez también evaluará que la condición 1=1 sea cierta, por lo que devolverá todos los Id de los usuarios en base de datos. Así de simple, hemos sido inyectados con sql. Esto daría pie a un sin fin de códigos maliciosos, pudiendo hacer algo como lo siguiente:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-igfkUo1BhgU/UoPmOdYccMI/AAAAAAAACfM/teWxWV0NDHg/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="25" src="http://3.bp.blogspot.com/-igfkUo1BhgU/UoPmOdYccMI/AAAAAAAACfM/teWxWV0NDHg/s640/login.png" width="640" /></a></div>
<br />
<div style="text-align: justify;">
Si, lo se, muy doloroso, pero no se preocupen que así como es tan fácil inyectar sql, también es fácil prevenirlo. Veamos como hacerlo.</div>
<div style="text-align: justify;">
El truco está en crear nuestras sentencias sql parametrizadas, por ejemplo en nuestro código c# nos quedaría de la siguiente manera:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-UnRYunsyHMw/UoPnKAZgRPI/AAAAAAAACfU/yHz0mwfIqvY/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-UnRYunsyHMw/UoPnKAZgRPI/AAAAAAAACfU/yHz0mwfIqvY/s1600/login.png" /></a></div>
Y listo, eso es todo, así de simple. Ahora que si quieren hacerlo en:<br />
<br />
Java<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-sIGYn4iiyPg/UoPpm2g4ZII/AAAAAAAACfg/dqtSgxMHfmw/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="http://2.bp.blogspot.com/-sIGYn4iiyPg/UoPpm2g4ZII/AAAAAAAACfg/dqtSgxMHfmw/s640/login.png" width="640" /></a></div>
<br />
Php<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Kj_cpyNQxjQ/UoPrAlSJl-I/AAAAAAAACfs/gcZckZfEIY0/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="98" src="http://1.bp.blogspot.com/-Kj_cpyNQxjQ/UoPrAlSJl-I/AAAAAAAACfs/gcZckZfEIY0/s640/login.png" width="640" /></a></div>
<br />
Python<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fJjMCr1ljpU/UoPtDNqcZkI/AAAAAAAACf4/An97p2nz4o4/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-fJjMCr1ljpU/UoPtDNqcZkI/AAAAAAAACf4/An97p2nz4o4/s1600/login.png" /></a></div>
<br />
O pueden hacerlo a través de Stored Procedures, pero siempre y cuando la instrucción esté parametrizada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-nWXv9LpDb7c/UoPt9MkOMfI/AAAAAAAACgA/dgGDva3hsus/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-nWXv9LpDb7c/UoPt9MkOMfI/AAAAAAAACgA/dgGDva3hsus/s1600/login.png" /></a></div>
Saludos ;)originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com2tag:blogger.com,1999:blog-3631400745966221264.post-18825493133238501022013-11-11T11:48:00.000-08:002013-11-11T11:48:33.646-08:00Y tú, ¿Ya utilizas un ORM?<div style="text-align: justify;">
Es bien sabido que en el día a día del desarrollo de aplicaciones, una de las tareas que requieren especial cuidado y en las que se dedica una buena parte del tiempo es la de desarrollar la capa de persistencia de datos. Y es que en éste mundo lleno de objetos, la realidad es que la mayoría de las empresas cliente utilizan bases de datos relacionales (y ya quiero verte convenciéndolos de cambiarlas), por lo que al momento de codificar la capa de acceso a datos nos vemos trabajando con dos paradigmas, que si bien no están peleados del todo, son bastante diferentes. Y aquí es donde entran los frameworks ORM.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-kFrHkJpMe_0/UoEXX0duQqI/AAAAAAAACcE/12n-c2wWAgo/s1600/expresspersistentobjects.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="http://1.bp.blogspot.com/-kFrHkJpMe_0/UoEXX0duQqI/AAAAAAAACcE/12n-c2wWAgo/s400/expresspersistentobjects.png" width="400" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
El problema radica, como ya mencione en la entrada, al momento de escribir el código para la persistencia de datos, el cuál se realiza dentro de la misma aplicación: escribiendo la sentencia y enviando la petición a nuestro motor de base de datos en turno, quien la ejecuta y nos devuelve un resultado el cuál se tiene que mapear a nuestro correspondiente modelo, y todo lo anterior realizado de manera manual, por lo que todas las ventajas de la orientación a objetos se pierden.</div>
<br />
<br />
<b>Frameworks ORM (Object Relational Mapping)</b><br />
<div style="text-align: justify;">
Es entonces cuando entran los ORM a solucionar nuestros problemas, ahorrándonos todo el trabajo descrito anteriormente, ya que se encargan de mapear todo nuestro mundo relacional de tablas en base de datos a objetos de negocio de nuestra aplicación, otorgando un buen nivel de abstracción.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.analyticaweb.com/wp-content/uploads/2013/01/orm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.analyticaweb.com/wp-content/uploads/2013/01/orm.jpg" width="264" /></a></div>
<div style="text-align: justify;">
Los ORM nos permiten realizar consultas, inserciones, etc. de una manera sencilla, ya que en vez de utilizar lenguaje SQL, dichas instrucciones las realizamos en base a nuestro modelo de objetos y sus relaciones.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por ejemplo, lo que en SQL es:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<code>SELECT c.* FROM Cliente c INNER JOIN Membresia m ON m.ClienteId=c.ClienteId WHERE m.MembresíaId = 1</code>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con el lenguaje del ORM hariamos:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<code>FROM Cliente c WHERE c.Membresia.Id = 1</code></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como ven la instrucción es mas sencilla, aunque por debajo realmente estaríamos haciendo lo mismo. Ésta es sólo una de las ventajas que nos da un ORM, y que se aprecian realmente al momento de realizar una aplicación de mayor tamaño.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Resumiendo, tenemos que un ORM nos otorga las siguientes ventajas:</div>
<ul>
<li style="text-align: justify;">Escribir mucho menos código, al ahorrarnos el trabajo de la capa de acceso a datos.</li>
<li style="text-align: justify;">Se complementa fácilmente con un modelo MVC.</li>
<li style="text-align: justify;">Tenemos un solo modelo: el de la aplicación. Por lo que las modificaciones se vuelven mas simples.</li>
<li style="text-align: justify;">No tenemos que escribir tanto lenguaje SQL.</li>
<li style="text-align: justify;">Nos brinda una aplicación 100% orientada a objetos, y con ello todas las ventajas que brinda éste paradigma (herencia, polimorfismo, etc.).</li>
</ul>
<br />
<div style="text-align: justify;">
<b>No todo es miel sobre hojuelas</b></div>
<div style="text-align: justify;">
Ok, una vez que ya vimos un poco sobre las ventajas de utilizar un ORM, veamos los contras. </div>
<ul>
<li style="text-align: justify;">De entrada, el performance. Y es que si bien un ORM nos ahorra escribir gran cantidad de código, todo el trabajo de mapear los objetos con las tablas es realizado por el framework, lo que repercute en el rendimiento de la aplicación cada vez que el mapeo se realiza. Siempre será más rápido ejecutar una query directamente que hacerlo a través del framework.</li>
<li style="text-align: justify;">Si no se hace un correcto mapeo, habrá muchos dolores de cabeza.</li>
<li style="text-align: justify;">Obviamente existe una curva de aprendizaje.</li>
</ul>
<b></b><br />
<div style="text-align: justify;">
<b><b>Algunos framework ORM </b></b></div>
<ul>
<li style="text-align: justify;"><b>.NET: </b><a href="http://msdn.microsoft.com/es-ES/data/jj590134">Entity Framework</a>, <a href="http://nhforge.org/">NHibernate</a>.</li>
<li style="text-align: justify;"><b>Java:</b> <a href="http://www.hibernate.org/">Hibernate</a>, <a href="http://blog.mybatis.org/">iBatis</a>(también para .NET).</li>
<li style="text-align: justify;"><b>PHP:</b> <a href="http://www.doctrine-project.org/">Doctrine</a>, <a href="http://propelorm.org/">propel</a>.</li>
<li style="text-align: justify;"><b>Android: </b><a href="http://ormlite.com/">ORMLite</a>, <a href="http://adaframework.com/">ADA Framework</a>.</li>
</ul>
<div style="text-align: justify;">
Para concluir, si bien un ORM facilita bastante el desarrollo de una aplicación, no necesariamente debería aplicar para cualquier proyecto (por temas de rendimiento, tamaño de aplicación, etc.). Pero sí es una herramienta bastante útil y que debe tomarse en cuenta, además de que no está de más aprender a utilizarla, ya que muchas empresas requieren desarrolladores que sepan manejar este tipo de tecnología.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Saludos ;)</div>
<ul>
</ul>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com1tag:blogger.com,1999:blog-3631400745966221264.post-56345081233398699482013-10-12T07:21:00.000-07:002013-10-12T07:21:52.874-07:00Patrones de Diseño para Android: El patrón ViewHolder<div style="text-align: justify;">
Aquí en MoztroDev siempre hemos tratado de cuidar cada tutorial que hacemos, y es que, además de enseñarles cómo realizar cada una de las técnicas, procesos, etc. que ven en cada uno de los <a href="http://moztrodev.blogspot.mx/search/label/tutoriales">tutoriales</a>, siempre tratamos de inculcar que lleven a cabo buenas prácticas de programación, tales como patrones de diseño, etc., y precisamente hoy les traigo un tutorial sobre el patrón ViewHolder para android, que si bien podemos aplicar muchos de los patrones que usamos en Java, éste patrón es usado en un caso muy particular en el desarrollo para dispositivos android: los ListView. Veamos que tal...</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://cdn.androidadvices.com/wp-content/uploads/2012/06/increase-android-performance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="284" src="http://cdn.androidadvices.com/wp-content/uploads/2012/06/increase-android-performance.png" width="380" /></a></div>
<a name='more'></a><b>¿En que nos beneficia?</b><br />
<div style="text-align: justify;">
El patrón ViewHolder tiene un único propósito en su implementación: mejorar el performance. Y es que cuando hablamos de aplicaciones móviles, el rendimiento es un tema de gran importancia. </div>
<br />
<b>¿Cómo funciona?</b><br />
<div style="text-align: justify;">
Lo que hacemos con el ViewHolder es mantener una referencia a los elementos de nuestro ListView mientras el usuario realiza scrolling en nuestra aplicación. Así que cada vez que obtenemos la vista de un item, evitamos las frecuentes llamadas a <i>findViewById</i>, la cuál se realizaría únicamente la primera vez y el resto llamaríamos a la referencia en el ViewHolder, ahorrándonos procesamiento. </div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Código, código, código!!!</b></div>
<div style="text-align: justify;">
Ok, empecemos.</div>
<div style="text-align: justify;">
Lo primero será crear un nuevo proyecto Android en Eclipse, lo nombraré ViewHolderTutorial. Y lo que haremos será una lista de post, como un lector de feeds pero sin funcionalidad, eso lo dejaremos para el siguiente tutorial.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-rBHPzxbnZn4/UlgraCepugI/AAAAAAAACYo/lFhvCy82k4g/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="342" src="http://2.bp.blogspot.com/-rBHPzxbnZn4/UlgraCepugI/AAAAAAAACYo/lFhvCy82k4g/s400/image.png" width="400" /></a></div>
<div style="text-align: justify;">
Una vez creado el proyecto nos vamos a la carpeta res->layout, y añadiremos 2 nuevos xml:<br />
<b>list_activity.xml</b><br />
Esta será la vista de nuestra MainActivity.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Y_FUUb8oeGo/UlgtgCGfH0I/AAAAAAAACY0/LPQc1Zj_KvQ/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Y_FUUb8oeGo/UlgtgCGfH0I/AAAAAAAACY0/LPQc1Zj_KvQ/s1600/image.png" /></a></div>
<b>item.xml</b><br />
Ésta será la vista que tendrá cada uno de los elementos de nuestra lista. Lo primero será crearla como un RelativeLayout.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-suio-BANY3U/Ulgt_DztgwI/AAAAAAAACY8/yxjjOeKWWgU/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-suio-BANY3U/Ulgt_DztgwI/AAAAAAAACY8/yxjjOeKWWgU/s1600/image.png" /></a></div>
Ahora le añadiremos una imagen y dos TextView para el nombre y la fecha del post.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GP4zOSmmPaQ/UlhMTqh4BII/AAAAAAAACbs/Fo9WljXNSRo/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-GP4zOSmmPaQ/UlhMTqh4BII/AAAAAAAACbs/Fo9WljXNSRo/s1600/image.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Nuestro <i>xml </i>debería entonces verse de la siguiente manera.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-nQZy34YfILU/UlhMk2EbBEI/AAAAAAAACb0/tkWslsFeK9Q/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-nQZy34YfILU/UlhMk2EbBEI/AAAAAAAACb0/tkWslsFeK9Q/s320/image.png" width="192" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Ya que tenemos nuestras vistas, vayamos a definir el modelo. Para esto crearemos una nueva clase llamada Post que usaremos para representar cada uno de los elementos de nuestra lista y la crearemos de la siguiente manera.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HnnAhSnhO8k/UlgvuJaH9AI/AAAAAAAACZY/t7mlHGy3T0s/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-HnnAhSnhO8k/UlgvuJaH9AI/AAAAAAAACZY/t7mlHGy3T0s/s1600/image.png" /></a></div>
<br />
Como pueden ver es una clase simple, con 3 atributos y sus correspondientes getters y setters, y dos constructores. Ahora vayamos a nuestra MainActivity.<br />
Haremos que nuestra MainActivity herede de ListActivity y que tome la vista que creamos como <i>list_activity.xml</i>.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-4-cIe_wL9E0/UlgyZX8Ne0I/AAAAAAAACZk/KFZc80GpMHU/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-4-cIe_wL9E0/UlgyZX8Ne0I/AAAAAAAACZk/KFZc80GpMHU/s1600/image.png" /></a></div>
Muy bien, recordemos entonces como realizar una ListView con elementos a mostrar. Toda ListView obtiene sus elementos de un Adapter, el cual puede ser un ListAdapter o un ArrayAdapter el cual toma un xml como vista y un conjunto de valores que son los elementos ¿correcto? Pues bien, lo que haremos nosotros será crear nuestro propio Adapter que herede de ArrayAdapter y al cual parametrizaremos con nuestro objeto Post. De ésta manera tendremos un Adapter al cual llenaremos con nuestros objetos y el cual utilizará el patrón ViewHolder para incrementar el rendimiento.<br />
Entonces una vez explicado lo anterior, crearemos una nueva clase llamada PostAdapter que extenderá de ArrayAdapter y como dije anteriormente la parametrizaremos para que reciba nuestro objeto Post.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Rng7r7KJsyY/Ulg0ZCPQL3I/AAAAAAAACZw/sokmD59KGT4/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Rng7r7KJsyY/Ulg0ZCPQL3I/AAAAAAAACZw/sokmD59KGT4/s1600/image.png" /></a></div>
Lo primero que nos indicará Eclipse al extender de ArrayAdapter será que implementemos su constructor, entonces lo implementamos.<br />
A continuación añadiremos los siguientes atributos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MFo52V_7nnU/Ulg09Flr2YI/AAAAAAAACZ4/TbuqaREDRxU/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-MFo52V_7nnU/Ulg09Flr2YI/AAAAAAAACZ4/TbuqaREDRxU/s1600/image.png" /></a></div>
<b>mContext</b>. Es el contexto de nuestra aplicación, el cuál le pasaremos como argumentos al instanciar nuestro PostAdapter.<br />
<b>postList</b>. Es nuestra lista de objetos Post.<br />
<b>imagen</b>. Es el widget que mostrará la imagen del post.<br />
<b>titulo </b>y <b>fecha</b>. Son TextView donde se mostrará la información del Titulo y Fecha del post.<br />
<br />
Ahora en el constructor añadiremos lo siguiente:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-c6oQgp7WqZg/Ulg17JHQ0SI/AAAAAAAACaE/MwoXkFUNzz0/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-c6oQgp7WqZg/Ulg17JHQ0SI/AAAAAAAACaE/MwoXkFUNzz0/s1600/image.png" /></a></div>
Aquí simplemente seteamos nuestros atributos mContext y postList a los que recibe nuestro objeto PostAdapter al ser instanciado.<br />
<br />
Lo que sigue es crear el método getView, que es el que obtiene los elementos del ListView y los muestra en pantalla mientras se realiza el scrolling. Primero codificaré éste método sin utilizar ViewHolder para que noten la diferencia una vez implementado el patrón.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-hy8Zj6lX9o4/Ulg3uoNXgVI/AAAAAAAACaQ/rkgv-jkZahk/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-hy8Zj6lX9o4/Ulg3uoNXgVI/AAAAAAAACaQ/rkgv-jkZahk/s1600/image.png" /></a></div>
Explicaré brevemente el método, lo primero que hace es obtener el inflater del contexto e inflar la vista (convertView) del item con el <i>item.xml</i> que creamos anteriormente, en seguida realizamos los findViewById para castear los widgets a nuestros atributos titulo, fecha e imagen. Lo siguiente creamos un nuevo objeto post y obtenemos el elemento actual de la vista mediante la posición. Dicho objeto nos servirá para setearle la información a nuestros atributos y mostrarlos en pantalla, para finalizar retornamos la vista del item. Si se fijan en el método podrán darse cuenta que cada vez que queramos mostrar el item en pantalla tendremos que "buscarlos" nuevamente a traves de findViewById ya que no guardamos ninguna referencia a ellos y es como si estuvieramos creando un nuevo item cada vez que se realiza el método getView. Por mientras lo dejaremos así como está y regresaremos a nuestra MainActivity.<br />
Crearemos los siguientes atributos:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-PKw7r6CZfZ8/Ulg6R1Ebz-I/AAAAAAAACac/P4zIxWyP-Ts/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-PKw7r6CZfZ8/Ulg6R1Ebz-I/AAAAAAAACac/P4zIxWyP-Ts/s1600/image.png" /></a></div>
Un Array de objetos Post el cual hidrataremos con nuestros objetos y un PostAdapter que nos servirá para cargar nuestro ListView con elementos.<br />
Crearé un método privado que me servirá para crear datos y añadirlos a nuestra lista de objetos.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-f59R5YAqauI/Ulg7HSh6Z7I/AAAAAAAACak/RxF3vpDGd6c/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-f59R5YAqauI/Ulg7HSh6Z7I/AAAAAAAACak/RxF3vpDGd6c/s1600/image.png" /></a></div>
A continuación en el método onCreate llamaremos al método llenarLista para cargar nuestra lista de objetos e instanciaremos nuestro PostAdapter pasandole la lista de objetos hidratada, y para finalizar seteamos nuestro postAdapter a nuestra actividad con setListAdapter.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-hUncHG6DKdM/Ulg7dKxh67I/AAAAAAAACas/ac6LtST8eno/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-hUncHG6DKdM/Ulg7dKxh67I/AAAAAAAACas/ac6LtST8eno/s1600/image.png" /></a></div>
Si corremos nuestra aplicación, deberíamos poder ver los siguiente.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-incGU1epDM8/Ulg8FeeVbbI/AAAAAAAACa0/OfpG9HVtnXI/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-incGU1epDM8/Ulg8FeeVbbI/AAAAAAAACa0/OfpG9HVtnXI/s320/image.png" width="279" /></a></div>
Ok, todo correcto, ya tenemos nuestro lista cargada con objetos, pero, el objetivo del tutorial es como hacerlo mas óptimo y mejorar el rendimiento de la aplicación a través del patrón ViewHolder, así que regresemos a nuestra clase PostAdapter.<br />
Crearemos una clase estática dentro de nuestra clase PostAdapter y la llamaremos ViewHolder.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zmAqEil9Bfk/Ulg9eG-LQbI/AAAAAAAACbA/n6P4YvcGKOs/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-zmAqEil9Bfk/Ulg9eG-LQbI/AAAAAAAACbA/n6P4YvcGKOs/s1600/image.png" /></a></div>
Ahora realizare algunos cambios en el método getView para mostrarles como implementar el patrón. El método quedará de la siguiente manera.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6GQWDG1-PQY/Ulg-5F_WjBI/AAAAAAAACbM/ECEjND6RP1w/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6GQWDG1-PQY/Ulg-5F_WjBI/AAAAAAAACbM/ECEjND6RP1w/s1600/image.png" /></a></div>
Muy bien, ahora entendamos un poco lo que cambio, de entrada declaramos un objeto ViewHolder, a continuación preguntamos primero si la vista es nula, de ser así, la inflamos a través del <i>inflater </i>e instanciamos nuestro objeto viewHolder y casteamos los widget a sus atributos a través del <i>findViewById </i>(aquí estamos guardando la referencia), una vez hecho ésto seteamos el viewHolder a la vista a través de <i>setTag, </i>éste proceso se realizará una sola vez para cada vista (la primera vez), ya que al momento de llamar nuevamente a getView, dicha vista ya no será nula y entonces lo único que hará será recoger la referencia del viewHolder a través de <i>getTag</i>, lo demás queda de igual manera solamente que ahora seteamos la información del objeto a los atributos del viewHolder.<br />
Cómo pueden observar el ViewHolder tiene un fin muy específico pero que mejora bastante el performance de nuestra aplicación, solo faltaría medir el rendimiento con alguna herramienta para verificar de cuánto es la mejora.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-2ys7JYKsPgs/UlhGXVxsnQI/AAAAAAAACbc/i3AASzySjrQ/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-2ys7JYKsPgs/UlhGXVxsnQI/AAAAAAAACbc/i3AASzySjrQ/s320/image.png" width="278" /></a></div>
<br />
Bueno, eso sería todo por hoy. Saludos. ;)</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com0tag:blogger.com,1999:blog-3631400745966221264.post-32851799666831036122013-10-09T07:51:00.004-07:002013-10-09T07:51:55.013-07:00Android: Conexión JTDS de manera asíncrona con AsyncTask<div style="text-align: justify;">
¡Que tal! Regresamos a las andadas con android. Ya tenía bastante tiempo desde que no publicábamos algo sobre el <a href="http://moztrodev.blogspot.mx/search/label/android">sistema operativo de Google</a>, pero déjenme <strike>presumirles</strike> contarles que en mi trabajo ya me han dado luz verde para empezar a trabajar sobre proyectos android, por lo que estaré mas en contacto con él y poder publicar algún truquito de vez en cuando (espero). Por lo pronto, los invitó a que lean lo que les traigo tras el salto...</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_HfTnQ_gDx4/UlRYYK80iVI/AAAAAAAACU4/ogWXYXsUkJ4/s1600/asynctask.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="http://3.bp.blogspot.com/-_HfTnQ_gDx4/UlRYYK80iVI/AAAAAAAACU4/ogWXYXsUkJ4/s640/asynctask.png" width="640" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
Primero veamos el porque realizar tareas de manera asíncrona. En android existe el thread o hilo principal de la aplicación, sobre el cuál corren las activities, y el cuál tras un tiempo de congelamiento es abortado por el sistema operativo. Si nosotros quisiéramos por ejemplo descargar algún archivo de internet mediante la aplicación, consultar las noticias de un sitio web mediante RSS(el próximo tutorial que haga será sobre esto), o como en este caso conectarnos a una base de datos remota, es decir, todas aquellas tareas que impliquen un proceso de carga y que involucran tiempos de espera y quisiéramos ejecutarlos en el hilo principal sería abortado por android, por lo que tenemos a fuerza que ejecutarlo en un hilo diferente, es decir, en segundo plano. Además de que al hacerlo de ésta manera tendremos una aplicación mucho mas ágil, dinámica y veloz.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>La clase AsyncTask</b></div>
<div style="text-align: justify;">
Android cuenta en su API con la clase AsyncTask, la cual nos permitirá realizar tareas en segundo plano de manera fácil y sencilla.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.narongwate.com/blog/wp-content/uploads/2012/09/AsyncTask-In-Android1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="http://www.narongwate.com/blog/wp-content/uploads/2012/09/AsyncTask-In-Android1.jpg" width="400" /></a></div>
La clase AsyncTask funciona tal cual se ve en la imagen, donde el método <i>doInBackground </i>es el que realiza la tarea asíncrona, precedido del método <i>onPreExecute </i>con el cual podemos realizar acciones antes de que se ejecute la tarea y seguido de <i>onPostExecute </i>que se ejecuta al finalizar <i>doInBackground </i>y que recibe los resultados de éste. También tenemos el método <i>onProgressUpdate</i>, el cuál se ejecuta a la par de <i>doInBackgorund </i>y con el cuál podríamos, por ejemplo, utilizar para mostrar en pantalla el progreso de la tarea.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
Para empezar a utilizar <i>AsyncTask</i>, tendremos que crear una <a href="http://en.wikipedia.org/wiki/Inner_class">InnerClass </a>dentro de nuestra activity, en mi caso lo haré en el MainActivity y la llamaré <i>GetDBConnection </i>(¡Que creativo soy!) y haré que esta clase herede de <i>AsyncTask</i>.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-CFLZSoorIhI/UlRlcd19oaI/AAAAAAAACVI/uqm5a7jBb_Y/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-CFLZSoorIhI/UlRlcd19oaI/AAAAAAAACVI/uqm5a7jBb_Y/s1600/image.png" /></a></div>
<div style="text-align: justify;">
A continuación me pedirá implementar los métodos de la clase AsyncTask, de hecho el único método que debemos implementar de manera obligatoria es <i>doInBackground</i>, aunque nosotros implementaremos también el método <i>onPostExecute </i>el cuál recibe el resultado de <i>doInBackground</i>. Entonces solo los implementamos y listo.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Psw9cQf2txo/UlRoMwK0tYI/AAAAAAAACVc/fsGUfyRgguA/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Psw9cQf2txo/UlRoMwK0tYI/AAAAAAAACVc/fsGUfyRgguA/s1600/image.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Antes de continuar me gustaría explicarles las parámetrizaciones que recibe la clase <b>AsyncTask<Params, Progress, Result></b>. </div>
<div style="text-align: justify;">
<b>Params</b>.- Es el tipo de parámetros que queremos que reciba nuestra clase para ejecutar la tarea.</div>
<div style="text-align: justify;">
<b>Progress </b>.- El tipo de parámetro de las unidades de progreso, normalmente de tipo entero y que nos indican el progreso de nuestra tarea. Útil al implementar el método <i>onProgressUpdate</i>.</div>
<div style="text-align: justify;">
<b>Result </b>.- Es el tipo de parámetro devuelto como resultado de la tarea hecha en <i>doInBackgournd </i>y que recibe el método <i>onPostExecute</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>La conexión!!! La conexión!!!</b></div>
<div style="text-align: justify;">
Bueno, ahora que ya tenemos preparado nuestro método asíncrono, es hora de ponerlo a trabajar. Para ello haremos una conexión a una base de datos SQL Server. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
1.- Para ello lo primero que haremos será leer este <a href="http://moztrodev.blogspot.mx/2013/10/hazlo-facil-conectar-aplicacion-android.html">post</a>, y ahora que ya sabemos como conectar una aplicación android a SQL Server nos vamos al segundo paso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
2. Lo segundo será crear una base de datos de ejemplo (db_ejemplo) y una tabla llamada Persona con la siguiente información:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VnepnMED2ZU/UlRscQqT_-I/AAAAAAAACVo/qwN5Kqc13J4/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-VnepnMED2ZU/UlRscQqT_-I/AAAAAAAACVo/qwN5Kqc13J4/s1600/image.png" /></a></div>
<div style="text-align: justify;">
3. Crearemos una clase <i>SimpleDAO</i>, que maneje nuestras consultas a la base de datos y cuyo método <i>construirLector </i>recibe nuestra query como parámetro y<i> </i>nos devuelve un ResultSet hidratado con la información.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-P7-elPd-DKQ/UlRtbVT1ipI/AAAAAAAACVw/le4yLiLopvI/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-P7-elPd-DKQ/UlRtbVT1ipI/AAAAAAAACVw/le4yLiLopvI/s1600/image.png" /></a></div>
<div style="text-align: justify;">
4. Ahora crearemos la clase <i>PersonaDAO </i>como un Singleton<i> y </i>que hereda de <i>SimpleDAO </i>y donde prepararemos todas las sentencias que hagamos sobre la tabla Persona.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6wQM8fdYrec/UlR8NoWQp9I/AAAAAAAACW8/uO9W6Jb71QI/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6wQM8fdYrec/UlR8NoWQp9I/AAAAAAAACW8/uO9W6Jb71QI/s1600/image.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Como pueden observar el método <i>getNombrePersona </i>recibe como parámetro el id de la persona en base de datos y es éste mismo método quien se encarga de preparar la query y llamar al método <i>construirLector </i>de su superclase <i>SimpleDAO </i>quien devuelve un ResultSet el cual solamente tenemos que leer y devolver el valor obtenido.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
5.- A continuación regresamos a nuestra MainActivity y en el método <i>doInBackground </i>de nuestra clase <i>GetDBConnection </i>simplemente llamaremos al método <i>getNombrePersona </i>de PersonaDAO (ya deben saber cómo llamar a una clase Singleton) y le pasaremos el primer parámetro de nuestra serie de parámetros (en seguida veremos como funciona esto al momento de llamar a nuestra clase <i>GetDBConnection </i>en el paso 6).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-7KW0icOLM-k/UlRx8AF5BbI/AAAAAAAACWI/eyVVsfAuhmA/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-7KW0icOLM-k/UlRx8AF5BbI/AAAAAAAACWI/eyVVsfAuhmA/s1600/image.png" /></a></div>
También añadiremos en el método <i>onPostExecute </i>un Toast que nos imprima en pantalla el resultado devuelto por <i>doInBackground, </i>que en este caso es el nombre de la persona.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fjGQP-FdUCk/UlRy5aueqXI/AAAAAAAACWY/xJaKmf5mfCk/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-fjGQP-FdUCk/UlRy5aueqXI/AAAAAAAACWY/xJaKmf5mfCk/s1600/image.png" /></a></div>
6. Listo, ahora para ejecutar nuestra tarea asíncrona solo debemos instanciar nuestra clase <i>GetDBConnection </i>y llamar a su método <i>execute.</i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fPJ3Uqv3YqM/UlRzoZLSl2I/AAAAAAAACWg/8iFkH5NvqMw/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-fPJ3Uqv3YqM/UlRzoZLSl2I/AAAAAAAACWg/8iFkH5NvqMw/s1600/image.png" /></a></div>
Fíjense como al método <i>execute </i>le paso como argumento el número 1, si se fijan en los parámetros del método <i>doInBackground(Integer... params)</i> se darán cuenta que es un arreglo de enteros, por lo que fácilmente podríamos enviarle varios argumentos, aunque en este caso como solamente estamos enviando un único entero como argumento, por eso es que al momento de obtener el parámetro desde <i>doInBackground </i>lo hacemos de la siguiente manera <i>params[0].</i><br />
<br />
7.- Ahora si, al correr la aplicación les deberá mostrar un mensaje en pantalla con el nombre de la persona en Base de Datos con id=1, que en mi caso sería así.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-TvV8hjVYoU8/UlR2l7gfAII/AAAAAAAACWs/4f1sa0sZSv0/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-TvV8hjVYoU8/UlR2l7gfAII/AAAAAAAACWs/4f1sa0sZSv0/s400/image.png" width="347" /></a></div>
<br />
Con esto nosotros podríamos hacer que nuestra aplicación ejecute las consultas que deseemos de nuestra base de datos (o descargar ficheros, consultar datos por internet, etc.) sin que esto afecte el hilo principal de nuestra aplicación, ya que se estarían ejecutando en segundo plano. De ésta manera tendremos una aplicación ágil y también permitiríamos que el usuario realice otras acciones en nuestra aplicación mientras se ejecutan otras tareas al mismo tiempo.<br />
<br />
Espero les sirva de ayuda. Hasta la próxima! ;)</div>
originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com4tag:blogger.com,1999:blog-3631400745966221264.post-91903406421967808242013-10-09T07:51:00.000-07:002013-11-28T07:56:24.247-08:00Hazlo fácil: Conectar aplicación Android a Base de Datos SQLServer<div style="text-align: justify;">
Quizás debería estar durmiendo a estas horas de la madrugada, o quizás viendo una película o pasando el rato navegando..., quizás, pero no, en lugar de eso estoy aquí picando algo de código y me pasó por la mente "Hey, si de escribir código se trata, porque no hacerlo para un tutorial, al fin y al cabo le debes un tiempo al blog", y me respondí "Cierto, pero antes de pasar a cosas interesantes, empecemos con algo sencillo que nos servirá para calentar motores", así que adelante... (la falta de sueño causa más daño de lo que creí)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.androidworld.it/wp-content/uploads/2012/04/android-db.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="http://www.androidworld.it/wp-content/uploads/2012/04/android-db.jpg" width="320" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
Con este tutorial lograrán conectar cualquier aplicación android con una base de datos SQL Server tanto local como remotamente de una manera sencilla, tal y como si se tratara de una aplicación java común y corriente, y esto gracias al driver jTDS de JDBC.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Descargar el driver jTDS</b></div>
<div style="text-align: justify;">
Entonces lo primero que haremos será ir a la <a href="http://jtds.sourceforge.net/license.html">página oficial</a> y descargarnos el driver. <b>NOTA</b>: El driver que utilizaré será el 1.2.7 y android 4.2.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>Creando el proyecto y añadiendo el driver</b></div>
<div style="text-align: justify;">
Una vez descargado, abrimos nuestro IDE(en mi caso eclipse) y creamos una nueva aplicación de android.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez creado importaremos el jar del driver jTDS a nuestro proyecto, para esto hacemos click derecho sobre nuestro proyecto->Properties->Java Build Path->Libraries y en Add External JARs..., buscamos nuestro jar descargado y click en OK.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-7XUfEvGTKA4/UlTdsTXlXJI/AAAAAAAACXg/R6e2qxP6-44/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.37.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://3.bp.blogspot.com/-7XUfEvGTKA4/UlTdsTXlXJI/AAAAAAAACXg/R6e2qxP6-44/s400/Captura+de+pantalla+2013-10-08+a+la(s)+23.37.33.png" width="400" /></a></div>
<b><br /></b>
<br />
<div style="text-align: justify;">
<b>La clase DBConnection</b></div>
<div style="text-align: justify;">
Creamos una nueva clase que llamaremos <i>DBConnection</i> y la crearé como un <a href="http://moztrodev.blogspot.mx/search/label/singleton">Singleton</a>,</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Suw5pNrPqfs/UlTbOs-VcvI/AAAAAAAACXM/x4aj62lGWOo/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.26.41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Suw5pNrPqfs/UlTbOs-VcvI/AAAAAAAACXM/x4aj62lGWOo/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.26.41.png" /></a></div>
Añadimos los atributos URL, USER y PASS que contendrán la información y credenciales para conectarnos a la base de datos.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Vl9A4Pq32r8/UlTgjqisWbI/AAAAAAAACXs/zValkOKtGrw/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.48.22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Vl9A4Pq32r8/UlTgjqisWbI/AAAAAAAACXs/zValkOKtGrw/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.48.22.png" /></a></div>
<div style="text-align: justify;">
Ya saben lo que pienso sobre el <a href="http://moztrodev.blogspot.mx/search/label/malas%20practicas">código duro</a> pero dado que es un ejemplo, podemos dejarlo pasar.</div>
<br />
<div style="text-align: justify;">
Después creamos el método que hará la conexión, y en el instanciamos el driver para después pasarle nuestros datos de conexión al <i>DriverManager</i>.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-UcCKdRaLZww/UlThkOD5miI/AAAAAAAACX0/S6wAeYGXLrU/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.54.12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-UcCKdRaLZww/UlThkOD5miI/AAAAAAAACX0/S6wAeYGXLrU/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.54.12.png" /></a></div>
<div style="text-align: justify;">
Bueno, ya para terminar creare otro método singleton que obtendrá la conexión hecha en nuestro método <i>conectar()</i>.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Z8x0Wxcqt4M/UlTiac5L23I/AAAAAAAACX8/b54SsBqlqWU/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.58.01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Z8x0Wxcqt4M/UlTiac5L23I/AAAAAAAACX8/b54SsBqlqWU/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.58.01.png" /></a></div>
<br />
Entonces la clase final nos quedaría de la siguiente manera:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-JGVj1wv_YWc/UlTi91BcGMI/AAAAAAAACYE/lP8VavLMolo/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.59.51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-JGVj1wv_YWc/UlTi91BcGMI/AAAAAAAACYE/lP8VavLMolo/s1600/Captura+de+pantalla+2013-10-08+a+la(s)+23.59.51.png" /></a></div>
<b><br /></b>
<br />
<div style="text-align: justify;">
<b>Llamando a nuestra conexión</b></div>
<div style="text-align: justify;">
Ahora para llamar llamar a nuestra clase lo haremos de la manera como se llaman a las clases Singleton.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-RhDTNP4AOxQ/UlTkI0zcHkI/AAAAAAAACYQ/pjpQnfYhi2E/s1600/Captura+de+pantalla+2013-10-09+a+la(s)+00.05.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-RhDTNP4AOxQ/UlTkI0zcHkI/AAAAAAAACYQ/pjpQnfYhi2E/s1600/Captura+de+pantalla+2013-10-09+a+la(s)+00.05.14.png" /></a></div>
<b><br /></b>
<br />
<div style="text-align: justify;">
<b>Otorgando permisos a nuestra aplicación</b></div>
<div style="text-align: justify;">
Por poco lo olvido, necesitarán otorgarle permisos a su aplicación para que pueda hacer uso del internet y conectarse a su base de datos si ésta se encuentra remota. En el <i>AndroidManifest.xml </i>de su aplicación añadan la siguiente línea de código.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-SLZRxR3vygM/UlTlHtEiOcI/AAAAAAAACYY/3FuuK2MdruY/s1600/Captura+de+pantalla+2013-10-09+a+la(s)+00.09.30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-SLZRxR3vygM/UlTlHtEiOcI/AAAAAAAACYY/3FuuK2MdruY/s1600/Captura+de+pantalla+2013-10-09+a+la(s)+00.09.30.png" /></a></div>
<br />
Ok, ahora si es todo. Espero les sea útil, hasta la próxima! ;)originalshttp://www.blogger.com/profile/06586187591005222754noreply@blogger.com71