Migrando paquetes NPM a Azure DevOps Artifacts

Hola a todos, como están. Feliz de retomar este espacio,  compartir conocimiento será siempre una buena acción altruista.

En esta ocasión estoy trabajando en una integración nodejs con unas librerías propias del proveedor.

El proveedor utiliza jfrog como gestor de paquetes, el cual usa una seria de credenciales para poder descargar dichos paquetes.

El problema es que a nuestros clientes teníamos que sumistrarle dicha configuración para que tuvieran acceso a los paquetes, por lo cual no es la mejor forma.

Cual es la mejor forma de resolver esta problemática?. La mejor forma es importar el paquete npm a nuestro gestor de paquetes privado, seria algo así, en vez de utilizar el paquete de jfrog utilizar el mismo paquete en nuestro gestor, que seria Azure DevOps Artifacts.

En jfrog puedes descargar el paquete que necesitas en formato tgz. Para el ejemplo voy a migrar este paquete “tfjs-backend-cpu-2.8.5.tgz”

La prueba la realizare en un Azure DevOps Artifacs vacío.

image

En esta ocasión utilizaremos PowerShell, para subir el paquete. La estructura del script seria así.

npm config set registry https://{feedname}:{personalaccesstoken(PAT)}@pkgs.dev.azure.com/{Organizaiton name}/{Project name}/_packaging/{feed name}/npm/registry

Me situó en la raíz de la carpeta donde esta mi archivo y ejecuto el comando.

image

Despues ejecuto el siguiente comando.

Get-ChildItem *.tgz | ForEach-Object { npm publish $_ }

image

Revisamos y ya encontramos el paquete.

image

Al finalizar es importe eliminar el registry del npm, dado que podria tener inconvenientes. para lo cual hacemos un npm config edit.

Espero les sirva este tip,

Sl2

Romny

[VS2019] – No se puede encontrar una parte de la ruta de acceso \bin\roslyn\csc.exe

Hola a todos, como están. Feliz de retomar este espacio,  es algo apasionante poder compartir conocimiento, y que bueno poder hacerlo antes de culminar el 2020.

Estaba trabajando en una solución ASP.NET MVC y por cosas de la vida tuve que cambiar de maquina.

Ahora bien en esta maquina nueva, clono el repositorio de git y proceso a  ejecutar la aplicación, Oh sorpresa cuando me sale el siguiente error : «could not find file…\bin\roslyn\csc.exe»

Para resolver este error basta con actualizar con el siguiente comando: PM > update-package Microsoft.CodeDom.Providers.DotNetCompilerPlatformimage

image

Con esto ya nuestra solución quedaría 100% operativa.

image

Espero les sirva este tip,

Sl2

Romny

Evento Xamarin: Crea apps para iOS y Android conectadas a Azure Storage

Hola a todos.  El 18 d enero, se tendrá un evento en línea sobre Xamarin llamado, Xamarin: Crea apps para iOS y Android conectadas a Azure Storage, la cual será impartida por Enrique Aguilar, Xamarin MVP y Microsoft MVP

Durante el evento, el participante podrá crear contenedores de blobs (Binary Large Objects) y Tablas NoSQL sobre Azure Storage y poderlos acceder desde aplicaciones con Xamarin. De la misma forma podrá usar iOS para capturar una imagen, manipularla y depositarla en el contenedor de blobs, subir a una tabla NoSQL información de ubicación geográfica del dispositivo y se podrá descargar dicha información en una aplicación para Android.

image

Para el registro, lo pueden hacer en el siguiente link.

https://mva.microsoft.com/liveevents/xamarin-live-latam?wt.mc_id=AID528317_EML_4807347

Sl2

Romny

Xamarin: HockeyApp Custom Events

Hola a todos. Espero que les haya gustado esta serie de post sobre HockeyApp, en esta ocasión les comentare como realizar seguimientos de eventos personalizados desde HockeyApp. Para revisar los post anteriores les dejo los enlaces.

