tag:blogger.com,1999:blog-26489387099891993312024-02-19T14:08:19.309-03:00El blog de Alvaro RegaladoAnonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.comBlogger78125tag:blogger.com,1999:blog-2648938709989199331.post-5575929358785763782016-11-27T11:13:00.000-03:002016-11-27T11:17:49.535-03:00Offline Sync + Azure Mobile App + Internal Server ErrorHace poco tiempo decidí aprender Xamarin Forms. Tuve suerte ya que Microsoft lanzó el curso en línea "Xamarin Diplomado Latinoamérica",<br />
<br />
Si están pensando en aprender dicha tecnología, no se lo pierdan: <a href="https://info.microsoft.com/LA-VSO-WBNR-FY17-10Oct-07-Xamarin-Diplomado-263218.html" target="_blank">Xamarin Diplomado Latinoamerica</a>.<br />
<br />
La cuestión con todo esto es que en dicho curso se debe hacer una app conectada a Azure Mobile Services.<br />
<br />
<div class="MsoNormal">
La app que hice muestra en pantalla las cotizaciones de las
principales monedas con las que se opera en Uruguay (mi país de origen). <o:p></o:p></div>
<br />
<div class="MsoNormal">
Para ello se fija en la base local (<span style="color: #2b91af; font-family: "consolas"; font-size: 9.5pt;">IMobileServiceSyncTable</span><span style="font-family: "consolas"; font-size: 9.5pt;">&lt;</span><span style="color: #2b91af; font-family: "consolas"; font-size: 9.5pt;">Cotizaciones</span><span style="font-family: "consolas"; font-size: 9.5pt;">&gt;</span>) si no
existen registros para la fecha actual, si no existen: baja de la página del
Banco República Oriental del Uruguay las cotizaciones del día, las guarda en la
base local y luego de ello sincroniza con Azure. La idea es, más adelante,
completar esta app agregando la funcionalidad de que el usuario pueda consultar
por fecha las cotizaciones y además un gráfico con la evolución de las monedas
entre dos fechas. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
(No, no vale reírse ... es una app con objetivo didáctico! 😃 )</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL0EfaeTB29jdLbB9Z8fE_guwJaL8nf-BTv1abibztFpe61gaKnx5rt23r27bUH57gQ0SStA80ZthWsZwIgW1YX0VrHMT7xqrkRzGaNc3TPZdlGYJXgwA_h64WnWZTq8K0EeTcX0Yp1qNZ/s1600/1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL0EfaeTB29jdLbB9Z8fE_guwJaL8nf-BTv1abibztFpe61gaKnx5rt23r27bUH57gQ0SStA80ZthWsZwIgW1YX0VrHMT7xqrkRzGaNc3TPZdlGYJXgwA_h64WnWZTq8K0EeTcX0Yp1qNZ/s320/1.PNG" width="165" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Al intentar sincronizar la app, en el método PullAsync, tiraba un error 500: "Internal Server Error".</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
El código del lado del cliente (Xamarin Forms):</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHY_m5gaNmQ0qaxOeBGgzLNLK4SDn0f3NVPZDMzqpzqFqZlgaGjx7I2wPQ-5mSzA7JvL3s7IHzbI2Im6rvrubMEY_Fu58NgCqTwSog2eOwoABa7cEyZssBe2lWyUTfhlL7IDE_QJffZfcn/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHY_m5gaNmQ0qaxOeBGgzLNLK4SDn0f3NVPZDMzqpzqFqZlgaGjx7I2wPQ-5mSzA7JvL3s7IHzbI2Im6rvrubMEY_Fu58NgCqTwSog2eOwoABa7cEyZssBe2lWyUTfhlL7IDE_QJffZfcn/s320/3.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx7Z_jJ7MUAjGKBr_DoWy7Zm7PYmC3fesm4txF3haRnGWFJLktWYNcMKVkDIXHkgyZAQIZNzuFujF7-v9W_qhypzCoj2nH2Vm56tMlwJ_2MvvOi0bR4VeyROaK_UbPdK9ZwUiHJYiF-JQR/s1600/4b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx7Z_jJ7MUAjGKBr_DoWy7Zm7PYmC3fesm4txF3haRnGWFJLktWYNcMKVkDIXHkgyZAQIZNzuFujF7-v9W_qhypzCoj2nH2Vm56tMlwJ_2MvvOi0bR4VeyROaK_UbPdK9ZwUiHJYiF-JQR/s320/4b.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;">Ésta es la clase “Cotizaciones”
definida en el cliente:</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRRGRV1J_tmO921zhvagJuMpkA4UqYmXye6Zt7bXMJavO48WJIZr0aynO9i2y85VoU-arI3xwRQM0vD0PUc7ngs38NQ7O96Ym9MhcKcVe0YDbmWcxrkamLdD1Q0QO6qQsYKO1HsWgHL1f/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRRGRV1J_tmO921zhvagJuMpkA4UqYmXye6Zt7bXMJavO48WJIZr0aynO9i2y85VoU-arI3xwRQM0vD0PUc7ngs38NQ7O96Ym9MhcKcVe0YDbmWcxrkamLdD1Q0QO6qQsYKO1HsWgHL1f/s320/6.png" width="285" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
El código correspondiente al Push funcionó, ya que si abría la tabla en el SQL Management Studio se mostraban los datos!: </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaDnEDS8q6pG_Ig4j104dPwpJb59OJQ8rk4BUiBfB-E8hoXAIFIt0Db1LKDmsnrlKDfXIEA02F41ORrEbsoaXlrWxTvSPzc-P0h4Fn1dDyY7y7l5Jb-YozrJygxTTDKvWTs_V-vozAZ4qv/s1600/sql.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="95" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaDnEDS8q6pG_Ig4j104dPwpJb59OJQ8rk4BUiBfB-E8hoXAIFIt0Db1LKDmsnrlKDfXIEA02F41ORrEbsoaXlrWxTvSPzc-P0h4Fn1dDyY7y7l5Jb-YozrJygxTTDKvWTs_V-vozAZ4qv/s320/sql.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Ésta es la clase “CotizacionesController” definida en el Backend. Noten el decorado de la clase: " <b>[MobileAppController]</b>" ... sin él las cosas no funcionan del todo bien.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2h-zrMqNA1C4nGqb1U7bhUUxDp9OFtdisSRX4r4Y6H2S9Poj7F4G5zrpa79MZw937iIo9SfL42msvwN_W9_6SD6NOT_HVE440EhXYVqVXpWHZZY0p2BuKcdf7R1w5FS1QcIb8qI8ocBPs/s1600/Backend.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2h-zrMqNA1C4nGqb1U7bhUUxDp9OFtdisSRX4r4Y6H2S9Poj7F4G5zrpa79MZw937iIo9SfL42msvwN_W9_6SD6NOT_HVE440EhXYVqVXpWHZZY0p2BuKcdf7R1w5FS1QcIb8qI8ocBPs/s320/Backend.png" width="281" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="MsoNormal">
Ésta es la clase “Cotizaciones” definida en el <o:p></o:p> Backend: </div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieCkf_ybtC7_ZLvVcGtV4lXaL1EQ0foM6spwIkilviXK5D1tniWUCiHm88A7oVOya_1O0811JkKcKZ66N-83jjoI8zC1blKozjTttu3G_WznC3YcGUKBsFIySX4Mvek8A7l6KUA3bh_Yxk/s1600/backend+entidad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieCkf_ybtC7_ZLvVcGtV4lXaL1EQ0foM6spwIkilviXK5D1tniWUCiHm88A7oVOya_1O0811JkKcKZ66N-83jjoI8zC1blKozjTttu3G_WznC3YcGUKBsFIySX4Mvek8A7l6KUA3bh_Yxk/s320/backend+entidad.png" width="270" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
El motivo de este post, es explicarles (mas allá del error puntual que yo tenia (<b>Tenía desactivado el AutomaticMigrationsEnabled de<span style="font-family: inherit;"> </span></b><span style="background-color: white; color: #242729;"><b><span style="font-family: inherit;">Entity Framework Code First automatic migrations</span></b><span style="font-family: "arial" , "helvetica neue" , "helvetica" , sans-serif;">), </span><span style="font-family: inherit;">cómo hice para solucionar el problema:</span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #242729;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: inherit;"><span style="background-color: white;"><span style="color: #242729;">Una </span><span style="color: #242729;">opción</span><span style="color: #242729;"> puede ser: </span></span><span style="font-size: 11pt;">En la parte del
servicio en Azure… entré a una parte que se llama “<b>Service Editor</b>” y luego <b>Output. </b>Esta ventana nos muestra un traceo con todos los posibles errores que hayan ocurrido en el servicio:</span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGrAbKp6tBBtNOY6sYtp40omguCcBYsyK_PE1U0BnTT-vLvZG3HMGno-OCvCSlRdoZ4198DbWnzGzwaZLDlchXpNjmyaeNo6cBnsQmRsUCKeBjPSO3gOp0ZNrALw_NWxKU6me0coFi5lM2/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGrAbKp6tBBtNOY6sYtp40omguCcBYsyK_PE1U0BnTT-vLvZG3HMGno-OCvCSlRdoZ4198DbWnzGzwaZLDlchXpNjmyaeNo6cBnsQmRsUCKeBjPSO3gOp0ZNrALw_NWxKU6me0coFi5lM2/s320/7.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Otra opción que también me fue de utilidad, es "attachearnos" (adjuntarnos) al backend (lo puedes hacer desde la pestaña Cloud Explorer) y depurar cuando el servicio recibe una llamada. Quedé asombrado de las buenas herramientas que posee Visual Studio (con el SDK de Azure instalado) para realizar cualquier operación en la nube:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigZnRhRklrTpiMqcbIYFiwsrc-3XRtFzBicr7328OmFGGBdoQuDM8wFPWfT_1TieRmtgSQWynY8f-WMfdEeKSIRfz7fS533M-qK9ENeRH32cFJ4cQmQUHRe3m59heDfBhKKhU9Cse5H5mS/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigZnRhRklrTpiMqcbIYFiwsrc-3XRtFzBicr7328OmFGGBdoQuDM8wFPWfT_1TieRmtgSQWynY8f-WMfdEeKSIRfz7fS533M-qK9ENeRH32cFJ4cQmQUHRe3m59heDfBhKKhU9Cse5H5mS/s320/8.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Bueno, eso ha sido todo por ahora espero les sea de utilidad... hasta la próxima!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<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: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><br /></span>
<span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><br /></span>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-9027123554270374352015-03-28T11:43:00.002-03:002015-03-28T16:36:32.172-03:00Como solucionar el bug del control ReportViewer que muestra todos los campos con #ErrorHace tiempo venimos trabajando con ReportViewer y nunca habíamos tenido mayores problemas con el mismo, hasta el día de ayer que sucedió lo que paso a contarles a continuación.<br />
<div>
<br />
<div>
Teníamos unos reportes hechos en una aplicación web que corría con la versión vieja del ReportViewer (la que venía con VS2010 ... no recuerdo el número de versión exacta) corriendo sobre .NET 2.0 y generando reportes localmente; teníamos la necesidad de migrarlo a un sitio nuevo hecho con VS2013 corriendo .NET 4.5.2. La migración se realizó de manera transparente, es decir, no hubo que meterle mano a los archivos rldc ni nada por el estilo. Al momento de probarlos tampoco hubo problemas, los reportes se generaron correctamente. </div>
<div>
<br /></div>
<div>
Hasta ahí íbamos bien, llegó el momento de ponerlo en producción y al momento de generar el reporte... ésto es lo que sucedió:</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFwNREk-il2HWi9ubSdPYOL4JmLhCvUsn8Su_yTrmacLhpS9UUEBt8gLghADbUTsi_wA5eAA1osQdh2DZO4NozzZ4ES-gyBzc3ngDtl-uXRmn-WetrLZx1AA86wxs401RBwLn3eL66xg9/s1600/Error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFwNREk-il2HWi9ubSdPYOL4JmLhCvUsn8Su_yTrmacLhpS9UUEBt8gLghADbUTsi_wA5eAA1osQdh2DZO4NozzZ4ES-gyBzc3ngDtl-uXRmn-WetrLZx1AA86wxs401RBwLn3eL66xg9/s1600/Error.png" height="215" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Nos generó el reporte con todos sus campos marcados con el tag "#Error" !. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Antes de seguir cabe aclarar que algunos campos son expresiones (ej: <span style="font-family: Consolas, Courier, monospace; font-size: 13px; line-height: 17.5499992370605px;">=IIf(Fields!Cost.Value > Fields!Revenue.Value, "Red", "Black")</span> pero la mayoría no lo son e igual se mostraban con el infame mensaje de "#Error", lo que descartaba algún bug que pudiera tener la expresión.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Pero, ¿que pasó? </b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Bien, al parecer es un tema relacionado con el cambio en las políticas de seguridad de .NET 4 y el ReportViewer corriendo en un AppDomain con permisos mas restrictivos, por lo que tenemos dos opciones posibles para solucionarlo:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
1) Agregar al web.config la siguiente linea:"<b><trust legacyCasModel="true" level="Full" /></b>" <b><trust legacycasmodel="true" level="Full"></trust></b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<trust legacycasmodel="true" level="Full"></trust></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: #333333; font-family: inherit;"><span style="line-height: 20.1620178222656px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: #333333; font-family: inherit;"><span style="line-height: 20.1620178222656px;">2) Al momento de generar el reporte agregar las dos líneas que se marcan a </span></span><span style="color: #333333;"><span style="line-height: 20.1620178222656px;">continuación:</span></span><span style="color: #333333; font-family: inherit;"><span style="line-height: 20.1620178222656px;"> </span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.1620178222656px;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;">protected void GenerarArchivoPdf(string fileName, ReportViewer rpv)</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;">{</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>Warning[] warnings = null;</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>string[] streamids = null;</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>string mimeType = null;</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>string encoding = null;</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>string extension = null;</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>const string deviceInfo = "<deviceinfo></deviceinfo>";</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span><span style="background-color: lime;">System.Security.PermissionSet sec = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted);</span></span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="background-color: lime; font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>rpv.LocalReport.SetBasePermissionsForSandboxAppDomain(sec);</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Generar el archivo</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>byte[] archivo = rpv.LocalReport.Render("PDF", deviceInfo, mimeType, encoding, extension, streamids, warnings);</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>//Guardar el archivo en la carpeta temporal para referenciarlo como adjunto del mensaje</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 20.1620178222656px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>My.Computer.FileSystem.WriteAllBytes(fileName, archivo, true);</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 14px; line-height: 20.1620178222656px;">}</span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 14px; line-height: 20.1620178222656px;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;">En nuestro caso lo resolvimos utilizando la <b>opción 2</b>. </span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;">Si quieren leer mas acerca de este tema les recomiendo:</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><a href="http://blogs.msdn.com/b/brianhartman/archive/2010/02/18/expression-evaluation-in-local-mode.aspx">http://blogs.msdn.com/b/brianhartman/archive/2010/02/18/expression-evaluation-in-local-mode.aspx</a></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333;"><span style="line-height: 20.1620178222656px;">Espero les sea de utilidad y me despido hasta la próxima!</span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;"><br /></span></span></div>
<div class="separator" style="clear: both;">
<span style="color: #333333; line-height: 20.1620178222656px;"><span style="font-family: inherit;"><br /></span></span></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.1620178222656px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="background-color: white; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.1620178222656px;"><br /></span></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com2tag:blogger.com,1999:blog-2648938709989199331.post-39319627407119978162014-10-09T11:46:00.001-02:002014-10-09T11:46:32.962-02:00Obtener el id de usuario desde un token generado por la pagina PasswordReset de ASP.NET Identity 2.1<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Antes de comenzar: ¿Que es <b>ASP.NET Identity</b>?</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><b>ASP.NET Identity</b> es una de las grandes novedades de la nueva
versión de ese gran paraguas de soluciones llamado ASP.NET, sustituyendo al viejo y querido sistema de Membership que
venimos usando desde que salio allá por el año 2005. Esta diseñado para dar solución a muchos de los problemas y
limitaciones que el sistema anterior tenia. </span><span style="font-family: Verdana, sans-serif;">Si quieren tener un análisis detallado del nuevo sistema,
les recomiendo leer este post </span><a href="http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/" style="font-family: Verdana, sans-serif;">http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/</a><span style="font-family: Verdana, sans-serif;">
(<i>Nota: no esta actualizado por lo que algún item mencionado como desventaja ya no aplica porque fue implementado en la ultima versión</i>)</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Presentado el tema, pasemos al problema.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La plantilla de Visual Studio 2013, viene con una pagina de
OlvidoSuContraseña y otra RestablecerContraseña que te permiten realizar dichas
tareas. </span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><o:p></o:p>El mecanismo para restablecer la contraseña que utilizamos en
nuestro caso, es el envío de un link vía mail para restablecer la contraseña
(hay que tener en cuenta que hay otras posibilidades) <o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Al entrar a la página de restablecimiento de contraseña, le vuelve a solicitar al usuario la dirección de mail! Evidentemente el que hizo esta
plantilla, no tuvo en cuenta que ésto no es muy práctico desde el punto de vista usabilidad.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La idea para solucionar esto, es obtener del token el id de
usuario que forma parte del mismo y a partir del mismo, obtener su dirección de
mail y no tener que pedírselo de nuevo al usuario.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Manos a la obra!<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">1) Ubicar el archivo <b>Startup.auth.cs</b> ubicado en la carpeta <b>App_Start</b> y agregar las lineas de código que se muestran a continuación:</span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib9duaW2h3oM8eORe9Ff7iIFWZc_3xVlz5ERquIwn3y5H4abbrbWlbXodO2FU0fSRLv2Dk5WukW-MT5iHAGlu6F4x-6T_hBSSmVPWSN6wyFmK9_fQwdURh9b8bbgJ-_UkpFwQQJvhli7US/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib9duaW2h3oM8eORe9Ff7iIFWZc_3xVlz5ERquIwn3y5H4abbrbWlbXodO2FU0fSRLv2Dk5WukW-MT5iHAGlu6F4x-6T_hBSSmVPWSN6wyFmK9_fQwdURh9b8bbgJ-_UkpFwQQJvhli7US/s1600/1.png" height="112" width="320" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;">2) Ubicar el archivo <b>ResetPassword.aspx</b> ubicado en la carpeta <b>Account</b> y agregar las lineas de código que se muestran a continuación:</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYFXltttm6UBMrLZ8KFf83SB3aQJjNM0-0gmB8nThCh46LAyAsPPt2YVF3yCDLjxw9wVco547GDDQXSTATOOUXAurqUz2qQrbHUEKQl013BIQqzmN7onzrW6tGnyqmghbmJ3I22oU8TQTf/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYFXltttm6UBMrLZ8KFf83SB3aQJjNM0-0gmB8nThCh46LAyAsPPt2YVF3yCDLjxw9wVco547GDDQXSTATOOUXAurqUz2qQrbHUEKQl013BIQqzmN7onzrW6tGnyqmghbmJ3I22oU8TQTf/s1600/2.png" height="113" width="320" /></span></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEJalQpriPNRJpaDgnQXeJN4yYETWtZ1JT-pEnnjxQf1euZgvBdMPgZlODyJmUHm7kEU6jOBnpKHCQl3iLvwZe2Y4Utlb9rbdjh6e5Fx9bvVpKWwVK0Cry4s_HfY4pSYQpoeXHmTI1OW1c/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEJalQpriPNRJpaDgnQXeJN4yYETWtZ1JT-pEnnjxQf1euZgvBdMPgZlODyJmUHm7kEU6jOBnpKHCQl3iLvwZe2Y4Utlb9rbdjh6e5Fx9bvVpKWwVK0Cry4s_HfY4pSYQpoeXHmTI1OW1c/s1600/3.png" height="115" width="320" /></span></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLAB1gBSJXVIEEJeFPnU73W62-tLNV7j3s4WhA03kxcmEMltFesBibzDDoccrYtiwAe9pF90cFusOyFa-B5jp-OuM2iDS9dZLOE-L6YmSZvzD4nX3BfLVzQrjLZ7KvBshRIlt5SiY2e0_N/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLAB1gBSJXVIEEJeFPnU73W62-tLNV7j3s4WhA03kxcmEMltFesBibzDDoccrYtiwAe9pF90cFusOyFa-B5jp-OuM2iDS9dZLOE-L6YmSZvzD4nX3BfLVzQrjLZ7KvBshRIlt5SiY2e0_N/s1600/4.png" height="152" width="320" /></span></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1sZiqhuU8GbqeAbhvX__Zb0hVfuFcQu89SU-clDl_rjDfkHt06GSA_mtecSUPkg4aAnFlziIASJxRrf3DUEQ1TZYZfBSJqbUY_74OAa_XDjx2h1glYRX_EWZgl8PZjQkvjpaQ8Ik7NqCs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1sZiqhuU8GbqeAbhvX__Zb0hVfuFcQu89SU-clDl_rjDfkHt06GSA_mtecSUPkg4aAnFlziIASJxRrf3DUEQ1TZYZfBSJqbUY_74OAa_XDjx2h1glYRX_EWZgl8PZjQkvjpaQ8Ik7NqCs/s1600/5.png" height="167" width="320" /></span></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;">La magia la hace el método <b>GetUserFromToken</b> que utiliza el provider que definimos en el primer paso (ResetPasswordProtectionProvider).</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;">Si querés saber mas acerca de <b>Asp.Net Identity</b>: <a href="http://www.asp.net/identity">http://www.asp.net/identity</a></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;">Espero que les sea de utilidad, hasta la próxima!</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-38545400733255365152014-03-04T20:47:00.000-02:002014-03-04T20:54:12.232-02:00Timeouts de Web Service en carga de archivos grandesEn esta semana hemos tenido la oportunidad de agregar funcionalidad a un web service existente. Dicha funcionalidad consta de subir una lista de fotos desde un celular al servicio web anteriormente mencionado. A continuación, la firma del método en cuestión:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNHBREEVsBzw0aByl6N80I-EMdGyfBmL8wVAYTEMW4pNwcaPfJsyixCwfoIF8ciP-CAcTmVcwiVt3xhO9-G3H-n7brsQnra3NWCiecC9sT9dxy3GeqSKZvjdS6awn_xJfsFz-bpS1_Usz-/s1600/Web+Service+Timeouts+0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNHBREEVsBzw0aByl6N80I-EMdGyfBmL8wVAYTEMW4pNwcaPfJsyixCwfoIF8ciP-CAcTmVcwiVt3xhO9-G3H-n7brsQnra3NWCiecC9sT9dxy3GeqSKZvjdS6awn_xJfsFz-bpS1_Usz-/s1600/Web+Service+Timeouts+0.png" height="50" width="400" /></a></div>
<br />
Eventualmente, cada foto subida desde el celular, puede superar el tamaño establecido como límite en un servicio web asp.net (4096KB - 4Mb), por lo que debemos meter mano en la configuración por defecto para aumentar estos límites.<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Abrimos el archivo web.config y dentro de la sección <strong>System.Web</strong> tenemos el tag <strong>HttpRuntime </strong>y dentro del mismo, encontramos <strong>maxRequestLenght</strong> y <strong>executionTimeout</strong> que son los valores que debemos aumentar dependiendo de nuestras necesidades:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNNiJAGQvUZyNoCocs6eprrA0vanq1tG_i7ND1D3_kUDQsgKBDCIpvjQ_w63r-qAd7MriTieS9-6t2A8jb8JuJ9eCsoEwjUyakPigq9aOJz11YvCp4VTo0ryW_EhMcCLFWu_4nNac1bPp1/s1600/Web+Service+Timeouts+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNNiJAGQvUZyNoCocs6eprrA0vanq1tG_i7ND1D3_kUDQsgKBDCIpvjQ_w63r-qAd7MriTieS9-6t2A8jb8JuJ9eCsoEwjUyakPigq9aOJz11YvCp4VTo0ryW_EhMcCLFWu_4nNac1bPp1/s1600/Web+Service+Timeouts+1.png" height="111" width="400" /></a></div>
<br />
Adicionalmente, si vamos a implementar este web service en un servidor con IIS 7 o superior, debemos cambiar el límite mencionado anteriormente en OTRO lugar. El tag en cuestión es <strong>maxAllowedContentLength </strong>el cual se encuentra dentro del tag <strong>requestLimits</strong>, que a su vez está dentro de<strong> system.webServer</strong><br />
<strong></strong><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIMZP8j0cH85X_Lw-FOBpGN8IT8pwx2wJXKCOwue4MWjRv9MGJxJqaDOpk2N7hZoBI0-oo2-6SxDrBTQMpygIGb2CrARAhYQXinRu5790i3e2yBjmq7pE5wshVUmPPw974wRoZEtZkSuVe/s1600/Web+Service+Timeouts+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIMZP8j0cH85X_Lw-FOBpGN8IT8pwx2wJXKCOwue4MWjRv9MGJxJqaDOpk2N7hZoBI0-oo2-6SxDrBTQMpygIGb2CrARAhYQXinRu5790i3e2yBjmq7pE5wshVUmPPw974wRoZEtZkSuVe/s1600/Web+Service+Timeouts+2.png" height="131" width="400" /></a></div>
<strong></strong><br />
Luego de haber modificado éstos valores, queda todo funcionando OK, verdad?<br />
En nuestro caso <strong>no fue así</strong>. Debimos aumentar un valor adicional dentro de la configuración de IIS, el cual les paso a detallar:<br />
<br />
Primero, vamos a la configuración avanzada del sitio como se muestra en la imagen a continuación:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD9uKdRj2n8wiwu7-VcJpRJyaakoD6nx4CkG7t6i2rhCSIp5U9Sy9ji09Bkp3xjwHS7RhVqjHBqZwscAgzcnYRAWrlrKCK5vFJlYWATUSKdQv-tWxRvQnXc3XCv0kykxZPTiU335J4KFzQ/s1600/Web+Service+Timeouts+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD9uKdRj2n8wiwu7-VcJpRJyaakoD6nx4CkG7t6i2rhCSIp5U9Sy9ji09Bkp3xjwHS7RhVqjHBqZwscAgzcnYRAWrlrKCK5vFJlYWATUSKdQv-tWxRvQnXc3XCv0kykxZPTiU335J4KFzQ/s1600/Web+Service+Timeouts+3.png" height="153" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
Luego, expandimos la sección límites y cambiamos el valor de <strong>"Tiempo de espera de la conexión" y That's it! </strong></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC4PPdpzpE8GQAUg7K4czAhsuULiG5sr6LVfNLrskH7WGcQGD1QHbKYeC42BhVgEUtsG-xQvMpY5SjdWqOA7b2GDZk7C_dnMjOtP5yDszYvmV7mwgGV7TwOIILTlGhoj4Pn5ShJPKzvDS5/s1600/Web+Service+Timeouts+4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC4PPdpzpE8GQAUg7K4czAhsuULiG5sr6LVfNLrskH7WGcQGD1QHbKYeC42BhVgEUtsG-xQvMpY5SjdWqOA7b2GDZk7C_dnMjOtP5yDszYvmV7mwgGV7TwOIILTlGhoj4Pn5ShJPKzvDS5/s1600/Web+Service+Timeouts+4.png" height="320" width="260" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
No puedo dejar de darle crédito del último tip, al colega <strong>Roberto Broggi</strong> encargado de IT en la empresa para la cual implementamos la solución.</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
Espero les sea de utilidad, hasta la próxima!</div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-37394470049998368492014-02-20T23:45:00.003-02:002014-02-20T23:45:53.958-02:00AOP & PostSharpMi filosofía, es siempre aprender cosas nuevas y divertirme haciéndolo.<br />
<br />Hace poco tiempo, los amigos Fabián Fernandez y Bruno Bologna, organizadores de la .NetMeetupUy, dieron una charla muy interesante de AOP y PostSharp.<br />
<br />Por las vueltas de la profesión, hoy me toca trabajar con esa tecnología, la cual gracias a esa charla, no me resulta una desconocida.<br />
<br />
Por lo tanto, me voy a tomar el atrevimiento de darles un consejo a mis colegas y amigos: <br />
<br />
Asistan a las charlas técnicas...siempre se adquiere conocimiento que en una de esas van necesitar mas pronto de lo que creen... <br />
<br />
Mas informacion de AOP y PostSharp en:<br />
<br />
<a href="http://www.meetup.com/NET-UY/events/145986872/">http://www.meetup.com/NET-UY/events/145986872/</a><br />
<br />
<a href="http://www.postsharp.net/">http://www.postsharp.net/</a><br />
<br />
<a href="http://www.youtube.com/watch?v=mKszBAlTOkg">http://www.youtube.com/watch?v=mKszBAlTOkg</a>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-28133280592383139672013-12-20T22:38:00.000-02:002013-12-20T22:38:02.719-02:00Tiempo de balance
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">Como todos los años por estas fechas, <span style="mso-spacerun: yes;"> </span>pasamos raya y sacamos cuentas acerca de cómo
ha estado el año. Podemos decirles que ha sido un gran año gracias a que
ustedes que nos han elegido para acompañarlos y esto nos hace muy felices.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">Dando una mirada hacia atrás, recordamos que cuando
comenzaba el año, Gustavo, un empresario joven dueño de la empresa de
transporte y turismo Hollybus viajes, nos planteaba un desafío: desarrollar una
aplicación que le permitiera automatizar el mantenimiento de su flota. Como
resultado de todo esto, nació CMT, una aplicación que desarrollamos para
Windows 8 y que más tarde nos daría muchas satisfacciones (entre otras
distinciones, fue seleccionada por Microsoft entre más de 50 proyectos de
empresas que se postularon para el Windows Appceleration Program). <o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">Más adelante en el año y gracias a dos fenómenos: Andrés
Topolansky y Gaston Tourón, grandes valores de Netviax, tuvimos la posibilidad
de desarrollar un sistema de gestión de cobros, muy ambicioso desde el punto de
vista técnico, implementado totalmente sobre la plataforma Azure de Microsoft.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">Para terminar el año con todo, otro viejo amigo de la casa,
Alvaro Vanni - gerente de sistemas de A.D.A (empresa que gestiona las denuncias
del B.S.E), confió en nosotros una vez más, para llevar adelante otro gran
sistema, por su complejidad y todos los desafíos técnicos que involucraba. </span><span style="font-family: Calibri;">Es un orgullo poder decir que los mismos fueron
desarrollados de manera exitosa.<o:p></o:p></span></div>
<span style="font-family: Calibri;">También han contribuido para que este haya sido un gran año,
todos los clientes y empresas que han confiado en nuestros servicios... a
todos...un GRACIAS gigante!<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">A veces es difícil poder "vender" los servicios de
una empresa pequeña como la nuestra, justamente porque nos tildan de
"chicos". Con el tiempo hemos aprendido que lo importante no es el
tamaño. Lo importante es que en cualquier trabajo que hacemos, le ponemos el
corazón, porque amamos nuestro trabajo. <o:p></o:p></span></div>
<span style="font-family: Calibri;">Para L&A, cada proyecto es como un hijo, su computadora
es nuestra computadora, nos ponemos la camiseta de tu empresa como si fuera la
nuestra, porque creemos que tu éxito es también el nuestro. ¿Cuantas empresas o
profesionales pueden decir lo mismo?<o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<span style="font-family: Calibri;">Para terminar y no aburrirlos, queremos desearles una feliz
navidad en familia y un próspero año 2014, Salud amig@s!<o:p></o:p></span></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com1tag:blogger.com,1999:blog-2648938709989199331.post-45087130325296276262013-12-13T14:55:00.001-02:002013-12-13T14:58:30.839-02:00Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 3<span style="font-family: Verdana, sans-serif;"><span xmlns=""></span><br /></span>
<br />
<div style="margin-left: 36pt; text-align: left;">
<span style="font-family: Arial, Helvetica, sans-serif;" xmlns="">En la <a href="http://alvaroregalado.blogspot.com/2013/12/resolviendo-el-rompecabezas-wcf-tcp_5329.html">parte 2</a> de ésta serie, les mostraba como configurar un namespace de ACS desde el portal de Azure. En esta tercera y última parte les estaré mostrando como configurar el servicio y un eventual cliente del mismo para asegurar la comunicación entre ambos. </span></div>
<div style="margin-left: 36pt; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpsHasZAO7rVVvM5q0lhx9OxVob1wOrYKKgfCih1KkLfkD7z26EZ4Bgivuht-BNctoV5N1s5_0PI0qhexo_uMElJNoeafrBZRDLFfdyH7mtSL6cUgJt7sB34pdP9Fr-UHXXJo_XVzBePA_/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpsHasZAO7rVVvM5q0lhx9OxVob1wOrYKKgfCih1KkLfkD7z26EZ4Bgivuht-BNctoV5N1s5_0PI0qhexo_uMElJNoeafrBZRDLFfdyH7mtSL6cUgJt7sB34pdP9Fr-UHXXJo_XVzBePA_/s400/1.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h1>
<span style="font-size: small;">Pre Requisitos<o:p></o:p></span></h1>
<div class="MsoListParagraphCxSpFirst">
<o:p> </o:p>Para poder seguir los pasos que se detallan a continuación, es necesario tener instalados los siguientes elementos:</div>
<div class="MsoListParagraphCxSpMiddle">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font-family: 'Times New Roman';"> </span></span>Microsoft .NET 3.5 o 4.0 </div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span lang="EN-US" style="font-family: Symbol;">·<span style="font-family: 'Times New Roman';"> </span></span><span lang="EN-US">Windows Identity Foundation </span><span lang="EN-US"><a href="http://www.microsoft.com/en-us/download/details.aspx?id=17331">http://www.microsoft.com/en-us/download/details.aspx?id=17331</a></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span lang="EN-US" style="font-family: Symbol;">·<span style="font-family: 'Times New Roman';"> </span></span><span lang="EN-US">Windows Identity Foundation SDK </span><span lang="EN-US"><a href="http://www.microsoft.com/en-us/download/details.aspx?id=4451">http://www.microsoft.com/en-us/download/details.aspx?id=4451</a></span> </div>
<div class="separator" style="clear: both;">
</div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 72.0pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<span style="font-family: Symbol; text-indent: -18pt;">·<span style="font-family: 'Times New Roman';"> </span></span><span style="text-indent: -18pt;">Microsoft Visual Studio 201</span>0<o:p></o:p></div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 72.0pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<br /></div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 72.0pt; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<br /></div>
<div style="margin-left: 36pt; text-align: justify;">
<div class="MsoNormal">
Teniendo en cuenta la complejidad de los pasos que hay que realizar, la incapacidad de Word para tener una relación amistosa con el blog de google y viceversa (y por supuesto mi salud mental), decidí publicar la ultima parte de esta serie en PDF. Les dejo el enlace para que se descarguen el mismo a continuación: <a href="http://sdrv.ms/1h6ZQyl">http://sdrv.ms/1h6ZQyl</a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-size: large;">Espero les sea de utilidad, hasta la próxima!</span></div>
<div class="MsoNormal">
<br /></div>
</div>
<br />Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-69840492780291197372013-12-12T17:16:00.000-02:002013-12-12T17:21:24.271-02:00Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 2<span xmlns=""></span><br />
<div style="margin-left: 36pt; text-align: justify;">
<span style="font-family: Times, Times New Roman, serif;"><span xmlns="">En el <a href="http://alvaroregalado.blogspot.com/2013/12/resolviendo-el-rompecabezas-wcf-tcp.html" target="_blank">post anterior</a>, les contaba un poco acerca de un escenario que teníamos, en el cual debíamos asegurar las comunicaciones con un WCF con NetTcpBinding hosteado en Azure. También hablamos acerca de la tecnología utilizada para ello (Windows Azure ACS) y explicamos un poquito acerca de la misma. En este segundo post, trataré de detallar los pasos necesarios para llegar a la solución</span> </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFylQDaaX_xBpezxBmIOgS-C9jnt_ytLU5VbQFC-l_b8gSqt4ZuRhDwFyFt4XB5Bk0kMRLlvCZj3UtPC4uFo8TGHU6yHYI5gBOsfztS2ImHhAJZh9N_lLz1H9eFl2m_78o6UXfTVbcSzUC/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFylQDaaX_xBpezxBmIOgS-C9jnt_ytLU5VbQFC-l_b8gSqt4ZuRhDwFyFt4XB5Bk0kMRLlvCZj3UtPC4uFo8TGHU6yHYI5gBOsfztS2ImHhAJZh9N_lLz1H9eFl2m_78o6UXfTVbcSzUC/s1600/1.png" /></span></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b><span style="font-family: Times, Times New Roman, serif; font-size: large;">Pre Requisitos</span></b></div>
<div style="margin-left: 36pt;">
<span style="font-family: Times, Times New Roman, serif;"><span xmlns=""><br /> </span>Para poder seguir los pasos que se detallan a continuación, es necesario tener instalados los siguientes elementos:</span></div>
<div style="margin-left: 36pt;">
<ul>
<li><span style="font-family: Times, Times New Roman, serif;" xmlns="">Microsoft .NET 3.5 o 4.0</span></li>
<li><span style="font-family: Times, Times New Roman, serif;" xmlns="">Windows Identity Foundation <a href="http://www.microsoft.com/en-us/download/details.aspx?id=17331">http://www.microsoft.com/en-us/download/details.aspx?id=17331</a></span></li>
<li><span style="font-family: Times, Times New Roman, serif;" xmlns="">Windows Identity Foundation SDK <a href="http://www.microsoft.com/en-us/download/details.aspx?id=4451">http://www.microsoft.com/en-us/download/details.aspx?id=4451</a></span></li>
<li><span style="font-family: Times, Times New Roman, serif;" xmlns="">Microsoft Visual Studio 2010</span></li>
</ul>
</div>
<div style="margin-left: 36pt;">
<span style="font-family: Times, Times New Roman, serif;">Para comenzar con el proceso debemos crear un ACS Namespace. Para ello, debemos ingresar al panel de manejo de Windows Azure, hacer clic en Active Directory, hacer un clic en Access Control Namespaces, luego en New, Quick Create e ingresar un nombre de namespace adecuado.</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhyphenhyphenh72wIRqqVbYHwQMIbthDZkR7o-1aKpR08ft63IvKr5KBa97WrC2cVEd-2vR_Db9JeuMezoMoOu3r_KY-w6JEovneoOdU2YyxRmndb4GmKh4fxaRZUu8heE0Qw4xtw2ezlSEHvmILhlB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhyphenhyphenh72wIRqqVbYHwQMIbthDZkR7o-1aKpR08ft63IvKr5KBa97WrC2cVEd-2vR_Db9JeuMezoMoOu3r_KY-w6JEovneoOdU2YyxRmndb4GmKh4fxaRZUu8heE0Qw4xtw2ezlSEHvmILhlB/s400/2.png" width="400" /></span></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQ5SmUdS4yRLmGKzELZH0jtosmJ4m2WXTDKghDU3uyo99YIK41T5Nyw_STd1VWJHuxOHlbc9UA9mIwsjXXA4NY-JR2MhkAbeyU2BBJ1VZCeQ7L9U-cF_LGbwMTQZpzv11nn9oEfls7liw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQ5SmUdS4yRLmGKzELZH0jtosmJ4m2WXTDKghDU3uyo99YIK41T5Nyw_STd1VWJHuxOHlbc9UA9mIwsjXXA4NY-JR2MhkAbeyU2BBJ1VZCeQ7L9U-cF_LGbwMTQZpzv11nn9oEfls7liw/s400/3.png" width="400" /></span></a><br />
<div style="text-align: center;">
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /> </span></div>
<div style="text-align: justify;">
<span style="font-family: Times, Times New Roman, serif;" xmlns="">Una vez que tenemos creado el Namespace, debemos configurarlo. Para ello, debemos hacer un clic en el namespace que deseamos configurar y luego hacer clic en el botón "Manage" que está en barra de comandos (parte inferior de la pantalla)</span></div>
<div style="text-align: justify;">
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span></div>
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYoDTmkOr6hHvaF36AFm77k1KWJN6cgVY1Rei25a4YYY0AysYViFbN-H_TuzV3LWcXv7UMXqeA-RuWPhAtYVRpJZJVdfZDk8qIcVmdP-Jwpx-1snRiF-VFhKxROczl1Pt0tTyOF0PbSYqS/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYoDTmkOr6hHvaF36AFm77k1KWJN6cgVY1Rei25a4YYY0AysYViFbN-H_TuzV3LWcXv7UMXqeA-RuWPhAtYVRpJZJVdfZDk8qIcVmdP-Jwpx-1snRiF-VFhKxROczl1Pt0tTyOF0PbSYqS/s400/4.png" width="400" /></span></a></div>
<div style="text-align: justify;">
<span style="font-family: Times, Times New Roman, serif;"><br /></span></div>
<span style="font-family: Times, Times New Roman, serif;" xmlns="">Importante: el usuario debe tener permisos de administrador de active directory, no sirven los permisos de co-administrador</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /> </span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns="">El siguiente paso es configurar una aplicación de usuario de confianza (en inglés Relying Party Applications). En nuestro caso la aplicación en cuestión va a ser el servicio wcf. Para realizar dicha operación debemos hacer un clic en Aplicaciones de usuario de confianza y luego en Agregar. </span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /> </span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaEZ-Ujs71yC6Onn3Y1ck-bZTmwgd_BFdxKPc7qR3WNQwD5N9OCOig5PTUKoCFFXk3k7-QUThh1YDtzxoZ1nlX7Zv487qoeizVKsAJT0x84JIzc_rJqgaUqON6S0khnRquvd1YL-z5PnM/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaEZ-Ujs71yC6Onn3Y1ck-bZTmwgd_BFdxKPc7qR3WNQwD5N9OCOig5PTUKoCFFXk3k7-QUThh1YDtzxoZ1nlX7Zv487qoeizVKsAJT0x84JIzc_rJqgaUqON6S0khnRquvd1YL-z5PnM/s400/5.png" width="400" /></span></a><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br />Los datos que debemos ingresar en la pantalla que aparece luego de haber hecho clic en agregar son:</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB12Qcf7SJ3nE_G0vF4azTtZrcd-UZql8c2fvisFeCUY6doTjDqrlEVV01hqlUtTJIa7N3XmwH6xgh4jxfqPMU7EnCCb20nIeoWHkmVBMj8bb0BSWPhIEISX2jbwFjXA6o-AzUipenQnVQ/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB12Qcf7SJ3nE_G0vF4azTtZrcd-UZql8c2fvisFeCUY6doTjDqrlEVV01hqlUtTJIa7N3XmwH6xgh4jxfqPMU7EnCCb20nIeoWHkmVBMj8bb0BSWPhIEISX2jbwFjXA6o-AzUipenQnVQ/s400/6.png" width="400" /></span></a><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Nombre</strong>: Un nombre amigable, por ejemplo "Sistema Gestión Pagos"</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Dominio (Realm)</strong>: La URI para el cual es válido el token de seguridad que emite ACS, en nuestro caso <strong>net.tcp://localhost/MiServicioWCF.svc</strong>. Debemos tener presente que esta dirección va a depender de la dirección en donde este publicado el servicio, así que cuando tengamos el wcf publicado deberemos volver para cambiar este dato por el de producción.</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Dirección URL de retorno: </strong><span style="color: #353535;">es la dirección URL a la que ACS devuelve el token de seguridad, en nuestro caso la dejamos vacía.</span><strong><br /> </strong></span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Dirección URL del error (opcional): </strong><span style="color: #353535;">es la dirección URL a la que ACS redirige a los usuarios si se produce un error durante el proceso de inicio de sesión, en nuestro caso la dejamos vacía.</span><strong><br /> </strong></span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Formato de tokens: </strong>formato del token emitido por ACS, en nuestro caso seleccionamos "SAML 2.0"</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Directiva de cifrado de tokens: </strong>En nuestro caso se debe seleccionar "Requerir cifrado"</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Vigencia de tokens (seg.): </strong>Dejamos la vigencia por defecto (600 seg)</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Proveedor de identidad: </strong>Debemos desmarcar todos los proveedores de identidad (más adelante vamos a configurar el proveedor de utilidad que utilizaremos)</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Grupo de reglas: </strong>Debemos dejar marcado "Crear nuevo grupo de reglas"</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Firma de tokens: </strong>Debemos dejar marcado "Use un certificado de espacio de nombres de servicio (estándar) "</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><strong>Cifrado de tokens: </strong>Debemos cargar un certificado para el cifrado de tokens. </span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /> </span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3czD5oqPtrj1JqLSZ-7ubigynybKyEHRVmRQHFwAkOs-VhQ67cA-z1KEKqJDUFCMkWBnRkD-Uc4y83o20qonocqegghCbDkIoWUQYnmLbPJiVjlV5r9brXsvT3epwyCBiehgx1ibuoQ1q/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: Times, Times New Roman, serif;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3czD5oqPtrj1JqLSZ-7ubigynybKyEHRVmRQHFwAkOs-VhQ67cA-z1KEKqJDUFCMkWBnRkD-Uc4y83o20qonocqegghCbDkIoWUQYnmLbPJiVjlV5r9brXsvT3epwyCBiehgx1ibuoQ1q/s400/7.png" width="400" /></span></a><br />
<div style="text-align: center;">
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span>
<br />
<div style="text-align: left;">
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><b style="font-size: x-large;">Acerca de los certificados</b></span></div>
</div>
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span>
<span style="font-family: Times, Times New Roman, serif;" xmlns="">En teoría se deberían tener 3 certificados con sus claves públicas/privadas como se detalla en el siguiente ejemplo <a href="http://msdn.microsoft.com/en-us/library/windowsazure/hh289316.aspx">http://msdn.microsoft.com/en-us/library/windowsazure/hh289316.aspx</a> en la sección "<b>What You Should Know</b>". A efectos de practicidad, se utilizará para todos los casos el mismo certificado generado en entorno de desarrollo y que será adjuntado a este documento.</span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span>
<span style="font-family: Times, Times New Roman, serif; font-size: large;" xmlns=""><b>Continuará...</b></span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns=""><br /></span>
<span style="font-family: Times, Times New Roman, serif;" xmlns=""></span><br />
<span style="font-family: Times, Times New Roman, serif;" xmlns="">En la tercera parte de esta serie, les mostrare como configurar el servicio y su cliente... hasta la próxima!</span>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-20953747610935560102013-12-11T13:30:00.001-02:002013-12-11T16:18:23.664-02:00Resolviendo el rompecabezas: WCF TCP Federation con WIF y Windows Azure ACS - PARTE 1<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Para empezar, quiero disculparme por lo pomposo del titulo de este post, pero en realidad es el mas acertado para lo que les voy a mostrar a continuación.</span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La idea es plantearles un problema al cual nos
enfrentamos recientemente y la solución al mismo, cuando tuvimos la necesidad
de asegurar un sistema de cobros que desarrollamos.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Por ser un sistema que manejaba dinero, el intercambio de información
con dicho sistema debía realizarse de manera confiable y segura.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Para implementar dicho sistema y de común acuerdo con
nuestro cliente, elegimos la plataforma de servicios Windows Azure, dadas todas
las facilidades que provee, aprovechando además que el cliente ya posee otros
sistemas implementados sobre la misma y está sumamente conforme.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La solución a entregar constaba de un sitio web en el cual
los usuarios de dicho sitio se autenticaran y pudieran ingresar pagos a
realizarse por clientes de la empresa.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Por detrás, ese sitio, debía comunicarse con un servicio que
le proveería de todas las operaciones que el sitio necesitara. Además, el servicio debía estar disponible para que otros
subsistemas pudieran obtener información del mismo.</span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La tecnología que elegimos para desarrollar el backend de
dicho sistema, fue WCF utilizando como enlace al mismo
NetTcpBinding, por su versatilidad y perfomance. </span><span style="font-family: Verdana, sans-serif;">Dado el escenario que teníamos planteado y la tecnología con
la que íbamos a desarrollar, solo nos restaba decidir como íbamos a asegurar
este sistema, siendo más especifico y en el caso particular que les quiero
plantear en este post, lo que nos quedaba por resolver era </span><b style="font-family: Verdana, sans-serif;">¿Cómo asegurar las
comunicaciones con el servicio WCF?</b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Para contestar dicha pregunta, estuvimos evaluando las
diferentes alternativas para resolver la necesidad planteada en el contexto que
les expuse anteriormente.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">(Todos sabemos que no existe la "solución
perfecta", sino la solución funcional sobre un escenario determinado).<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">En fin, llegamos a la conclusión de que en este caso utilizaríamos
un servicio que ya provee Windows Azure: Access Control Services.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Pero...<b><span style="font-size: large;"> </span>¿Qué es y para qué sirve Windows Azure Control
Services?</b><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Verdana, sans-serif;"><a href="http://punto-informatico.it/Sponsor/Snap5_7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://punto-informatico.it/Sponsor/Snap5_7.jpg" /></a></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">El servicio de Access Control (<b>ACS</b> para los amigos) pone a
disposición de los desarrolladores un sistema de identidad y control de acceso
a las aplicaciones y servicios. Está integrado con los proveedores de identidad
estándares, tanto a nivel enterprise (directorio activo), así como web (Yahoo,
Live Id, Google, facebook)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">En pocas palabras… permite sacar de la aplicación las
decisiones de autorización y basarlas en reglas declarativas. ACS actuará como
una capa de abstracción para lidiar con los diferentes Identity Providers y
ofrecer a la aplicación un único <b>formato de intercambio de tokens</b>. Además nos permite establecer la <b>relaciones de confianza</b> entre nuestro servicio y el ACS así como el <b>protocolo</b> utilizado para la <o:p></o:p>comunicación</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Para los que hace años que desarrollamos en ambientes que
requieren altos niveles de seguridad, sabemos que este un tema duro, sobre todo
cuando nos enfrentamos a los expertos de seguridad de IT por éstos menesteres. :)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Ni hablar de siglas como ADFS, WS-Trust y federación.. Es un
lenguaje IT que difícilmente se escuche fuera de los círculos de expertos en el
área de seguridad.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Entonces y resumiendo un poco:<b> la buena noticia</b> es que si
bien ACS hace uso de todas estas especificaciones, APIs, herramientas, etc. no
es necesario que los desarrolladores nos volvamos expertos en seguridad para
entender y utilizar el Access Control Service. </span><span style="font-family: Verdana, sans-serif;">No hay que aprender ninguna de las tecnologías antes mencionadas, para el 80% de
escenarios de uso de Access Control Service no será necesario empaparnos de estas
especificaciones/herramientas/SDKs, simplemente consumiremos una serie de
servicios. </span><span style="font-family: Verdana, sans-serif;">Si querés saber más de ACS, éste es un buen lugar para
empezar: </span><a href="http://msdn.microsoft.com/library/windowsazure/hh147631.aspx" style="font-family: Verdana, sans-serif;">http://msdn.microsoft.com/library/windowsazure/hh147631.aspx</a><span style="font-family: Verdana, sans-serif;">.</span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-align: center;">
<o:p><span style="font-family: Verdana, sans-serif;"> </span></o:p><a href="http://www.windowsazure.com/media/devcenter/dotnet/acs-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://www.windowsazure.com/media/devcenter/dotnet/acs-01.png" /></a></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><b>Volviendo a lo nuestro</b><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Entonces, ya tenemos todo pronto para empezar a trabajar, ACS provee unos escenarios de ejemplo que están muy buenos!
<a href="http://msdn.microsoft.com/en-US/library/windowsazure/gg185939.aspx">http://msdn.microsoft.com/en-US/library/windowsazure/gg185939.aspx</a></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Inclusive, tiene un escenario que nos viene bárbaro en el
contexto de la solución que vamos a implementar:
<a href="http://msdn.microsoft.com/en-us/library/gg185912.aspx">http://msdn.microsoft.com/en-us/library/gg185912.aspx</a><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">Dentro de las posibilidades que nos provee ACS para asegurar
las comunicaciones, nosotros elegimos certificados x.509.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;"><b>¿Tenemos todo listo entonces? NO</b><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">La realidad es que, como suele suceder, los ejemplos para
este tipo de soluciones, <u>no aplican 100% al escenario que estamos teniendo</u>.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">En nuestro caso, la dificultad es que estamos usando WCF con
un binding NetTcpBinding y certificados x.509 para comunicaciones seguras, sin mencionar el manejo de los token emitidos por el STS de ACS... un gran lío para lo cual no
hay una solución de ejemplo.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="font-family: Verdana, sans-serif;">CONTINUARÁ...</b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: Verdana, sans-serif;">En la próxima parte de este post te voy a contar como
hicimos para solucionar este problema. </span><span style="font-family: Verdana, sans-serif;">Mientras tanto y para que te vayas divirtiendo, te dejo unos
links para que leas...</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="font-family: Verdana, sans-serif;"><b>Windows
Identity Foundation</b>: <a href="http://msdn.microsoft.com/en-us/library/hh377151.aspx">http://msdn.microsoft.com/en-us/library/hh377151.aspx</a><o:p></o:p></span></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="font-family: Verdana, sans-serif;"><b>ACS
Security Guidance</b>:
<a href="http://www.windowsazure.com/en-us/develop/net/best-practices/security/?fb=es-es">http://www.windowsazure.com/en-us/develop/net/best-practices/security/?fb=es-es</a><o:p></o:p></span></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="font-family: Verdana, sans-serif;"><b>ADFS 2.0</b>:
<a href="http://msdn.microsoft.com/en-us/library/ee895355.aspx">http://msdn.microsoft.com/en-us/library/ee895355.aspx</a></span><o:p></o:p></span></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-31472649058208310232013-12-11T08:49:00.000-02:002013-12-11T08:49:25.492-02:00Nuestra participacion en el .NET Meetup 4<div style="text-align: center;">
El día de 5 de Noviembre, tuvimos el gusto de participar como oradores en la .NET Meetup 4.
Compartimos dicha tarea nada mas ni nada menos que con los organizadores de las .NET Meetups: Fabián Fernandez & Bruno Bologna.
Además tuvimos la distinguida participación del DPE de Microsoft, Ariel Schapiro, quien nos contó de primera mano todas las novedades de la plataforma.
Agradecemos a todos los asistentes y una vez mas a los organizadores por confiar en nosotros. Les dejamos algunas fotos del evento...</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<img alt="" class="aligncenter" height="270" src="https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc3/1454874_668966933136430_1847989437_n.jpg" width="480" />
</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<img alt="" class="aligncenter" height="270" src="https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-frc3/1463169_668967273136396_269070909_n.jpg" width="480" />
</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<img alt="" class="aligncenter" height="270" src="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/1450869_668967073136416_508191628_n.jpg" width="480" />
</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<img alt="" class="aligncenter" height="270" src="https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-ash3/1462887_668967323136391_1598669115_n.jpg" width="480" />
</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="270" src="//www.youtube.com/embed/kHek6_n2UHg" width="480"></iframe><br /></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-22189342639508541122013-08-17T00:37:00.000-03:002013-08-17T00:46:49.413-03:00Conectarnos con diferentes credenciales a Team Foundation Services<div class="separator" style="clear: both; text-align: center;">
<a href="http://blog.jersson.net/wp-content/uploads/2012/08/image10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="http://blog.jersson.net/wp-content/uploads/2012/08/image10.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
En los últimos tiempos, hemos tenido a varios clientes de nuestra empresa utilizando <a href="http://tfs.visualstudio.com/" target="_blank">Team Foundation Service</a> ( a propósito, les mencioné que hay un plan de este servicio <a href="http://tfs.visualstudio.com/en-us/pricing/tfs-information" target="_blank">GRATIS</a>?)<br />
<br />
La cuestión es que si nos conectamos a diferentes TFS's utilizando diferentes cuentas Live Id's puede llegar a suceder que aparezca un mensaje bastante molesto : "Access Denied" “TF31003: Either you have not entered the necessary credentials or your user account does not have permission…"<br />
<br />
Una opción que nos sugirió nuestro colega y amigo de la casa Gaston Touron, es borrar el historial de exploración (pueden encontrar mas información en <a href="http://social.msdn.microsoft.com/Forums/vstudio/en-US/4c887b08-60fe-40fb-8e25-81ab4c267003/cant-connect-to-tfspreview-in-vs11-but-can-via-ie">http://social.msdn.microsoft.com/Forums/vstudio/en-US/4c887b08-60fe-40fb-8e25-81ab4c267003/cant-connect-to-tfspreview-in-vs11-but-can-via-ie</a>)<br />
<br />
El problema con esta solución es justamente que debemos borrar el historial cada vez que queremos cambiar de TFS con el que deseamos conectarnos :(<br />
<br />
La solución que les propongo no es trivial, pero funciona y no hay que borrar el historial de exploración :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLlWCLoOkmH-rruoeEhI6YRfHe9oB9uLS6xi2igPbs5sID3VaJ643AXU9XDPNLTS4-ieHwJacYjK1MQp9XFsVpOf4lnCCtOQqtpE-0gl7i4kAa4D8rw1f_0mrX7ZkrauCXzSMaJPlLHR8/s1600/TFS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLlWCLoOkmH-rruoeEhI6YRfHe9oB9uLS6xi2igPbs5sID3VaJ643AXU9XDPNLTS4-ieHwJacYjK1MQp9XFsVpOf4lnCCtOQqtpE-0gl7i4kAa4D8rw1f_0mrX7ZkrauCXzSMaJPlLHR8/s320/TFS.png" width="320" /></a></div>
<br />
<br />
1) En esta primera imagen, vemos que hay un link que nos deja cerrar la sesión en la parte inferior izquierda de la imagen. La cosa es que si hacemos un click en el enlace... por esos misterios insondables del universo, vuelve a conectarse automáticamente con las mismas credenciales...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeGpK_ZO80fFr5UXAA0KF6VMgqVwraGAX8katX6iksFE17B0GPV-Q_6t2g4I4pdEUuxZLzVmu0pn6zhtA-GXWEEgjYzBap66LUhfnH4v-ReFWakSrUhyphenhyphen1KL9GScMtXX1TRt5Hae60CMYIb/s1600/TFS2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeGpK_ZO80fFr5UXAA0KF6VMgqVwraGAX8katX6iksFE17B0GPV-Q_6t2g4I4pdEUuxZLzVmu0pn6zhtA-GXWEEgjYzBap66LUhfnH4v-ReFWakSrUhyphenhyphen1KL9GScMtXX1TRt5Hae60CMYIb/s320/TFS2.png" width="320" /></a></div>
<br />
<br />
2) ¿Que debemos hacer entonces? Bien, lo primero que debemos hacer es abrir el explorador que viene integrado en el Visual Studio y digitar www.outlook.com. A continuación, debemos cerrar la sesión que tenemos abierta (tal y como se muestra en la imagen a continuación) <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWJLOqgxZpGBsKtGwBtnVsxC3fGA_xi6lkvZZaKb2ae0DRNTjte69HgPWsXJdnEB9msxTrewu79r_2Ck6BEa5MMlluzHJNVJNEgh2MCMdS1ALbkzUJJRQOZ2vXAd01Ez4LcHBky-g7FQod/s1600/TFS3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWJLOqgxZpGBsKtGwBtnVsxC3fGA_xi6lkvZZaKb2ae0DRNTjte69HgPWsXJdnEB9msxTrewu79r_2Ck6BEa5MMlluzHJNVJNEgh2MCMdS1ALbkzUJJRQOZ2vXAd01Ez4LcHBky-g7FQod/s320/TFS3.png" width="320" /></a></div>
<br />
<br />
3) Acto seguido, debemos volver a iniciar sesión, esta vez con las credenciales correctas para el TFS con el que deseamos conectarnos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgngZCcI0HY173coyze6NeRn_nOMclbV09FzEqTy2e5NKCl4ncL03Xk709HA8vE2-rdLJBZODQHRP2h8Q_orCEffLBtletRS8LBvrqmSjs7yCkEA-9G8ndiMT69zoEn2OaDr4UQpToLnxUa/s1600/TFS4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgngZCcI0HY173coyze6NeRn_nOMclbV09FzEqTy2e5NKCl4ncL03Xk709HA8vE2-rdLJBZODQHRP2h8Q_orCEffLBtletRS8LBvrqmSjs7yCkEA-9G8ndiMT69zoEn2OaDr4UQpToLnxUa/s320/TFS4.png" width="320" /></a></div>
<br />
<br />
4) Finalmente, y por esa lógica medio macabra de todo esto, debemos abrir el team explorer y hacer click en "Log out". Como mencioné anteriormente (y en esto si es coherente), lo único que hará esta ultima acción es loguearse automáticamente, pero esta vez lo hará con las credenciales correctas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsR7pq7B2BEHq0-GXRfw_ZXs8xGcZmbpNVsXk8YatTGo_avIGglC_wgFjdWnyhDcImh6NGnE0ctC6bOFKwUZ67-aaZSAelJUqNIl7mqgSk2vQsRniy1AV1urfm7LNikLq0TPe6ailwj1Ql/s1600/TFS5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsR7pq7B2BEHq0-GXRfw_ZXs8xGcZmbpNVsXk8YatTGo_avIGglC_wgFjdWnyhDcImh6NGnE0ctC6bOFKwUZ67-aaZSAelJUqNIl7mqgSk2vQsRniy1AV1urfm7LNikLq0TPe6ailwj1Ql/s320/TFS5.png" width="320" /></a></div>
<br />
<br />
Espero les sea de utilidad, hasta la próxima!<br />
<br />Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-7448079418988378552013-07-16T14:57:00.001-03:002013-07-16T14:57:39.438-03:00Car Maintenance Tracker para Windows Phone 8.<span style="font-family: Verdana, sans-serif;">Estimados amigos, </span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">HOY, después de mucho esfuerzo y meses de trabajo, cumplimos una meta: tener una aplicación de marca propia que aprovecha todo el potencial de las tecnologías de punta de Microsoft.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjTEb9IWE4jDMXCN7_ytObWJ6E3xq7KZsu-GkyGF9KcmlXOvH2BGWx2Ts4RSP9h0EnpdlDhoUP4_CTqRTifkVUD0Giu7FNGCi_xDGmHXqBALQnwFZGTXdSeGXJYInCqr8aWJvBSKGzKzKH/s1600/Azure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjTEb9IWE4jDMXCN7_ytObWJ6E3xq7KZsu-GkyGF9KcmlXOvH2BGWx2Ts4RSP9h0EnpdlDhoUP4_CTqRTifkVUD0Giu7FNGCi_xDGmHXqBALQnwFZGTXdSeGXJYInCqr8aWJvBSKGzKzKH/s320/Azure.png" width="320" /></a></div>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><a href="http://apps.microsoft.com/windows/es-uy/app/lya-car-maintenance-tracker-2-0/eba07d96-9ca2-48d5-80d6-59cc3035240a" target="_blank">CMT para Windows 8</a>, CMT Backend utilizando <a href="http://www.windowsazure.com/en-us/" target="_blank">Windows Azure + SQL Azure</a> y nuestro benjamín pero no menos potente <a href="http://www.windowsphone.com/es-es/store/app/cmt/306fbe64-3329-4c90-a76f-49eb3da6ce38" target="_blank">CMT para Windows Phone 8</a>.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkkizuvbcYyYGwhacz3fsKuMADVmNf0Z2drzjeWHUcL9rN7UsizqUpG-tNG5GFi_J9xqDcxWoLwPXo1APn4xo_p9rVXhlKXX4LlBno_gXBzu9D4V9A6ycH7DqNgsX3wG16k-1WZ2Jfs6GP/s1600/main.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkkizuvbcYyYGwhacz3fsKuMADVmNf0Z2drzjeWHUcL9rN7UsizqUpG-tNG5GFi_J9xqDcxWoLwPXo1APn4xo_p9rVXhlKXX4LlBno_gXBzu9D4V9A6ycH7DqNgsX3wG16k-1WZ2Jfs6GP/s320/main.png" width="320" /></a></div>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Realmente, estamos muy felices por haber cumplido nuestro objetivo y esto nos alienta a seguir afrontando nuevos desafíos, con las ganas, calidad, garra y corazón que le ponemos a todos nuestros proyectos. </span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Si todavía no conocés CMT para Windows Phone, podés bajartelo desde <a href="http://www.windowsphone.com/es-es/store/app/cmt/306fbe64-3329-4c90-a76f-49eb3da6ce38" target="_blank">aquí</a> (un mes de prueba) </span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjry62pSS5HYrjQpz0O35EgbMUq04Bg9gMrzWxqJyT3V3JSqXv8azqG1ZIaq0a9NHHwaRgBfL3FHU_hSmehV80-WEkvfoPAhAWmC4khPJDY5mVBr6JUviOtaCibmbtnqruYEW6okYBA1YDm/s1600/wp_ss_20130706_0010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjry62pSS5HYrjQpz0O35EgbMUq04Bg9gMrzWxqJyT3V3JSqXv8azqG1ZIaq0a9NHHwaRgBfL3FHU_hSmehV80-WEkvfoPAhAWmC4khPJDY5mVBr6JUviOtaCibmbtnqruYEW6okYBA1YDm/s320/wp_ss_20130706_0010.png" width="192" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWxZwCdz2Mh_06JK6kCBF8BvGerYowUVhx-FSvCRWsPgxBIQAutPgw1njXIYgLBRQWZRZkgI1nn1qWh05hhhi2W4JEaP6B9XwtdsGtJJCSLNCLWHB2qG0KaNaKIcE8APynDsFxO-TcKr-/s1600/wp_ss_20130706_0013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWxZwCdz2Mh_06JK6kCBF8BvGerYowUVhx-FSvCRWsPgxBIQAutPgw1njXIYgLBRQWZRZkgI1nn1qWh05hhhi2W4JEaP6B9XwtdsGtJJCSLNCLWHB2qG0KaNaKIcE8APynDsFxO-TcKr-/s320/wp_ss_20130706_0013.png" width="192" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Saludos y hasta la próxima!</div>
<span style="font-family: Verdana, sans-serif;"><br /></span>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-15913588038607857982013-06-18T23:26:00.000-03:002013-06-18T23:26:58.565-03:00Top 5 de herramientas GRATUITAS para desarrollo en Windows Phone 8<span style="font-family: Verdana, sans-serif;">Estimados,</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQ0N5-CW-ZHEiJBRWkqgzIQl3SArL4J85YQS10HZpD0aihZOJKr9w" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQ0N5-CW-ZHEiJBRWkqgzIQl3SArL4J85YQS10HZpD0aihZOJKr9w" /></span></a></div>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Como el nombre del post indica, quiero compartir con ustedes un top 5 de herramientas GRATUITAS para desarrollo en Windows Phone 8.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><b>The Windows Phone Toolkit</b></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><a href="http://phone.codeplex.com/">http://phone.codeplex.com/</a></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><b>Coding 4 Fun Toolkit</b> </span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><a href="http://coding4fun.codeplex.com/">http://coding4fun.codeplex.com/</a></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><b>MVVM Light Toolkit</b></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><a href="http://mvvmlight.codeplex.com/">http://mvvmlight.codeplex.com/</a></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><b>Windows Phone Power Tools</b></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><a href="http://wptools.codeplex.com/">http://wptools.codeplex.com/</a></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><br /></span></div>
<div style="text-align: center;">
<span style="font-family: Verdana, sans-serif;"><b>Sqlite in Windows Phone</b>: <a href="http://www.developer.nokia.com/Community/Wiki/How_to_use_SQLite_in_Windows_Phone">http://www.developer.nokia.com/Community/Wiki/How_to_use_SQLite_in_Windows_Phone</a></span></div>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Si tienen alguna que no se encuentra en esta lista, se aceptan sugerencias!</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Saludos y hasta la próxima!</span>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-58176361323383329962013-06-05T18:11:00.000-03:002013-06-05T18:27:07.931-03:00Windows Appceleration Program: Cierre.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-09-metablogapi/4762.clip_5F00_image002_5F00_thumb_5F00_244DFBF1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-09-metablogapi/4762.clip_5F00_image002_5F00_thumb_5F00_244DFBF1.jpg" /></a></div>
<div style="margin: 0cm 0cm 0pt; text-align: justify;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;">E</span><span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;">s
grande la alegría pero como en toda graduación la despedida de compañeros,
profesores, y técnicos dejan ese sabor agridulce. Fueron semanas de trabajo
intenso junto a los tutores, reuniones capacitación, discusión de ideas. Pero
el resultado en lo que <span style="mso-spacerun: yes;"> </span>a adquisición de
conocimientos se refiere, es invaluable.<o:p></o:p></span></div>
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8idDZWF4LM1aR9PjmPxTjek64NAOE7GwumKYuLR_davRmQdXJ4GUWcO70tqNHNpsjsujjPGXOt74q5QUb3d41jGKNuQF25kAIbgfNnTNesIbGo2OhreOSLfWDO_8WpgPrczoXMCpjgLlY/s1600/2013-06-05+14.10.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8idDZWF4LM1aR9PjmPxTjek64NAOE7GwumKYuLR_davRmQdXJ4GUWcO70tqNHNpsjsujjPGXOt74q5QUb3d41jGKNuQF25kAIbgfNnTNesIbGo2OhreOSLfWDO_8WpgPrczoXMCpjgLlY/s400/2013-06-05+14.10.40.jpg" width="400" /></a></div>
<br />
<br />
<div style="text-align: justify;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;">Este
programa nos permitió a los participantes compartir experiencias e ideas, ejercicio
que en general en Uruguay <span style="mso-spacerun: yes;"> </span>es poco practicado.
Compartir ideas y proyectos no hacen más que abrir las mentes, preparando a
empresas pequeñas como la nuestra a un potencial mercado global.</span></div>
<div style="text-align: justify;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghLNTR_WzDFddN5wNA-CCIJj0XH4MTWMLZZS15TIdVZJqx6vrsl0iXYqErHJBuwLm_8XuonYUk7Y83Az5MMtvfNX9afsN9H90ZcBzhO49Ph3nXlQxjoMGPwP6m9cseZDBLeggszsSDDce9/s1600/WP_20130605_005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></span><br /></div>
<div style="text-align: justify;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p></o:p></span><br /></div>
<div style="text-align: justify;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;">No
queda más que agradecer a nuestras empresas colegas, tutores y personal de
Microsoft, que aportaron este empujón para el crecimiento en especial a <strong>Leandro
Ordoñez</strong> (nuestro tutor), <strong>Magdalena Hourcade,<span style="mso-spacerun: yes;">
</span>Miguel Sáez y Ariel Schapiro</strong>.</span></div>
<div style="margin: 0cm 0cm 0pt;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"></span> </div>
<div style="margin: 0cm 0cm 0pt; text-align: center;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwD1G45R-WNJzBRY06Xs4Xj5A5gG0WslTM3clzHUd6v2ueNiIycTC2Jrch79NTc0WRcTxgdw3eqUA9Veo5IVJUH18PxWY4a3oTpd-CVLcKfA-UOTbOjR_BU_7vBi_B8R6u62mLDkEN_UHD/s1600/WP_20130605_009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwD1G45R-WNJzBRY06Xs4Xj5A5gG0WslTM3clzHUd6v2ueNiIycTC2Jrch79NTc0WRcTxgdw3eqUA9Veo5IVJUH18PxWY4a3oTpd-CVLcKfA-UOTbOjR_BU_7vBi_B8R6u62mLDkEN_UHD/s320/WP_20130605_009.jpg" width="320" /></a></o:p></span></div>
<div style="margin: 0cm 0cm 0pt; text-align: center;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p></o:p></span> </div>
<div style="margin: 0cm 0cm 0pt; text-align: center;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE9JpI5fUid9iYPnb748EUsA0BHTpmSxrmioePJhN40Dj1DiGZYBw6g1vh7Q8MCGbU0_engMZDy0U4bte9_yL9URoT_E8Y5BTuhV0qoT0Gtb44b_eos-kvHx7GMs4DOg3D3M8KylFBcaUK/s1600/WP_20130605_006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE9JpI5fUid9iYPnb748EUsA0BHTpmSxrmioePJhN40Dj1DiGZYBw6g1vh7Q8MCGbU0_engMZDy0U4bte9_yL9URoT_E8Y5BTuhV0qoT0Gtb44b_eos-kvHx7GMs4DOg3D3M8KylFBcaUK/s320/WP_20130605_006.jpg" width="320" /></a></o:p></span></div>
<div style="margin: 0cm 0cm 0pt; text-align: center;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p></o:p></span> </div>
<div style="margin: 0cm 0cm 0pt; text-align: center;">
<span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><o:p><span lang="ES-MX" style="color: black; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ansi-language: ES-MX;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghLNTR_WzDFddN5wNA-CCIJj0XH4MTWMLZZS15TIdVZJqx6vrsl0iXYqErHJBuwLm_8XuonYUk7Y83Az5MMtvfNX9afsN9H90ZcBzhO49Ph3nXlQxjoMGPwP6m9cseZDBLeggszsSDDce9/s1600/WP_20130605_005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghLNTR_WzDFddN5wNA-CCIJj0XH4MTWMLZZS15TIdVZJqx6vrsl0iXYqErHJBuwLm_8XuonYUk7Y83Az5MMtvfNX9afsN9H90ZcBzhO49Ph3nXlQxjoMGPwP6m9cseZDBLeggszsSDDce9/s320/WP_20130605_005.jpg" width="320" /></a></span></o:p></span></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-71066629921779121192013-04-21T23:12:00.000-03:002013-04-21T23:17:49.859-03:00L&A SISTEMAS, participando del Windows Appceleration Program<div class="separator" style="clear: both; text-align: left;">
<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-09-metablogapi/4857.clip_5F00_image002_5F00_5F81D7BC.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-09-metablogapi/4857.clip_5F00_image002_5F00_5F81D7BC.jpg" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="MsoNormal" style="margin: 0cm 0cm 8pt; text-align: justify;">
<span style="font-family: Calibri;"></span> <span style="font-family: Calibri;">Como ustedes saben, <a href="http://www.lyasistemas.com/" target="_blank">L&A SISTEMAS</a> fue seleccionada por Microsoft
entre más de 50 proyectos de empresas que se postularon para el Windows
Appceleration Program. El Windows Appceleration Program está dirigido a una
cantidad reducida de proyectos que fueron seleccionados entre las empresas de Argentina
y Uruguay que se postularon. Las mismas, presenciaron la apertura oficial dónde oradores de primera como
<a href="http://ar.linkedin.com/in/masaez" target="_blank">Miguel Angel Saez</a> y <a href="http://ar.linkedin.com/in/arielschapiro" target="_blank">Ariel Schapiro</a> expusieron las oportunidades del mercado
para todos los presentes. <a href="http://apps.microsoft.com/windows/es-mx/app/lya-car-maintenance-tracker/418ad748-2a50-4f74-b571-febc04d56e67" target="_blank">CMT</a>, la aplicación para llevar mantenimientos de vehículos
de <a href="http://www.lyasistemas.com/" target="_blank">L&A</a>, fue elegida para participar a partir del 10 de abril de la
experiencia de aceleración en plataformas Windows 8 y/o la plataforma móvil de
más rápido crecimiento de América Látina, Windows Phone, junto con Microsoft.
Para <a href="http://www.lyasistemas.com/" target="_blank">L&A</a>, el objetivo de formar parte del programa está en llevar adelante
la adaptación del producto para sincronizar los datos entre diferentes
dispositivos que utilicen la aplicación. L&A será acompañada de manera
personal en el ciclo de vida completo de una aplicación con los recursos
profesionales, capacitación y herramientas, con un enfoque de colaboración a
largo plazo para trabajar en garantizar los mejores resultados de calidad, los
cuales serán avalados mediante el logo de participación en el programa y
mediante la difusión en los sitios de Microsoft. Windows 8 y Windows Phone
juntos permiten llegar a un amplio espectro de dispositivos, no solo cubriendo
Smartphones, sino también PCs de escritorio, laptops y tabletas, facilitando
una mayor cantidad de descargas. Para lograr dicho resultado, L&A deberá
analizar y cumplir con las generalidades y requisitos del programa. Entre
ellas, contar con un proyecto para llevar a cabo durante el programa, destinar
las horas necesarias para participar de los entrenamientos y el desarrollo del
proyecto y pasar por las instancias de certificación y publicación de la
aplicación. “<strong>Agradecemos a Microsoft por habernos seleccionado y que nos haya elegido nuevamente por presentar un proyecto innovador</strong>”,
dijo <a href="http://uy.linkedin.com/pub/leonardo-borzillo/17/65/125" target="_blank"><strong>Leonardo Borzillo</strong></a>, socio fundador de L&A SISTEMAS. Y agregó: “<strong>Nuestro
objetivo a cumplir, es sincronizar la información entre dispositivos que
utilicen nuestra aplicación </strong><a href="http://apps.microsoft.com/windows/es-mx/app/lya-car-maintenance-tracker/418ad748-2a50-4f74-b571-febc04d56e67" target="_blank"><strong>Car Maintenance Tracker</strong></a>” en el lanzamiento del
programa.<o:p></o:p></span></div>
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
<o:p><span style="font-family: Calibri;"> </span></o:p><span style="font-family: Calibri;">Más información del programa en </span><a href="http://msdn.microsoft.com/es-ar/xx187195"><span style="color: #0563c1; font-family: Calibri;">http://msdn.microsoft.com/es-ar/xx187195</span></a><o:p></o:p></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-55672140864195672682013-04-09T01:32:00.002-03:002013-04-09T01:32:53.105-03:00Error en CurrentApp.LoadListingInformationAsync() HRESULT: 0x801900CC<span style="font-family: Times, "Times New Roman", serif;">Amigos,</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Como mucho de ustedes ya sabrán, en los últimos días hemos estado bastante ocupados tratando de certificar una aplicación que tenemos pronta hace ya un tiempo, sin éxito.</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Luego de un ida y vuelta con los técnicos que certifican las aplicaciones del Windows Store, pudimos obtener el error que nos estaba impidiendo certificar nuestra aplicación. </span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">El error surge cuando un intenta llamar a la función <strong>CurrentApp.LoadListingInformationAsync()</strong> <u>sin estar conectado a Internet</u>.</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Es necesario controlar las excepciones de red lanzadas por CurrentApp.LoadListingInformationAsync, así la aplicación no se bloqueará cuando pase por el proceso de certificación y para que no se bloquee cuando un usuario intenta ejecutarla sin conectividad con el Store.</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Si por algún motivo, no se obtener la información devuelta por la función anteriormente mencionada, nuestra aplicación aún debería poder funcionar en modo de prueba (trial), desactivando todas las opciones de compra dentro de la aplicación, ya que las mismas obviamente no se pueden completar sin estar conectados. </span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Los detalles de dicha implementación dependerán de su aplicación y de como tiene implementadas las compras en la misma.</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Si caducó el periodo de prueba, la aplicación no se inicia, por lo que no es necesario pensar la lógica para ese caso en particular</span><br />
<span style="font-family: Times, "Times New Roman", serif;"></span><br />
<span style="font-family: Times, "Times New Roman", serif;">Finalmente quiero comentarles que el ejemplo que uno se baja de Microsoft - </span><a href="http://code.msdn.microsoft.com/windowsapps/Licensing-API-Sample-19712f1a" target="_blank"><span style="font-family: Times, "Times New Roman", serif;">Trial app and in-app purchase sample</span></a><span style="font-family: Times, "Times New Roman", serif;"> - carece de estos chequeos que mencionaba anteriormente</span><br />
<span style="font-family: Times, "Times New Roman", serif;">por lo que he decidido compartir con ustedes un código un poco mas completo (por lo menos en lo que tiene que ver con aplicaciones de prueba) </span><br />
<br />
<div style="background: white; color: black; font-family: Consolas; font-size: 10pt;">
<div style="margin: 0px;">
<span style="color: teal;"> 935</span> <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">async</span> <span style="color: #2b91af;">Task<</span><span style="color: blue;">bool></span> ChequearEstadoDeLaLicencia()</div>
<div style="margin: 0px;">
<span style="color: teal;"> 936</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 937</span> <span style="color: blue;">if</span> (<span style="color: #2b91af;">CurrentApp</span>.LicenseInformation == <span style="color: blue;">null</span>)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 938</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 939</span> <span style="color: blue;">return</span> <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 940</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 941</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 942</span> <span style="color: blue;">var</span> hayInternet = HayConexionInternet();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 943</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 944</span> <span style="color: blue;">if</span> (<span style="color: #2b91af;">CurrentApp</span>.LicenseInformation.IsActive)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 945</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 946</span> <span style="color: blue;">try</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 947</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 948</span> <span style="color: blue;">if</span> (hayInternet)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 949</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 950</span> <span style="color: blue;">var</span> listing = <span style="color: blue;">await</span> <span style="color: #2b91af;">CurrentApp</span>.LoadListingInformationAsync();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 951</span> <span style="color: #2b91af;">App</span>.LicenciaPrecio = listing.FormattedPrice;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 952</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 953</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 954</span> <span style="color: blue;">catch</span> (<span style="color: #2b91af;">Exception</span> ex)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 955</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 956</span> <span style="color: #2b91af;">MetroEventSource</span>.Log.Error(<span style="color: #a31515;">"MainPage.Xaml: Error en CurrentApp.LoadListingInformationAsync(). Detalle:"</span> + ex.Message);</div>
<div style="margin: 0px;">
<span style="color: teal;"> 957</span> hayInternet = <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 958</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 959</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 960</span> <span style="color: blue;">if</span> (<span style="color: #2b91af;">CurrentApp</span>.LicenseInformation.IsTrial)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 961</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 962</span> <span style="color: blue;">var</span> licenciaDiasRestantesDeTrial = (<span style="color: #2b91af;">CurrentApp</span>.LicenseInformation.ExpirationDate - DateTime.Now).Days;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 963</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 964</span> <span style="color: blue;">if</span> (licenciaDiasRestantesDeTrial <= 0)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 965</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 966</span> <span style="color: blue;">var</span> apretoComprar = <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 967</span> <span style="color: blue;">var</span> messageDialog = <span style="color: blue;">new</span> <span style="color: #2b91af;">MessageDialog</span>(<span style="color: #a31515;">"Your_trial_has_expired__Do_you_want_to_purchase_full_license"</span>);</div>
<div style="margin: 0px;">
<span style="color: teal;"> 968</span> <span style="color: blue;">if</span> (hayInternet)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 969</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 970</span> messageDialog.Commands.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">UICommand</span>(<span style="color: #a31515;">"Purchase"</span>, (command) =>; apretoComprar = <span style="color: blue;">true</span>)); </div>
<div style="margin: 0px;">
<span style="color: teal;"> 971</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 972</span> messageDialog.Commands.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">UICommand</span>(<span style="color: #a31515;">"Close"</span>, (command) =>; { }));</div>
<div style="margin: 0px;">
<span style="color: teal;"> 973</span> <span style="color: blue;">await</span> messageDialog.ShowAsync();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 974</span> <span style="color: blue;">if</span> (apretoComprar)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 975</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 976</span> <span style="color: blue;">await</span> ConvertirTrialToFull();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 977</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 978</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 979</span> <span style="color: blue;">return</span> <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 980</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 981</span> <span style="color: blue;">else</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 982</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 983</span> <span style="color: blue;">var</span> apretoComprar = <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 984</span> <span style="color: blue;">var</span> messageDialog =</div>
<div style="margin: 0px;">
<span style="color: teal;"> 985</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">MessageDialog</span>(</div>
<div style="margin: 0px;">
<span style="color: teal;"> 986</span> <span style="color: #a31515;">"Thank_you_for_evaluating_Our_App__Your_license_will_expire_in"</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 987</span> + licenciaDiasRestantesDeTrial + <span style="color: #a31515;">" days."</span> + <span style="color: #2b91af;">Environment</span>.NewLine</div>
<div style="margin: 0px;">
<span style="color: teal;"> 988</span> + <span style="color: #a31515;">"Do_you_want_to_purchase_full_license"</span>);</div>
<div style="margin: 0px;">
<span style="color: teal;"> 989</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 990</span> <span style="color: blue;">if</span> (hayInternet)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 991</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 992</span> messageDialog.Commands.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">UICommand</span>(<span style="color: #a31515;">"Purchase"</span>), (command) =>; { apretoComprar = <span style="color: blue;">true</span>; }));</div>
<div style="margin: 0px;">
<span style="color: teal;"> 993</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 994</span> messageDialog.Commands.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">UICommand</span>(<span style="color: #a31515;">"Continue_using_trial"</span>, (command) =>; { }));</div>
<div style="margin: 0px;">
<span style="color: teal;"> 995</span> <span style="color: blue;">await</span> messageDialog.ShowAsync();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 996</span> <span style="color: blue;">if</span> (apretoComprar)</div>
<div style="margin: 0px;">
<span style="color: teal;"> 997</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 998</span> <span style="color: blue;">await</span> ConvertirTrialToFull();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 999</span> <span style="color: blue;">return</span> <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1000</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1001</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1002</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 1003</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1004</span> <span style="color: blue;">else</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 1005</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1006</span> <span style="color: green;">// Show the features that are available only with a full license.</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 1007</span> <span style="color: blue;">return</span> <span style="color: blue;">true</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1008</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1009</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1010</span> <span style="color: blue;">else</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 1011</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1012</span> <span style="color: green;">// A license is inactive only when there's an error.</span></div>
<div style="margin: 0px;">
<span style="color: teal;"> 1013</span> <span style="color: blue;">var</span> messageDialog = <span style="color: blue;">new</span> <span style="color: #2b91af;">MessageDialog</span>(<span style="color: #a31515;">"Could_not_find_any_valid_license_for_Our_App__The_application_will_be_closed"</span>);</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1014</span> messageDialog.Commands.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">UICommand</span>(<span style="color: #a31515;">"Ok"</span>, (command) => { }));</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1015</span> <span style="color: blue;">await</span> messageDialog.ShowAsync();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1016</span> <span style="color: blue;">return</span> <span style="color: blue;">false</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1017</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1018</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 1019</span> <span style="color: blue;">return</span> <span style="color: blue;">true</span>;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1020</span> }</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1021</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 1022</span> </div>
<div style="margin: 0px;">
<span style="color: teal;"> 1023</span> <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> HayConexionInternet()</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1024</span> {</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1025</span> <span style="color: #2b91af;">ConnectionProfile</span> connections = <span style="color: #2b91af;">NetworkInformation</span>.GetInternetConnectionProfile();</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1026</span> <span style="color: blue;">bool</span> internet = connections != <span style="color: blue;">null</span> && connections.GetNetworkConnectivityLevel() == <span style="color: #2b91af;">NetworkConnectivityLevel</span>.InternetAccess;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1027</span> <span style="color: blue;">return</span> internet;</div>
<div style="margin: 0px;">
<span style="color: teal;"> 1028</span> }</div>
<div style="margin: 0px;">
</div>
<div style="margin: 0px;">
</div>
<div style="margin: 0px;">
Espero les sea de utilidad, hasta la próxima!</div>
</div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-25084397839160256522013-02-01T17:06:00.002-02:002013-02-04T16:03:24.688-02:00Aplicaciones de prueba para el Windows Store.<span style="font-family: Verdana, sans-serif;">Estimad@s, </span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Les dejamos dos apuntes sumamente importantes (por lo menos a nuestro criterio) y que no están del todo claros en la ayuda que proporciona Microsoft para quienes tengan que publicar aplicaciones de prueba (Trial) en el Windows Store:</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;"><em>"Trial versions in Windows Store can only be installed once. Once they’re expired, they can’t be uninstalled. So we could say that trial is your only chance to convince your user to buy your app. Once the trial is over, there is no other chance, even if your app was updated and is looking and working way better than before."</em></span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">(Gracias <strong>Alvaro Vanni</strong> por habernos preguntado como se manejaba esto) :)</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Test, Test, Test!</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;"><em>"Before deploying your application to the market, ensure that trial process works correctly! To facilitate testing, Microsoft has created a helper class called CurrentAppSimulator, which you can find in Windows.ApplicationModel.Store namespace.</em></span><br />
<span style="font-family: Verdana, sans-serif;"><em>This class replaces the CurrentApp functionality with only difference that the licensing state of the app will be taken from the <strong><span style="font-size: x-small;">WindowsStoreProxy.xml</span></strong> file located in <strong><span style="font-size: x-small;">%userprofile%\appdata\local\packages\</span></strong></em></span><package-moniker><span style="font-family: Verdana, sans-serif;"><em><strong><span style="font-size: x-small;">\localstate\microsoft\Windows Store\Apidata.</span></strong>When using CurrentAppSimulator, beware that it doesn’t modify the mentioned xml file, but only the object in memory. So changes are not preserved after restart."</em></span></package-moniker><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Fuente del material: </span><a href="http://kirsanov.net/post/2012/12/15/Creating-Windows-8-Store-Apps-Introduction-to-Windows-Store-for-Software-Developers.aspx"><span style="font-family: Verdana, sans-serif;">http://kirsanov.net/post/2012/12/15/Creating-Windows-8-Store-Apps-Introduction-to-Windows-Store-for-Software-Developers.aspx</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Un detalle importante acerca de la última nota, es que en el ejemplo de Trial Apps que proporciona el SDK, cargan "a mano" un archivo de licencia en el CurrentAppSimulator, lo cual marea un poco, ya que en realidad el CurrentAppSimulator genera un archivo <strong><span style="font-size: x-small;">WindowsStoreProxy.xml</span></strong> automáticamente si éste ya no existe en el path <strong><span style="font-size: x-small;">%userprofile%\appdata\local\packages\</span></strong><package-moniker><strong><span style="font-size: x-small;">\localstate\microsoft\Windows Store\Apidata</span></strong>.</package-moniker></span><br />
<span style="font-family: Verdana, sans-serif;"><package-moniker></package-moniker></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yuieTHSMobQw4r0ER010xlASN5KCYEdX3pagJgla6Fxptj75Q-yV3_iAwor0hIwdybnGLlhhQ7kvHGORcL3AdCPT1S9PTWudoU4mR1xPo09HrlGjBhCtyTf9lqkefnOyVobZZTRrBX8v/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yuieTHSMobQw4r0ER010xlASN5KCYEdX3pagJgla6Fxptj75Q-yV3_iAwor0hIwdybnGLlhhQ7kvHGORcL3AdCPT1S9PTWudoU4mR1xPo09HrlGjBhCtyTf9lqkefnOyVobZZTRrBX8v/s400/1.jpg" width="400" /></a></div>
<span style="font-family: Verdana, sans-serif;"><package-moniker></package-moniker></span><br />
<package-moniker><br /><span style="font-family: Verdana, sans-serif;">Corre por nuestra cuenta abrirlo y modificarlo para testear las diferentes opciones que se pueden presentar en nuestro trial (en lo que tiene que ver con el manejo de la licencia y los diferentes "sabores" que deseamos establecer de nuestra aplicación")</span></package-moniker><br />
<package-moniker><span style="font-family: Verdana, sans-serif;"></span></package-moniker><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_AMTFkpdtIEFga8Tnd22yyAKCR8D4ufWoTrtY5h3rypFyo3Ovj3otFPFMN1NNsjhNi7wg4JXriZi1dirLS2NGuPOOxtASu__WG6up0pPb1PZzizvYCt6ZFDM2QiFLC9azL-fS5fptPrM/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_AMTFkpdtIEFga8Tnd22yyAKCR8D4ufWoTrtY5h3rypFyo3Ovj3otFPFMN1NNsjhNi7wg4JXriZi1dirLS2NGuPOOxtASu__WG6up0pPb1PZzizvYCt6ZFDM2QiFLC9azL-fS5fptPrM/s400/2.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJpRSfpNn5onGAeKaP2GH2jftpxRa87Chey1emsq6MKpY7t3IIR6KF2SMBpDH0O-U_i9mgWSnloYck-2O2uO5OSYZ_wsIndUfumby1t0veCZQ65fFoto-ARQ1_KP1M8O23fE4-FqNpsdtK/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJpRSfpNn5onGAeKaP2GH2jftpxRa87Chey1emsq6MKpY7t3IIR6KF2SMBpDH0O-U_i9mgWSnloYck-2O2uO5OSYZ_wsIndUfumby1t0veCZQ65fFoto-ARQ1_KP1M8O23fE4-FqNpsdtK/s320/3.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<package-moniker><span style="background-color: lime; font-family: Verdana;">Actualización 04/02/2013:</span></package-moniker><br />
<package-moniker><span style="background-color: lime; font-family: Verdana;"></span></package-moniker><br />
<package-moniker><span style="background-color: white; font-family: Verdana;">Tengan cuidado al utilizar el método<span style="font-family: Verdana, sans-serif;"> "<strong>RequestAppPurchaseAsync</strong>" del objeto "<strong>CurrentAppSimulator"</strong>, porque si sucede algún error, el método nos devolverá OK (una manera fácil de comprobarlo es presionar el botón cancel del cuadro de dialogo que aparece) ¿Que hacemos para solucionarlo? Luego de llamar a este método debemos comprobar el estado de la licencia para ver si efectivamente la operación fue exitosa. Pueden encontrar mas info en <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh967809.aspx">http://msdn.microsoft.com/en-us/library/windows/apps/hh967809.aspx</a></span></span></package-moniker><br />
<package-moniker><span style="font-family: Verdana;"></span></package-moniker><br />
<package-moniker><span style="font-family: Verdana;"></span></package-moniker><br />
<span style="font-family: Verdana, sans-serif;">Como siempre, quedamos a las órdenes para quienes tengan dudas al respecto.</span>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-22789453496357795132013-01-22T02:51:00.000-02:002013-01-23T14:35:33.162-02:00Bases de datos locales en Windows Store Apps<span style="font-family: Verdana, sans-serif;">Una de las dificultades a las que nos hemos enfrentado al momento de desarrollar un aplicación del tipo Windows Store App, es la imposibilidad de contar con una base de datos relacional "nativa" en este entorno.</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Un tiempo atrás se podía llegar a lograr esto, utilizando </span><a href="http://www.sqlite.org/" target="_blank"><span style="font-family: Verdana, sans-serif;">SQLite</span></a><span style="font-family: Verdana, sans-serif;">, aunque podía llegar a ser un proceso bastante "complicado" por llamarlo de alguna manera.</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Afortunadamente, el equipo de </span><a href="http://www.sqlite.org/" target="_blank"><span style="font-family: Verdana, sans-serif;">SQLite</span></a><span style="font-family: Verdana, sans-serif;"> se ha encargado de facilitarnos bastante la vida reduciendo significativamente la complejidad necesaria para utilizar dicha base en nuestros proyectos.</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">El objetivo de este post, es tratar de explicarle, los pasos necesarios para incluir una base SQLite en su proyecto.</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<strong><span style="font-family: Verdana, sans-serif;">Primer paso:</span></strong><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;">Lo primero que debe hacer es, obtener el paquete de SQLite propiamente dicho. Para ello tiene que seleccionar del menú principal la opción <strong>Tools|Extensions and Updates </strong>(esto depende claro está,<strong> </strong>del idioma en el que tenga Visual Studio) . En la ventana de extensiones y actualizaciones, seleccione "<strong>Online</strong>" y luego escriba "<strong>sqlite</strong>" en el cuadro de búsqueda. Si todo va bien, debería ver la opción "<strong>SQLite for Windows Runtime</strong>", presione el botón instalar. Por último, debe agregar las referencias del paquete recién instalado y del Runtime de VC++ y ya tendría listo el primer paso. Para ello, debe ir al menú contextual dentro del proyecto y seleccionar "<strong>Add References</strong>". A continuación dejo unas capturas de como debería verse la secuencia de este primer paso:</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQQkNsZ9TC1DTv5crETGjoZjSeyT4T_eKsyCYN2LcM1jAh3e8KuTvuholV5ik4aJWXTdECdX8yjclT8qHXODyFFwfmWaU7CEraEllbOi2G2s6f4T0PCFZnziSlzUKyxk1rj_0T3EF8JxT/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQQkNsZ9TC1DTv5crETGjoZjSeyT4T_eKsyCYN2LcM1jAh3e8KuTvuholV5ik4aJWXTdECdX8yjclT8qHXODyFFwfmWaU7CEraEllbOi2G2s6f4T0PCFZnziSlzUKyxk1rj_0T3EF8JxT/s320/1.png" width="320" /></span></a></div>
<span style="font-family: Verdana, sans-serif;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLFCBh5vK62VK9O4N8gL3O_jGONN3B2YZKYz3e1U4ujfSyS4_Lnfd1_9LcaRHOwVFP8XwGRMfN5a7YiBHTH8M7YCtlr9Zn1YOkmmNbefOQ17hstjtdnOOSz8peg_mud1GVCSkAl2dUooB-/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLFCBh5vK62VK9O4N8gL3O_jGONN3B2YZKYz3e1U4ujfSyS4_Lnfd1_9LcaRHOwVFP8XwGRMfN5a7YiBHTH8M7YCtlr9Zn1YOkmmNbefOQ17hstjtdnOOSz8peg_mud1GVCSkAl2dUooB-/s320/2.jpg" width="320" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr3NEKWXwVBeRctUHVx1OMg4tW7O0nWj7YugH3pqrbjXVN2tY7uhtW4xpsuCW7cwAtwbSZyDxH9yhiZGuI6IcR6LRZ2KTq2FkZquOkWuq3zm9nt0xRo8R2HKESvxa25rPQPu1eLt2OCotc/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"></span></a> </div>
<span style="font-family: Verdana, sans-serif;"> </span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbdZAiX-Bj-F3X5f8Os3b4eensLWHhnfrPzZQSib7xnfESKt9TY2oKN37uypIwXfWidJkB5NKyJ4yYqR32JzzirqecXgz_EjWqA7MQ96VM_2r2f_kqWYyFC1NoSRsF_JaZj8Ml16cP0Qsy/s1600/3.5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbdZAiX-Bj-F3X5f8Os3b4eensLWHhnfrPzZQSib7xnfESKt9TY2oKN37uypIwXfWidJkB5NKyJ4yYqR32JzzirqecXgz_EjWqA7MQ96VM_2r2f_kqWYyFC1NoSRsF_JaZj8Ml16cP0Qsy/s320/3.5.jpg" width="320" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Verdana, sans-serif;"></span> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr3NEKWXwVBeRctUHVx1OMg4tW7O0nWj7YugH3pqrbjXVN2tY7uhtW4xpsuCW7cwAtwbSZyDxH9yhiZGuI6IcR6LRZ2KTq2FkZquOkWuq3zm9nt0xRo8R2HKESvxa25rPQPu1eLt2OCotc/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif;"><img border="0" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr3NEKWXwVBeRctUHVx1OMg4tW7O0nWj7YugH3pqrbjXVN2tY7uhtW4xpsuCW7cwAtwbSZyDxH9yhiZGuI6IcR6LRZ2KTq2FkZquOkWuq3zm9nt0xRo8R2HKESvxa25rPQPu1eLt2OCotc/s320/3.jpg" width="320" /></span></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"></span> </div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;"></span></div>
<span style="font-family: Segoe UI; font-size: x-small;"><span style="font-family: Verdana, sans-serif; font-size: small;">Antes de pasar al segundo paso, cabe aclarar que si quisiéramos compilar el proyecto en este momento, probablemente nos daría un error. Esto sucede porque por defecto, cuando creamos un Windows Store Project, la compilación esta marcada como "Any CPU". Como hemos agregado este paquete de SQLite, esto no va a ser posible, por lo que deberemos compilar un paquete por cada plataforma para la cual deseemos generar. Esto se realiza seleccionando del menú principal la opción <strong>Build|Configuration Manager</strong> y seleccionando la plataforma deseada <strong>x86</strong>, <strong>x64</strong> o <strong>ARM. </strong>Esto se aplica también si utilizamos otras dlls, por ejemplo, bing maps. Es un proceso engorroso, pero lo bueno de todo esto, es que cuando un usuario se descargue la aplicación, el store seleccionará automáticamente el paquete que aplique a su plataforma.</span><br />
<span style="font-family: Verdana, sans-serif; font-size: small;"></span><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgik4XJ21LMx2WT08Ti4R9pTHaF9UqHjqBuMl60fb29rK9ZCzQ908d4xIKLDsOWCMSmXWElhj8cdCMn9Ln3vsNolpnNRU03iMiczni5x_oj17Yz9u2mlNFUSLPtlwfuYXmtqr12eFcYjimd/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif; font-size: small;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgik4XJ21LMx2WT08Ti4R9pTHaF9UqHjqBuMl60fb29rK9ZCzQ908d4xIKLDsOWCMSmXWElhj8cdCMn9Ln3vsNolpnNRU03iMiczni5x_oj17Yz9u2mlNFUSLPtlwfuYXmtqr12eFcYjimd/s320/6.jpg" width="320" /></span></a></span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><span style="font-family: Verdana, sans-serif; font-size: small;"></span> </span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
</span><br />
<div align="left" class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><span style="font-family: Verdana, sans-serif; font-size: small;"></span></span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
<strong><span style="font-family: Verdana, sans-serif; font-size: small;">Segundo paso:</span></strong><br />
<span style="font-family: Verdana, sans-serif; font-size: small;"></span><br />
<span style="font-family: Verdana, sans-serif; font-size: small;">Antes de empezar a trabajar con la base, vamos a necesitar un paquete llamado </span><a href="https://github.com/praeclarum/sqlite-net" target="_blank"><strong><span style="font-family: Verdana, sans-serif; font-size: small;">sqlite-net</span></strong></a><span style="font-family: Verdana, sans-serif;"><span style="font-size: small;"><strong>. </strong>sqlite-net es una librería open source, que nos va a permitir trabajar con la base de datos SQLite de una manera mas amigable utilizando sintaxis del tipo LINQ. La manera mas sencilla que hay de agregar esta librería a nuestro proyecto, es presionar el botón derecho sobre la solución y seleccionar la opción "<strong>Manage NuGet Packages for Solution</strong>". En la ventana de Manage Nuget Packages, seleccione la opción <strong>Online</strong> y escriba <strong>sqlite-net</strong> en el cuadro de búsqueda. Después que instale dicho paquete, verá que se han agregado dos nuevos archivos a la solución: <strong>SQLite.cs</strong> y <strong>SQLiteAsync.cs</strong>. </span></span><br />
<span style="font-family: Verdana, sans-serif; font-size: small;"></span><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin1DuhGmMFt2yu_aSICLPI9lgCe8h5QQV0s5ywEqBfzZ_wutGi30Wn0_H9Hm4Y0I94H2mH-KgVmKEx2fhkZ6kU91bbZvvv-fj8z4mjFyCcqbhgJt_FnX-knhGlWMuCp7XyWvy8nutIL3AL/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif; font-size: small;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin1DuhGmMFt2yu_aSICLPI9lgCe8h5QQV0s5ywEqBfzZ_wutGi30Wn0_H9Hm4Y0I94H2mH-KgVmKEx2fhkZ6kU91bbZvvv-fj8z4mjFyCcqbhgJt_FnX-knhGlWMuCp7XyWvy8nutIL3AL/s320/4.jpg" width="320" /></span></a></span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
</span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><span style="font-family: Verdana, sans-serif; font-size: small;"></span> </span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
</span><div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Segoe UI; font-size: x-small;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgegFtNnx3gM4P-6Uh1b_vGrehUahKKnZD1g2Yx_QHDiYsYNGztJg_2ZowZXcIHqyMqbpbohS_SIuofJWPrCmpBV11YejZmRrlLF0e-8Ux_1DeQscPAk5JdN8ImL7XgSHPcioxTKj9To039/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Verdana, sans-serif; font-size: small;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgegFtNnx3gM4P-6Uh1b_vGrehUahKKnZD1g2Yx_QHDiYsYNGztJg_2ZowZXcIHqyMqbpbohS_SIuofJWPrCmpBV11YejZmRrlLF0e-8Ux_1DeQscPAk5JdN8ImL7XgSHPcioxTKj9To039/s320/7.jpg" width="300" /></span></a></span></div>
<span style="font-family: Segoe UI; font-size: x-small;">
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Verdana, sans-serif; font-size: small;"></span> </div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif; font-size: small;"><strong>Manos a la obra!</strong></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif; font-size: small;"></span> </div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif; font-size: small;">Ahora que tenemos todo listo, debemos abrir el archivo App.xaml y agregar el código de inicialización de la base:</span></div>
<span style="background: white; color: blue;"><span style="color: green;"><span style="color: green;"><span style="color: green; font-family: "Courier New", Courier, monospace;"><pre><span style="font-family: Verdana, sans-serif; font-size: small;"> </span><div class="code">
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="color: green;"><span style="color: green;"><span style="color: green;">// Obtiene una referencia a la base de datos</span></span></span>
</span></span></div>
</pre>
</span></span></span></span></span><span style="font-family: "Courier New", Courier, monospace; font-size: small;">DbPath = <span style="color: #2b91af;"><span style="color: #2b91af;"><span style="color: #2b91af;">Path</span></span></span>.Combine(<span style="color: #2b91af;"><span style="color: #2b91af;"><span style="color: #2b91af;">ApplicationData</span></span></span>.Current.LocalFolder.Path, <span style="color: #a31515;"><span style="color: #a31515;"><span style="color: #a31515;">"CMT.db"</span></span></span>);</span><br />
<div class="code">
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="color: green;"><span style="color: green;"><span style="color: green;">// Inicializa la base si es necesario</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;">
</span></span></span></span></span></div>
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="color: blue;"><span style="color: blue;"><span style="color: blue;">using</span></span></span> (<span style="color: blue;"><span style="color: blue;"><span style="color: blue;">var</span></span></span> db = <span style="color: blue;"><span style="color: blue;"><span style="color: blue;">new</span></span></span> SQLite.<span style="color: #2b91af;"><span style="color: #2b91af;"><span style="color: #2b91af;">SQLiteConnection</span></span></span>(DbPath))</span></span><br />
<span style="font-family: "Courier New", Courier, monospace; font-size: small;">{
</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: blue;"> </span>// Crear las tablas si las mismas no existen</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;">
</span></span></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace; font-size: small;"> db.CreateTable<<span style="color: #2b91af;"><span style="color: #2b91af;"><span style="color: #2b91af;">Customer</span></span></span>>();</span><br />
<span style="font-family: "Courier New", Courier, monospace; font-size: small;"> db.CreateTable<<span style="color: #2b91af;"><span style="color: #2b91af;"><span style="color: #2b91af;">Project</span></span></span>>();</span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;">}</span><br />
</span></span><br />
<pre><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span></pre>
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><br />
<pre class="separator" style="clear: both; text-align: left;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span></pre>
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Verdana, sans-serif;">
</span><span style="color: black; font-family: inherit;"></span></span></span><br />
<pre class="separator" style="clear: both; text-align: left;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;"><span style="font-family: Verdana, sans-serif; font-size: small;">Tanto la entidad Customer, como la entidad Project, son clases POCO básicas que no tienen mayor complejidad.</span></span></span></span></pre>
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;">
<span style="font-family: Verdana, sans-serif;">
</span></span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;"><span style="font-family: Times, "Times New Roman", serif; font-size: small;"><span style="font-family: Verdana, sans-serif;">El único detalle que vale mencionar, es el atributo de Primary Key de SQLite. <span style="background-color: white;"><span style="background-color: lime;">Actualización</span>: Les recomiendo ver la </span><a href="http://code.google.com/p/sqlite-net/wiki/Features" target="_blank"><span style="background-color: white;">página de características de sqlite-net</span></a><span style="background-color: white;"> para ver todos los decorados que podemos utilizar en la clase.</span> </span></span></span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;">
</span></span></span><br />
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;"> </span></span></span></div>
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;">
</span></span></span><pre class="separator" style="clear: both; text-align: left;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;"><span style="font-size: small;"></span> </span></span></span></pre>
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: inherit;">
<pre class="code"><span style="font-size: small;"><span style="font-family: "Courier New", Courier, monospace;"><span style="background: white; color: blue;">public class </span><span style="background: white; color: #2b91af;">Customer
</span><span style="background: white; color: black;">{
[SQLite.</span><span style="background: white; color: #2b91af;">PrimaryKey</span><span style="background: white; color: black;">]
</span><span style="background: white; color: blue;">public int </span><span style="background: white; color: black;">Id { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public string </span><span style="background: white; color: black;">Name { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public string </span><span style="background: white; color: black;">City { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public string </span><span style="background: white; color: black;">Contact { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
}
</span></span></span></pre>
<div class="code">
<span style="font-size: small;"><span style="font-family: "Courier New", Courier, monospace;"><span style="background: white; color: black;"></span></span></span> </div>
<div class="code">
<span style="font-size: small;"><span style="font-family: "Courier New", Courier, monospace;"><span style="background: white; color: black;"></span></span></span> </div>
<pre class="code"><span style="font-size: small;"><span style="font-family: "Courier New", Courier, monospace;"><span style="background: white; color: blue;">public class </span><span style="background: white; color: #2b91af;">Project
</span><span style="background: white; color: black;">{
[SQLite.</span><span style="background: white; color: #2b91af;">PrimaryKey</span><span style="background: white; color: black;">]
</span><span style="background: white; color: blue;">public int </span><span style="background: white; color: black;">Id { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public int </span><span style="background: white; color: black;">CustomerId { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public string </span><span style="background: white; color: black;">Name { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public string </span><span style="background: white; color: black;">Description { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
</span><span style="background: white; color: blue;">public </span><span style="background: white; color: #2b91af;">DateTime </span><span style="background: white; color: black;">DueDate { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }
}
</span></span></span></pre>
</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: "Courier New", Courier, monospace;"></span> <span style="font-family: Times, "Times New Roman", serif;"> </span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Verdana, sans-serif;">A continuación y a modo de ejemplo, se muestra el método GetCustomer, que retorna un cliente dado su Id. </span></div>
<br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: blue;">public </span><span style="background: white; color: #2b91af;">CustomerViewModel </span><span style="background: white; color: black;">GetCustomer(</span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">customerId)
</span></span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;">{
</span></span><br />
<span style="background: white; color: black;"></span><span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: blue;"> var </span><span style="background: white; color: black;">customer = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: #2b91af;">CustomerViewModel</span><span style="background: white; color: black;">();
</span><span style="background: white; color: blue;"></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: blue;"> using </span><span style="background: white; color: black;">(</span><span style="background: white; color: blue;">var </span><span style="background: white; color: black;">db = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: black;">SQLite.</span><span style="background: white; color: #2b91af;">SQLiteConnection</span><span style="background: white; color: black;">(app.DBPath))
</span></span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;"> {
</span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: black;"> </span><span style="background: white; color: blue;">var </span><span style="background: white; color: black;">_customer = (db.Table<</span><span style="background: white; color: #2b91af;">Customer</span><span style="background: white; color: black;">>().Where(
c => c.Id == customerId)).Single();
</span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: black;"> customer.Id = _customer.Id;
</span></span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;"> customer.Name = _customer.Name;
</span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;"> customer.City = _customer.City;
</span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;"> customer.Contact = _customer.Contact;
</span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: black;"> }
</span><span style="background: white; color: blue;"></span></span></span><br />
<span style="font-family: "Courier New", Courier, monospace;"><span style="font-size: small;"><span style="background: white; color: blue;"> return </span><span style="background: white; color: black;">customer;
</span></span></span><br />
<span style="background: white; color: black;"><span style="font-family: "Courier New", Courier, monospace; font-size: small;">}
</span></span><br />
<br />
<span style="font-family: Consolas; font-size: x-small;"><br />
<span style="font-family: Verdana, sans-serif; font-size: small;">Si quieren el código de una aplicación completamente funcional, pueden bajar un ejemplo de </span><a href="http://code.msdn.microsoft.com/Using-SQLite-in-a-Windows-c16aea77" target="_blank"><span style="font-family: Verdana, sans-serif; font-size: small;">aquí</span></a></span></span><span style="font-family: Verdana, sans-serif;"> </span><br />
<span style="font-family: Verdana;"></span><br />
<span style="font-family: Verdana, sans-serif;">Si quieren ejemplos de código de sqlite-net, pueden bajar un proyecto entero de </span><a href="https://github.com/praeclarum/sqlite-net/archive/master.zip" target="_blank"><span style="font-family: Verdana, sans-serif;">aquí</span></a><br />
<br />
<br />
<span style="font-family: Verdana, sans-serif;"><strong>Referencias</strong>:</span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<a href="http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx"><span style="font-family: Verdana, sans-serif;">http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<a href="http://timheuer.com/blog/archive/2012/08/07/updated-how-to-using-sqlite-from-windows-store-apps.aspx"><span style="font-family: Verdana, sans-serif;">http://timheuer.com/blog/archive/2012/08/07/updated-how-to-using-sqlite-from-windows-store-apps.aspx</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<a href="http://blogs.msdn.com/b/robertgreen/archive/2012/11/13/using-sqlite-in-windows-store-apps.aspx"><span style="font-family: Verdana, sans-serif;">http://blogs.msdn.com/b/robertgreen/archive/2012/11/13/using-sqlite-in-windows-store-apps.aspx</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<a href="http://www.sqlite.org/"><span style="font-family: Verdana, sans-serif;">http://www.sqlite.org/</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<a href="https://github.com/praeclarum/sqlite-net"><span style="font-family: Verdana, sans-serif;">https://github.com/praeclarum/sqlite-net</span></a><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<span style="font-family: Verdana, sans-serif;"></span><br />
<strong><span style="font-family: Verdana, sans-serif;">Espero que les haya gustado y les sea de utilidad, </span></strong><br />
<strong><span style="font-family: Verdana, sans-serif;"> </span></strong><br />
<strong><span style="font-family: Verdana, sans-serif;">Hasta la próxima!</span></strong><br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com4tag:blogger.com,1999:blog-2648938709989199331.post-68886389589820987082012-12-06T10:37:00.000-02:002012-12-06T10:52:45.022-02:00Taller "Desarrolla en Windows 8 y Windows Phone 8" @ Microsoft<br />
En el día de ayer tuvimos el gusto de participar como oradores del taller "Desarrollo en Windows 8 y Windows Phone 8" que se brindó en las oficinas de Microsoft. Un lujo haber compartido dicha tarea con oradores de primera como <b>José Russomano</b> (FX2 http://www.fx2.com.uy/website) y <b>Magdalena Hourcade</b> (Microsoft Developer Evangelist)<br />
<br />
Queremos agradecer también, al señor <b>Alejandro Garrido</b> (Microsoft MVP) por su apoyo constante hacia nuestra empresa y destacar su compromiso para que la comunidad CUMUY crezca.<br />
<br />
Compartimos el material que expusimos en dicha sesión<br />
<br />
<div style="text-align: center;">
<iframe frameborder="0" height="220px" src="https://skydrive.live.com/embed?cid=A5100CC3B6976950&resid=A5100CC3B6976950%21722&authkey=AJs0uexTQloC-lo&em=2&wdAr=1.7777777777777776" width="350px">Esto es un documento de <a target='_blank' href='http://office.com'>Microsoft Office</a> incrustado con tecnología de <a target='_blank' href='http://office.com/webapps'>Office Web Apps</a>.</iframe></div>
<br />
¡Hasta la próxima!Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-58139467173308902422012-12-03T12:36:00.000-02:002012-12-03T12:36:25.674-02:00CUMUY: Desarrolla y publica tus aplicaciones de Windows 8 y Windows Phone <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59HqXLvPyHbMma3VEM36NTQ-OZ4NHizurYsMqOMGDTcXKoszM-EOmfC167sL2bWmgafEsUIBxiRFbO7E5txBXrjzpQTAtiN4bzgYPFg4TB5zqP_bjFQxUIZxHZOLXQAk5IaC8ifHxKkGC/s1600/CUMUYTallerDesarrolloWindows8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh59HqXLvPyHbMma3VEM36NTQ-OZ4NHizurYsMqOMGDTcXKoszM-EOmfC167sL2bWmgafEsUIBxiRFbO7E5txBXrjzpQTAtiN4bzgYPFg4TB5zqP_bjFQxUIZxHZOLXQAk5IaC8ifHxKkGC/s640/CUMUYTallerDesarrolloWindows8.jpg" width="385" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-family: "Courier New", Courier, monospace;">Ven a desarrollar tu primera App para Windows 8 y publicarla en el Windows Store
!!!<br /><br />Te invitamos a participar a un taller donde podrás desarrollar y
publicar tus aplicaciones de Windows 8 y Windows Phone.<br /><br />Lo haremos el
miércoles 5 de diciembre de 9 a 15 horas, en Microsoft Uruguay, Cebollatí 1474
piso 5.<br /><br />No te olvides de traer tu computadora con:<br /><br />- Windows
8<br />- Visual Studio 2012<br />- Windows Phone 8 SDK <br /><br />Para publicar tu
aplicación en tu cuenta sin costo en el Windows Store y Windows Phone Dev
Center, necesitamos que nos confirmes antes del viernes.<br /><br />Para esta, vas a
necesitar una tarjeta de crédito internacional, y el costo total para abrirla
para este taller es 0.<br /><br />Por consultas e inscripciones, enviá mail a: </span><a href="mailto:garridoalejandro@outlook.com"><span style="color: #888888; font-family: "Courier New", Courier, monospace;">garridoalejandro@outlook.com</span></a> </div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-55972119858101846702012-10-28T11:38:00.000-02:002012-10-28T11:38:19.626-02:00L&A Time Tracker ya está disponible en el Windows Store! <div>
Amig@s</div>
<div>
<br /></div>
<div>
Luego de mucho esfuerzo, puedo decir con mucha satisfacción que L&A Time Tracker ya está disponible en el Windows Store! </div>
<div>
<br /></div>
<div>
Los invito a que lo descarguen, lo prueben y nos envíen sus comentarios, que son y serán siempre bienvenidos. Ah, me olvidaba de lo más importante: ES GRATIS!</div>
<div>
<br /></div>
<div>
Les dejo unos enlaces para que conozcan mas detalles de la aplicación.</div>
<div>
<br /></div>
<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/v-Kl71ZFJDk?feature=player_embedded' frameborder='0'></iframe></div>
<div>
<br /></div>
<div style="text-align: center;">
<a href="http://alvaroregalado.blogspot.com/2012/08/l-time-tracker-para-windows-8-un.html">http://alvaroregalado.blogspot.com/2012/08/l-time-tracker-para-windows-8-un.html</a></div>
<div>
<br /></div>
<div style="text-align: center;">
Puedes descargarla desde aquí:</div>
<div>
<br /></div>
<div style="text-align: center;">
<a href="http://apps.microsoft.com/webpdp/es-ES/app/lya-time-tracker/123dd293-7ec0-4945-914c-f31564ce9a56">http://apps.microsoft.com/webpdp/es-ES/app/lya-time-tracker/123dd293-7ec0-4945-914c-f31564ce9a56</a></div>
<div>
<br /></div>
<div>
Espero les guste,</div>
<div>
<br /></div>
<div>
Hasta la próxima!</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-35497668764509300142012-09-03T00:06:00.000-03:002012-09-03T00:16:21.961-03:00L&A Time Tracker en acción!<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dz_6GPQF6oMwuUNlzebwWmC_gEDPZw8WEc1fndZ74gXWyyTa8J-SQ4nvD9HUO8omS9oE61HYvtIWdnWfbXV9g' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-55794055585239228702012-08-31T16:36:00.000-03:002012-08-31T16:38:46.357-03:00L&A Time Tracker para Windows 8. Un software para control de tiempo<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnvwgMFQw_X5jFYnS2wPngSlpn50NWY32elpQOSM6NAIZDuRUPbTP7SZ25veqJzDfgUkyu-BbIE4zopyd13e62C1gpK1noVx24XDvaRBC8cBiFMxnuvGnoGkgeFC2C30qU7Usv27NaF3YT/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnvwgMFQw_X5jFYnS2wPngSlpn50NWY32elpQOSM6NAIZDuRUPbTP7SZ25veqJzDfgUkyu-BbIE4zopyd13e62C1gpK1noVx24XDvaRBC8cBiFMxnuvGnoGkgeFC2C30qU7Usv27NaF3YT/s400/1.jpg" width="400" /></a></div>
<div class="MsoNormal" style="margin: 0cm 0cm 10pt; text-align: justify;">
<br />
<span style="font-family: Calibri;">Como muchos de Uds. ya sabrán, nuestra empresa (<a href="http://www.lyasistemas.com/" target="_blank">LyA Sistemas</a>), participó del programa <a href="http://www.puertadeenlace.net/post/191;Queres-ser-Pionero-en-Windows-8.aspx" target="_blank">"Pioneros de Windows 8"</a>.
Básicamente este programa es un Quality Lab, que tiene como objetivo
sustancial, guiar a los desarrolladores en el proceso de aprendizaje del
desarrollo en <a href="http://windows.microsoft.com/es-US/windows-8/release-preview" target="_blank">Windows 8</a>. Como resultado del mismo, y si la aplicación cumple
con todos los aspectos requeridos, Microsoft otorga un "token" para
publicar en el Windows Store.<o:p></o:p></span></div>
<div style="text-align: justify;">
<span style="font-family: Calibri;">Nuestra aplicación cumplió con todos los requisitos, y fue
aprobada para su publicación <span style="mso-spacerun: yes;"> </span></span><span style="font-family: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: Wingdings;"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;">J</span></span></div>
<div style="text-align: justify;">
<span style="font-family: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: Wingdings;"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"></span></span><br /></div>
<div style="text-align: justify;">
<span style="font-family: Calibri;">Pero hoy les quiero contar un poco acerca de LYA Time
Tracker, la aplicación que desarrollamos para el programa anteriormente
mencionado.</span></div>
<span style="font-family: Calibri;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0afCGGvXt0s1M8u2IZwDiL4DdOIOD6I94UBJIifnxQy2r04rw5mIftkPOOszzKF4AkI_9oHx_1NTqu7T6yccq_0Odu4Diiuc2TNJr9BsqTeccjiQbtFsoAvgrG9PHBoNtrzuJXgwUWvs9/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0afCGGvXt0s1M8u2IZwDiL4DdOIOD6I94UBJIifnxQy2r04rw5mIftkPOOszzKF4AkI_9oHx_1NTqu7T6yccq_0Odu4Diiuc2TNJr9BsqTeccjiQbtFsoAvgrG9PHBoNtrzuJXgwUWvs9/s1600/logo.png" /></a></div>
<span style="font-family: Calibri;"><span style="font-family: Times New Roman;"><v:shape id="Imagen_x0020_2" o:gfxdata="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
AA==
" o:spid="_x0000_s1026" style="height: 52.2pt; margin-left: 324.65pt; margin-top: 50.25pt; mso-height-percent: 0; mso-height-relative: margin; mso-position-horizontal-relative: margin; mso-position-horizontal: absolute; mso-position-vertical-relative: page; mso-position-vertical: absolute; mso-width-percent: 0; mso-width-relative: margin; mso-wrap-distance-bottom: 0; mso-wrap-distance-left: 9pt; mso-wrap-distance-right: 9pt; mso-wrap-distance-top: 0; position: absolute; visibility: visible; width: 47.3pt; z-index: -251657216;" type="#_x0000_t75"><span style="font-family: Calibri;">
<v:imagedata cropleft="-3553f" cropright="-3459f" croptop="-3808f" o:title="" src="file:///C:\Users\Alvaro\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png">
<w:wrap anchorx="margin" anchory="page" type="tight">
</w:wrap></v:imagedata></span></v:shape><span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;">¿Qué es y para qué
sirve Time Tracker?<o:p></o:p></span></span></span><br />
<span style="font-family: Calibri;"><span style="font-family: Times New Roman;">
</span></span><br />
<span style="font-family: Calibri;"><span style="font-family: Times New Roman;"></span></span><br />
<span style="font-family: Calibri;"><span style="font-family: Times New Roman;"></span></span><br />
<span style="font-family: Calibri;"><span style="font-family: Times New Roman;"><div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l2 level1 lfo1; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Es
una herramienta que le permite al usuario que la utiliza, realizar la gestión
del tiempo que dedica a diversas tareas.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-list: l2 level1 lfo1; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Maneja
diferentes perfiles, hablándole al usuario en su propio idioma.</span><br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p></o:p></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 72pt; mso-add-space: auto; mso-list: l2 level2 lfo1; text-align: justify; text-indent: -18pt;">
<span style="font-size: 10pt; mso-fareast-font-family: Calibri;"><span style="mso-list: Ignore;"><span style="font-family: Calibri;">-</span><span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Pongamos
el caso de un doctor que trabaja con pacientes, un abogado trabaja con
clientes, etc.</span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p> </o:p></span></div>
<div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo4; text-align: justify; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">La
aplicación estará orientada a freelancers, abogados, médicos, especialistas
técnicos,<span style="mso-spacerun: yes;"> </span>contadores y cualquier persona
que necesite administrar sus horas efectivas de trabajo.</span><br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p></o:p></span> </div>
<div class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;">Ventajas
de usar Time Tracker</span><br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;"><o:p></o:p></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Puede
usarla durante reuniones con clientes (pacientes), mientras está
viajando, etc. </span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Le
permite al usuario evaluar en que tareas ha usado su tiempo.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Genera
planillas de horas claras y exactas para impresionar a sus clientes.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Le
permite al usuario mejorar sus estimaciones para proyectos futuros, usando como
referencia las horas previamente registradas.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Registra
en qué lugar se está desarrollando la tarea (siempre y cuando el dispositivo
disponga del hardware necesario).</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraph" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-align: justify; text-indent: -18pt;">
<span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Aprovecha
todas las ventajas que ofrece Windows 8:</span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">
</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 72pt; mso-add-space: auto; mso-list: l3 level2 lfo3; text-align: justify; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Comparte los
contactos con todas las aplicaciones y permite obtener información de contactos
de otras aplicaciones.</span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p> </o:p></span><br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p></o:p></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 72pt; mso-add-space: auto; mso-list: l3 level2 lfo3; text-align: justify; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Mantiene al
usuario informado del cronómetro que está corriendo mientras el usuario no está
dentro de la aplicación (Live Tiles)</span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p> </o:p></span><br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;"><o:p></o:p></span> </div>
<div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 72pt; mso-add-space: auto; mso-list: l3 level2 lfo3; text-align: justify; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Permite que el
usuario defina notificaciones de tiempo transcurrido (Toast notifications)<o:p></o:p></span></div>
<br />
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;">Funcionalidades
planificadas para próximas versiones<o:p></o:p></span><br />
<div class="MsoListParagraphCxSpFirst" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Obtener y
compartir tareas desde y hacia otras aplicaciones.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Billing de tareas.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo3; text-indent: -18pt;">
<span style="font-family: Wingdings; font-size: 10pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";"> </span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Mensajes dinámicos
en “Reportes por:” estilo: “Los 5 clientes con más consumo son…”<span style="mso-tab-count: 1;"> </span></span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpMiddle" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;">
<span style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Gráficos.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span> </div>
<div class="MsoListParagraphCxSpLast" style="margin: 0cm 0cm 0pt 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;">
<span style="font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings;"><span style="mso-list: Ignore;">§<span style="font-size-adjust: none; font-stretch: normal; font: 7pt/normal "Times New Roman";">
</span></span></span><span style="font-family: "Segoe UI","sans-serif"; font-size: 10pt;">Almacenamiento
en SkyDrive, así el usuario podrá ver la información de contadores y el cronometro
activo sin importar en que dispositivo esté trabajando.</span><br />
<span style="font-family: Segoe UI; font-size: x-small;"></span><span style="font-family: "Segoe UI","sans-serif";"><o:p></o:p></span> </div>
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;">Por último les dejo algunas capturas
de pantalla</span><div class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;"></span> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFFM7C-5JfsD0XmXRRCTyRRGuIGGlsrzY3FhPwr2AV-VBD77ooX0md5lem6-md5xwl6RDqBKEvur54KKnWvaiw_3vWN3yHS7e2vw6X1ZjwGJwnPoZmZZ_28VFmAzewfzW1OZ8pOTeHc7lz/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFFM7C-5JfsD0XmXRRCTyRRGuIGGlsrzY3FhPwr2AV-VBD77ooX0md5lem6-md5xwl6RDqBKEvur54KKnWvaiw_3vWN3yHS7e2vw6X1ZjwGJwnPoZmZZ_28VFmAzewfzW1OZ8pOTeHc7lz/s320/1.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs8XxOYaH0YCwn5HpkJwUXJUUCNRvx0pYF-mHy7NMDXQdjDcafIsqgqjjBKxGZEMLd85uTSfsl_2VyXw566GfI2FFW9_d7oJv9hEPsAHsD1Ixj6Y9hk23BezxLi7Cs3_GU4fWA65biISOQ/s1600/a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs8XxOYaH0YCwn5HpkJwUXJUUCNRvx0pYF-mHy7NMDXQdjDcafIsqgqjjBKxGZEMLd85uTSfsl_2VyXw566GfI2FFW9_d7oJv9hEPsAHsD1Ixj6Y9hk23BezxLi7Cs3_GU4fWA65biISOQ/s320/a.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIWpQPqRH8FWl-gsvtnrFpgN1J5iALbXqvEWI85H1eVK2_O3zj4FSVyncx3rbe7jYLxGIBhxTuwh7v98w_chprMSidzQxPmt_mQssOxcvNv-tnXMo7pWrzwWszFLf39nEpsb6Vg4icGhF/s1600/b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIWpQPqRH8FWl-gsvtnrFpgN1J5iALbXqvEWI85H1eVK2_O3zj4FSVyncx3rbe7jYLxGIBhxTuwh7v98w_chprMSidzQxPmt_mQssOxcvNv-tnXMo7pWrzwWszFLf39nEpsb6Vg4icGhF/s320/b.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlb8Lt93iNnjn0B9HIuAaIbsClcgdYTp8ydj1AoTPZTieLl-3y2SJTxBeD_X6tDN6HuWW8b2SvSu1BJf9P7vsqbzdEsP7gsuCNNtfcNTHLbZ3K9YD8XOAfaqoP36nxMcUqxKyyxOZadW6L/s1600/c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlb8Lt93iNnjn0B9HIuAaIbsClcgdYTp8ydj1AoTPZTieLl-3y2SJTxBeD_X6tDN6HuWW8b2SvSu1BJf9P7vsqbzdEsP7gsuCNNtfcNTHLbZ3K9YD8XOAfaqoP36nxMcUqxKyyxOZadW6L/s320/c.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;">Por mas información acerca de Time Tracker <a href="mailto:admin@lyasistemas.com">admin@lyasistemas.com</a></span></div>
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;"></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-family: "Segoe UI","sans-serif"; font-size: 16pt;"><o:p></o:p></span> </div>
</span></span><div style="text-align: center;">
</div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-78592994092366869982012-08-31T14:52:00.003-03:002012-08-31T14:54:35.680-03:00Editar Datos de SQL Azure<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;">Los que trabajamos con SQL Azure "extrañamos" la posibilidad de editar datos en el SQL Management Studio. Curiosamente, esta limitacion existe en la versión mas nueva del SQLMS (2012)</span></span></div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;"></span></span> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifthb8A48aM_HSIEgBx9n86Nqx5ZLihcSsm3WqPBVCE5OTfaW7z13Gcvsw4p7u1OWlmfCoNns0GnP5kMdVkj4PD-C7VuG6R60N3H265-efPt8S9tqCnDJZzNuIjfw6QOmpQutvazXA4jJw/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifthb8A48aM_HSIEgBx9n86Nqx5ZLihcSsm3WqPBVCE5OTfaW7z13Gcvsw4p7u1OWlmfCoNns0GnP5kMdVkj4PD-C7VuG6R60N3H265-efPt8S9tqCnDJZzNuIjfw6QOmpQutvazXA4jJw/s400/1.png" width="400" /></a></div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;"></span></span> </div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;"></span></span> </div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;">Obviamente que se pueden editar datos mediante comandos SQL, pero para los "atorrantes" como nosotros existe un producto llamado Navicat, que nos ayuda a realizar esta tarea a través de un GUI. </span></span></div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;"></span></span> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.navicat.com/images/stories/product/sqlserver/img84.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="http://www.navicat.com/images/stories/product/sqlserver/img84.jpg" width="400" /></a></div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;">Les dejo un enlace a dicho producto: </span></span></div>
<div style="text-align: justify;">
<span class="userContent"></span> </div>
<div style="text-align: justify;">
<span class="userContent"><a href="http://www.navicat.com/en/products/navicat_sqlserver/sqlserver_overview.html" rel="nofollow nofollow" target="_blank"><span style="font-family: Verdana, sans-serif;">http://www.navicat.com/en/<wbr></wbr><span class="word_break"></span>products/navicat_sqlserver/<wbr></wbr><span class="word_break"></span>sqlserver_overview.html</span></a></span></div>
<div style="text-align: justify;">
<span class="userContent"></span> </div>
<div style="text-align: justify;">
<span class="userContent"><span style="font-family: Verdana, sans-serif;">Saludos y hasta la próxima!</span></span></div>
Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0tag:blogger.com,1999:blog-2648938709989199331.post-39393814593652506562012-07-03T11:08:00.000-03:002012-07-03T11:09:13.847-03:00Taller de aplicaciones MetroEstimados, queremos invitarlos al taller "Como crear tu primer aplicación estilo Metro y Acceder al Windows Store" el día Lunes 9 de Julio de 14:00 a 18:00 en las oficinas de Microsoft Uruguay. Cebollatí 1474, Mercosur Business Center, piso 5. Va a estar dando el taller un excelente profesional: Miguel Saez - Developer Evangelist @ Microsoft. <br />
<br />
Para concurrir recuerden registrarse en: <a href="http://www.meetup.com/Desarrolladores-Windows-de-Argentina-y-Uruguay/events/71704982/">http://www.meetup.com/Desarrolladores-Windows-de-Argentina-y-Uruguay/events/71704982/</a>Anonymoushttp://www.blogger.com/profile/04018505459032330687noreply@blogger.com0