← maurobernal.com.ar

Categoría: Blog

  • AMI Commands List

    AMI es la interface que tiene disponible Asterisk para permitir la integración con sistemas externos.

    En esta ocasión te dejo el listado completo en Asterisk 18 de comandos disponibles para interactuar con tu PBX

    AbsoluteTimeout Set absolute timeout.
    AGI Add an AGI command to execute by
    AOCMessage Generate an Advice of Charge mess
    Atxfer Attended transfer.
    BlindTransfer Blind transfer channel(s) to the
    Bridge Bridge two channels already in th
    BridgeDestroy Destroy a bridge.
    BridgeInfo Get information about a bridge.
    BridgeKick Kick a channel from a bridge.
    BridgeList Get a list of bridges in the syst
    BridgeTechnologyList List available bridging technolog
    BridgeTechnologySuspend Suspend a bridging technology.
    BridgeTechnologyUnsuspend Unsuspend a bridging technology.
    CancelAtxfer Cancel an attended transfer.
    Challenge Generate Challenge for MD5 Auth.
    ChangeMonitor Change monitoring filename of a c
    Command Execute Asterisk CLI Command.
    ConfbridgeKick Kick a Confbridge user.
    ConfbridgeList List participants in a conference
    ConfbridgeListRooms List active conferences.
    ConfbridgeLock Lock a Confbridge conference.
    ConfbridgeMute Mute a Confbridge user.
    ConfbridgeSetSingleVideoSrc Set a conference user as the sing
    ConfbridgeStartRecord Start recording a Confbridge conf
    ConfbridgeStopRecord Stop recording a Confbridge confe
    ConfbridgeUnlock Unlock a Confbridge conference.
    ConfbridgeUnmute Unmute a Confbridge user.
    ControlPlayback Control the playback of a file be
    CoreSettings Show PBX core settings (version e
    CoreShowChannels List currently active channels.
    CoreStatus Show PBX core status variables.
    CreateConfig Creates an empty file in the conf
    DAHDIDialOffhook Dial over DAHDI channel while off
    DAHDIDNDoff Toggle DAHDI channel Do Not Distu
    DAHDIDNDon Toggle DAHDI channel Do Not Distu
    DAHDIHangup Hangup DAHDI Channel.
    DAHDIRestart Fully Restart DAHDI channels (ter
    DAHDIShowChannels Show status of DAHDI channels.
    DAHDITransfer Transfer DAHDI Channel.
    DBDel Delete DB entry.
    DBDelTree Delete DB Tree.
    DBGet Get DB Entry.
    DBGetTree Get DB entries, optionally at a p
    DBPut Put DB entry.
    DeviceStateList List the current known device sta
    DialplanExtensionAdd Add an extension to the dialplan
    DialplanExtensionRemove Remove an extension from the dial
    Events Control Event Flow.
    ExtensionState Check Extension Status.
    ExtensionStateList List the current known extension
    FAXSession Responds with a detailed descript
    FAXSessions Lists active FAX sessions
    FAXStats Responds with fax statistics
    Filter Dynamically add filters for the c
    G729LicenseList G.729 License List
    G729LicenseStatus G.729 License Status
    GetConfig Retrieve configuration.
    GetConfigJSON Retrieve configuration (JSON form
    Getvar Gets a channel variable or functi
    Hangup Hangup channel.
    IAXnetstats Show IAX Netstats.
    IAXpeerlist List IAX Peers.
    IAXpeers List IAX peers.
    IAXregistry Show IAX registrations.
    ListCategories List categories in configuration
    ListCommands List available manager commands.
    LocalOptimizeAway Optimize away a local channel whe
    LoggerRotate Reload and rotate the Asterisk lo
    Login Login Manager.
    Logoff Logoff Manager.
    MailboxCount Check Mailbox Message Count.
    MailboxStatus Check mailbox.
    MeetmeList List participants in a conference
    MeetmeListRooms List active conferences.
    MeetmeMute Mute a Meetme user.
    MeetmeUnmute Unmute a Meetme user.
    MessageSend Send an out of call message to an
    MessageSendInfo
    MixMonitor Record a call and mix the audio d
    MixMonitorMute Mute / unMute a Mixmonitor record
    ModuleCheck Check if module is loaded.
    ModuleLoad Module management.
    Monitor Monitor a channel.
    MuteAudio Mute an audio stream.
    Originate Originate a call.
    Park Park a channel.
    ParkedCalls List parked calls.
    Parkinglots Get a list of parking lots
    PauseMonitor Pause monitoring of a channel.
    Ping Keepalive command.
    PJSIPCallIDToChannel
    PJSIPNotify Send a NOTIFY to either an endpoi
    PJSIPQualify Qualify a chan_pjsip endpoint.
    PJSIPRegister Register an outbound registration
    PJSIPShowAors Lists PJSIP AORs.
    PJSIPShowAuths Lists PJSIP Auths.
    PJSIPShowContacts Lists PJSIP Contacts.
    PJSIPShowEndpoint Detail listing of an endpoint and
    PJSIPShowEndpoints Lists PJSIP endpoints.
    PJSIPShowRegistrationInboundContactStatuses Lists ContactStatuses for PJSIP i
    PJSIPShowRegistrationsInbound Lists PJSIP inbound registrations
    PJSIPShowRegistrationsOutbound Lists PJSIP outbound registration
    PJSIPShowResourceLists Displays settings for configured
    PJSIPShowSubscriptionsInbound Lists subscriptions.
    PJSIPShowSubscriptionsOutbound Lists subscriptions.
    PJSIPUnregister Unregister an outbound registrati
    PlayDTMF Play DTMF signal on a specific ch
    PlayMF Play MF digit on a specific chann
    PresenceState Check Presence State
    PresenceStateList List the current known presence s
    PRIDebugFileSet Set the file used for PRI debug m
    PRIDebugFileUnset Disables file output for PRI debu
    PRIDebugSet Set PRI debug levels for a span
    PRIShowSpans Show status of PRI spans.
    QueueAdd Add interface to queue.
    QueueChangePriorityCaller Change priority of a caller on qu
    QueueLog Adds custom entry in queue_log.
    QueueMemberRingInUse Set the ringinuse value for a que
    QueuePause Makes a queue member temporarily
    QueuePenalty Set the penalty for a queue membe
    QueueReload Reload a queue, queues, or any su
    QueueRemove Remove interface from queue.
    QueueReset Reset queue statistics.
    QueueRule Queue Rules.
    QueueStatus Show queue status.
    QueueSummary Show queue summary.
    QueueWithdrawCaller Request to withdraw a caller from
    Redirect Redirect (transfer) a call.
    Reload Send a reload event.
    SendText Sends a text message to channel.
    Setvar Sets a channel variable or functi
    ShowDialPlan Show dialplan contexts and extens
    SorceryMemoryCacheExpire Expire (remove) ALL objects from
    SorceryMemoryCacheExpireObject Expire (remove) an object from a
    SorceryMemoryCachePopulate Expire all objects from a memory
    SorceryMemoryCacheStale Marks ALL objects in a sorcery me
    SorceryMemoryCacheStaleObject Mark an object in a sorcery memor
    Status List channel status.
    StopMixMonitor Stop recording a call through Mix
    StopMonitor Stop monitoring a channel.
    UnpauseMonitor Unpause monitoring of a channel.
    UpdateConfig Update basic configuration.
    UserEvent Send an arbitrary event.
    VoicemailRefresh Tell Asterisk to poll mailboxes f
    VoicemailUsersList List All Voicemail User Informati
    VoicemailUserStatus Show the status of given voicemai
    WaitEvent Wait for an event to occur.
  • mover tu wsl a otro disco

    Desde que apareció WSL en Windows ya no tuve la necesidad de tener que tener una VM con alguna distro de Linux.

    Si no sabes lo que es WSL (Windows Subsystem for linux) aquí te dejo la documentación oficial Instalación de WSL | Microsoft Learn

    Pero en pocas palabras es la capacidad que tiene Windows (desde win 10) de exponer el acceso al procesador a través de una capa controlada, pudiendo tener otro mini sistema operativo corriendo a la par. A diferencia de la emulación, aquí lo que se intenta es que ambas sistemas operativos puedan acceder al procesado, y ahorrar recursos sobre todo.

    En mi caso, para acceder a servidores y programar, suele tener dos distros:

    • Ubuntu 22.04 (WSL 2)
    • Debian (WSL)

    Ambos con dos versiones diferentes de WSL. Esto es debido a que el performance del disco en la versión 2 de WSL, se vio afectada, y por otro lado hay problemas de compatibilidad, aún con la versión dos.

    El espacio destinado a cada una es de unas 10gigas, y aveces resulta cómodo tenerlas en algún disco diferente. Por ello hoy veremos el proceso para mover las mismas a otra ubicación.

    Listar las distro instaladas:

    wsl --list -v

    Con este simple comando podrás ver que distro tienes disponibles y que versión son.

    Detener la distro a mover.

    En mi caso la de Debian

    wsl -t Debian

    Exportar la distro

    wsl --export Debian "D:\WSL\debian.tar"

    Esta parte demora unos minutos dependiende del tamaña de tu distro. En mi caso la voy a mover al disco D:, a una carpeta denominada WSL

    Desregistrar la distro

    wsl --unregister Debian

    Actualizamos el registro, eliminando distro actual, y luego volviendo a crear pero con la nueva ubicación

    Importar la distro

    wsl --import Debian "D:\WSL\Debian" "D:\WSL\debian.tar"

    Ya estamos llegando a su fin. Aquí solamente le decimos que queremos importar nuestro distro, indicando el nombre de la misma, la ubicación en donde va a quedar, y el donde en donde esta el backup.

    Vale aclarar que con este proceso no pierdes nada de lo que tengas en tu distro, como así también el perfil que tengas en tu terminal ya configurado.

    Espero que te sea útil. En mi caso no demoró mas de 5 min todo el proceso.

  • Failed to execute operation: No such file or directory

    ¿Porque un systemctl enable myservice.service da este error?

    Hoy es unos de esos días donde algo tan simple deja de funcionar. Te pongo en contexto: Un worker service creado en .NET 7.0 encargado de interactuar con un servicio de telefónia Asteriks y una API de .NET

    Este servicio funciona correctamente en el servidor linux que cuenta con CentOS y una distro de «FreePBX». Por lo que se decidió pasar a servicio la ejecución del mismo.

    Para ello, de acuerdo a la documentación de .NET tan solo con el siguiente archivo de texto es suficiente:

    Host ASP.NET Core on Linux with Nginx | Microsoft Learn

    [Unit]
    Description=Example .NET Web API App running on Linux
    After=network.target

    [Service]
    WorkingDirectory=/var/ami
    ExecStart=/usr/bin/dotnet /var/ami/WorkerServiceAMI.dll
    Restart=always

    Restart service after 10 seconds if the dotnet service crashes:

    RestartSec=10

    KillSignal=SIGINT
    SyslogIdentifier=dotnet-ami
    User=root
    Environment=ASPNETCORE_ENVIRONMENT=Production
    Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

    [Install]
    WantedBy=multi-user.target

    Una vez generado el mismo tan solo al ejecutar systemctl enable myservice.service debería funcionar pero recibía constantemente este error:

    Failed to execute operation: No such file or directory

    Luego de romperme la cabeza y no encontrar la solución en Google me puse analizar el porque no encontraba el archivo. Y entendí lo siguiente: Systemctl es parte del administrador de servicios del sistema, por lo tanto busca los archivos de forma predeterminada en /etc/systemd/system o /usr/lib/systemd/system.

    Solución:

    Copia el archivo dentro de esa ubicación y asunto arreglado.

    Espero que te sirva este dato.

  • Maui con Mysql

    Sino sábes lo que es net MAUI te dejo un video donde está bien explicado.

    La historia corta es que es el framework de Microsoft para desarrollar aplicaciones móviles nativas para iOs, Android, MacOs y Windows.

    En caso de que requieras persistencias historicamente se ha trabajado siempre con el motor SQLLite de forma local. Pero si quieres algo más robutos te conviene buscar un motor de bases de datos como PostgreSQL, MySQL, MSSQl, etc.

    Pero la cuestión aquí es: «Puedo conectarme directamente a MySQL desde Net MAUI?

    La respuesta corta es: «No, Lamentablemente no es posible». El problema está en la forma en que se realiza la encriptación de la conexión al motor, y el sistema operativo que la intenta hacer, por ejemplo Android.

    Tuve varias horas cacharreando con el asunto, y cada paso que avanzaba, se compensaba con dos mas de retroceso.

    ¿Porque lo intente hacer?

    A fines educativo, ya que no es la manera correcta.

    ¿Como deberías hacerlo?

    Siempre a través de un servicio web (WebService Rest Ful). Es la mejor alternativa ya que simplemente con un cliente web (http client) podrás realizar la integración de una manera standarizada.

  • No uses Newtonsoft

    Seguramente para serializar / deserializar tus json ocupas la librería externa de Newtonsoft Json.NET – Newtonsoft

    Esta librería nos acompaña desde el 2011, y durante todo el furor de .NET framework fue la mejor alternativa que teníamos disponible.

    Luego con la aparición de Net Core (2016) y su enfoque en el rendimiento estaba claro que había que tener algo nativo para el trabajo con JSON ya que es un estándar a la hora de pasar información entre servicios web del tipo WebAPI. Por ello surgió la clase nativa System.Text.Json. De manera muy tímida fue adquiriendo mayor funcionalidad, pero sobre todo un mejor rendimiento en performance frente a su competidor mas estable.

    Al día de hoy tenemos Net 7.0 y en la puerta Net 8.0 que será liberado en noviembre del 2023. Por ello me propuse realizar una comparativa para ver que tan cierto era esto de que System.Text.Json es 100% más rapido que NetwtonSoft.

    Aquí te dejo el video y los resultados te sorprenderán

    Para ello haremos un #benchmark usando los frameworks de #net7 y #net8.

  • Mover la tempDB en MS SQL Server

    Errores como esto puede significar que algo anda mal con tu TempDB

    The operating system returned error 1117(No se puede realizar la solicitud por un error del dispositivo de E/S.) to SQL Server during a write at offset 0x0000003f840000 in file 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\tempdb.mdf'

    Se puede tratar de indagar el motivo, pero en esta ocasión, vamos a mover directamente la TempDB que está en producción. Quedó actualmente en el disco del sistema operativo (mal ahí), y llegó la hora de llevarla a un nuevo disco preparado para todas las E/S que estaba recibiendo.

    Aquí te explico en esta tutorial como realizar el proceso

    Paso 1: Creamos la nueva ubicación: En mi caso H:\TempDB

    Paso 2: Con la siguiente consulta podremos generar el script necesario para poder moverlo directamente

    declare @destiny as varchar(20)
    set @destiny = 'G:\TempDB\'
    SELECT 'ALTER DATABASE tempdb MODIFY FILE (NAME = [' + t.name + '],'
    	+ ' FILENAME = ''H:\TempDb\' + t.name
    	+ CASE WHEN t.type = 1 THEN '.ldf' ELSE '.mdf' END
    	+ ''');' as command
    FROM sys.master_files t
    WHERE t.database_id = DB_ID(N'tempdb');

    En mi caso 5 archivos MDF (4 en la posición anterior, y 1 que ya había movido a fines de prueba) y un 1 archivo LDF

    La respuesta ya te indica que en el próximo reinicio ocuparán la nueva ubicación

    Procedemos a reiniciar y deberías ya tener la TempDB movida de ubicación
  • Screenshot y Share con Net MAUI

    Estamos a full con el nuevo framework de Microsoft, y en esta oportunidad te enseñamos a capturar la pantalla y activar el menú de compartir.

    La ventaja de Net MAUI ( al igual que con Xamarin) es que es multiplaforma y nativo.

    ¿Esto que significa? Que desde unas pocas líneas podremos acceder a las funciones nativas de la plataforma en donde se esté ejecutando, y para nosotros será indiferente.

    En este caso vamos a dividir esta situación en dos partes:

    1. Screenshot ( captura de pantalla)

    Gracias a la interface IScreenShot podremos capturar la pantalla actual en la que nos encontremos. Esto funcionará para cualquiera de las plataformas disponibles por Net MAUI

    Screenshot – .NET MAUI | Microsoft Learn

    El resultado de la misma será en un conjunto de bytes (Stream), disponibles para nuestro siguiente paso

    2. Guardar el archivo

    Para ello haremos uso de la clase histórica de .NET llamada System.IO

    System.IO Namespace | Microsoft Learn

    • 3. Activar el menú compartir

    Ya teniendo nuestra captura convertida a un archivo procedemos a pasarselo a la clase encargarda de las funciones de «compartir»

    Share – .NET MAUI | Microsoft Learn

    Como siempre, te dejo un video con todos los pasos bien explicado y acceso al código. Recuerda dejar tu like y tu comentario. Nos vemos…

  • Agrega publicidad a tu aplicación

    Con la nueva versión de Microsoft para el desarrollo de aplicaciones nativas móviles ya en producción, ha nacido un nuevo boom. Anteriormente te contamos sobre Net MAUI: el Framework de .NET para el crear aplicaciones para diferentes plataformas, entre ellas iOs y Android.

    Parecía que Xamarin era la única opción disponible, pero un poco olvidada en el tiempo, sin embargo con la llegada de Net 5, trajo consigo esta ansiada evolución: Net MAUI.

    El día de hoy con muchos de sus bugs púlidos, y con muchos de los plugins originarios de Xamarin, ya migrados a este nuevo framework, empezamos a hilar finos para empezar a crear aplicaciones aptas para producción y de indole comercial.

    Una de esas características es poder monetizar tu aplicación a través de una cuenta de Google Adsense.

    Hoy te contaré los pasos necesarios para poder lograrlo y no morir en el intento.

    • 1- Publica tu aplicación en tu tienda oficial

    Es necesario que la aplicación esta subida a PlayStore (Android) o AppStore (iOs)

    • 2- Crear tu cuenta en google AdMob

    https://admob.google.com/

    Está plataforma integrará tu cuenta de Google Adsense y Google Analitycs en una sola. Te permitirá crear tus banners y los diferentes tipos de productos disponibles para monetizar a través de la publicidad

    Te permitirá buscar tu aplicación desde las tiendas oficiales

    • 3- Instala en tu proyecto el nuget
    dotnet add package Plugin.MauiMTAdmob

    Los siguientes pasos consiste en crear directamente sobre tu vista, el yaml correspondiente al control equivalente a tu banner. A continuación te dejo el video del proceso completo.

    No te olvides de comentar y dejar tu like!!!

    Agrega Google Adsense en Net MAUI
  • NET MAUI – 2022 Enero

    Este versión está disponible para NET 6, y es el framework para desarrollar aplicaciones multiplataforma. Es parte de dotnet, está disponible en NET 6,0 o NET 7.0 en adelante.

    Con el podemos desarrollar aplicaciones nativas para MacOS, iOs, Android y Windows. Si te suena esto, es porque anteriormente teníamos a Xamarín con Xamarín Forms. Con el lanzamiento de Net 6.0, y bajo los nuevos lineamientos que apunta .NET a convertir en el framework multiplataforma mas usado por tener aplicaciones completas y veloces, es que decide evolucionar su herramienta (Xamarin) hacía un nuevo producto: NET MAUI. En el incluirá todo lo aprendido hasta el momento con su framework de NET (microservicios, serverless, opensource, multiplataforma, etc).

    Lo primero que debes saber es que está en una versión preview, y solo está disponible por el canal de Visual Studio 2022 preview (en cualquier versión). Pero para el Q1 del 2022 ya tendremos un versión candidad. Y en el Q2 del 2022, ya una versión definitiva.

    Lo que no está claro si está en Net 6.0, o será ya parte de Net 7.0 (Nov 2022).

    Estas son las últimas novedades, y te muestro como obtener un ejemplo de una arquitectura completa con NET 6.0 (API, Minimal API, FrontEnd y Mobile Apps entre otros):

    Net Maui – Enero 2022 – YouTube

    Si quieres saber más de NET MAUI, este lo lanzamos apenas ya teníamos las primeras novedades:

    NET MAUI – Te cuento todo lo que debes sabes – YouTube

  • Consultas Linq en Query Syntax y Method Syntax en .net con c#

    LINQ : Language Integrated Query – Wikipedia, la enciclopedia libre

    Como su nombre lo dice, es lenguaje para realizar consultas integradas, y es provisto y administrado por .NET

    Aprende a usarlo, te permitirá recorrer cualquier colección (Enumerables, Dictioraries, Lists, etc)

    También cada resultado proveniente de una consulta con el ORM de EF (Entity Framework ) te devolverá un IQueriable (Un tipo de colleción), y su manipulación, sin dudas los harás mediante LINQ.

    Para que puedas aprender en el siguiente video vemos varias consultas para que puedas realizar, y sobre todo para que puedas comparar los dos métodos disponibles que tienes:

    Method Sintax & Query Sintax

    Sin mas nada que decir, aquí está el video:

    Consultas Linq en Query Syntax y Method Syntax en .net con c# – YouTube

Tags

tsql (27)mssql (26)sql (20)devops (20)dotnet (18)docker (15)performance (14)contenedores (11)dotnet10 (10)linux (9)csharp (8)microservicios (7)angular (7)angular21 (7)sql server (6)issabel (6)docker-compose (6)typescript (6)mysql (5).NET (5)