HockeyApp On – Application Insights Off

Xamarin: Integrando HockeyApp

Xamarin: Manejando FeedBack con HockeyApp

Los Customs Events son una funcionalidad en la cual nos permite ver en la plataforma y hacer seguimiento de dichos eventos. Algo así como cuantas veces se le ha echo click a un botón.

HockeyApp Custom Events gives you the ability to track specific user actions and help you better understand how users interact with your app.

Para poder implementarlo lo primero es activar el Preseason Program estas funcionalidades no vienen por defecto ya que están todavía en desarrollo. Teniendo habilitado el sistema nos mostrara un tab nuevo.

image

Para implementarlo debemos incluir una línea de código como se muestra a continuación.

[sourcecode language='csharp'  padlinenumbers='true' htmlscript='true']
button.Click += delegate
			{
				button.Text = string.Format("{0} clicks! ", count++);
				HockeyApp.Metrics.MetricsManager.TrackEvent("button.Click");
			};
[/sourcecode]

Republicamos en HockeyApp y probamos. Revisamos la plataforma y confirmamos que se vean los datos.

image

Bueno, quería mostrarle esta parte. Espero que sea de agrado este post.

Sl2

Romny

Xamarin: Manejando FeedBack con HockeyApp

Hola a todos. seguimos compartiendo funcionalidades de HockeyApp.

HockeyApp On – Application Insights Off

Xamarin: Integrando HockeyApp

En este punto ya hemos creado una app, la hemos configurado, la hemos publicado y la hemos distribuido con HockeyApp.

Procedemos a revisar la funcionalidad de feedback, esta funcionalidad permite compartir con el dueño de la app, comentarios sobre la misma, si nos gusto o no o si tenemos bugs que reportar.

Abrimos la app

image

Nos dirigimos al botón de feedback y damos click. Se nos mostrara un formulario en donde colocaremos los comentarios que necesitemos enviar.

image

Diligenciamos y enviamos.

image

La siguiente vista se presenta después de enviar los datos.

image

Con esta acción nos llegara un email con la información del feedback. También en la web podemos ver esta información y responder el feedback.

image

Los feedback se puede manejar como bugs, para esto necesitamos configura la funcionalidad Bug Tracker, pero en esta ocasión no lo haremos.

image

Nos regresamos a la app y podremos ver la respuesta.

image

De esta forma podemos usar la funcionalidad de feedback de HockeyApp.

Espero les haya gustado.

Sl2

Romny

Xamarin: Integrando HockeyApp

Hola a todos.

Después de una breve introducción a HockeyApp, el cual pueden leerlo en este post.

HockeyApp On – Application Insights Off

Es hora de integrarlo con nuestra app, para esta prueba usaremos Xamarin Android.

Lo primero crearemos nuestra app de ejemplo.

image

Después procederemos a instalar el paquete de nuget HockeySDK.Xamarin, tener presente habilitar la opción de mirar las versiones previas.

image

Procedemos a realizar unos cambios en la interfaz grafica del Main, donde agregaremos unos botones, los cuales nos permitirán realizar un feedback de la app y de provocar un crash.

<Button
        android:id="@+id/MyButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/Hello" />
    <Button
        android:id="@+id/feedback_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/FeedBack" />
    <Button
        android:id="@+id/buttonCauseCrash"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/buttonCauseCrash" />
//

Para poder usar HockeyApp, necesitamos un App Id, el cual me lo genera la pagina web, pero previo a esto necito configurar el package name en mi app.

image

Vamos a HockeyApp y creamos una nueva app. Damos click en “New App”

image

Escogemos la opción manual.

image

Escogemos la plataforma de la app, que en este caso será Android.

image

Seleccionamos el Release Type, en este caso será beta.

image

Por ultimo le damos un titulo y el package name.

image

Después de crear la app, se mostrara el panel de administración.

image

