tag:blogger.com,1999:blog-91711496356351853172024-02-19T06:59:35.194-03:00Escritura Ágil - Agile WritingEsfuerzo Por Agregar Valor, No Por Ser Perfecto!
Strive For Adding Value, Not Being Perfect!Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.comBlogger80125tag:blogger.com,1999:blog-9171149635635185317.post-54687760359435794422020-11-13T18:29:00.000-03:002020-11-13T18:29:03.648-03:00Covid, iniciación a análisis de datos y PythonLes dejo una charla que tuve por chat con una compañera del trabajo acerca de aprender Python y de cómo hice esto que está en mi <a href="https://www.blogger.com/#">repo acerca del estado del COVID en Argentina</a> y espero que sirva de inspiración para alguien.<br /><br /><i>Yo de python no se mucho pero busco en internet como hacer las cosas y las adapto pero amen de no saber la sintanxis, si conocia algunas cosas que son las que preguntas vos como "conceptos"<br /><br />Yo creo que mas q aprender python, que es como aprender cualquier lenguaje, hay que aprender que ecosistema / librerias tiene python para realizar las tareas mas comunes y como funcionan.<br /><br />Para manejar sets de datos, siempre se usa pandas, que es una librerias que crea una entidad en memoria y te permite manipularla de mil maneras y tiene muchas cosas de estadisticas ya metidas <a href="https://pandas.pydata.org/">https://pandas.pydata.org/</a> Entonces al saber que pandas sirve para manipular datos, busco en google cosas como x ej python pandas load files from csv<br /><br />Para graficar, se usa matplotlib.pyplot, <a href="https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.html">https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.html</a> y hago lo mismo, busco en google: python plot linear graph <a href="https://www.google.com/search?q=python+plot+linear+graph&rlz=1C1GCEA_enAR875AR875&oq=python+plot+linear+graph&aqs=chrome..69i57.177j0j1&sourceid=chrome&ie=UTF-8">https://www.google.com/search?q=python+plot+linear+graph&rlz=1C1GCEA_enAR875AR875&oq=python+plot+linear+graph&aqs=chrome..69i57.177j0j1&sourceid=chrome&ie=UTF-8</a> <br /><br />Y ahi te aparecen muchísimos blogs con info... lo que tiene python es una comunidad y librerías muy grande, asi que vas a encontrar info para todo.<br /><br /></i><div><i>Con esas 2 librerías hice la mayor parte de todo<br /><br />Después cosas básicas, como x ej como hacer un request a una url en python<br /><br />Otras librerías que se usan siempre son NumPy y SciPy que sirven para hacer operaciones cientificas con numeros, <a href="https://numpy.org/">https://numpy.org/</a> <br /><br />Todas esas son tipo standar que luego te sirve como input para los FWKs de AI <br /><br />Uno de los mas faciles y mas usados en https://scikit-learn.org/stable/<br /><br />Con solo esto, vas a podes hacer muchisisisisismas cosas de AI, analisis de datos, etc...<br /><br />Después si te queres conectar a una BD SQL Server x ej, buscas como se hace y el resultado lo metes en un dataframe de PANDAS (la lib que te comentaba al principio)<br /><br />Para hacer pruebas siempre te conviene usar jupyter notebooks (que son esos que viste en mi repo), te lo podes instalar todo localmente mediante el entorno <a href="https://www.anaconda.com/">https://www.anaconda.com/</a> o usas <a href="https://colab.research.google.com/">https://colab.research.google.com/</a> que ya esta todo hosteado en la nube y no tenes que instalar ni pelearte con nada, azure tiene lo mismo <a href="https://notebooks.azure.com/">https://notebooks.azure.com/</a> <br /><br />Para hacer cosas básicas y empezar, los planes gratis te sirven y te bastan... y si necesitas mas power, pagas o instalas todo en tu máquina local</i></div><div><br />Para mi todo esto que te explique es el verdadero valor y poder de python...<br /></div>Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-18977388439812072092020-01-02T17:22:00.000-03:002020-01-02T17:23:50.291-03:00AI notesHere you have some notes I took during my AI learning path. They are what they are .. just simple useful notes. Enjoy them!<br />
<h2>
What is machine learning?</h2>
Machine learning is often thought to mean the same thing as AI, but they aren’t actually the same. AI involves machines that can perform tasks characteristic of human intelligence. AI can also be implemented by using machine learning, in addition to other techniques.<br />
<img height="268" src="https://lh4.googleusercontent.com/r1CmkWY-3SydAmiaqFiOH64dOShqFw8oGXQLsdLxYeVZ5vudAgk5tOJezqV-pA8b6GO65SgR-SQndcw--AUts4uUQbl1BS_yOMtxcDMrKno362WdSNXXWg_lE7RsFeqc_jirF4iA" width="640" /><br />
<br />
Machine learning itself is a field of computer science that gives computers the ability to learn without being explicitly programmed. Machine learning can be achieved by using one or multiple algorithm technologies, like neural networks, deep learning, and Bayesian networks.<br />
<br />
<img src="https://lh4.googleusercontent.com/NiJ79VBzCoQTiAc3t4X1fr_ZAVnaL2dtyVdcTlk7Th7G7T-auPafPJgY0BDtFBoSUxvVxU6Z5w7R8FUjeicjaoJ5kkiSax73J4z1_kfeq5GC4Mmc7XAbqikJO1brmKHJ9QYLbaIq" /><br />
The machine learning process works as follows:<br />
<ul>
<li>Data contains patterns. You probably know about some of the patterns, like user ordering habits. It’s also likely that there are many patterns in data with which you’re unfamiliar.</li>
<li>The machine learning algorithm is the intelligent piece of software that can find patterns in data. This algorithm can be one you create using techniques like deep learning or supervised learning.</li>
<li>Finding patterns in data using a machine learning algorithm is called “training a machine learning model.” The training results in a machine learning model. This contains the learnings of the machine learning algorithm.</li>
<li>Applications use the model by feeding it new data and working with the results. New data is analyzed according to the patterns found in the data. For example, when you train a machine learning model to recognize dogs in images, it should identify a dog in an image that it has never seen before.</li>
</ul>
The crucial part of this process is that it is iterative. The machine learning model is constantly improved by training it with new data and adjusting the algorithm or helping it identify correct results from wrong ones.<br />
<h2>
Visualising datasets </h2>
The first step around any data related challenge is to start by exploring the data itself. This could be by looking at, for example, the distributions of certain variables or looking at potential correlations between variables.<br />
<br />
The problem nowadays is that most datasets have a large number of variables. In other words, they have a high number of dimensions along which the data is distributed. Visually exploring the data can then become challenging and most of the time even practically impossible to do manually. However, such visual exploration is incredibly important in any data-related problem. Therefore it is key to understand how to visualise high-dimensional datasets. This can be achieved using techniques known as dimensionality reduction. This post will focus on two techniques that will allow us to do this: PCA and t-SNE.<br />
<br />
<a href="https://towardsdatascience.com/visualising-high-dimensional-datasets-using-pca-and-t-sne-in-python-8ef87e7915b">https://towardsdatascience.com/visualising-high-dimensional-datasets-using-pca-and-t-sne-in-python-8ef87e7915b</a><br />
<h2>
Prepare data</h2>
A dataset usually requires some preprocessing before it can be analyzed. You might have noticed some missing values when visualizing the dataset. These missing values need to be cleaned so the model can analyze the data correctly. <br />
<h3>
Basics of Entity Resolution with Python and Dedupe</h3>
<a href="https://medium.com/district-data-labs/basics-of-entity-resolution-with-python-and-dedupe-bc87440b64d4">https://medium.com/district-data-labs/basics-of-entity-resolution-with-python-and-dedupe-bc87440b64d4</a><br />
<h3>
Categorical columns</h3>
<ul>
<li>Features which have some order associated with them are called ordinal features.</li>
<li>Features without any order of precedence are called nominal features.</li>
<li>There are also continuous features. These are numeric variables that have an infinite number of values between any two values. A continuous variable can be numeric or a date/time.</li>
</ul>
Use Category Encoders to improve model performance when you have nominal or ordinal data that may provide value.<br />
<ul>
<li>For ordinal columns try Ordinal (Integer), Binary, OneHot, LeaveOneOut, and Target. Helmert, Sum, BackwardDifference and Polynomial are less likely to be helpful, but if you have time or theoretic reason you might want to try them.</li>
</ul>
<i>With only three levels, the information embedded becomes muddled. There are many collisions and the model can’t glean much information from the features. Just one-hot encode a column if it only has a few values. In contrast, binary really shines when the cardinality of the column is higher — with the 50 US states, for example.</i><br />
<ul>
<li>For nominal columns try OneHot, Hashing, LeaveOneOut, and Target encoding. Avoid OneHot for high cardinality columns and decision tree-based algorithms.</li>
</ul>
<i>For nominal data a hashing algorithm with more fine-grained control usually makes more sense. If you’ve used binary encoding successfully, please share in the comments. HashingEncoder implements the <a href="https://medium.com/value-stream-design/introducing-one-of-the-best-hacks-in-machine-learning-the-hashing-trick-bf6a9c8af18f">hashing trick</a>. It is similar to one-hot encoding but with fewer new dimensions and some info loss due to collisions.</i><br />
<ul>
<li>For regression tasks, Target and LeaveOneOut probably won’t work well.</li>
</ul>
<a href="https://www.datacamp.com/community/tutorials/categorical-data">https://www.datacamp.com/community/tutorials/categorical-data</a><br />
<br />
<a href="https://towardsdatascience.com/smarter-ways-to-encode-categorical-data-for-machine-learning-part-1-of-3-6dca2f71b159">https://towardsdatascience.com/smarter-ways-to-encode-categorical-data-for-machine-learning-part-1-of-3-6dca2f71b159</a><br />
<h3>
Values normalization</h3>
Many machine learning algorithms work better when features are on a relatively similar scale and close to normally distributed. MinMaxScaler, RobustScaler, StandardScaler, and Normalizer are <a href="https://scikit-learn.org/stable/index.html?source=post_page---------------------------">scikit-learn</a> methods to preprocess data for machine learning.<br />
<br />
<a href="https://towardsdatascience.com/scale-standardize-or-normalize-with-scikit-learn-6ccc7d176a02">https://towardsdatascience.com/scale-standardize-or-normalize-with-scikit-learn-6ccc7d176a02</a><br />
<br />
<img height="134" src="https://lh4.googleusercontent.com/bUaq9uKjjZ_IaM808y8htYtkXYQw7RpQuZN3rqSyDlq5d2POxWl9sytsHeNxWqC2EnFWFYQ49fe_hgPhaH-jrNuXPENN3U0s6DYChToZ06GCEG487fM2uZdsEVDFqxmksC-xELFP" width="640" /><br />
<h3>
Synthetic data generation — a must-have skill for new data scientists</h3>
A brief rundown of methods/packages/ideas to generate synthetic data for self-driven data science projects and deep diving into machine learning methods.<br />
<br />
<a href="https://towardsdatascience.com/synthetic-data-generation-a-must-have-skill-for-new-data-scientists-915896c0c1ae">https://towardsdatascience.com/synthetic-data-generation-a-must-have-skill-for-new-data-scientists-915896c0c1ae</a><br />
<br />
<a href="https://github.com/tirthajyoti/Machine-Learning-with-Python/blob/master/Synthetic_data_generation/Synthetic-Data-Generation.ipynb?source=post_page---------------------------">https://github.com/tirthajyoti/Machine-Learning-with-Python/blob/master/Synthetic_data_generation/Synthetic-Data-Generation.ipynb?source=post_page---------------------------</a><br />
<h2>
Pipeline in Machine Learning with Scikit-learn</h2>
Definition of pipeline class according to scikit-learn is “Sequentially apply a list of transforms and a final estimator. Intermediate steps of pipeline must implement fit and transform methods and the final estimator only needs to implement fit.”<br />
<br />
<a href="https://towardsdatascience.com/a-simple-example-of-pipeline-in-machine-learning-with-scikit-learn-e726ffbb6976">https://towardsdatascience.com/a-simple-example-of-pipeline-in-machine-learning-with-scikit-learn-e726ffbb6976</a><br />
<h2>
Testing the Neural Network</h2>
<h3>
Precision, recall, and the f1-score</h3>
<br />
Given the following results:<br />
<br />
precision recall f1-score support<br />
<br />
0 0.76 0.78 0.77 650<br />
<br />
1 0.98 0.96 0.97 1990<br />
<br />
2 0.91 0.94 0.92 452<br />
<br />
3 0.99 0.84 0.91 370<br />
<br />
4 0.82 0.77 0.79 725<br />
<br />
5 0.93 0.98 0.95 2397<br />
<br />
avg / total 0.92 0.92 0.92 6584<br />
<br />
Here is a brief recap of what those scores mean:<img height="156" src="https://lh5.googleusercontent.com/Ffi1iGdSrnYGbEkDr5WK8QBlT4UKpHArjShrGE2tBb9h2FX_ZM4lZT-BDgaEZseIsooyGIAJCt6cbMDG-mYrN5KZf8KO9UzaPFSA69yY8W7tkevmFWyVsqyqV0oQPBqycvQ3EScY" width="640" /><br />
<br />
“Prediction versus Outcome Matrix” by Nils Ackermann is licensed under Creative Commons <a href="https://creativecommons.org/licenses/by-nd/4.0/?source=post_page---------------------------">CC BY-ND 4.0</a><br />
<ul>
<li>Accuracy: The ratio between correctly predicted outcomes and the sum of all predictions. ((TP + TN) / (TP + TN + FP + FN))</li>
<li>Precision: When the model predicted positive, was it right? All true positives divided by all positive predictions. (TP / (TP + FP))</li>
<li>Recall: How many positives did the model identify out of all possible positives? True positives divided by all actual positives. (TP / (TP + FN))</li>
<li>F1-score: This is the weighted average of precision and recall. (2 x recall x precision / (recall + precision))</li>
</ul>
The associated confusion matrix against the test data looks as following.<br />
<br />
<img src="https://lh3.googleusercontent.com/Irl_39mnC7ZXhp5Z5E8XewwRybsk-tNm0vob4apjNmy4dxkAcoGfwcEzQuoipOdL7KRHNV81XkYpBEd0a-cfkG-NTfST1MqaSbMyzZ7eUciGY1-vYfXIsukDaFQiyZqWZ6fPlqlO" /><br />
<h2>
Explainability on a Macro Level with SHAP</h2>
The whole idea behind both SHAP and LIME is to provide model interpretability. I find it useful to think of model interpretability in two classes — local and global. Local interpretability of models consists of providing detailed explanations for why an individual prediction was made. This helps decision makers trust the model and know how to integrate its recommendations with other decision factors. Global interpretability of models entails seeking to understand the overall structure of the model. This is much bigger (and much harder) than explaining a single prediction since it involves making statements about how the model works in general, not just on one prediction. Global interpretability is generally more important to executive sponsors needing to understand the model at a high level, auditors looking to validate model decisions in aggregate, and scientists wanting to verify that the model matches their theoretical understanding of the system being studied.<br />
<br />
<a href="https://blog.dominodatalab.com/shap-lime-python-libraries-part-2-using-shap-lime/">https://blog.dominodatalab.com/shap-lime-python-libraries-part-2-using-shap-lime/</a><br />
<br />
Shap explanation and its graphs<br />
<a href="https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27">https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27</a>Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com1tag:blogger.com,1999:blog-9171149635635185317.post-80471949341880541082019-10-31T11:28:00.001-03:002019-10-31T11:28:30.191-03:00Windows Server Core ltsc2019 Docker image on Windows 10 1803: no matching manifest for windows/amd64 10.0.17134 in the manifest list entries<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I'm trying to create a Windows Server Core ltsc2019 Docker image on Windows 10 1803 and when trying to get the docker image from the registry I'm getting</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>$ docker run mcr.microsoft.com/windows/servercore:ltsc2019</i></div>
<div>
<div style="text-align: justify;">
<i>Unable to find image 'mcr.microsoft.com/windows/servercore:ltsc2019' locally</i></div>
<div>
<div style="text-align: justify;">
<i>ltsc2019: Pulling from windows/servercore</i></div>
<div style="text-align: justify;">
<i>docker: no matching manifest for windows/amd64 10.0.17134 in the manifest list entries.</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Searching the Internet I came with the solution, "<i>your pulling image must match the version of Windows that you're running</i>" <a href="https://github.com/docker/for-win/issues/3761#issuecomment-498315046">https://github.com/docker/for-win/issues/3761#issuecomment-498315046</a> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
And the explanation is simple (and also on that thread) "<i>the version must match the Windows kernel version you're running on. Unlike Linux, the Windows kernel does not have a stable API, so container images running on Windows must have libraries that match the kernel on which they will be running to make it work (which is also why those images are a lot bigger than Linux images).</i>" <a href="https://github.com/docker/for-win/issues/3761#issuecomment-484131393">https://github.com/docker/for-win/issues/3761#issuecomment-484131393</a> </div>
<div>
<br /></div>
</div>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com1tag:blogger.com,1999:blog-9171149635635185317.post-87499977610131160632019-10-23T17:30:00.002-03:002019-11-07T10:16:56.866-03:00Aplicando practicas modernas de desarrollo a proyectos hosteados en TFS / legacySi me preguntan cuáles son las prácticas que deberían aplicarse a un proyecto de desarrollo de software hoy en día, sin importar su tamaño, yo rápidamente respondería:<br />
<br />
<ol>
<li>Utilización de <a href="https://www.docker.com/resources/what-container" target="_blank">containers</a> para levantar entornos de trabajo. </li>
<li><a href="https://en.wikipedia.org/wiki/Source_Code_Control_System" target="_blank">Código versionado</a> en herramienta moderna. Hoy en día el estandar de la industria es <a href="https://git-scm.com/" target="_blank">GIT</a></li>
<li>Aplicar <a href="https://en.wikipedia.org/wiki/Code_refactoring" target="_blank">refactorización</a> a ese código.</li>
<li>Que ese código tenga una buena <a href="https://en.wikipedia.org/wiki/Code_coverage" target="_blank">cobertura</a>.</li>
<li>Integrar las modificaciones al código continuamente y que <a href="https://www.atlassian.com/continuous-delivery/continuous-integration" target="_blank">un server compile el código y verifique que no haya roto nada</a>.</li>
<li>Hace un <a href="https://www.perforce.com/blog/sca/what-static-code-analysis" target="_blank">análisis de mi código</a> que me asegure que sigo standard, que me de métricas sobre mi código, etc.</li>
<li><a href="https://en.wikipedia.org/wiki/Test_automation" target="_blank">Test automatizados</a></li>
<li><a href="https://www.atlassian.com/continuous-delivery/principles/continuous-integration-vs-delivery-vs-deployment" target="_blank">Delivery / deploy automatizado y continuo</a></li>
</ol>
<br />
Y si me apuran aún mas, respondo "<i>como mínimo integrar las modificaciones al código continuamente y que <a href="https://www.atlassian.com/continuous-delivery/continuous-integration" target="_blank">un server compile el código y verifique que no haya roto nada</a></i>" aunque a veces en mucho pedir.<br />
<br />
Ahora, déjenme que les cuente una historia a ver si les suena familiar.<br />
<br />
Este año me sume a trabajar a un equipo que desarrollaba una aplicación web para un cierto cliente. El código ha sido tocado por mucha gente, de distintos senorities y ni hablar de los errores inexplicables que se encuentran o del código dulpicado que hay.<br />
<br />
El código fuente del proyecto estaba hosteado en el TFS del cliente con un <a href="https://jenkins.io/" target="_blank">Jenkins</a> build server y deploy server (que no controlamos). Este build server no está configurado como <a href="https://www.atlassian.com/continuous-delivery/continuous-integration" target="_blank">integración continua</a><br />
<br />
El Jenkins ejecuta un análisis de código con <a href="https://www.sonarqube.org/" target="_blank">SonarQube</a> aunque tampoco tenemos acceso. El acceso a los análisis de SonarQube nos serviría para tener métricas de nuestro código, ver como evoluciona / involuciona y ayudaría a los desarrolladores más juniors a que aprendan y mejoren.<br />
<br />
A pesar que no hacemos <a href="http://agiledata.org/essays/tdd.html" target="_blank">TDD</a> (y que la arquitectura de app no lo permite), hay algunos <a href="http://softwaretestingfundamentals.com/unit-testing/" target="_blank">unit test</a> escritos que nunca se ejecutan.<br />
<br />
<u>Conclusión:</u> casi ninguno de los puntos nombrados al principio se cumplen.<br />
<br />
¿Seguimos desarrollando así? la respuesta es muy simple NOOOOOOOOOOOO<br />
¿Qué opciones tengo? ahi la cosa es más compleja pero nada complicado gracias a la cantidad de herramientas con las que contamos hoy en día:<br />
<br />
<ol>
<li>Utilizar un GIT controlado por nosotros y luego integremos los cambios en el TFS. Esto es facil de hacer con <a href="http://git-tfs.com/" target="_blank">GIT TFS</a>, un comando que nos permite clonar en un repo GIT el código fuente hosteado en un TFS y tener una comunicación bidireccional. Una vez que controlamos el repo, el resto es más facil!</li>
<li>Como integración continua podemos usar algo como <a href="https://azure.microsoft.com/es-es/services/devops/" target="_blank">Azure DevOPS</a> para que buildee el código continuamente y ejecute las tareas que necesitamos:</li>
<ul>
<li>Unit Tests</li>
<li>Análisis SonarQube (Instalar SonarQube en una VM en Azure <a href="https://bitnami.com/stack/sonarqube/cloud/azure">https://bitnami.com/stack/sonarqube/cloud/azure</a>) </li>
<li>Integración de código nuevamente en TFS</li>
</ul>
</ol>
<br />
Ya con el hecho de usar <a href="http://git-tfs.com/" target="_blank">GIT TFS</a> y <a href="https://azure.microsoft.com/es-es/services/devops/" target="_blank">Azure DevOPS</a> junto a los Unit Test y SonarQube logramos tener mucho más de lo que originalmente teníamos y hemos mejorado notablemente nuestra calidad.Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-18935965820263842962019-10-10T16:11:00.000-03:002019-10-10T16:12:16.859-03:00Asp.Net Core + GraphQL + Docker + Github + AzureDevOps + SonarQubeThis project was created to learn about GraphQL and to spread the learnings. You can find the related PPT <a href="http://bit.ly/NeorisGraphQLPPT">http://bit.ly/NeorisGraphQLPPT</a><br />
<div>
<br /></div>
<div>
Project source code: <a href="https://github.com/vackup/AspNetCoreGraphQL/">https://github.com/vackup/AspNetCoreGraphQL/</a><br />
<br />
The app runs on 2 docker containers, one for the React frontend and one for the Asp.Net Core GraphQL backend <br />
<ul>
<li><a href="https://docs.docker.com/engine/examples/dotnetcore/">https://docs.docker.com/engine/examples/dotnetcore/</a></li>
<li><a href="https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/?view=aspnetcore-2.2">https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/?view=aspnetcore-2.2</a></li>
</ul>
The project is being built using Azure Devops build pipelines (<a href="http://devops.azure.com/">http://devops.azure.com</a>)<br />
<br />
<br />
<a href="https://dev.azure.com/hernanzaldivar/GraphQLSamples/_build/latest?definitionId=28&branchName=master"><img src="https://camo.githubusercontent.com/f6bdc2fd9d9dc5a5ef619abd8a17a4588868c9f7/68747470733a2f2f6465762e617a7572652e636f6d2f6865726e616e7a616c64697661722f4772617068514c53616d706c65732f5f617069732f6275696c642f7374617475732f7661636b75702e4173704e6574436f72654772617068514c3f6272616e63684e616d653d6d6173746572" /></a><br />
<br />
Continuous Code Inspection is being done by SonarQube (<a href="https://www.sonarqube.org/">https://www.sonarqube.org/</a>).<br />
<div>
AspNetCoreGraphQL SonarCloud Dashboard <a href="https://sonarcloud.io/dashboard?id=vackup_AspNetCoreGraphQL">https://sonarcloud.io/dashboard?id=vackup_AspNetCoreGraphQL</a></div>
<h2>
<br /></h2>
<h2>
What's GraphQL?</h2>
<div>
GraphQL (<a href="https://graphql.org/">https://graphql.org/</a>) is a data query language and specification developed internally by Facebook in 2012 before being publicly open sourced in 2015.<br />
<br />
It provides an alternative to REST-based architectures with the purpose of increasing developer productivity and minimizing amounts of data transferred.<br />
<br />
GraphQL is used in production by hundreds of organizations of all sizes including Facebook, Credit Karma, GitHub, Intuit, PayPal, the New York Times and many more. <a href="https://graphql.org/users/">https://graphql.org/users/</a><br />
<br />
Some post for building GraphQL APIs with ASP.NET Core <br />
<ul>
<li><a href="https://medium.com/volosoft/building-graphql-apis-with-asp-net-core-419b32a5305b">https://medium.com/volosoft/building-graphql-apis-with-asp-net-core-419b32a5305b</a> </li>
<li><a href="https://code-maze.com/graphql-asp-net-core-tutorial/">https://code-maze.com/graphql-asp-net-core-tutorial/</a></li>
</ul>
<ul style="background-color: white; box-sizing: border-box; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 0px !important; margin-top: 0px; padding-left: 2em;">
</ul>
</div>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-15946146000378501362019-09-23T11:22:00.001-03:002019-09-24T09:27:33.867-03:00Mi (primer) experiencia en las jornadas agiles latam 2019En este post quiero compartir lo que tooooooooooodo lo que me dejo las jornadas Agiles Latam 2019 (<a href="https://twitter.com/agilesla">https://twitter.com/agilesla</a>) llevadas a cabo en mi ciudad Rosario, Argentina. Obviamente es un post que lo único que espera es aportar un granito de arena, no trata de ser perfecto, completo o excelente, simplemente aportar un poco de valor.<br />
<div>
<br /></div>
<div>
Sinceramente me llevo muchísimo más de lo que fui a buscar. Como siempre digo, las personas son todo!!! eso es lo más importante y lindo que me llevo... que hay muchísimos "locos" ahí afuera queriendo cambiar el mundo y trata de hacer de él un lugar mucho mejor! Ver como todo fluía con respeto y sinceridad, con ganas.. como las cosas se iban dando me voló la cabeza. Me llevo interacciones impresionantes, experiencias, charlas, demostrar que en mi ciudad se puede hacer evento de calidad internacional. Poder compartir con personas grosas de todo punto de vista cuya única finalidad era compartir su conocimiento, sea mucho o poco, pero solo compartir desinteresadamente.<br />
<br />
Me fui con la cabeza aún más abiertas, yo siendo el mismo pero distinto a la vez, con muchas más ganas. Y debo confezar un gran cambio que ocurrió en mi: antes las actividades del tipo "habla con la persona que tenés al lado por 1 minuto de tal tema" las odiaba, me costaban y no les encontraba sentido. Hoy puedo decir que me encantan y cuando no hay de ese tipo de actividades, es como que me falta algo.<br />
<br />
<h2>
Manifiesto agiles latam</h2>
<img height="480" src="https://lh5.googleusercontent.com/9b5pIWdZQ_voZZ1fCwfH6EQzOk7jVIeCvSSzIw1HT_tM4Ms-nWpUVElUlMPOjVB2y3PF0LPZaia0qCCFBfIuyevAoeXPvtQ0RIo4oYbv_l8IXDe-UIgfX5pqa5TKqBFIMjCirrD3" width="640" /></div>
<div>
<h2>
Dinámica de las charlas y agenda</h2>
Agenda completa <a href="https://agiles2019.sched.com/">https://agiles2019.sched.com/</a></div>
<div>
<br />
<img height="480" src="https://lh4.googleusercontent.com/A-MnXQlfOQY5cAS_ox4sfLfqr_JqwdUSWpvgjd4I_DW6_8j4Vy5AS-sNZmA3wKlFiKjp7b0eSPnkg1nzSOf_nkxVL96qvTUFaRR8MOaQ3Hnw6ocqHCecsKjZF7tWzgMezbL-zc-1" width="640" /></div>
<div>
<br /></div>
<div>
<img height="480" src="https://lh4.googleusercontent.com/LgvFVjdESelOp1vMW0vw9nu3IFBbngNCvf4udnMvwtbJfoC6gE4OgoQjug-bcjkafXz4Yo2zNnj1_gDMJNYW9vIuHDwzY4b4HoA_pSn_LlJVdbPZGQFhozFj7cB9Y-Zc2z6oXtRu" width="640" /></div>
<div>
<br /></div>
<div>
<img height="640" src="https://lh5.googleusercontent.com/sAdgiEoNlPrdBYAeIjpiAsS_eJQwd5A1nfWjWV-beMVjf3emo6N2QpmRk3I3zD3wvbTy4Ozle8XWrg3rZVulaxMq6kOpX5wh1dfOd-luFmiw0B837gEUMpTTPfr19QtlikbsnxOY" width="480" /><br />
<h2>
Jueves</h2>
<h4>
Del EGO sistema al ECO sistema</h4>
<br />
<img height="640" src="https://lh6.googleusercontent.com/5_wLp4-QmlFT8qbIi8rKvaUWD8NRBDIcnVPcbkdPPPWOozOkfcXj5hAQQ4OvnnAcgBlp5FsOb_IzA4EGx6iA_JJupMgwrUu07y2ys522yA7Z1Y0h_i8i1sevF3spJ4GtXyOOhqsx" width="311" /><br />
<br />
<a href="https://drive.google.com/open?id=10bVLRsLLz_dI_h3-koess_HkRmsT5R82">Del Egosistema al Ecosistema_RoseRestrepoV-TA.pptx</a><br />
<br />
<h4>
Desarrollo del liderazgo con #leadershipdancefloor</h4>
<img height="640" src="https://lh5.googleusercontent.com/yvIALfFSSo4aA04zZiRuDaSp1wWYFAB4vK9Q4mh-rSJAphNtOniyfSTLevZ9apYfk0dNC02DxvBk7SwTwn4jS-YYBMeOANpVzAxazz5CaFuwt9GhleglSUnqbreOpTYdrXIsgibm" width="480" /><br />
<br />
<h4>
Empresas sin Jefes (Caso 10 Pines)</h4>
<a href="https://www.10pines.com/">https://www.10pines.com/</a><br />
<ul>
<li>No es cooperativa, es SRL, pero solo por figura pública, todo se decide entre todos. Toma de decisiones → Fue una evolución / iteración la forma en que se toman las decisiones de 6 a 80 empleados.</li>
<ul>
<li>Decisiones triviales → usan Lumio (x ej: compra de cafeteras)</li>
<li>Decisiones importantes → pasaron del consenso (100% de acuerdo) a “nadie en desacuerdo” (quizá hay decisiones que no me importa y lo que decidan los demás me parece bien)</li>
</ul>
<li>Reunión de roots (raíces, personas de más de 3 meses dentro de la compañia) para temas importantes</li>
<li>Números abiertos → todos saben todos los número de la compañía, sueldos incluidos y se autoregulan (ver próxima charla)</li>
<li>La mayoría son devs, sólo 3 de administración. Hay grupos que desempeñan funciones como x ej ventas, hardware, recruting, etc.</li>
<li>50% de las ganancias se reparte como bono según fórmula (la fórmula la revisan todos los años)</li>
<li>Las personas que ingresan, están 3 meses sin asignación aprendiendo ya dentro de la empresa. </li>
<li>Todos los viernes los proyectos hacen tipo una daily global.</li>
<ul>
<li>Se reconoce la kudo wall virtual</li>
<ul>
<li><a href="https://kudos.10pines.com/">https://kudos.10pines.com/</a></li>
<li><a href="https://github.com/10Pines/kudo-wall">https://github.com/10Pines/kudo-wall</a></li>
</ul>
</ul>
<li>Aumentos de sueldos → cada uno se postula y necesita aval. Hubo casos de gente que rechazo el aumento porque consideraba que iba a ganar algo más que otro que consideraba que aportaba más</li>
<li>Confianza</li>
<li>Capacitación</li>
<li>Reunión anual donde se definen las cosas a hacer en el corto plazo, lo que quieren, lo que desean, retro general, etc</li>
</ul>
<br />
<img height="640" src="https://lh3.googleusercontent.com/wVlB_HUKhiEWlIeT6DRbFZqsT1wcQL6Y_tC0BWD1OsYsR2FWQOz177n3RvoRNUxW4ZUuJDHeCoBiKOj58mLN_8N8Ll3ZisF-96iWKCc3w_tVOWG5vmnWBLNnP5XYga3B5or_ZmVR" width="480" /></div>
<div>
<h3>
Receta para números abiertos en tu empresa (10 pines)</h3>
<h4>
<img height="640" src="https://lh4.googleusercontent.com/bWjEkm9cq8rf0Ihnkw5ijIIltQ7gIcKffWO8xQdjWP-sD1q-xhl8S_71PQBYucInZq1zjQxQmvOdMVJ6AH5slDRGa4gsSyvNC1P9h817lyELpHzuOjCG6hPFU6DhH8iZavZs_YSL" width="480" /></h4>
<h2>
Viernes</h2>
<h4>
Libros Latam</h4>
<a href="https://blog.nicopaez.com/2019/09/20/notas-de-la-sesion-de-libros-de-autores-latinoamericanos-en-agiles-2019/">https://blog.nicopaez.com/2019/09/20/notas-de-la-sesion-de-libros-de-autores-latinoamericanos-en-agiles-2019/</a><br />
<br />
<a href="https://docs.google.com/presentation/d/1ONsz-Wpjbl70nHyI2svpgy71_poepuvq8lnRs1dTo50/edit#slide=id.g34d96f1218_0_8">https://docs.google.com/presentation/d/1ONsz-Wpjbl70nHyI2svpgy71_poepuvq8lnRs1dTo50/edit#slide=id.g34d96f1218_0_8</a><br />
<br />
<a href="https://10pines.gitbook.io/desarrollo-de-software-agil-en-10pines/">https://10pines.gitbook.io/desarrollo-de-software-agil-en-10pines/</a><br />
<br />
<h4>
Charlas para generar futuro</h4>
<br />
<br />
<img height="480" src="https://lh3.googleusercontent.com/ItmL0zGPEnbWbCs2ke900UNY2Ok0HiY9cD5PcZq3LTUEb2-p-ds2s8qsQf65YhuZPfG-Lrr2rnoS743d0wxvnQKVqFfbW-vKki3JuJTRhkaCVnFI_WZV9XqhCjGbj_lBN1MTuezd" width="640" /><br />
<br />
<br />
<img height="640" src="https://lh3.googleusercontent.com/VY4juT1-ZNhjSrwxBSk3NovJfjiQlnllNpMkxqJxFnzgfKFRwb9z726E-mo7Bmv5ZX_C4W88i3bkrbrTT3Jhc846ieM8wrhdV9hzlKWB3E0DDU5x8d2BY8msZISCEV05MasbJPLS" width="480" /><br />
<br />
<br />
<img height="640" src="https://lh5.googleusercontent.com/IYf_S5fG5J5pvybze0eOZ0q3gjIuY76tLCKA4xZrmK6_Hqj46naKudNk0txWgrszACxBtr9UZMIq4QA6l7UEAR8aNf-9dUbc1gM-oWZUZUMFcoYI2_3eYInP5LrB5t9Q6Vn6imjS" width="480" /><br />
<br />
<br />
<img height="640" src="https://lh6.googleusercontent.com/XwLBH_fkYMQl47eC_K5WShKqq6NRkhRD4oqLDzpZQ6OWlE3rR35X4DC5kFY-UCjxuVRkZA3mLpwso1BKYG51uFuEk3Vf_ANVP6fuAgHoFd4poTvmSXeuUO_gjMqCBFP8bQZQcDpb" width="480" /><br />
<br />
<br />
<img height="640" src="https://lh6.googleusercontent.com/Eq7jrQyVbGvNcCPehN2CdD4H2OhEKcixWMzk8fjBq4ivKDZnaMBNvSj_vgE5ccTlqf47CgI6zIcALtMA2UtA3pV2zcmzeHEwaKI8rz5pmgdfDyiifXym7of3YsvUtKAMNBXvFP1q" width="480" /><br />
<br />
<br />
<img height="640" src="https://lh6.googleusercontent.com/LeqKas_7xHp3kByIjVybjj6QKdRmIRtOMhAAUCk9XqCho0-IB237dxph7FmFvZsv_ImzN1CWKEFjWQ6s5NYpSKAg6mpscWL7iiQrczBiY1MMor43QWrcMq7WJMWCFDN_zOEsgHk-" width="480" /><br />
<br />
<h4>
Open space xxl</h4>
<h4>
Historias de los abuelos (Ing y otros) & #EffectiveScrum Menos reuniones y mejores resultados</h4>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0Rosario, Santa Fe, Argentina-32.9587022 -60.693041600000015-33.1718887 -61.015765100000017 -32.7455157 -60.370318100000013tag:blogger.com,1999:blog-9171149635635185317.post-82796883398403052422019-09-12T09:44:00.002-03:002019-09-12T10:00:19.861-03:00Learning GraphQL using NodeJS<h2>
Motivation and background</h2>
Trying to learn GraphQL (<a href="https://graphql.org/">https://graphql.org/</a>) I found the "Code Challenge for Scoutbase" (<a href="https://medium.com/scoutbase/we-are-hiring-javascript-developers-e7833762a40d">https://medium.com/scoutbase/we-are-hiring-javascript-developers-e7833762a40d</a>).<br />
<br />
The drawback of the challenge was that I've never done a nodejs app but as I knew JS and I have many many years of experience building web apps (mainly .net) and I love to learn new thing, I decided to go for it!<br />
<br />
So I went from nothing (0) using NodeJs, GraphQL, Sequelize, PostgreSQL to this in just a couple of hours.<br />
<br />
Here you have the code (it's an MVP or a prototype) and the code challenge description<br />
<a href="https://github.com/vackup/scoutbase-code-challenge-back-end/">https://github.com/vackup/scoutbase-code-challenge-back-end/</a><br />
<br />
The app is deployed to Azure through Azure pipelines.<br />
<br />
<a href="https://dev.azure.com/hernanzaldivar/scoutbase-code-challenge/_build/latest?definitionId=26&branchName=master"><img src="https://camo.githubusercontent.com/6e7d8ab6faf4a6afb8681a072690cf2dfed0c97b/68747470733a2f2f6465762e617a7572652e636f6d2f6865726e616e7a616c64697661722f73636f7574626173652d636f64652d6368616c6c656e67652f5f617069732f6275696c642f7374617475732f7661636b75702e73636f7574626173652d636f64652d6368616c6c656e67652d6261636b2d656e643f6272616e63684e616d653d6d6173746572" /></a><br />
<br />
The app is using an Azure Database for PostgreSQL.<br />
<br />
You can access the Graphql playground here <a href="https://scoutbase-code-challenge-backend.azurewebsites.net/graphql">https://scoutbase-code-challenge-backend.azurewebsites.net/graphql</a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoqv0M1Dp5lQS8xIJt5Y4Bq-T2_U3oAemnCjm6Tyv6uqaMG49JttI0VrNhl58kLJA96oCtbiKQ_mxzW4SZHqAveibzBq1oD54wDxMjKR5M_eitvNvIPhVu55a6fQj0qFVVpDLhSb7Jahzq/s1600/graphql.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="693" data-original-width="1364" height="323" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoqv0M1Dp5lQS8xIJt5Y4Bq-T2_U3oAemnCjm6Tyv6uqaMG49JttI0VrNhl58kLJA96oCtbiKQ_mxzW4SZHqAveibzBq1oD54wDxMjKR5M_eitvNvIPhVu55a6fQj0qFVVpDLhSb7Jahzq/s640/graphql.jpg" width="640" /></a><br />
<h2>
Helpful links</h2>
<br />
<ul>
<li><a href="https://www.wolfe.id.au/2014/02/01/getting-a-new-node-project-started-with-npm/">Getting a new node project started with npm · Mark Wolfe's Blog</a></li>
<li><a href="https://medium.com/the-node-js-collection/making-your-node-js-work-everywhere-with-environment-variables-2da8cdf6e786">Node.js Everywhere with Environment Variables! - Node.js Collection - Medium</a></li>
<li><a href="https://elanderson.net/2018/02/setup-postgresql-on-windows-with-docker/">Setup PostgreSQL on Windows with Docker – Eric L. Anderson</a></li>
<li><a href="https://blogs.msdn.microsoft.com/azureossds/2018/08/30/debugging-node-js-applications-on-azure-app-services-linux-containers/">Debugging Node.js applications on Azure App Services Linux/containers | Microsoft Azure Open Source Development Support Team Blog</a></li>
<li><a href="https://www.robinwieruch.de/node-js-express-tutorial">How to setup Express.js in Node.js - RWieruch</a></li>
<li><a href="https://www.robinwieruch.de/graphql-apollo-server-tutorial">GraphQL Server Tutorial with Apollo Server and Express - RWieruch</a></li>
<li><a href="https://patrickdesjardins.com/blog/graphql-context">GraphQL Context – Patrick Desjardins' Blog</a></li>
<li><a href="https://patrickdesjardins.com/blog/how-to-setup-a-typescript-nodejs-express-apollo-server-to-easy-debugging-with-vscode">How to setup a TypeScript, NodeJS, Express Apollo Server to easy debugging with VsCode – Patrick Desjardins' Blog</a></li>
<li><a href="https://patrickdesjardins.com/blog/install-apollo-server-to-host-a-graphql-service">Install Apollo Server to host a GraphQL service – Patrick Desjardins' Blog</a></li>
<li><a href="https://medium.com/the-guild/authentication-and-authorization-in-graphql-and-how-graphql-modules-can-help-fadc1ee5b0c2">Authentication and Authorization in GraphQL (and how GraphQL-Modules can help)</a></li>
<li><a href="https://uptoskill.com/articles/graphql-custom-scalars/">UpToSkill – Custom Scalars in GraphQL</a></li>
<li><a href="https://developer.mozilla.org/es/docs/Learn/Server-side/Express_Nodejs/development_environment">Setting up a Node development environment - Aprende sobre desarrollo web | MDN</a></li>
</ul>
<h2>
Back-end task of Code Challenge for Scoutbase</h2>
This task is for demonstrating your understanding of HTTP, GraphQL, Node.js and general API practices.<br />
<h3>
Instructions:</h3>
<ol>
<li>Implement a Node.js-based server with raw http, Koa or Express.</li>
<li>Add a /graphql endpoint serving the apollo-server or any other GraphQL implementation.</li>
<li>Schema must be able to return proper response for the following public query:</li>
<ul>
<li>{
movies {
title
year
rating
actors {
name
birthday
country
directors {
name
birthday
country
}
}
}
}</li>
</ul>
<li>Add support for the following mutation:</li>
<ul>
<li>mutation createUser($username: String, $password: String) {
createUser(username: $username, password: $password) {
token
user {
id
name
}
}
}</li>
</ul>
<li>To expand on the number four, add a mutation-based authentication that accepts:</li>
<ul>
<li>mutation login($username: String, $password: String) {
login(username: $username, password: $password) {
token
user {
id
name
}
}
}</li>
</ul>
<li>Authenticated users may request additional fields for the query used earlier. New scoutbase_rating field must return the a random string between 5.0-9.0:</li>
<ul>
<li>{
movies {
scoutbase_rating
title
year
rating
actors {
name
birthday
country
directors {
name
birthday
country
}
}
}
}</li>
</ul>
<li>/graphql must be accessible for external clients.</li>
<li>End.</li>
</ol>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0Rosario, Santa Fe, Argentina-32.9587022 -60.693041600000015-33.1718887 -61.015765100000017 -32.7455157 -60.370318100000013tag:blogger.com,1999:blog-9171149635635185317.post-20654409064665620712018-02-28T20:01:00.000-03:002018-02-28T20:01:01.292-03:00fastlane snapshots and xamarinAs you all know, <a href="https://fastlane.tools/" target="_blank">fastlane</a> is the easiest way to automate beta deployments and releases for your iOS and Android apps. It handles all tedious tasks, like generating screenshots, dealing with code signing, and releasing your application.You can use <a href="https://docs.fastlane.tools/getting-started/ios/screenshots/" target="_blank">fastlane snapshots</a> to automate the process of capturing screenshots of your app. It allows you to:<div>
<ul>
<li>Capture hundreds of screenshots in multiple languages on all simulators</li>
<li>Take screenshots in multiple device simulators concurrently to cut down execution time (Xcode 9 only)</li>
<li>Do something else while the computer takes the screenshots for you</li>
<li>Configure it once, and store the configuration so anyone on the team can run it</li>
<li>Generate a beautiful web page showing all screenshots on all devices. This is perfect to send to Q&A, marketing, or translators for verification</li>
<li>Avoid having loading indicators in your App Store screenshots by intelligently waiting for network requests to be finished</li>
<li>Get a summary of how your app looks like across all supported devices and languages</li>
</ul>
<div>
Here <a href="https://docs.fastlane.tools/getting-started/ios/screenshots/">https://docs.fastlane.tools/getting-started/ios/screenshots/</a> you have all the necessary information to take the best screenshots you need.</div>
<div>
<br /></div>
<div>
Unfortunately for <a href="https://www.xamarin.com/" target="_blank">Xamarin</a> users, snapshots uses UITests, which require an Xcode project so, Is there anything we can do to use snapshots with our Xamarin projects? </div>
<div>
<br /></div>
<div>
The answer is short, YES YOU CAN!!!</div>
<div>
<h2>
Setting up you XCUITest project</h2>
UITest does not use the project code to test, it exists outside the app. UITest instead looks at what is available in the simulator and returns to us instances of XCUIElement based on what it finds, XCUIElement and XCUIApplication are the proxies that are used for this.<br /><br />So you only need to open XCode, go to FILE --> NEW --> PROJECT and select SINGLE VIEW APP, click the NEXT button and on the next screen, the most important thing, is that you check "INCLUDE UI TEST".</div>
<div>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDeT1umLPeHJ03am3a6yFbo2x5-GWDW4dXJp0V7VLqPUdhAf1YOJ1M1_-sJ97COfNfJ1CXeypmBZh0lnfQO-yrq3XjE4lK3XgeEUyX27e-SqZu3i2hzV2-8-YRBcJYHxtydILMKHOULq2w/s1600/1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="561" data-original-width="769" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDeT1umLPeHJ03am3a6yFbo2x5-GWDW4dXJp0V7VLqPUdhAf1YOJ1M1_-sJ97COfNfJ1CXeypmBZh0lnfQO-yrq3XjE4lK3XgeEUyX27e-SqZu3i2hzV2-8-YRBcJYHxtydILMKHOULq2w/s320/1.PNG" width="320" /></a></div>
<br />Now you have almost ready, just follow this information <a href="https://docs.fastlane.tools/getting-started/ios/screenshots/">https://docs.fastlane.tools/getting-started/ios/screenshots/</a> to configure your project.</div>
<div>
<br /></div>
<h2>
Xamarin app? How?</h2>
<div>
As explained here <a href="https://medium.com/xcblog/hands-on-xcuitest-features-with-xcode-9-eb4d00be2781">https://medium.com/xcblog/hands-on-xcuitest-features-with-xcode-9-eb4d00be2781</a> now <a href="https://developer.apple.com/documentation/xctest/xcuiapplication/2879415-init">XCUIApplication()</a> has <a href="https://developer.apple.com/documentation/xctest/xcuiapplication/2879415-init">initialiser</a> which takes bundleIdentifier so that we can pass bundleID of our app and has new <a href="https://developer.apple.com/documentation/xctest/xcuiapplication/2873317-activate">activate()</a> method to activate app from background. </div>
<div>
<br /></div>
As you can see, you can interact with any app within Simulator or device as long as we know bundle identifier. This is huge improvement in UI testing of iOS apps. <div>
<br /></div>
<div>
Guess what? You can interact with you Xamarin app as far as it's deployed in the simulator! You can install your Xamarin in the simulator as normal, I mean, just hitting the PLAY / DEBUG button on your Visual Studio for macOS.</div>
<h2>
Automate everything</h2>
<div>
But what if you can automate you Xamarin iOs deployment? I also have the answer! </div>
<div>
<br /></div>
<div>
To install an iOs app from the command line you can use this command: <i><b>xcrun simctl install <device> <path></path></device></b></i></div>
<div>
<br /></div>
<div>
Where</div>
<div>
<ol>
<li>device can be the device <b>UUID</b>, its name, or <b>booted</b> which means the currently booted device</li>
<li>path is the path of your .app. </li>
</ol>
<h2>
Get simulator device <b>UUID</b></h2>
<div>
To get all your devices UUID, execute this command: <b><i>xcrun instruments -s devices</i></b><br /><br />For more information please visit <a href="https://developer.xamarin.com/guides/testcloud/calabash/working-with/identifying-ios-devices-and-simulators/">https://developer.xamarin.com/guides/testcloud/calabash/working-with/identifying-ios-devices-and-simulators/</a> </div>
<h2>
Get the path of your .app</h2>
It's in your build folder <i>pathToYourAppSourceCode/bin/iPhoneSimulator/Debug/device-builds/iphone[build ios version]/appName.app</i>. In case of my <a href="http://www.hypstrapp.com/" target="_blank">hypstr</a> app, the location is here<br /><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuWE38X9L-ylFYmu5GamVZWC_cQY0hrkSrCAm0GTBgugLtB3PcRoewZHiw3QluQZS2UGSVgFx8pAw0drRQGCV_O6UbwK36GnxL6dW8PNbMCKAI7w6q2O2KPM8_OOEa51uxVumhNpCgQQYe/s1600/Captura+de+pantalla+2018-02-28+a+la%2528s%2529+19.34.45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="548" data-original-width="882" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuWE38X9L-ylFYmu5GamVZWC_cQY0hrkSrCAm0GTBgugLtB3PcRoewZHiw3QluQZS2UGSVgFx8pAw0drRQGCV_O6UbwK36GnxL6dW8PNbMCKAI7w6q2O2KPM8_OOEa51uxVumhNpCgQQYe/s640/Captura+de+pantalla+2018-02-28+a+la%2528s%2529+19.34.45.png" width="640" /></a></div>
<h2>
Tying everything up</h2>
</div>
<div>
Create a bash script to automate app deploy to all your selected simulators (<a href="https://www.macobserver.com/tmo/article/os-x-how-to-convert-a-terminal-command-into-a-double-clickable-desktop-file">https://www.macobserver.com/tmo/article/os-x-how-to-convert-a-terminal-command-into-a-double-clickable-desktop-file</a>) <br /><br />eg: <br /><i><b><br />#!/bin/bash<br /><br />echo booting iphone 6 simulator<br />xcrun simctl boot E26FC3E7-DF91-49DF-AE9D-3A7443B849AD<br /><br />echo deploying app<br />xcrun simctl install E26FC3E7-DF91-49DF-AE9D-3A7443B849AD pathToYourAppSourceCode/bin/iPhoneSimulator/Debug/device-builds/iphone[build ios version]/hypstr.UI.iOs.app<br /><br />echo shutdown simulator<br />xcrun simctl shutdown E26FC3E7-DF91-49DF-AE9D-3A7443B849AD</b></i><br /><br />More info on ios simulator commands <a href="https://medium.com/xcblog/simctl-control-ios-simulators-from-command-line-78b9006a20dc">https://medium.com/xcblog/simctl-control-ios-simulators-from-command-line-78b9006a20dc</a> <br /><br />As only these screens are needed for iPhone when submitting to App Store, just create the script to deploy to this four simulator:<br /><ol>
<li>iPhone 7 Plus (5.5-Inch)</li>
<li>iPhone 7 (4.7-Inch)</li>
<li>iPhone 5 (4-Inch)</li>
<li>iPhone X</li>
</ol>
<div>
<span style="background-color: yellow;">Those simulators are the ones you need to specify in you Snapfile (snapshots config file)</span></div>
<div>
<h2>
Magic, magic, magic! </h2>
</div>
<div>
Following this approach, I manage to take my screeshots for my Xamarin app called hypstr published in the App Store <a href="https://itunes.apple.com/us/app/hypstr/id650216315">https://itunes.apple.com/us/app/hypstr/id650216315</a> using fastlane snapshots as you can see in the following image</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPv7n1skG3i5h-djdb42gCtljnLeAIUl_ztebryzMDAsCye6oFQK29v00VidYCsDscv4jKZJNrBJSNJBOz1QzXOdfMlYEhyvmJs3QlQ6XiI0ptEvyPjJrhNDZh7anRGJOfarn9scNyJWpT/s1600/Captura+de+pantalla+2018-02-19+a+la%2528s%2529+18.54.03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="956" data-original-width="1600" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPv7n1skG3i5h-djdb42gCtljnLeAIUl_ztebryzMDAsCye6oFQK29v00VidYCsDscv4jKZJNrBJSNJBOz1QzXOdfMlYEhyvmJs3QlQ6XiI0ptEvyPjJrhNDZh7anRGJOfarn9scNyJWpT/s640/Captura+de+pantalla+2018-02-19+a+la%2528s%2529+18.54.03.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Enjoy!</div>
<div>
<br /></div>
<div>
More info about fastlane, snapshots and XCUITest:</div>
<div>
<ul>
<li><a href="https://fastlane.tools/">https://fastlane.tools</a></li>
<li><a href="https://medium.com/xcblog/hands-on-xcuitest-features-with-xcode-9-eb4d00be2781">https://medium.com/xcblog/hands-on-xcuitest-features-with-xcode-9-eb4d00be2781</a></li>
<li><a href="https://blog.metova.com/guide-xcode-ui-test/">https://blog.metova.com/guide-xcode-ui-test/</a></li>
<li><a href="http://masilotti.com/ui-testing-cheat-sheet/">http://masilotti.com/ui-testing-cheat-sheet/</a></li>
<li><a href="https://github.com/joemasilotti/UI-Testing-Cheat-Sheet">https://github.com/joemasilotti/UI-Testing-Cheat-Sheet</a></li>
</ul>
</div>
<br /><br /><br /><br /></div>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com1Rosario, Santa Fe, Argentina-32.9442426 -60.650538799999993-33.1574291 -60.973262299999995 -32.7310561 -60.32781529999999tag:blogger.com,1999:blog-9171149635635185317.post-73473480165730864632018-01-29T16:12:00.003-03:002018-01-29T16:12:57.440-03:00Implement async “fire and forget” HTTP triggers in azure functionsInspired by "implement async “fire and forget” HTTP triggers in azure functions" (<a href="https://stackoverflow.com/questions/38123887/can-i-implement-async-fire-and-forget-http-triggers-in-azure-functions">https://stackoverflow.com/questions/38123887/can-i-implement-async-fire-and-forget-http-triggers-in-azure-functions</a>), I've created 2 <a href="https://azure.microsoft.com/en-us/services/functions/" target="_blank">Azure Functions</a><br />
<br />
<ol>
<li>Http Trigger function with queue message output</li>
<li>Queue Trigger function.</li>
</ol>
<div>
They were created using VS 2017 Template and not from de Azure Portal.</div>
<div>
<br /></div>
<div>
Basically you fire the task doing a request to the first Azure Function. This Function leaves a message in a queue and the response the request. So your app continues to run normally (fire and forget).</div>
<div>
Then, there is another Function that proccess that message. Hereinafter, you can check / notify the result however you want.</div>
<br />
<br />
Source code in my github repo: <a href="https://github.com/vackup/QueueAzureFunctionApp">https://github.com/vackup/QueueAzureFunctionApp</a><br />
<br />
More info at:<br />
<br />
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-integrate-storage-queue-output-binding">https://docs.microsoft.com/en-us/azure/azure-functions/functions-integrate-storage-queue-output-binding</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-queue-triggered-function">https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-queue-triggered-function</a></li>
<li><a href="https://stackoverflow.com/questions/44961482/how-to-specify-output-bindings-of-azure-function-from-visual-studio-2017-preview">https://stackoverflow.com/questions/44961482/how-to-specify-output-bindings-of-azure-function-from-visual-studio-2017-preview</a></li>
</ul>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-44223873382419836672016-11-10T01:40:00.000-03:002016-11-10T01:40:33.706-03:00Native iOS & Android Development for the C# Developer with XamarinEn este curso de 4 días se intentará dar un pantallazo general sobre el mundo mobile, su distribución a nivel mundial, tips sobre que hace especial a esta plataforma y una introducción a Xamarin para el desarrollo de aplicaciones nativas tanto en Android como iOs.<br />
<br />
El objetivo del curso, es que quienes participen sean capaces de entender todo lo que engloba al desarrollo mobile, y aquello que va más allá de la pantalla del mobile device.
<br />
<br />
Me quedan subir varios links con los videos y los archivos con los materiales, ya los ire subiendo pero mientras tanto acá tiene las presentaciones<br />
<br />
<div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/u1NywgR3dDRzZV" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-0-expectativas-y-objetivos-de-los-presentes-68539702" target="_blank" title="Dia 0 expectativas y objetivos de los presentes">Dia 0 expectativas y objetivos de los presentes</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<br /></div>
<div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/5EeTtMnc41z9Kk" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-1-intro-to-mobile-and-xamarin" target="_blank" title="Dia 1 intro to mobile and xamarin">Dia 1 intro to mobile and xamarin</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<br /></div>
<div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/hESzCr8e4ohNaT" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-2-xamarin-android" target="_blank" title="Dia 2 xamarin android">Dia 2 xamarin android</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/gNSyB6UbqipEv" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-3-xamarin-i-os-68539710" target="_blank" title="Dia 3 xamarin i os">Dia 3 xamarin i os</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/1LAJSaoYqlNNOa" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-4-introduction-to-cross-platform-mobile-development-68539711" target="_blank" title="Dia 4 introduction to cross platform mobile development">Dia 4 introduction to cross platform mobile development</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<br /></div>
<div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/lMFYvv7ptx48Tb" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-41-shared-asset-projects-and-portable-class-library-pcl-projects-68539715" target="_blank" title="Dia 4.1 shared asset projects and portable class library (pcl) projects">Dia 4.1 shared asset projects and portable class library (pcl) projects</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
<br /></div>
<div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/l0QEAWPdDIoggS" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/vackup/dia-41-mvvm-cross-68539882" target="_blank" title="Dia 4.1 mvvm cross">Dia 4.1 mvvm cross</a> </strong> from <strong><a href="https://www.slideshare.net/vackup" target="_blank">Hernan Zaldivar</a></strong> </div>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-34614360956419489202016-10-12T11:48:00.002-03:002016-10-12T11:48:45.678-03:00Xamarin iOS - apply gradient background to status bar and navigation barHere you have a running sample on how to apply gradient background to status bar and navigation bar to Xamarin iOS <a href="https://github.com/vackup/StatusBarGradientBackground/">https://github.com/vackup/StatusBarGradientBackground/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHEUWx1QQjlXOYbCyyvJllgYtdhuyBjo06k8WCJeKX4v_IYASgy7C-31LzBFyxXaMVOjcl02rbyhlYhNd2V6JCNO1Xk88R8jgGC296F_2WpzDZ58mwigu4JQE4lguVuVwyIVjXr3srZj0j/s1600/StatusBarGradientBackground.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHEUWx1QQjlXOYbCyyvJllgYtdhuyBjo06k8WCJeKX4v_IYASgy7C-31LzBFyxXaMVOjcl02rbyhlYhNd2V6JCNO1Xk88R8jgGC296F_2WpzDZ58mwigu4JQE4lguVuVwyIVjXr3srZj0j/s1600/StatusBarGradientBackground.png" /></a></div>
<span id="goog_1472946153"></span><span id="goog_1472946154"></span><br />
<br />
Info used:<br />
How can I create a horizontal gradient background for my iOS nav bar?<br />
<a href="http://stackoverflow.com/a/31901915/580229">http://stackoverflow.com/a/31901915/580229</a><br />
<br />
Using Background Image in Navigation Bar<br />
<a href="https://www.appcoda.com/customize-navigation-status-bar-ios-7/">https://www.appcoda.com/customize-navigation-status-bar-ios-7/</a><br />
<br />
How to programmatically get iOS status bar height<br />
<a href="http://stackoverflow.com/a/16598350/580229">http://stackoverflow.com/a/16598350/580229</a>Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com1tag:blogger.com,1999:blog-9171149635635185317.post-32533184384912661252016-10-03T21:34:00.001-03:002016-10-03T21:34:33.614-03:00Xamarin.iOs.Animation: rotate imageJust a quick sample of how to rotate a button image 45 degrees on click<br />
<br />
Source code in my github <a href="https://github.com/vackup/Xamarin.iOs.Animation">https://github.com/vackup/Xamarin.iOs.Animation</a><br />
<br />
Enjoy!Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-44518169324067489602016-09-20T00:50:00.002-03:002016-09-20T00:51:24.171-03:00Visual Studio: package did not load correctly after update extension.<div style="text-align: justify;">
If you get something similar to this:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: left;">
<i>package [XamarinAndroidPackage]Source: 'Xamarin.AndroidTools' Description: Method not found: 'Void Mono.AndroidTools.AnalyticsService.ReportContextProperty(System.String[], System.String[])'. System.MissingMethodException: Method not found: 'Void Mono.AndroidTools.AnalyticsService.ReportContextProperty.....</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This might be caused by one of the common issues Visual Studio can run into with updating extensions according to <a href="https://bugzilla.xamarin.com/show_bug.cgi?id=44162">https://bugzilla.xamarin.com/show_bug.cgi?id=44162</a> and it's right!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The solution is to Clear MEF Component Cache! Clearing the ComponentModelCache folder might help. See step 3 on the following guide:<br />
<a href="https://developer.xamarin.com/guides/cross-platform/getting_started/visual_studio_with_xamarin/troubleshooting/uninstall-xamarinvs/">https://developer.xamarin.com/guides/cross-platform/getting_started/visual_studio_with_xamarin/troubleshooting/uninstall-xamarinvs/</a> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Also there is a Visual Studio extension to make you life easier:<br />
<a href="https://visualstudiogallery.msdn.microsoft.com/22b94661-70c7-4a93-9ca3-8b6dd45f47cd">https://visualstudiogallery.msdn.microsoft.com/22b94661-70c7-4a93-9ca3-8b6dd45f47cd</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This extension clears the MEF cache on disk and lets Visual Studio rebuild it. The reason for clearing the MEF cache is that it can become corrupted. This ususally happens when installing or updating extensions or other Visual Studio components.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Typical errors that can be solved by clearing the component cache are:</div>
<br />
<ul>
<li style="text-align: justify;">Could not load package exception</li>
<li style="text-align: justify;">Could not load assembly exception</li>
<li style="text-align: justify;">Composition error when opening files</li>
<li style="text-align: justify;">Missing syntax highlighting of some languages in VS</li>
</ul>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-21919118224753760622016-09-08T11:49:00.001-03:002016-09-08T11:49:38.313-03:00Getting "#!/bin/bash: No such file or directory"If you are getting "#!/bin/bash: No such file or directory" when trying to run a bash script on mac written on Windows, the issue is the encoding<br />
<br />
According to <a href="http://ss64.com/osx/syntax-shellscript.html">http://ss64.com/osx/syntax-shellscript.html</a><br />
<br />
<span style="background-color: #cccccc; font-family: "helvetica" , "arial" , "freesans" , sans-serif; font-size: 16px; line-height: 18px;">If you get an error like </span><span class="code" style="background-color: #cccccc; font-family: "courier new" , "courier" , monospace; font-size: 16px; line-height: 18px;">"<i>#!/bin/bash: No such file or directory"</i></span><span style="background-color: #cccccc; font-family: "helvetica" , "arial" , "freesans" , sans-serif; font-size: 16px; line-height: 18px;">, that is typically an indication that the File encoding or line endings are wrong, use an editor like VI or </span><a href="http://www.barebones.com/products/textwrangler/" style="background-color: #cccccc; color: blue; font-family: Helvetica, Arial, FreeSans, sans-serif; font-size: 16px; line-height: 18px;">TextWrangler</a><span style="background-color: #cccccc; font-family: "helvetica" , "arial" , "freesans" , sans-serif; font-size: 16px; line-height: 18px;"> (shows line encodings at the bottom of the edit window) the script file should be </span><span class="code" style="background-color: #cccccc; font-family: "courier new" , "courier" , monospace; font-size: 16px; line-height: 18px;">Unicode (UTF-8)</span><span style="background-color: #cccccc; font-family: "helvetica" , "arial" , "freesans" , sans-serif; font-size: 16px; line-height: 18px;"> and </span><span class="code" style="background-color: #cccccc; font-family: "courier new" , "courier" , monospace; font-size: 16px; line-height: 18px;">Unix (LF)</span><span style="background-color: #cccccc; font-family: "helvetica" , "arial" , "freesans" , sans-serif; font-size: 16px; line-height: 18px;"> line endings</span>Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-43215406067500204272016-08-10T12:24:00.001-03:002016-08-10T13:52:08.972-03:00Configure Xamarin.iOs build on TFS<br />
<h2>
Build agent</h2>
First of all, you need to install the cross platform build and release agent for Team Services and Team Foundation Server 2015 and beyond on a mac.<br />
<br />
I think the easiest way to do that is to you MacInACloud service (<a href="https://support.macincloud.com/support/solutions/articles/8000016614-getting-started-with-the-macincloud-vsts-build-agent-plan">https://support.macincloud.com/support/solutions/articles/8000016614-getting-started-with-the-macincloud-vsts-build-agent-plan</a>) but if you don't want to pay for the service and have a Mac, you must install it there.<br />
<h2>
Install Prequisites</h2>
<span style="background-color: red;">First, ensure you have the necessary OSX (macOs) system prequisites (<a href="https://github.com/Microsoft/vsts-agent/blob/master/docs/start/envosx.md">https://github.com/Microsoft/vsts-agent/blob/master/docs/start/envosx.md</a>) - basically OpenSSL, Git and other stuff.</span><span style="background-color: yellow;"> </span>You will need BREW (<a href="http://brew.sh/">http://brew.sh/</a>), so visit Brew website for install instructions<br />
<div>
<br /></div>
Installing OpenSLL, if the following lines doesn't work, check the installed version and use it instead of 1.0.0<br />
<div>
<br /></div>
<div>
<pre style="border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span style="background-color: #f7f7f7;">ln -s /usr/local/opt/openssl/lib/libcrypto.</span><span style="background-color: yellow;">1.0.0</span><span style="background-color: #f7f7f7;">.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.</span><span style="background-color: yellow;">1.0.0</span><span style="background-color: #f7f7f7;">.dylib /usr/local/lib</span></pre>
<h2>
Deploy an agent on OSX</h2>
<div>
After installing all prequisites, you need to install the agent.</div>
<div>
<br /></div>
<div>
Download it from <a href="https://github.com/Microsoft/vsts-agent/releases/tag/v2.104.2">https://github.com/Microsoft/vsts-agent/releases/tag/v2.104.2</a> and follow these instructions <a href="https://www.visualstudio.com/en-us/docs/build/admin/agents/v2-osx">https://www.visualstudio.com/en-us/docs/build/admin/agents/v2-osx</a>.</div>
<div>
<br /></div>
<div>
You must configure it and run it (don't forget to run it LOL), pretty straightforward.</div>
<div>
<br /></div>
<div>
If everything is OK you shoul see you Build Agent is green, if it is red, then something went wrong</div>
<div>
<br /></div>
<div>
<img alt="image" src="http://www.codewrecks.com/blog/wp-content/uploads/2015/05/image_thumb.png" /></div>
<h2>
Creating the build</h2>
<div>
Now you have go to your TFS and create a new Xamarin.iOS. To create it follow these instructions <a href="https://www.visualstudio.com/docs/build/apps/mobile/xamarin">https://www.visualstudio.com/docs/build/apps/mobile/xamarin</a></div>
<h2>
Troubleshooting</h2>
If you have any issues, visit these url for troubleshooting info:</div>
<h3>
Can't connect to TFS when configuring the agent</h3>
<div>
<a href="https://github.com/Microsoft/vsts-agent/issues/470">https://github.com/Microsoft/vsts-agent/issues/470</a></div>
<div>
<a href="https://github.com/Microsoft/vsts-agent/issues/110">https://github.com/Microsoft/vsts-agent/issues/110</a></div>
<div>
<a href="https://github.com/dotnet/cli/issues/3964#issuecomment-236493536">https://github.com/dotnet/cli/issues/3964#issuecomment-236493536</a></div>
<div>
<h3>
User permissions</h3>
</div>
<div>
If you face issues with user permissions:</div>
<div>
<ol>
<li><u>Creation issues:</u> To <span style="background-color: red;">create</span> the agent, the user must be part of "Agent Queue Administrator"</li>
<li><u>Execution issues "Tfs2015 Build agent error: Access denied: xxxxx\yyyyy needs Listen permissions for pool zzzzz to perform the action":</u> To <span style="background-color: yellow;">run</span> the agent, the user must be part of "Agent Queue Users" and not "Agent Queue <span style="background-color: red;">Administrator</span>". This is the (<a href="http://www.codewrecks.com/blog/index.php/2015/05/09/tfs2015-build-agent-error-access-denied-xxxxxyyyyy-needs-listen-permissions-for-pool-zzzzz-to-perform-the-action/">http://www.codewrecks.com/blog/index.php/2015/05/09/tfs2015-build-agent-error-access-denied-xxxxxyyyyy-needs-listen-permissions-for-pool-zzzzz-to-perform-the-action/</a>)</li>
<li>Can't select a build queue during build definition - TFS 2015 Build’s Queue is Empty: your user doesn't have permissions to execute the queue and needs to be part of "Agent Queue Users" (<a href="https://lajak.wordpress.com/2016/03/24/fix-tfs-2015-builds-queue-is-empty/">https://lajak.wordpress.com/2016/03/24/fix-tfs-2015-builds-queue-is-empty/</a>)</li>
<li>I use Team Foundation Server on-premises and I don't see some of these features. Why not? Some of these features are available only on Visual Studio Team Services and not yet available on-premises. Some features are available on-premises if you have upgraded to the latest version of TFS. Check the available features on each version here <a href="https://www.visualstudio.com/de-de/docs/build/define/build">https://www.visualstudio.com/de-de/docs/build/define/build</a> (eg: at the time of writting this post "Xamarin component restore" is only available on Team Services)</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7QCKNs8DuYjppiIGghNm3sIlahNM3pig85W4H-H4BnV_x5iCZk_yl_ujZO_huIhNXqpRNgNslWKj7__ZXBTwNC28DLpfbMckrh4_Jb1GGCJUKe-rqM9J-HJS1h87lv2B-lFFIOUmR4RAA/s1600/tfs.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7QCKNs8DuYjppiIGghNm3sIlahNM3pig85W4H-H4BnV_x5iCZk_yl_ujZO_huIhNXqpRNgNslWKj7__ZXBTwNC28DLpfbMckrh4_Jb1GGCJUKe-rqM9J-HJS1h87lv2B-lFFIOUmR4RAA/s400/tfs.PNG" width="400" /></a></div>
<div>
<br /></div>
</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-3790282696145046632016-07-19T15:38:00.002-03:002016-07-19T15:43:44.703-03:00iOS Backgrounding and Updating an Application in the Background<br />
<h2>
iOS Backgrounding with Tasks</h2>
Run tasks that don't have to die when app enters background<br />
<div>
<ul>
<li><u>Creating Background-Safe Task:</u> You can use this pattern anywhere in your application where you don't want a task being interrupted should the user put the app into the background. A great candidate for this pattern would be tasks such as sending a new user's registration information to your server, or verifying login information. </li>
</ul>
<a href="https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/ios_backgrounding_with_tasks/#background_tasks_in_ios7">https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/ios_backgrounding_with_tasks/#background_tasks_in_ios7</a><br />
<h2>
Updating an Application in the Background</h2>
Update the app at regular intervals<br />
<ul>
<li>Region Monitoring and Significant Location Changes Service </li>
<li>Background Fetch </li>
</ul>
<a href="https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/#background_fetch">https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/#background_fetch</a> <br />
<h2>
iOS Backgrounding Guidance</h2>
Refer to the following diagram to choose a backgrounding technique<br />
<a href="https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_5_ios_backgrounding_guidance/">https://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_5_ios_backgrounding_guidance/</a> <br />
<h3>
iOs7</h3>
<span style="background-color: white;"><img height="640" src="https://lh4.googleusercontent.com/744-UAPnMkjb9ydrlTCZZGyEIa1lZnMFGbvoxnENFjyFHb4posFQwM8aXcXQsC00xpjj86r2yyiIXLSC29mkcyf1jo8OH4KMJxnS3d-LCaZpKsmSNW1V5t6VZCLDww3WaSGbQH6e" width="548" /></span><br />
<h2>
Multi Platform implementation (Xamarin.Form)</h2>
Using Messanger<br />
<a href="http://arteksoftware.com/backgrounding-with-xamarin-forms/">http://arteksoftware.com/backgrounding-with-xamarin-forms/</a> </div>
<div>
<h2>
More Info</h2>
<ul>
<li><a href="http://www.solarityllc.com/blog/the-road-to-xamarin-certification-introduction-to-backgrounding-running-finite-length-tasks-ios210">http://www.solarityllc.com/blog/the-road-to-xamarin-certification-introduction-to-backgrounding-running-finite-length-tasks-ios210</a></li>
<li><a href="https://spin.atomicobject.com/2016/06/15/ios-background-xamarin-part-1/">https://spin.atomicobject.com/2016/06/15/ios-background-xamarin-part-1/</a></li>
<li><a href="https://spin.atomicobject.com/2016/06/16/ios-background-xamarin-part-2/">https://spin.atomicobject.com/2016/06/16/ios-background-xamarin-part-2/</a></li>
<li><a href="https://krumelur.me/2015/11/25/ios-background-transfer-what-about-uploads/">https://krumelur.me/2015/11/25/ios-background-transfer-what-about-uploads/</a></li>
<li><a href="http://backstopmedia.booktype.pro/developing-an-ios-7-edge/3-update-and-running-in-the-background-michael/">http://backstopmedia.booktype.pro/developing-an-ios-7-edge/3-update-and-running-in-the-background-michael/</a> </li>
</ul>
<br /></div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-75165943443765016092016-03-28T11:12:00.001-03:002016-03-28T11:12:25.837-03:00Camino a la AgilidadEste fin de semana estuve leyendo un par de artículos que me han llamado la atención.<br />
<br />
El primero habla sobre Samsung y como una empresa de semejante tamaño está tratando de cambiar su cultura para ir más rápido, tipo startup, porque están viendo que su crecimiento se hace muy lento.<br />
El artículo dice cosas interesantes, algunas de ellas las he tratado y debatido con varios colegas:<br />
<br />
<ul>
<li>Samsung’s executives will sign a pledge to move away from a top-down culture and towards a working environment that fosters open dialogue.</li>
<li>The flagship firm of South Korea’s dominant conglomerate will also reduce the number of levels in its staff hierarchy and hold more frequent online discussions between business division heads and employees.</li>
<li>Other moves in recent years to ease a rigid corporate culture include flexible working hours, a loosening of dress code requirements for weekend work and less pressure on employees to attend after-work drinking sessions that have long been a staple of Korean corporate life.</li>
</ul>
<br />
<a href="http://venturebeat.com/2016/03/24/worlds-biggest-startup-samsung-to-reform-corporate-culture/">http://venturebeat.com/2016/03/24/worlds-biggest-startup-samsung-to-reform-corporate-culture/</a><br />
<br />
Otro de los artículos que he leído habla sobre “The End of Agile: Death by Over-Simplification” y nombra algunos riesgos que se están corriendo por pensar que uno tiene que ser demasiado Agile, habla sobre todo de encontrar un balance:<br />
<br />
<ul>
<li>Agile was abused, becoming the biggest ever hype in the history of software development, and generating a multi-million dollar industry of self-proclaimed Agile consultants and experts selling dubious certifications</li>
<li>In my personal opinion, we will have to go back to the basics: To all the wonderful design fundamentals that were being discussed in the 90’s: the SOLID principles of OOD, design patterns, software reuse, component-based software development. Only when we are able to incorporate these basic principles in our development process we will reach a true state of Agility, embracing change effectively.</li>
</ul>
<br />
<a href="https://effectivesoftwaredesign.com/2014/03/17/the-end-of-agile-death-by-over-simplification/">https://effectivesoftwaredesign.com/2014/03/17/the-end-of-agile-death-by-over-simplification/</a><br />
<br />
Personalmente creo que este muchacho tiene algo de razón pero no toda. Me ha tocado trabajar durante 10 años en una empresa / startup donde no se sabía muy bien el software a realizar porque el negocio todavía no estaba definido. Creo que hicimos Agile antes que Agile sea nombrado por estas latitudes (de casualidad diría yo) y fuimos creando un software que otorgó mucho valor al negocio y que permitió que la empresa crezca a un ritmo del 100% anual. Obviamente al cabo de 10 años, el software no escalaba más y tenía problema de performance por todos lados pero si no lo hubiéramos desarrollado de esa manera la empresa no hubiera crecido y quizá no hubiéramos llegado a la etapa de tener problemas de arquitectura.<br />
<br />
Buena semana<br />
<div>
<br /></div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-69003225480358293702016-03-12T20:15:00.000-03:002016-03-12T20:15:05.795-03:00Continuous integration using Visual Studio Online and a Bitbucket repository<div style="text-align: justify;">
<a href="https://www.visualstudio.com/features/continuous-integration-vs" target="_blank">Continuous integration using Visual Studio Online</a> and a <a href="https://bitbucket.org/" target="_blank">Bitbucket repository</a> is not a straightforward task, it's not hard but definitely not straightforward.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://en.wikipedia.org/wiki/Continuous_integration" target="_blank">Continuous integration</a> is the practice to build your code everytime any member of your dev team integrates code changes to the main repository.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Integrate Visual Studio Online with Bitbucket requires a couple of thing:</div>
<div style="text-align: justify;">
</div>
<ol>
<li>You need to create a web app (aka proxy*) that ueue a new build using <a href="https://www.visualstudio.com/en-us/integrate/api/build/builds" target="_blank">Visual Studio Team Services REST APIs</a></li>
<li>You need to configure a <a href="https://confluence.atlassian.com/bitbucket/manage-webhooks-735643732.html" target="_blank">Bitbucket webhook</a> to queue a new build using the proxy. FYI webhooks "<i>provide a way to configure Bitbucket Cloud to make requests to your server (or another external service) whenever certain events occur in Bitbucket Cloud</i>".</li>
<li>Configure a new build in VSO that gets the code from an external Git repository</li>
</ol>
<div>
*You need to use a proxy because bitbucket webhooks only do a POST to an URL without any configuration options.</div>
<div>
<br /></div>
<div>
Also you can create a <a href="https://www.visualstudio.com/en-us/get-started/integrate/service-hooks/slack-and-vso-vs" target="_blank">VSO webhook to notify slack</a> (and also the dev team) the result of the build</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz74Nnz_kUB3CSkVExHnD89s3jaeJ8qquSkYqHnicdO2rl32Yy03zpx44dxOisjwbYUg62lsPSdREWrzInyqHGWDlsiJL1tP_Ymy_xjVYOb3uMUJcM3KCWOvzJiev-0dA2g0kzzPj2LAN9/s1600/ci+vos+and+bitbucket.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="278" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz74Nnz_kUB3CSkVExHnD89s3jaeJ8qquSkYqHnicdO2rl32Yy03zpx44dxOisjwbYUg62lsPSdREWrzInyqHGWDlsiJL1tP_Ymy_xjVYOb3uMUJcM3KCWOvzJiev-0dA2g0kzzPj2LAN9/s640/ci+vos+and+bitbucket.png" width="640" /></a></div>
<div>
<br /></div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-85965447567781632002015-11-17T00:15:00.000-03:002015-11-17T00:18:24.668-03:00From my notebook HDD to Image (external HDD) to SDDThe other I bought a <a href="http://www.amazon.com/Kingston-Digital-SSDNow-SV300S37A-240G/dp/B00A1ZTZNM/ref=as_sl_pc_qf_sp_asin_til?tag=almasgemelas&linkCode=w00&linkId=6PT3X3JSBPBOYDCP&creativeASIN=B00A1ZTZNM">SDD Kingston Digital 240GB</a> from Amazon to upgrade my old i3 notebook (By the way, I also bought some RAM)<br />
<br />
The main problem was how to copy all my Windows, Programs and personal data to my new SDD without plugging both of them to my notebook (only one internal SATA adapter and no cradle)<br />
<br />
Searching the web and after trying <a href="http://clonezilla.org/" target="_blank">Clonezilla</a> without any good result, I found this article about "<a href="http://www.pcworld.com/article/2029832/backing-up-your-entire-drive-cloning-vs-imaging.html" target="_blank">Backing up your entire drive - Cloning vs. imaging</a>" and about this excelent software called <a href="http://www.macrium.com/reflectfree.aspx" target="_blank">Macrium Reflect Free</a> (with Windows 10 support)<br />
<br />
I can't tell you how easy and intuitive the proccess was!!! This software is free an extremely awesome<br />
<br />
<div style="text-align: center;">
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=qf_sp_asin_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00A1ZTZNM&asins=B00A1ZTZNM&linkId=6PT3X3JSBPBOYDCP&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00S9Q9VS4&asins=B00S9Q9VS4&linkId=WNHVOG2MIJUGI34E&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
</div>
<br />
You'll need:<br />
<br />
<ol>
<li>USB pendrive to create a boot recovery and to restore you image to your new SDD</li>
<li>External HDD to copy your HDD "backup" image.</li>
</ol>
<br />
<br />
The basics steps to clone your notebook HDD to Image (external HDD) to SDD are:<br />
<br />
<ol>
<li>Shrink you Windows and data Partition to fit your new SDD (if you need to move some data to other drive, just do it) using the free <a href="http://www.partition-tool.com/" target="_blank">EaseUS Partition Master</a> (or similar)</li>
<li>Download <a href="http://www.macrium.com/reflectfree.aspx" target="_blank">Macrium Reflect Free</a> and install it</li>
<li>Create the USB recovery boot. </li>
<li>Open <a href="http://www.macrium.com/reflectfree.aspx" target="_blank">Macrium Reflect Free</a> and select "Create an image of partition(s) required to backup and restore Windows". </li>
<li>Once the image creation process ends, turn off your notebook and replace the old HDD with your new SDD</li>
<li>Boot your notebook with the USB</li>
<li>Restore your partitions from you image to your SDD</li>
<li>Enjoy!</li>
</ol>
<div>
That's all!</div>
<div>
Enjoy your new and faster notebook</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-59197841969601774412015-10-27T21:46:00.003-03:002015-11-17T00:17:11.207-03:00Amazon salesThese are my favourite amazon items!<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=qf_sp_asin_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00A1ZTZNM&asins=B00A1ZTZNM&linkId=6PT3X3JSBPBOYDCP&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=qf_sp_asin_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00TSUGXKE&asins=B00TSUGXKE&linkId=P3PCAOZJUA7BK2MD&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B014854RGK&asins=B014854RGK&linkId=5MM2Z3XSEA7KSROK&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00ZQVSKSM&asins=B00ZQVSKSM&linkId=KAWOEJAPYEVI6BGX&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00S9Q9VS4&asins=B00S9Q9VS4&linkId=WNHVOG2MIJUGI34E&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00MWI4LD0&asins=B00MWI4LD0&linkId=6RHOJEXX2SO3PZBR&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B00ZKDUFBQ&asins=B00ZKDUFBQ&linkId=CNTTKFBBFWDG6EP7&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=tf_til&ad_type=product_link&tracking_id=almasgemelas&marketplace=amazon&region=US&placement=B003U8EWN0&asins=B003U8EWN0&linkId=Y5GT5TKEHRBCFRMI&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe>Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-16209350339682606402015-06-17T17:47:00.000-03:002015-06-17T17:47:01.055-03:00Epidemic: human IA walking aroundEy you! It's me again adding more and more IA to my game characters.<br />
<br />
In the last version, the infected became more intelligent, they were able to pick a human (not infected) using their vision.<br />
<br />
Now is the turn of the human to become intelligent. Now they walk around choosing randomly where to go. Actually they randomly pick one "point" in a list of points and walk to that point and they arrive to that point, they choose other point. The idea is that human can walk from bus stops to shops to house and so on.<br />
<br />
Here you can see the implementation: <a href="https://db.tt/bWvlxKPI" style="text-align: center;">https://db.tt/bWvlxKPI</a><br />
<br />
Plans for the future:<br />
<br />
<ol>
<li>When the humans (not infected) see an infected, they will try to evade it / run away.</li>
<li>The infected will be patrolling / walking around when they are not following anyone.</li>
</ol>
Hope you enjoy it! Drop me a line with your feedback<br />
<br />
Please, don't forget to visit all the related post to see how the project advances<br />
<br />
Greetings from Argentina,<br />
HernanHernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-84935622313778027472015-06-09T11:35:00.003-03:002015-06-09T11:36:34.101-03:00Epidemic: enemy IA sight and follow<div style="text-align: justify;">
Good morning! It's me again, and now trying to add more inteligence to the game. In the last version, the infected chose not infected randombly. Now this changed! they pick their victims using their vision! And if they can't see their victim anymore, they'll stop following it.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
By a 3d model / technical limitation (and remember this is only a prototype), now the infected are represented by robots (and the infection mechanic is disabled)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So in this new version you will find:</div>
<ol>
<li style="text-align: justify;">The infected will be able to pick a not infected using their vision. This was done by following the <a href="http://unity3d.com/learn/tutorials/projects/stealth/enemy-sight" target="_blank">Unity tutorial about "Enemy Sight"</a>. And if they can't see their victim anymore, they'll stop following it.</li>
<li style="text-align: justify;">The infection mechanic is (temporarily) disabled</li>
</ol>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Plans for the future:</div>
<div style="text-align: justify;">
<ol>
<li>The infected will be patrolling / walking around when they are not following anyone.</li>
<li>The not infected will be more intelligent. They will be walking around and when they see an infected, they will try to evade it / run away.</li>
</ol>
</div>
<div style="text-align: center;">
<a href="https://dl.dropboxusercontent.com/u/6909443/Epidemic/20150609/Web.html">https://dl.dropboxusercontent.com/u/6909443/Epidemic/20150609/Web.html</a></div>
<div style="text-align: center;">
<br /></div>
Hope you enjoy it! Drop me a line with your feedback<br />
<br />
Please, don't forget to visit <a href="http://www.hernanzaldivar.com/search/label/epidemic" target="_blank">all the related post </a>to see how the project advances<br />
<br />
Greetings from Argentina,<br />
Hernan<br />
<br />Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-78157197657579345022015-05-27T02:26:00.002-03:002015-05-27T02:27:54.068-03:00Epidemic: some IA, a bot that follows one person<div style="text-align: justify;">
I'm trying to make things a little bit fun, so I added some IA to the enemies (sort of)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
IA can be extremely difficult but as I'm prototyping and I'm just trying some features, I searched the Internet for already done scripts / components. I found a free and excelent component called "A* Pathfinding Project". By the mouth of the creator "<i>Lightning fast pathfinding for Unity3D. Whether you write a TD, RTS, FPS or RPG game, this package is for you. With heavily optimized algorithms and a large feature set but yet simple to use, you will be able to make those bots a bit smarter in no time.</i>". For those who don't know what is "A* Pathfinding", you can <a href="http://en.wikipedia.org/wiki/A*_search_algorithm" target="_blank">visit wikipedia as always</a></div>
<br />
In this case, I followed the <a href="http://arongranberg.com/astar/webplayer?p=penalties" target="_blank">penalties example</a>. Basically it's a robot that follow one point. As I was trying the infected to follow the not infected, this was great!!!<br />
<br />
<div style="text-align: justify;">
So in this new version you will find:</div>
<br />
<ol>
<li style="text-align: justify;"><b>Infection fixed:</b> now the not infected are infected (thanks Pablo Ferro!!)</li>
<li style="text-align: justify;"><b>Added an "inteligent" robot</b> that picks one not infected randomly and follows it. When the not infected becomes infected, then it picks another not infected to follow. If everyone is infected, it will stop following people :)</li>
</ol>
<div style="text-align: justify;">
Plans for the future:</div>
<div>
<ol>
<li style="text-align: justify;">Add the robot IA to the infected so they can follow the not infected.</li>
<li style="text-align: justify;">The infected will be able to pick a not infected not randombly but using their vision. This will be done following one of the <a href="http://unity3d.com/learn/tutorials/projects/stealth/enemy-sight" target="_blank">Unity tutorial about "Enemy Sight"</a></li>
</ol>
</div>
<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
Check the prototype here:</div>
<div style="text-align: center;">
<a href="https://dl.dropboxusercontent.com/u/6909443/Epidemic/20150527/Web.html">https://dl.dropboxusercontent.com/u/6909443/Epidemic/20150527/Web.html</a></div>
<br />
Hope you enjoy it! Drop me a line with your feedback<br />
<br />
Please, don't forget to visit <a href="http://www.hernanzaldivar.com/search/label/epidemic" target="_blank">all the related post </a>to see how the project advances<br />
<br />
Greetings from Argentina,<br />
HernanHernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-15906671704035367072015-05-25T17:36:00.003-03:002015-05-25T17:41:05.828-03:00Sobre el Amazon Fire TV Stick y mi experiencia con el mismo<div style="text-align: justify;">
Básicamente el <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> es tipo un pendrive que se conecta al puerto HDMI de tu TV y te permite agregarle funcionalidades smart o ampliar sus funcionalidades a través del Amazon App Store. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En este post trataré de contarles como fue mi experiencia con el mismo y sabiendo que vivo en Argentina</div>
<h2>
Principales características</h2>
<div>
Apriori el <a href="http://amzn.to/1FbDx58" style="text-align: justify;" target="_blank">Amazon Fire TV Stick</a> tiene características que lo hacen muy interesante, características las cuales ampliaré más adelante.</div>
<br />
<ul>
<li style="text-align: justify;"><u>Disfrutar de MILES de películas y series al instante:</u> El <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> se conecta al puerto HDMI de tu TV. Es fácil de usar y de configurar para disfrutar de MILES de películas y series al instante en <a href="http://amzn.to/1Au7mBb" target="_blank">Netflix</a>, <a href="http://amzn.to/1Au7bpF" target="_blank">Amazon Prime Video</a>, HBO GO, and Hulu Plus. Además posee Spotify y muchos juegos. Jugá juegos como Flappy Birds Family, Toy Story: Smash It, Monsters University y muchos más.</li>
<li style="text-align: justify;"><u>Instalar apps Android:</u> Además, podés descargar distintas aplicaciones Android e instalarlas en el dispositivo ya que internamente es un Android 4.4.4 customizado por Amazon. Funcionan muy bien, hay listados en internet sobre cuáles son las que funcionan, etc.</li>
<li style="text-align: justify;"><u>Duplicar tu dispositivo:</u> <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> te deja duplicar tu teléfono, tablet o PC en la TV (Miracast) o utilizar en ella APPs para liberar la pantalla de tu dispositivo.</li>
<li style="text-align: justify;"><u>Mejor que el Chromecast:</u> 4x la capacidad y 2x la memoria de <a href="http://amzn.to/1cWH7IK" target="_blank">Chromecast </a>más un procesador dual-core y 1 GB de memoria para acceder al contenido de forma instantánea. Además funciona distinto a <a href="http://amzn.to/1cWH7IK" target="_blank">Chromecast</a>, instalando las APPs en el dispositivo mismo, sin la necesidad de emparejar un teléfono ni ningún otro dispositivo. Enchufálo al HDMI de tu TV y directamente navegá usando su control remoto dedicado. </li>
</ul>
<br />
<h2>
<span style="text-align: justify;">Disfrutar de MILES de películas y series al instante</span></h2>
<span style="text-align: justify;">Una de sus principales ventajas es su bajo precio y que posee un Android 4.4.4 que lo hacen totalmente autónomo ya que además posee control remoto. A priori puede ser un dispositivo excelente pero no todo lo que brilla es oro. Si no vives en EEUU o en alguno de los países donde Amazon ofrece sus servicios como pueden ser </span><a href="http://amzn.to/1Au7bpF" style="text-align: justify;" target="_blank">Amazon Prime Video</a><span style="text-align: justify;"> o </span><a href="http://amzn.to/1FbFfTY" style="text-align: justify;" target="_blank">Amazon Music</a><span style="text-align: justify;">, sólo servirá para ver </span><a href="http://amzn.to/1Au7mBb" style="text-align: justify;" target="_blank">Netflix</a><span style="text-align: justify;"> y algo más. </span><br />
<span style="text-align: justify;">A pesar de ser un dispositivo autónomo, sólo se pueden disfrutar de fábrica algunas de las apps que estén disponibles en tu país desde el <a href="http://www.amazon.com/b/ref=mas_lftnav_KFTV?ie=UTF8&node=10208590011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=merchandised-search-leftnav&pf_rd_r=1F6Q1PH8JA4VG5SXC6Y0&pf_rd_t=101&pf_rd_p=2075644122&pf_rd_i=2350149011" target="_blank">Amazon App Store for Fire TV</a> pero esto puede ser solventado instalándole apps Android.</span><br />
<div style="text-align: justify;">
<h2 style="text-align: start;">
Instalar apps Android</h2>
</div>
<div style="text-align: justify;">
Como antes comentaba, el <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> es un dispositivo con Android asi que puede instalarle cualquier app Android disponible. El proceso se conoce como Sideload y es simplemente aprovechar la ventaja que tienen los Androids para probar apps para un desarrollador de aplicaciones. Para habilitar para cargar las aplicaciones sólo tienes que <a href="http://sideloadfiretv.com/" target="_blank">seguir estos simples pasos</a>. Si ya tienes el modo desarrollador habilitado en tu Fire TV, puede <a href="https://play.google.com/store/apps/details?id=com.googletv.sideloader" target="_blank">usar apps como AGK Fire (Ad free) para cargar apps más fácilmente</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Uno de las mayores molestias de las aplicaciones "sideload" es que no se muestran en el launcher del <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> , no se muestran ni “Home” ni en “Apps”. En cambio debes ingresar al menú de Setting y buscar aplicaciones instaladas, cosas que requerirá al menos presionar 20 veces el botón del control remoto. Pero como para todo problema hay algún tipo de solución y la comunidad ya se ha encargado de eso. Aquí tienes varias ideas de como solventar eso. <a href="http://www.aftvnews.com/how-to-launch-kodi-xbmc-spmc-and-other-sideloaded-apps-from-the-fire-tv-homescreen/">http://www.aftvnews.com/how-to-launch-kodi-xbmc-spmc-and-other-sideloaded-apps-from-the-fire-tv-homescreen/</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quizá hay problemas de compatibilidad porque una app está preparada para un dispositivo mobile pero será cuestión de probar. Aquí tiene un listado de las tops apps que puedes hacer sideload en tu Fire TV Stick <a href="http://www.aftvnews.com/list-of-apps-you-can-sideload-onto-the-amazon-fire-tv/">http://www.aftvnews.com/list-of-apps-you-can-sideload-onto-the-amazon-fire-tv/</a></div>
<h3>
Compatibilidad de apps Android en Fire TV</h3>
<div style="text-align: justify;">
Como ya veíamos, al <a href="http://amzn.to/1FbDx58" style="text-align: justify;" target="_blank">Amazon Fire TV Stick</a><span style="text-align: justify;"> </span>se le puede poner casi cualquier aplicación Android ya que corre un Android tuneado por Amazon. Otra desventaja, además que las apps no te aparecen dentro del launcher, es que el control remoto del <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> no está pensado para manejar apps táctiles. Pero como ya comentamos, casi todo problema tiene solución y es este caso, el <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> posee Bluetooth por lo que podremos <a href="https://www.reddit.com/r/fireTV/comments/2o696o/best_mouse_keyboard_to_go_with_fire_tv_stick/" target="_blank">conectarle un teclado con mouse bluetooth</a> (para poder tipear y moverte dentro de las apps normales. Algunos de los teclados / joysticks que funcionan son:</div>
<div style="text-align: justify;">
</div>
<ol>
<li><a href="http://amzn.to/1HsRRXp" target="_blank">QQ-Tech Mini Bluetooth Keyboard W Touchpad for Android OS Windows</a></li>
<li><a href="http://amzn.to/1Q74PyE" target="_blank">Nyko Playpad Pro for Android/Bluetooth</a></li>
<li><a href="http://amzn.to/1AuaOf4" target="_blank">Nyko Playpad for Android/Bluetooth (Black)</a></li>
</ol>
<div>
Aquí pueden encontrar más info sobre <a href="https://www.reddit.com/r/fireTV/comments/2o696o/best_mouse_keyboard_to_go_with_fire_tv_stick/" target="_blank">como configurarlos</a> y además <a href="http://www.howtogeek.com/204540/how-to-pair-third-party-controllers-with-your-fire-tv-and-fire-tv-stick/" target="_blank">aquí</a></div>
<div>
<br /></div>
<br />
<div style="text-align: justify;">
Si no quieres comprar un teclado con mouse bluetooth, una buena alternativa es <a href="http://amzn.to/1ApWg0s" target="_blank">Remote Mouse for Fire TV</a> que cuesta unos pocos dólares o usar una app gratuita de Android <a href="https://play.google.com/store/apps/details?id=com.wukongtv.wkremote.client.en" target="_blank">Wukong TV Romote Control</a> para simular el teclado y mouse con tu telefono. La desventaja de esta última es que no está traducida a todos los idiomas.</div>
<h2>
Duplicar tu dispositivo</h2>
<div style="text-align: justify;">
En principio te permite usar tu computadora con Windows 7 / 8 para proyectar en el <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a>, siempre y cuando tu computadora / notebook con Windows 8 soporte Miracast. Para saber si tu computadora soporta Miracast, puedes it a este <a href="https://actiontec.zendesk.com/hc/en-us/articles/200694717-How-can-I-find-out-if-my-system-laptop-or-notebook-or-ultrabook-can-support-Intel-WiDi-" target="_blank">link </a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Respecto a la velocidad de transferencia usando el <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> como receptor Miracast, acá se puede encontrar una <a href="http://withinrafael.com/raw-wi-fi-display-dongles-and-associated-latencies/" target="_blank">comparativa entre varios dispositivos</a>, otorgando al <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> uno de los peores resultados. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Yo he conectado mi Sony Xperia ZL y el resultado ha sido moderado, pudiendo hacer mirroring de mi telefóno y ver apps pero no pudiendo por ejemplo reproducir un video en 1080p</div>
<h2>
Mejor que el Chromecast</h2>
<div style="text-align: justify;">
Todo depende del uso que le vas a dar. He utilizado los 2 y a pesar que el <a href="http://amzn.to/1FbDx58" style="text-align: justify;" target="_blank">Amazon Fire TV Stick</a> tiene mejor hardware y sistema operativo propio, para poder utilizarlo en Argentina o paises donde Amazon no ofrece sus servicios, tienes que configurarlo mucho, instalarle muchas apps y comprarle hardware extra o usar apps en tu smartphone. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Y en este punto es donde mas quiero hacer incapie "usar apps en tu smartphone". Si tengo que instalar apps en mi smartphone, me quedo con mi chromecast ya que la mayoría de cosas que le "tire" desde mi smartphone funcionan, en mi smartphone tengo el Google Play store y no tengo que hacer sideload de apps ni nada por el estilo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pero como comentaba, todo depende del uso que le vas a dar, por ejemplo le regalé uno a mi papá que solo quería un dispositivo para ver Netflix y algo más sin tener que renegar con un smartphone ni computadora y <a href="http://amzn.to/1FbDx58" target="_blank">Amazon Fire TV Stick</a> y su control remoto cumplen a la perfección con esta tarea.</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com0tag:blogger.com,1999:blog-9171149635635185317.post-60172306883638077512015-05-20T02:22:00.000-03:002015-05-20T02:22:02.457-03:00Epidemic: new version of my prototype<div style="text-align: justify;">
After a long time without updates, here you have a new version of my Unity3d game prototype called Epidemic. The <a href="http://www.hernanzaldivar.com/2013/11/epidemic-my-new-work-in-progress-game.html" target="_blank">original post is here</a> and all the <a href="http://www.hernanzaldivar.com/search/label/epidemic" target="_blank">related post are here</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This new version has just few news:</div>
<div style="text-align: justify;">
</div>
<ol>
<li>Move camera with left mouse button + mouse movement</li>
<li>Zoom camera with right mouse button + mouse movement</li>
<li>Rotate camera with left controle button + mouse movement</li>
<li>New top down camera</li>
<li>New map or world</li>
<li>Bombs and other items are temporary disabled.</li>
<li>Internal improvements (eg: you can setup spawn points for infected and not infected and also the number of each to spawn)</li>
</ol>
<div style="text-align: center;">
Check the prototype here:</div>
<div style="text-align: center;">
<a href="https://dl.dropboxusercontent.com/u/6909443/Epidemic/Web.html">https://dl.dropboxusercontent.com/u/6909443/Epidemic/Web.html</a> </div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Hope you enjoy it! Drop me a line with your feedback</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Greetings from Argentina,</div>
<div style="text-align: left;">
Hernan</div>
Hernan Zaldivarhttp://www.blogger.com/profile/03894581211300599578noreply@blogger.com1