Algo importante es que administran tantas versiones como se quieran de mi app.

Para realizar la implementación de HockeyApp necesitamos incluir las siguientes líneas de código, las cuales se cargaran en el método OnCreate, por ahora solo vamos a habilitar el seguimiento de los crash, seguimiento de feedback y registro de métricas.

image

Agregamos las siguientes líneas. Estas líneas lo que hacen es, hacer un feedback y provocar un crash.

[sourcecode language=»csharp» htmlscript=»true»]
var feedbackButton = FindViewById<Button>(Resource.Id.feedback_button);

feedbackButton.Click += delegate
{
FeedbackManager.ShowFeedbackActivity(ApplicationContext);
};

FindViewById<Button>(Resource.Id.buttonCauseCrash).Click += delegate
{
// Throw a deliberate sample crash
throw new HockeyAppSampleException("You intentionally caused a crash!");
};
[/sourcecode]

[sourcecode language=»csharp» htmlscript=»true»]
public class HockeyAppSampleException : System.Exception
{
public HockeyAppSampleException(string msg)
: base(msg)
{
}
}
[/sourcecode]

Ahora lo que restas es probar en local y subir el apk a hockeyapp para distribuir a nuestros usuarios. En hockeyApp agregamos una nueva versión. Como nota el apk tiene que estar firmado.

image

Agregamos unas notas para la distribución.

image

Habilitamos las opciones de instalación y de restricciones en las descargas.

image

Por ultimo notificamos a nuestros usuarios.

image

Al final nos muestra un resumen de la versión que estamos cargando.

image

El siguiente es el panel administrativo de la versión que acabamos de subir.

image

Podemos instalar la app de dos formas, con el correo que nos llegara o ir directamente a la pagina en HockeyApp desde nuestros dispositivos.

Revisamos nuestro email para descargar la app.

image

image

Abrimos el enlace y descargamos la app.

image
Abrimos la app y probamos. Si realizan un crash y consultan la web,muy posiblemente no vean el crash, HockeyApp demora de 3 a 5 minutos en poder visualizarlo.

image

Provocamos un crash y la app se cierra, cuando volvemos a abrirla nos muestra el siguiente mensaje.

image

Después este paso ya podemos visualizar el crash en la consola y hacerle seguimiento.

image

Implementamos un botón de feedback, este nos permite escribirle al dueño de la app y dar sus comentarios y apreciaciones de la app. pero esto queda para que lo investiguen.

Para los que deseen ver el código se los deje en el siguiente link.

https://github.com/romnyd/AppHokeyDemo

Espero que les haya gustado este post

Sl2

Romny

HockeyApp On – Application Insights Off

Hola a todos.

Para los que no conocían “Application Insights” es un servicio de Azure con el cual se podía detectar y diagnosticar problemas de nuestras aplicaciones móviles, permitía realizar muchas cosas y era muy interesante por los servicios complementarios como el realizar el big data de nuestra app.

En marzo, salió un articulo donde se explica que a partir del 15 de abril se dejaba de aceptar nuevas aplicaciones móviles con Application Insights, que se recomendaba migrar a HockeyApp. Además a partir de junio 15 se dejaba de mostrar data en azure.

Transitioning Mobile Apps from Application Insights to HockeyApp

En ese tiempo HockeyApp, era una plataforma enfocada en distribuir y testear nuestras app, nuestro amigo walter ya había comentado sobre esto. Cómo probar y distribuir tus apps de manera sistemática: HockeyApp.

HockeyApp dejo de ser un servicio enfocado solo en distribuir y testear nuestras apps, para convertirse en el nuevo Application Insights. Las características que ofrecen hasta ahora son: Distribution, Crash Reports, Feedback, User Metrics, Teams, Enterprise.

Estas características son básicas, para tener las características mas interesantes debes ser parte del  “Preseason Program” donde tendremos Custom Events, Mobile Developer Apps, HockeySDK for tvOS, HockeySDK for UWP que es lo importante de HockeyApp, para aplicar este programa debes tener cuenta, el único dato que no se es cuanto se demoran en activarte estas opciones.

Las personas que ya estén usando Application Insights pueden revisar este articulo para migrar lo existente. Migrate your Application Insights mobile app to HockeyApp today

Bueno, este post fue mas informativo, el próximo será usando HockeyApp

Sl2

Romny

Consumiendo InternalEndPoint–WCF en Azure

Hola a todos.

Después de crear un wcf en Azure y de consumir un EndPoint interno que viaja por tcp, ahora procedemos a consumir dicho EndPoint interno desde una aplicación en un WebRole.

Para revisar el post anterior http://geeks.ms/rduarte/2016/03/13/comunicacin-interna-wcf-en-azure/

Lo primero es agregar una solución web de tipo Web Role, puede ser una aplicación tipo web forms o mvc.

image

Dicha aplicación le colocamos un EndPoint de entrada, para poder acceder a ella.

image

Creamos un botón con la siguiente funcionalidad.

[sourcecode language='csharp'  padlinenumbers='true' htmlscript='false']
protected void Button1_Click(object sender, EventArgs e)
		{
			try
			{
				var factory = new ChannelFactory<WcfWorker.IWorker>(new NetTcpBinding(SecurityMode.None));
				var current = RoleEnvironment.CurrentRoleInstance;
				var channel = factory.CreateChannel(GetRandomEndpoint());
				Label1.Text = channel.Say("Hola");
				
			}
			catch (Exception ex)
			{

				Label1.Text = ex.Message;
			}

			
		}
		private EndpointAddress GetRandomEndpoint()
		{
			var endpoints = RoleEnvironment.Roles["WcfWorker"].Instances.Select(i => i.InstanceEndpoints["InternalRest"].IPEndpoint).ToArray();
			var r = new Random(DateTime.Now.Millisecond);
			return new EndpointAddress(string.Format("net.tcp://{0}/InternalRest", endpoints[r.Next(endpoints.Count() - 1)]));
		}
[/sourcecode]

Para esta parte es importante saber que servicio es el que esta expuesto para uso interno. Revisen CreateServiceHost();

Ahora publicamos y probamos.

image

Bueno, espero que sea de utilidad este post.

Sl2

Romny

Comunicación Interna – WCF en Azure

Hola a todos.

Muchas veces necesitamos hacer aplicaciones orientadas a servicios y además que estas se integren con otros sistemas de servicios como soa.

Para estos casos un simple rest no es factible debido a que se montara en Azure. Básicamente lo que se quiere es exponer un servicio wcf que ira por http pero la comunicación interna deberá ser por tcp por aquello de que tcp nos evita como dos capas del modelo osi.

Requerimientos

    Microsoft Azure SDK for .NET – 2.8.2

    Cuenta de Azure

    Creamos un proyecto Azure WorkerRole

    image

    image

    Después de creado el proyecto, damos en propiedades del role WcfWorker, vamos a extremos y añadimos los siguientes puntos.

    image

    Agregamos las siguientes referencias.

    image

    Agregamos una interface IService

    image

Agregamos una interface IWorker

image

Agregamos una clase Service que implemente las interfaces creadas.

image

Abrimos la clase WorkerRole.cs, creamos variables ServiceHost y añadimos el método CreateServiceHost para alojar su servicio WCF REST.

[sourcecode language='csharp'  padlinenumbers='true']
//Static channel factory for inter-role communication.
		private static ChannelFactory<IWorker> factory;

		//Service host varible.
		private ServiceHost serviceHost;


		private void CreateServiceHost()
		{
			//Url of service.
			Uri httpUri = new Uri(String.Format("http://{0}/{1}", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Rest"].IPEndpoint.ToString(), "Rest"));

			//Assign url to service host.
			serviceHost = new ServiceHost(typeof(Service), httpUri);

			//Adding endpoint for REST service.
			ServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");

			//Adding behavior for REST service.
			ep.Behaviors.Add(new WebHttpBehavior() { HelpEnabled = true });


			//NetTcpBinding with no security.
			NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);

			//Define an internal endpoint for inter-role traffic.
			RoleInstanceEndpoint internalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["InternalRest"];

			//Add internal endpoint.
			this.serviceHost.AddServiceEndpoint(typeof(IWorker), binding, String.Format("net.tcp://{0}/InternalRest", internalEndPoint.IPEndpoint));

			//Create channel factory for inter-role communication.
			WorkerRole.factory = new ChannelFactory<IWorker>(binding);

			//Open the service host  to start listening for messages.
			serviceHost.Open();

		}
[/sourcecode]

Creamos el método NotifiyAllNodes para notificar en las instancias.

[sourcecode language='csharp' ]
internal static void NotifyAllNodes(string message)
        {
            //Get the role id.
            string roleId = RoleEnvironment.CurrentRoleInstance.Id;


                //Gets a RoleInstance object representing the role instance in which this code is currently executing.
                var current = RoleEnvironment.CurrentRoleInstance;

                //Get all instances except the current.
                var endPoints = current.Role.Instances
                                .Where(instance => instance != current)
                                .Select(instance => instance.InstanceEndpoints["InternalRest"]);
                foreach (var ep in endPoints)
                {
                    //Internal endpoint address.
                    EndpointAddress address = new EndpointAddress(String.Format("net.tcp://{0}/InternalRest", ep.IPEndpoint));

                    //Channel for communication.
                    IWorker client = WorkerRole.factory.CreateChannel(address);

                    //Update all the instances.
                    client.UpdateMessage(message, ep.RoleInstance.Id);
                }
         }
[/sourcecode]

Llamar método CreateServiceHost en método OnStart() .

Procedemos a publicar.

image

Cuando publicamos tenemos una exception.

HTTP could not register URL http://+:80/Rest/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).

La solución a este problema es averiguar el puerto que necesita para abrir y dar permiso al rol de trabajo para abrir el puerto apropiado.

Para esto creamos un proyecto de consola.

image

Vinculamos el ejecutable al proyecto WorkerRole y seleccionamos que se copie siempre.

image

En el archivo de definición agregamos las siguientes líneas.

[sourcecode language='xml' ]
<Startup>
			<Task commandLine="PortDetect.exe" executionContext="elevated" taskType="simple">
			</Task>
		</Startup
[/sourcecode]

Volvemos a publicar, Ahora se puede acceder al servicio rest que se aloja (en el puerto 80) en el WorkerRole y internamente se comunica por tcp.

Realizamos una prueba para ver que todo este bien.

image

Bueno, espero que sea de utilidad este post.

Sl2

Romny

Team Fundation Services – Crear Build

Hola a todos, seguimos con pequeños tips o ayudas a la hora de usar TFS. hoy vamos a crear un Build para nuestro proyecto. Esta labor se puede hacer desde Visual Studio o desde el Portal. Esta vez lo haremos desde el Portal.

Vamos al protal a la seccion de Build y damos agregar

image

se desplegara un formulario para escoger que tipo de solucion queremos hacer el build

image

en la siguiente escogemos nuestro repositorio, podemos usar aparte del sistema de repositorio de visual studio, podemos usar github,subversion, o cualquier sistema externo que utilice gitbug como bitbucket y damos crear.

image

Para este caso escogemos que se desea compilar una solución de visual studio y que limpie la solución y restaure paquetes cuando se ejecute. Ademas podemos configurar mas opciones, pueden revisar.

image

Lo ultimo es guardar y asignarle un nombre.

image

algo importante que deben saber es que la build o compilación se ejcutara automaticamente cuando subimos un cambio al repositorio de codigo.

image

Con esto ya pueden probar en sus implementaciones, espero les agrade y les sirva.

Sl2

Romny