Nuevas ‘versiones’ de Visual Studio 2019

Pues eso… con fecha de anteayer 2 de marzo, hay nuevas versiones de Visual Studio 2019, tanto para la versión final: v16.9.0 como para la preview: v16.10 Preview 1.0.

Este es un extracto de las novedades de .NET Productivity de la versión 16.9.0:
He resaltado las que, a mí me, parecen más interesantes.

.NET Productivity (versión final v16.9.0)

  • There is now IntelliSense completion for preprocessor symbols.
  • Solution Explorer now displays the new .NET 5.0 Source Generators.
  • Go To All won’t display duplicate results across netcoreapp3.1 and netcoreapp2.0.
  • Quick Info now displays compiler warning IDs or numbers for suppressions.
  • Using directives will now automatically get added when copying and pasting types to a new file.
  • IntelliSense completion will now automatically insert a semicolon as a commit character for object creation and method completion.
  • Semantic colorization for C# 9.0 records.
  • Refactoring that removes unnecessary discards.
  • Refactoring that converts a verbatim and regular string to an interpolated string preserving curly braces that were intended to go in the output.
  • Code fix in Visual Basic that removes the shared keyword when you convert methods that are shared to a module.
  • A refactoring that suggests using new(…) in non-contentious scenarios
  • A code fix that removes redundant equality expressions for both C# and Visual Basic
  • The .NET Code Style (IDE) analyzers can now be enforced on build
  • The Syntax Visualizer shows the current foreground color for enhanced colors
  • A new tooltip when hovering over the diagnostic ID for pragma warnings
  • When you type the return key from within a comment the new line is now automatically commented out
  • Inline parameter name hints enhancements
  • .NET Core Debugging with WSL 2

Para la versión preview… pues… mejor lo miras en la página de información publicada por la gente de Microsoft.

Nos vemos.
Guillermo

Cambiar nombres ficheros (utilidad)

Pues eso… aquí tienes una utilidad para cambiar los nombres de los ficheros. No solo cambiar un texto existente en el nombre, si no que también se puede añadir (o quitar) un texto al principio o al final del nombre del fichero.

Ver el P.S. 3 con los cambios del 1-mar-2021

Los ficheros a procesar los puedes indicar según la extensión de los mismos (o usando un filtro con * y/o ?. En total se pueden procesar 4 directorios/filtros.

En la figura puedes ver la aplicación en modo de ejecución.

Figura 1. La aplicación en funcionamiento

Funcionamiento de la aplicación

Como puedes ver en la figura, tiene 4 grupos de directorios/ficheros con idea de que puedas indicar varias extensiones o bien 4 directorios diferentes.

Cada directorio se puede o no procesar (el primero siempre se tendrá en cuenta), por supuesto, si no indicas el path ni la extensión no se procesarán (o así debería ser, pero en realidad no hago ningana comprobación al respecto, así que… para salir de dudas… ¡pruébalo!).

En la parte inferior tienes las opciones de qué hará la aplciación, teniendo estas opciones:

  • Añadir el texto indicado en Text 1 al principio.
  • Añadir el texto indicado en Text 1 al final.
  • Quitar el texto indicado en Text 1 del principio.
  • Quitar el texto indicado en Text 1 del final.
  • Cambiar lo que haya en Text 1 por lo que hay en Texto 2

Y para las dos opciones de añadir texto puedes indicar si no se hace el cambio en el caso de que dicho texto (el de Texto 1) ya está.

Cuando se selecciona alguna de las dos opciones de añadir, se habilita ese control. En el resto de opciones está deshabilitado.

Lo mismo ocurre con el texto de Texto 2, que se habilitará solo si se selecciona la opción de cambiar, en las otras 4 opciones estará deshabilitado, y por tanto no se tendrá en cuenta lo que se escriba.

En las cajas de textos (Texto 1 y Texto 2) se pueden indicar espacios al final (y se tendrán en cuenta en la búsqueda y/o reeemplazo) y como visiblemente es difícil de ver si hay uno o más espacios, en caso de que haya más de un espacio al final, el programa los quitará y dejará solo uno. Si no hay espacios al final del texto no se añadirá ninguno.

Nota:

Hay que tener en cuenta, sobre todo al reemplazar texto (opción Cambiar) que el texto indicado en Texto 1 se reemplazará por el que haya en Texto 2 en todo el nombre del fichero (sin tener en cuenta ni el path ni la extensión).
Por tanto, si buscas el y el nombre original es Inclemencias del tiempo y quieres cambiar ese el por la el rtexto resultandte será (en mayúsculas los cambios realizados): IncLAmencias dLA tiempo.

El que avisa…

Controles usados en la utilidad

Esta utilidad (o aplciación) usa 4 controles del tipo BackgroundWorker con idea de usar de forma fácil la operación asíncrona.

El que está enlazado con el primer grupo (el que siempre está activo) siempre se ejecuta. Pero los otros 3 solo si se marca la opción que está arriba de cada grupo.

La barra de progreso tendrá en cuenta todos los ficheros que se vayan a procesar.

Y para saber el total de ficheros a procesar, en cada evento DoWork de cada control BackgroundWorker se añade a una colección definida a nivel del formulario en la que se almacenará los nombres de los ficheros a procesar (teniendo en cuenta el directorio en el que se buscarán los ficheros con el filtro indicado.

Ese filtro se hace usando lo indicado en cada caja de texto etiquetada tras Filtro. Como se pueden usar los comodines * y ? podrás usar cosas como estas:

  1. *.txt para indicar todos los ficheros con la extensión .txt
  2. algo?.xls* esto buscará los ficheros que empiecen con algo y cualquier carácter a continuación y que tengan una extensión que empiece por .xls

Como el código está compilado con .NET Framewwork 4.8 en realidad esto se puede hacer sin indicar el asterisco final, es decir, se puede indicar de esta forma: algo?.xls para que acepte todas las extensiones que empiecen por xls (.xls y .xlsx).

En .NET 5.0 habría que hacerlo como he comentado en el segundo punto, pero no es este el caso de esta aplicación.

Algo de código fuente

El código fuente está publicado en GitHub Cambiar-Nombres-Ficheros-v1

Aquí te muestro el código del evento Click del botón Procesar:

Private Sub btnProcesar_Click(sender As Object, e As EventArgs) Handles btnProcesar.Click
    ficheros.Clear()

    ' Si al final del texto a buscar/poner
    ' hay más de un espacio, cambiarlo por solo 1
    If txtTexto1.Text.EndsWith(" ") Then
        txtTexto1.Text = txtTexto1.Text.TrimEnd(" "c) & " "
    End If
    If txtTexto2.Text.EndsWith(" ") Then
        txtTexto2.Text = txtTexto2.Text.TrimEnd(" "c) & " "
    End If

    If chkProces1.Checked Then
        bgwProc1.RunWorkerAsync()
    End If
    If chkProces2.Checked Then
        bgwProc2.RunWorkerAsync()
    End If
    If chkProces3.Checked Then
        bgwProc3.RunWorkerAsync()
    End If

    ' Este siempre se procesa
    ' Hacer esta llamada al final para que se restauren los valores
    ' al terminar el trabajo.
    bgwProc.RunWorkerAsync()
End Sub

En los eventos DoWork de cada BackgroundWorker se hace la llamada al método … con el siguiente código:

backgroundWorker_DoWork(txtDir, txtExtensiones.Text)

Donde txtDir y txtExtensiones se usarán los nombres correwspondientes a cada grupo, por ejemplo, en el grupo 1 (el cero es el que siempre se ejecuta) se hará la siguiente llamada:

backgroundWorker_DoWork(txtDir1, txtExtensiones1.Text)

El código de backgroundWorker_DoWork es el siguiente, en donde solo se obtienen los ficheros que corresponden a cada directorio y con el filtro indicado.

''' <summary>
''' Método usado por el método DoWork de los BackgroundWorkers.
''' </summary>
''' <param name="txtDir">El directorio a usar.</param>
''' <param name="filtro">El filtro de los ficheros a usar.</param>
Private Sub backgroundWorker_DoWork(txtDir As TextBox,
                                    filtro As String)
    ' Aquí se acumulan los ficheros en la colección
    ' y se procesarán todos al final.
    ' De esta forma sabemos cuántos ficheros se procesan en total.
    Dim fileEnum = System.IO.Directory.EnumerateFiles(txtDir.Text, filtro)
    ficheros.AddRange(fileEnum)

End Sub

Una vez que finaliza el trabajo de bgwProc se procesan los ficheros.
Esto último se hace en el evento RunWorkerCompleted de ese control BackgroundWorker (en un momento verás el código).
Ahí se harán los cambios de todos los ficheros (que estarán en la colección ficheros), llamando al método cambiarNombres al que le pasamos como argumento el nombre del fichero a procesar.
Una vez finalizado los cambios, (y para que de tiempo a ver el mensaje), lanzo un temporizador después de tres segundos en el que se limpiarán los mensajes y se ocultará la barra de progreso.

Cabe decir que si alguno de los otros procesos dura má que este último puede que no se procesen bien todos los ficheros, pero… eso es algo que podemos arreglar en una futura revisión de este programa.
Y que a mí se me ocurre que se puede hacer comprobando cuando terminan todos los procesos asíncronos (comprobando cada uno de los eventos RunWorkerCompleted de cada tarea).
Pero por ahora te lo dejo como tarea que debes hacer y que podrás comprobar el día que yo lo publique.

Este es el código del método que hace todo esto (y como tip decirte que ese código tendrá que estar en otro sitio diferente si quieres tener en cuenta lo que he comentado en la nota anterior).

Private Sub bgwProc_RunWorkerCompleted(sender As Object,
                                       e As System.ComponentModel.RunWorkerCompletedEventArgs) _
                                       Handles bgwProc.RunWorkerCompleted
    ' Procesar los ficheros acumulados en la colección
    ProgressBar1.Visible = True
    ProgressBar1.Maximum = ficheros.Count
    ProgressBar1.Value = 0

    For i = 0 To ficheros.Count - 1
        cambiarNombres(ficheros(i))
        ProgressBar1.Value = i + 1
    Next

    Dim s As String
    If ficheros.Count = 1 Then
        s = "el nombre al fichero."
    Else
        s = $"los {ficheros.Count} nombres."
    End If
    LabelStatus.Text = $"Finalizado el proceso de cambiar {s}"
    Application.DoEvents()

    ' Mostrar ese mensaje por 3 segundos
    Timer1.Interval = 3000
    Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Enabled = False

    ProgressBar1.Visible = False
    LabelStatus.Text = LabelStatus.Tag.ToString()
    Application.DoEvents()

End Sub

Por último te muestro el código del método cambiarNombres.

Private Sub cambiarNombres(file As String)
    Dim fi As New System.IO.FileInfo(file)
    Dim s As String = file ' fi.FullName

    LabelStatus.Text = $"{fi.Name}"
    Application.DoEvents()

    If optCambiar.Checked Then
        s = fi.Name.Replace(txtTexto1.Text, txtTexto2.Text)
        If s <> fi.Name Then
            My.Computer.FileSystem.RenameFile(file, s)
        End If
    ElseIf optAñadirPrincipio.Checked Then
        If chkNoDuplicar.Checked Then
            If fi.Name.StartsWith(txtTexto1.Text) = False Then
                s = txtTexto1.Text & fi.Name
                My.Computer.FileSystem.RenameFile(file, s)
            End If
        Else
            s = txtTexto1.Text & fi.Name
            My.Computer.FileSystem.RenameFile(file, s)
        End If
    ElseIf optAñadirFinal.Checked Then
        If chkNoDuplicar.Checked Then
            If fi.Name.EndsWith(txtTexto1.Text) = False Then
                s = fi.Name & txtTexto1.Text
                My.Computer.FileSystem.RenameFile(file, s)
            End If
        Else
            s = fi.Name & txtTexto1.Text
            My.Computer.FileSystem.RenameFile(file, s)
        End If
    ElseIf optQuitarPrincipio.Checked Then
        If fi.Name.StartsWith(txtTexto1.Text) Then
            s = fi.Name.Replace(txtTexto1.Text, "")
            My.Computer.FileSystem.RenameFile(file, s)
        End If
    ElseIf optQuitarFinal.Checked Then
        If fi.Name.EndsWith(txtTexto1.Text) Then
            s = fi.Name.Replace(txtTexto1.Text, "")
            My.Computer.FileSystem.RenameFile(file, s)
        End If
    End If

    LabelStatus.Text &= $" --> {s}"
    Application.DoEvents()
End Sub

Y esto es todo por ahora… espero que te sea de utilidad, y si quieres indicar alguna mejora o algún fallo, eres libre de hacerlo en los comentarios de este post.

Muchas gracias.

Nos vemos.
Guillermo

P.S.
Crearé la versión de C# de esta utilidad (por ahora solo la tengo en Visual Basic) y cuando la tenga finalizada, la publicaré también en GitHub.
Aunque esa versión de CSharp la haré con los cambios que antes te he indicado: para asegurar que todos los procesos asíncronos han finalizado.

P.S.2 (28-feb-2021 02:21)
Ya está el código modificado teniendo en cuenta que se finalicen todos los procesos de los BackgroundWorker y además con el código para C#.
Puedes ver el código fuente en GitHub.

Para hacer lo que comentaba más arriba: comprobar que todos los BackgroundWorkers han finalizado he modificado el código de forma que se hacen estas comprobaciones:

  1. Defino dos variables a nivel de formulario para saber cuántos grupos se van a procesar (cada grupo se corresponde con un BackgroundWorker) y cuántos han finalizado.
  2. En el evento RunWorkerCompleted se usa el siguiente código (te muestro el de C#):
private void bgwProc_RunWorkerCompleted(object sender, 
                                        System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    cuantosFinalizados += 1;
    // Cuando estén todos los procesos finalizados, hacer los cambios.
    if (cuantosFinalizados == cuantosProcesos)
        finalizarCopia();
}
  1. El código que había antes en ese método de evento ahora está en el método finalizaCopia, tal como puedes ver en el siguiente código que es para C#.
private void finalizarCopia()
{
    // Procesar los ficheros acumulados en la colección
    ProgressBar1.Visible = true;
    ProgressBar1.Maximum = ficheros.Count;
    ProgressBar1.Value = 0;

    for (var i = 0; i <= ficheros.Count - 1; i++)
    {
        cambiarNombres(ficheros[i]);
        ProgressBar1.Value = i + 1;
    }

    string s;
    if (ficheros.Count == 1)
        s = "el nombre al fichero.";
    else
        s = $"los {ficheros.Count} nombres.";
    LabelStatus.Text = $"Finalizado el proceso de cambiar {s}";
    Application.DoEvents();

    // Mostrar ese mensaje por 3 segundos
    timer1.Interval = 3000;
    timer1.Enabled = true;
}
  1. En el método de evento Click del botón Procesar ahora se tiene en cuenta las dos nuevas variables para saber cuántos grupos hay que tener en cuenta.
private void btnProcesar_Click(object sender, EventArgs e)
{
    ficheros.Clear();
    cuantosFinalizados = 0;
    cuantosProcesos = 1;

    // Si al final del texto a buscar/poner
    // hay más de un espacio, cambiarlo por solo 1
    if (txtTexto1.Text.EndsWith(" "))
        txtTexto1.Text = txtTexto1.Text.TrimEnd(' ') + " ";
    if (txtTexto2.Text.EndsWith(" "))
        txtTexto2.Text = txtTexto2.Text.TrimEnd(' ') + " ";

    if (chkProces1.Checked)
    {
        cuantosProcesos += 1;
        bgwProc1.RunWorkerAsync();
    }
    if (chkProces2.Checked)
    {
        cuantosProcesos += 1;
        bgwProc2.RunWorkerAsync();
    }
    if (chkProces3.Checked)
    {
        cuantosProcesos += 1;
        bgwProc3.RunWorkerAsync();
    }

    // Este siempre se procesa
    // Hacer esta llamada al final para que se restauren los valores
    // al terminar el trabajo.
    bgwProc.RunWorkerAsync();
}

Y esto es todo…
En GitHub está el nuevo código para Visual Basic y el proyecto de C#.

 
 
P.S. 3 (01-mar-2021)
Actualizado el código de VB y C# para que tenga en cuenta un par de fallillos que había:
– al añadir/quitar de los nombres el texto indicado, ya que se usba fi.Name y ahí se incluye la extensión, y la extensión no se debe tener en cuenta al cambiar el nombre.
– al marcar/desmarcar las opciones de los grupos, que se deshabilitaba todo, ahora solo se habilitan/deshabilitan los controles que contiene, salvo el propio CheckBox.

Aguacates, oro verde, proteínas y calorías

Aguacates, oro verde, proteínas y calorías

Nota aclaratoria (por si decides no seguir leyendo):

Esto es una especie de cuento (o historia), es decir, nada tiene que ver con la programación ni el I+D.

Oro verde = aguacates.

De esos frutos, donde vivo, está abarrotao, hay árboles por todos lados, y por el cortijo en el que resido actualmente hay aún más… o al menos más a mano; prácticamente solo tengo que extender el brazo y ya tengo los aguacates que quiera. Eso sí, no son de mi propiedad, aunque el dueño, que es también el dueño del cortijo, me da permiso para que coja los que necesite, pero sin pasarme, solo los necesarios.

Aguactates fresquitos

Ayer precisamente me dio una caja, realmente media, ya que estuvieron recogiendo para venderlos, y antes de que se llevará todos, le pedí unos pocos para mis hijos y hermanos, y para mí amigo Gabrié, el de Chauchina, Graná, compañero de la mili, concretamente de la 5ª CIA de la PM allá por el 1978-79 en Barcelona, tierra de los polacos… O eso nos hicieron recordar durante los días de instrucción en el cuartel del Bruch. Que allí no había barceloneses si no polacos. En fin… Las cosas de los que eran más veteranos (y ninguno de ellos era de Barcelona).

Los aguacates están caros, sobre todo fuera de esta zona… No sé los precios actuales, pero creo que en el norte de paga por un solo aguacate lo que a Pepe, el dueño del cortijo, le dan por un kilo de los de tamaño grande.

Como puedes ver en las fotos, 2 aguacates grandes o 5 de los chicos pesan unos 500 gr, y a este hombre le pagan menos de 2€ por un kilo de ese tamaño grande, y si son de los chicos, no llega ni al euro.

Dos aguacates grandes 500gr
Cinco aguacates chicos 500gr

Pero… así son las cosas del campo y la gente que tiene que distribuirlos,
envasarlos, enviarlos y demás.

Pero los aguacates son buenos.

No a todo el mundo les gusta, pero solo es cuestión de acostumbrarse al sabor.

A mí me pasó eso al principio, antes de vivir en el campo, hasta que me dijeron que, aparte de la grasa que tienen (calorías supongo) tienen muchas proteínas, por tanto son buenos para la alimentación del cuerpo este que tenemos, sobre todo si eres vegetariano.

Yo de calorías y proteínas no entiendo, al menos en lo que respecta en saber cómo se sabe que las tiene. Lo mismo que dicen que las lentejas (si no las quieres las dejas) solo tienen media proteína y debes comerlas o prepararlas con otra legumbre (por ejemplo el arroz) para tener una proteína completa.

Pero supongo que habrá alguna forma de saber estas cosas.

Aunque a mí se he escapan.

Lentejas con aguacates

Lo que sí he probado es a poner aguacates al preparar las lentejas, no sé si de esa forma parte de la proteínas del aguacate se pasarán a las lentejas o no… Ya te digo que no sé cómo narices funciona esto de las medias proteínas y cómo se hacen una entera… pero la verdad es que las lentejas con aguacates están buenas… Y por si quieres probar la próxima vez que prepares unas lentejas,. yo echo el aguacate directamente con las lentejas, el tomate, los pimientos y el ajo (y el chorreoncito de aceite de oliva virgen extra, de eso que no falte), es decir, no hace falta echarlo cuando ya falte menos para que pase el tiempo de cocción, como es el caso de las zanahorias o las patatas.

Todo es empezar

La cuestión es que estuve un tiempo comiendo aguacates casi todos los días, creo que fue por el 2016 o antes… en el desayuno y hasta en la comida, mezclado con tomate, pan y aceite… ¡Qué rico!
En esa época, mi colega Juani (el de Conservas Yoga) era el que me daba los aguacates, ¡y que no faltaran! También me daba mi amiga Carmen; ya que en aquélla época no vivía en el campo… aunque aprovechaba cuando iba a caminar por sitios con aguacates recolectar los que daban al camino… ya sabes lo que se dice: si los frutos dan al camino, no tienen dueño (o algo así) jejeje.

Y en algunas de esas recolectas iba con mis sobrinas postizas (Estrella y Candela), y de tanto hablar de los aguacates, me decían (en plan juego) que no podía decir la palabra agua así que… esto de comentar que quería recoger algunos …cates era complicado, y cada vez que me olvidaba… ¡me tocaba la regañina de las dos! En fin… Juegos de niños, y uno, a pesar de no poder decir la palabra completa, también me lo pasaba bien… eso sí, recibía más regañinas de las que hubiera deseado… 😉

Y como suele pasar, de todo se harta uno… ¡hasta de los ricos aguacates!

Y… continuar

Pero bueno, aprovechando que el otro día estuvieron recogiendo aguacates para llevarlos a la corría pa venderlos, rebusqué los que tenía ya maduros y así llevo unos días desayunando tostadas con aceite, aguacate, tomate aderezados con algo de pimienta negra, ajo y un poco de sal (marina) con aloe vera, cebolla y jengibre que prepara mi amigo y colega Juani (sí, el de Conservas Yoga) que dice que es mejor para los que tenemos la tensión alta ya que se disuelve mejor en la sangre que la sal marina común.

Bueno, ya está bien del tema de los aguacates… que parece que te los quiero vender… jajaja. Esto es porque el otro día (creo que el 23 por la noche) se me pasó por la cabeza contarte algunas cosillas de estas, así en plan distendido y sin querer hacer algo serio con estas cosas… Y así lo he hecho… y ya de paso, esto lo estoy escribiendo usando el formato MarkDown que después se puede convertir en código HTML, más que nada para poder escribirlo tanto en el ordenador, como en el móvil y después pegarlo en el blog.

Herramientas usadas para escribir esta historia

Actualmente estoy usando la aplicación MarkdownPad 2 para Windows y en el móvil Android he instalado SimpleMarkdown porque la anterior que instalé, y eso que tenía más votos, no me permitía abrir ficheros ni de Google Drive ni siquiera de la carpeta de descargas (download) del móvil, y con SimpleMarkdown sí puedo hacer esas dos cosas.

Aunque intento en la medida de lo posible descargar primero el fichero con la extensión .MD desde Google Drive y usarlo desde la carpeta de descargas, y después lo vuelvo a subir, con idea de tenerlo disponible desde el portátil; pero ese envío lo hago por email, ya que algunas veces el android se toma su tiempo en subir el fichero al Drive y prefiero mandarlo a una cuenta de gmail y desde el mensaje recibido almacenarlo en una carpeta de Google Drive. Al menos así siempre funciona, y lo mejor, sin esperas, aunque haya que dar un paso más.

He puesto esas referencias, porque siempre gusta (al menos a mí) qué herramientas usa la gente para hacer estas cosas.

¡Espero que lo aguacatees bien!

Nos vemos.
Guillermo

P.S.
Esto está publicado usando las categorías historias y mis cosas.
La categoría historias la estreno con este post, mientras que mis cosas era la categoría que en un principio ideé para los post con cosas particulares, no técnicas: las correrías, excursiones, etc.

He estado modificando las categorías de los posts anteriores a hoy, y a fecha de hoy 27 de febrero de 2021 a las 15:30, a todos los artículos posteriores a diciembre de 2018 le he quitado mis cosas a los artículos técnicos que no incluyen batallitas mías, así en plan personal, los artículos técnicos están bajo la categoría cosas técnicas.

Acceder a la página maestra (Master page) desde una página en ASP.NET para .NET Framework (con C# y VB)

Pues eso… el otro día estaba escribiendo código para un nuevo sitio web de un colega (ConservasYoga.com.es) y me decidí a hacerlo en C# , por aquello de que creía que ya no existen plantillas (o eso creo ) en Visual Studio 2019 para ASP.NET con Visual Basic, pero sí existen, de las que no existen es para usar ASP.NET Core.

La cuestión es que quería acceder a ciertas propiedades (y/o métodos) de la master page y lo hice (o lo intenté) tal como lo hago con Visual Basic, es decir, usando Master.Propiedad, pero nada… daba error… después de muchas pruebas lo conseguí… algo rebuscado, pero… probando, probando… lo pude encontrar, y es que en C# para acceder a las cosas definidas en una página maestra hay que usar el nombre de la página maestra (en minúsculas) seguida de un guón bajo y la palabra master (también en minúsculas), es decir, si la página maestra se llama Site.master para acceder al código desde C# hay que usarlo de esta forma: site_master.

Un ejemplo de sitio usando Master Page en VB y C#

Para este ejemplo he optado por seleccionar un sitio en blanco: ASP.NET Empty Web Site (ver figura 1), ya que si se elige el tipo ASP.NET Web Forms Site te añade un montón de código y página, etc., que… en los hosting de ASP.NET que hay por esta zona no funcionan… y si intento que sea de ASP.NET Core ya ni te digo, ninguna de las empresas de hosting con las que he probado (Axarnet, IONOS, acens) lo soportan, incluso una de ellas me dijo que como es código abierto por eso no lo soportan… pero sí venden servidores con Linux, WordPress, PHP… que… ¡lo mismo no son de código abierto! 😉

En fin…

Figura 1. Crear un nuevo proyecto de C# (Empty Web Site)

Cuando trabajo con sitios de ASP.NET no me gusta usar el code behind, si no que prefiero que cada página tenga su código, de esa forma no es necesario compilar la aplicación, si no que se usa el código directamente en el sitio hospedado y ya está… el ASP.NET de IIS se encarga de compilar las páginas y el código a usar. Y lo mejor es que si haces cambios, solo tienes que subir la página o el fichero de código modificado y ya está… ¡a compilarlo tocan! pero… ¡que lo compile otro! 😉

En el segundo tipo de proyecto todo lo que añade el Visual Studio usa el code behind, mientras que en el proyecto vacío, cuando añadas una nueva página (maestra o normal) puedes indicar que no se incluya el código de forma separada (que es lo que viene a significar el code behind o separación entre el diseño y el código).

Si elegimos añadir una nueva página con el código incrustado en la propia página tendremos que hacer algo como lo mostrado en la figura 2.

Figura 2. Añadir nueva página con el código separado de la página aspx

En ese caso, se indica también seleccionar una página maestra para esa página aspx.

Y si decidimos que el código esté separado lo haremos como se muestra en la figura 3.

Figura 3. Nueva página con el código en la propia página.

Es decir, quitamos la marca de la casilla Place code in separate file.

Al añadir una página de esa forma tendremos esto en la página:

<% @ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" 
    CodeFile="Prueba.aspx.vb" Inherits="Prueba" %>

Donde CodeFile indica qué página es la que tiene el código y el Inherits es el nombre de la clase.

Si esto lo has hecho por error… puedes arreglarlo.
¿Cómo?
Simplemente quitando todo lo que se indica en CodeFile y en Inherits y poniendo el código aparte, tal como te muestro a continuación:

<% @ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master"  %>

<script runat="server">

</script>

Nota:
Por cierto, esa página la he añadido al proyecto de C#, pero está usando el código de VB, y es porque yo, por error, he seleccionado una página de Visual Basic (tal como ves en la figura 3).
Pero en el código mostrado lo he cambiado a C#.

Decir o aclarar que en un sitio web hecho con ASP.NET para .NET Framework podemos usar tanto código de VB como de C#, aunque no revueltos.

En este sitio que he creado, en el proyecto de C# uso una página con código de VB y otras dos con el código de C#.

En la página maestre he definido una propiedad con el título de la aplicación.
En C# quedaría de esta forma:

<script runat="server">

    public static string AppName { get; set; } = "Web Site Master C#";

</script>

En la de Visual Basic, esa misma propiedad la definimos como te muestro a continuación:

<script runat="server">

    Public Shared Property AppName As String = "Web Site Master VB"

</script>

Como es una propiedad compartida, en C# se utiliza static y en VB se usa Shared.

Y para usarla desde C# lo haríamos de esta forma, por ejemplo para poner el título de la página 2:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <h2>Prueba2 en C# para <%= masterpage_master.AppName  %> </h2>
</asp:Content>

Como dije al principio, en VB podemos usar Master para acceder al código de la página maestra, en C# no sepuede.
Lo que también se puede en VB es usar la clase de la página maestra, es decir, tal como se hace en C#.
Decirte que esto último hará que en VB no te muestre un warning que sí muestra cuando se accede a la página maestra usando Master (ver la figura 4).

Nota:
No sé porque ahora me muestra ese warning, ya que siempre lo he usado así (con Master.Propiedad) y nunca había salido esa advertencia, pero bueno… si queremos compatibilidad entre los dos lenguajes, podemos hacerlo usando el nombre de la clase.

Figura 4. Desde C# no se puede usar Master si no el nombre de la clase de la página maestra

Resumiendo el acceso a las páginas maestras desde código

Mejor usar el nombre de la clase, tanto en C# (que es la única forma de ahcerlo, al menos que yo sepa) como en VB.

Te iba a comentar que, aparte de lo que ya hemos visto, desde un sitio web de asp.net con .NET Framework se puede usar tanto código de VB y de C# en conjunto, solo hay que poner dicho código en carpetas diferentes e indicarlo en el fichero Web.Config.

Esto ya lo expliqué cuando salió ASP.NET 2.0 y por tanto las páginas maestras.
Este es el enlace en elguille.info: Usar clases de VB y C# en una misma aplicación Web.

Pero te lo resumo brevemente.

Usar código de VB y C# en un mismo sitio de ASP.NET Framework

Crea la carpeta de código App_Code, decide qué lenguaje será el que use las clases puestas en esa carpeta (normalmente el lenguaje con el que has creado el proyecto), crea una nueva carpeta (dentro de App_Code) para poner las clases del otro lenguaje.

Por ejemplo, si queremos que en la carpeta App_Code estén las clases de VB y en la carpeta c-sharp (App_Code\c-sharp), pondremos esto en el fichero web.config:

<compilation debug="true" strict="true" explicit="true" targetFramework="4.7">
    <codeSubDirectories>
        <add directoryName="c-sharp" />
    </codeSubDirectories>

d </compilation>

Este código estará dentro de la rama: <configuration><system.web>.

Para acceder a las clases o el código se hace de la forma habitual, en este ejemplo, he definido una propiedad estática/compartida para que se pueda acceder desde el código ASP.

Hay que tener en cuenta que C# distingue entre mayúsculas y minúculas, mientras que a VB le da igual como la escribamos.

<p>Usando el código definido en la carpeta <b>App_Code</b></p>
<p>Acceso al código de C# (class1.Nombre):  <% = Class1.Nombre  %> </p>
<p>Acceso al código de VB (class2.Nombre): <% = Class2.Nombre %> </p>
<p>En C# hay que usar correctamente el nombre: Class1 y Class2 (no class1/class2 como en VB).</p>

Y esto es todo… este es el código en GitHub por si le quieres echar un vistazo.

 

 

Cambios en el código de C# para que compile con C# 5.0

Al limpiar el proyecto de los «packages» que añade el Visual Studio, empiezan los errores, uno de ellos es que C# 5.0 no permite asignar valores a las auto-propiedades, por tanto, el código mostrado antes hay que sustituirlo por este otro:

El de la clase Class1.cs: (tanto en el proyecto de VB como en el de C#)

public static string Nombre 
{ 
    get { return "¡Hola Mundo de C#!"; }
} 

El de la página maestra:

<script runat="server">

    public static string AppName 
    { 
        get {return "Web Site Master C#"; } 
    }

</script>

El código de VB no hay que modificarlo, se ve que el compilador usado reconoce la autodefinición de propiedades con asignación de valores.

En el código de GuitHub ya está rectificado.

Nos vemos.
Guillermo

Cómo enviar cambios de línea usando mailto (html/script)

Pues eso… llevo unos días creando un nuevo sitio usando ASP.NET (con C#) para un colega al que le ayudo a vender sus productos por internet (Conservas Yoga) y probando el envío de emails desde el sitio usando una cuenta de gmail, me ha estado dando problemas y al final no he conseguido que funcione, no creo que sea por los permisos de gmail, ya que en la aplicación de gsNotasNET.Android me ha estado funcionando bien (o en su día en foros.elguille.info, pero en este nuevo sitio no había forma… así que… he hecho lo que suelo hacer cuando las cosas no funcionan: ¡cortar por lo sano y usar lo que siempre funciona!

Y lo que siempre funciona es usar mailto para enviar mensajes.

¿Cómo indicar el asunto al usar mailto?

Una de las cosas que siempre he usado es indicar el asunto cuando se pulse en el enlace de mailto (ahora te muestro el código), en ese caso, lo que hay que hacer es indicar un parámetro con la palabra clave subject el signo igual e indicar el texto del asunto.

Según desde que navegador se use habrá que indicar de forma distinta los espacios en el asunto, normalmente la forma más segura de hacerlo (válido para todos los navegadores, más viejos o más recientes) es usar %20 (equivalente en valor hexadecimal a un espacio).

Pero como te digo puedes usarlo con espacios y casi siempre funciona.

El código para enviar un email a la cuenta tuemail2021@gmail.com con el asunto «Comentario desde el guille mola» sería el siguiente:

Pulsa en este enlace para enviar un mensaje con el asunto: Comentario desde el guille mola.

El código de esa línea sería el siguiente:

<p>Pulsa en este enlace para enviar un mensaje con el asunto: 
    <a href="mailto:tuemail2021@gmail.com?Subject=Comentario desde el guille mola">
        Comentario desde el guille mola</a>.</p>

Si quisieras asegurarte de que no dará problemas, puedes cambiar los espacios por %20, pero creo que así debería funcionar (si no pruebas y te da error o algún mensaje fuera de lo común, por favor lo comentas en la sección de comentarios de este post, gracias).

Y ahora vamos a la parte principal de este artículo… Sí, podría haber empezado por aquí, pero… antes había que sentar los precedentes 😉

¿Cómo indicar el cuerpo del mensaje usando mailto?

Esto ya lo había hecho yo antes, pero el otro día necesitaba añadir cambios de líneas al texto del cuerpo del mensaje y no daba con la forma de hacerlo… menos mal que en internet siempre hay alguien que te lo explica 😉

En mi caso fue en este sitio: HTML mailto link.

Y el truco para añadir cambios de línea es (ahora parece tan obvio) usar los códigos de cambio de línea (LF o Line Feed) y retorno de carro (CR o Carriage Return) cuyos valores en decimal son: LF = 10, CR = 13, que en hexadecimal son: x0A y x0D, por tanto añadiendo esos valores en cada cambio de línea (normalmente se hace al revés, primero el CR y después el LF, pero creo que dará lo mismo).

Así que… si queremos usar el asunto del ejemplo anterior y queremos poner el siguiente mensaje (el body del email):

Hola Guille, perdón Tu Email 2021,

Este mensaje es una prueba desde post del blog.

¡Hasta la próxima!
<Indica tu nombre>

El enlace sería este: Enviar un mensaje con el texto arriba indicado.

El código quedaría de la siguiente forma:

<p>El enlace sería este: <strong>
    <a href="mailto:tuemail2021@gmail.com?Subject=Comentario desde el guille mola
        &Body=Hola Guille, perdón Tu Email 2021,%0D%0A%0D%0AEste mensaje es una prueba desde post del blog.%0D%0A%0D%0A¡Hasta la próxima!%0D%0A---Indica tu nombre---
        Enviar un mensaje con el texto arriba indicado</a></strong>.</p>

Nota:
Hay que tener cuidado con los editores de sitios WEB, como este de WordPress, ya que para indicar el asunto se hace con ? (?Subject=) después del nombre de la cuenta de correo (el ? es porque es el primer parámetro) y el cuerpo se usa con &Body=, es decir, cada parámetro o argumento que no sea el primero debe indicarse con el signo & (ampersand). Y los editores de código HTML lo sulen cambaiar pro &amp; (de ampersand).
Así que… si al pulsar en el enlace anterior no funciona, es que el editor de WordPress lo ha modificado… pero creo que aún así, seguirá funcionando.

Es decir, para usar el asunto se indica co ?Subject= y para indicar el cuerpo o texto del mensaje se hace con &Body=.

Si inviertes el orden, primero indicas el Body y después el Subject, la cosa quedaría así:
?Body=Cuerpo del mensaje%0D%0ACon cambio de línea.&Subject=Asunto del mensaje.

Si pulsas en este enlace, el orden está invertido (tal como muestro arriba).

Y ya solo nos queda repasar lo comentado:

Recordando que en Subject y Body dan igual las mayúsculas o minúsculas.

  1. Para indicar el asunto se usa Subject (o subject)
  2. Para indicar el cuerpo (o texto) del mensaje se usa Body (o body)
  3. Para indicar espacios tanto en el asunto como en el texto del mensaje puedes usar %20
  4. Para indicar cambios de líneas (normalmente en el cuerpo del mensaje) usa: %0D%0A

Y esto es todo… espero que te sea de utilidad… y si no te sirve, al menos a mí me servirá algún día (ya que seguro que me olvidaré de este truco si pasa un tiempo sin usarlo).

Nos vemos.
Guillermo

¡FELIZ AÑO AÑO 2021!

Pues eso… ya estamos en el 2021, al menos en España… si que… feliz 2021!!!

Nos vemos.

Guillermo

Quien dice 32, dice 33: gsNotasNET.Android v2.0.0.33

gsNotasNET.Android v2.0.0.33

Utilidad para dispositivos móviles Android para tomar notas y guardarlas localmente o en una base de datos externa.

En esta versión (v2.0.0.33) la utilidad/aplicación hace lo siguiente:

Permite crear notas y marcarlas con estos atributos/propiedades:

  • Indicar a qué grupo (tag/etiqueta) pertenece.

  • Se pueden crear tantos grupos como se deseen.

  • El programa recordará el último nombre de grupo utilizado al guardar una nota.

  • Se pueden ver los grupos que hay creados, mostrando la información de las notas que contiene.

  • Al mostrar los grupos se muestra la información de las notas que contiene.

  • (v2.0.0.32) Al seleccionar un grupo (clic o tap) te muestra la información de tallada de las notas que contiene, así como la lista de esas notas pertenecientes a ese grupo. Desde esa lista puedes editar las notas.

Atributos /Propiedades de cada nota:

  • Favorita, al mostrar las notas (de la base de datos externa) las notas favoritas se muestran al principio.

  • Notificar, las notas marcadas para notificar se pueden usar para que al hacer login se muestren automáticamente, ahí puedes anotar los recordatorios que necesites ver cada vez que inicias sesión.

  • Archivada, esto hará que la nota no se muestre al mostrar las notas activas.

  • Eliminada, es otra forma de ocultar las notas, ya que nunca se eliminan físicamente de la base de datos (tanto local como externa).

  • Sincronizada, esta propiedad indica si la nota está sincronizada entre las bases local y externa. Las notas siempre se sincronizan entre las dos bases de datos.

Para mostrar las notas hay varios apartados en el menú o pantalla principal, pudiendo mostrar las notas según el atributo o propiedad seleccionado.

  • En la lista de notas se muestra la siguiente información:

  • El título de la nota que consiste en los primeros 50 caracteres o si hay cambios de líneas en la nota, la primera línea.

  • El nombre del grupo, la fecha de modificación y una letra cn el nombre del atributo y si está marcado (True) o no lo está (False).

  • Las abreviaturas de los atributos son:

    Favorita, Notificar, Archivada y Eliminada.

  • En una nueva actualización añadiré Sincronizada, aunque se supone que siempre deben estar sincronizadas.

  • Seguramente también añadiré una página (opción) para mostrar las notas sincronizadas y poder asegurarte que si no está sincronizada, lo haga.

En la configuración puedes indicar:

  • Recordar el usuario con el que se ha hecho Login.
  • Recordar el password usado.
  • Iniciar la aplicación con el último usuario.
  • Mantener las notas sincronizadas (siempre está activada esta opción).
  • Mostrar las notas a Notificar al iniciar el programa (o hacer Login).
  • Usar las notas locales (cuando se activa) o usar las notas de la base externa.

En la información del Perfil te muestra los datos de la cuenta con la que has hecho Login.

  • Ahí puedes cambiar la cuenta de correo y el password.

  • Si cambias la cuenta de correo, se enviarán 2 mensajes, uno a cada cuenta pidiendo confirmación.

  • Te muestra la inforamción de la fecha de alta, último acceso, cuántas notas de la base externa puedes escribir:

  • Para los primeros 90 usuarios que se registren tienen una cuota de 1.000 notas, a partir del usuario 100 (los otros 10 los tengo reservados para mí) tendrán 100 notas como máximo de forma totalmente gratuita.

  • En esa cantidad, se cuentan todas las notas, estén o no eliminadas (ya que nunca se eliminan las notas).

  • El importe por cada 1.000 notas será de una donación anual de 12$ USD (unos 10€).

  • En esa cuota no se cuentan las notas ofrecidas gratuitamente.

  • El importe indicado en Pagos será el importe que hayas ido pagando.

  • Ya te digo que solamente debes pagar si quieres más cantidad de notas. La aplicación es totalmente gratuita. Salvo que prefieras hacer un donativo voluntario.

  • El donativo lo puedes hacer mediante este enlace: Donativo para elGuille.

  • Todos los donativos serán siempre bienvenidos 🙂

Puedes realizar búsquedas en las notas (tanto en la base local como en la externa).

  • La búsqueda se realiza sin tener en cuenta el case (no diferencia entre mayúsculas y minúsculas).

  • Por ahora solo hace la búsqueda en el Texto de las notas.

  • En una nueva actualización incluiré que se pueda hacer tanbién (o solo) en los nombres de los grupos).

  • En el resultado de la búsqueda puedes pulsar (hacer clic o tap) en la nota para editarla.

  • Aunque estés usando las notas de la base de datos remota (de SQL Server) puedes mostrar las notas de la base de datos loca, en este caso las notas no son editables, solo se muestran en la lista y haciendo tap o clic en ellas no se muestran. ⋅⋅⋅ Si quieres editar una nota local, debes cambiarlo en la configuración seleccionando la opción Usar las notas locales.

En la pantalla principal además te encontrarás con estas opciones:

  • Validar Email. Esto tendrás que usarlo cuando te registres con un nuevo usuario. O al crear un nuevo usuario.

  • Sincronizar. Esta opción te sirve para comprobar si las notas están sincronizadas (deberían estarlo), pero en caso de que no lo estuvieran, puedes sincronizar las locales al romoto o al revés.

  • Comentarios. Por si quieres enviarme alguna sugerencia, bug o cualquier cosa que me quieras decir. Esta opción te permite indicar un comentario y al pulsar en el botón de ENVIAR… abrirá una cuenta de email que tengas configurada en tu dispositivo para poder enviar el mensaje. El texto que hayas escritor aparecerá en el cuerpo del mensaje.

  • Acerca de Abre una ventana con un poco de ayuda sobre la aplicación. Seguramente añadiré un enlace a esta página descriptiva, ya que tanto texto no se puede poner en ese tipo de páginas… o al menos no se vería bien.

  • Cambiar de usuario. Desde ahí puedes hacer login, si no lo has hecho ya, o bien poder registrar un nuevo usuario.

  • Con esta última actualización, tanto en la ventana principal (Menú) como en la de Acerca de se comprueba si hay una nueva versión y de ser así, se indica de ese hecho, De esta forma puedes estar avisado y te puedes descargar el paquete de instalación.

NOTA: Esta release (recuerda que las releases o paquetes de instalación) siempre son versiones Release no versiones Debug. Y en esta he tenido que hacer 9 comprobaciones en el dispositivo físico ya que me daba error al comprobar si había una nueva versión. En modo debug funcionaba bien, pero en la release daba error. Y todo era por hacer caso a los tips de la documentación de .NET, y es que para esa comprobación uso el ensamblado que se está ejecutando y yo siempre usaba (y seguiré usando, al menos en las versiones para móviles) este código para obtener el ensamblado:

var ensamblado = System.Reflection.Assembly.GetExecutingAssembly();

La documentación dice esto:

Remarks For performance reasons, you should call this method only when you do not know at design time what assembly is currently executing. The recommended way to retrieve an Assembly object that represents the current assembly is to use the Type.Assembly property of a type found in the assembly, as the following example illustrates.

using System;
using System.Reflection;

public class Example
{
   public static void Main()
   {
      Assembly assem = typeof(Example).Assembly;
      Console.WriteLine("Assembly name: {0}", assem.FullName);
   }
}
// The example displays output like the following:
//    Assembly name: Assembly1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

Pero al usar un código parecido, tal como este:

System.Reflection.Assembly ensamblado = typeof(AcercaDegsNotasNET).Assembly;

Da error y, sin nada de descripción, solo el nombre del ensamblado desde donde se ha llamado. Y lo curioso es eso, que no pod´çia saber porqué fallaba la aplicación, salvo después de ¡10 intentos! (y porque me imaginaba por dónde iban los tiros), en fin…

En todas (o casi todas) existe un botón POLÍTICA DE PRIVACIDAD que al pulsarlo te muestra (en el navegador) la política de privacidad, es decir, qué datos personales se recogen.

Ahora muestra el contenido de elguillemola.com: Política de privacidad en elguillemola.com pero seguramente lo cambiaré a una que sea específica de esta aplicación.

De todas formas, comentarte que con los datos que facilitas o las notas que escribe yo no hago nada, ni cambairé nada, salvo que tú me lo pidas expresamente, bien porque no tengas acceso o cualquier otra circunstancia que te impida acceder a las notas o tu cuenta de usuario.

Bueno y creo que esto es todo…

He escrito tanto con idea de crear una página en elguillemola.com y así poder usarla como ayuda de la aplicación.

También crearé un video explicativo con las cosas que debes saber sobre la aplicación.

Si has llegado leyendo hasta aquí… ¡muchas gracias! 🙂

Y como estamos en las fechas que estamos (30 de diciembre de 2020) te deseo ¡FELICES FIESTAS!

Guillermo

 

Galería de fotos / capturas de la versión 2.0.0.33

De la versión 2..33 solo hay dos que muestra la «nota» de comprobación de si hay una nueva versión, el resto son de las versiones v2.0.0.31 y v2.0.0.32

 

Nota:

Pulsa en la foto que quieras ver con más detalle para que se muestre a tamaño real.

Puedes descargar el "paquete" de instalación desde GitHub:

Este enlace es para la versión v2.0.0.33.

Este otro es para la versión v2.0.0.32 (si no te funciona el enlace es que lo has pulsado antes de que yo lo haya publicado 😉 )

 

Nos vemos.
Guillermo

gsNotasNET.Android release v2.0.0.32

gsNotasNET.Android v2.0.0.32

Utilidad para dispositivos móviles Android para tomar notas y guardarlas localmente o en una base de datos externa.

En esta versión (v2.0.0.32) la utilidad/aplicación hace lo siguiente:

Permite crear notas y marcarlas con estos atributos/propiedades:

  • Indicar a qué grupo (tag/etiqueta) pertenece.

  • Se pueden crear tantos grupos como se deseen.

  • El programa recordará el último nombre de grupo utilizado al guardar una nota.

  • Se pueden ver los grupos que hay creados, mostrando la información de las notas que contiene.

  • Al mostrar los grupos se muestra la información de las notas que contiene.

  • Al seleccionar un grupo (clic o tap) te muestra la información de tallada de las notas que contiene, así como la lista de esas notas pertenecientes a ese grupo. Desde esa lista puedes editar las notas.

Atributos /Propiedades de cada nota:

  • Favorita, al mostrar las notas (de la base de datos externa) las notas favoritas se muestran al principio.

  • Notificar, las notas marcadas para notificar se pueden usar para que al hacer login se muestren automáticamente, ahí puedes anotar los recordatorios que necesites ver cada vez que inicias sesión.

  • Archivada, esto hará que la nota no se muestre al mostrar las notas activas.

  • Eliminada, es otra forma de ocultar las notas, ya que nunca se eliminan físicamente de la base de datos (tanto local como externa).

  • Sincronizada, esta propiedad indica si la nota está sincronizada entre las bases local y externa. Las notas siempre se sincronizan entre las dos bases de datos.

Para mostrar las notas hay varios apartados en el menú o pantalla principal, pudiendo mostrar las notas según el atributo o propiedad seleccionado.

  • En la lista de notas se muestra la siguiente información:

  • El título de la nota que consiste en los primeros 50 caracteres o si hay cambios de líneas en la nota, la primera línea.

  • El nombre del grupo, la fecha de modificación y una letra cn el nombre del atributo y si está marcado (True) o no lo está (False).

  • Las abreviaturas de los atributos son:

    Favorita, Notificar, Archivada y Eliminada.

  • En una nueva actualización añadiré Sincronizada, aunque se supone que siempre deben estar sincronizadas.

  • Seguramente también añadiré una página (opción) para mostrar las notas sincronizadas y poder asegurarte que si no está sincronizada, lo haga.

En la configuración puedes indicar:

  • Recordar el usuario con el que se ha hecho Login.
  • Recordar el password usado.
  • Iniciar la aplicación con el último usuario.
  • Mantener las notas sincronizadas (siempre está activada esta opción).
  • Mostrar las notas a Notificar al iniciar el programa (o hacer Login).
  • Usar las notas locales (cuando se activa) o usar las notas de la base externa.

En la información del Perfil te muestra los datos de la cuenta con la que has hecho Login.

  • Ahí puedes cambiar la cuenta de correo y el password.

  • Si cambias la cuenta de correo, se enviarán 2 mensajes, uno a cada cuenta pidiendo confirmación.

  • Te muestra la inforamción de la fecha de alta, último acceso, cuántas notas de la base externa puedes escribir:

  • Para los primeros 90 usuarios que se registren tienen una cuota de 1.000 notas, a partir del usuario 100 (los otros 10 los tengo reservados para mí) tendrán 100 notas como máximo de forma totalmente gratuita.

  • En esa cantidad, se cuentan todas las notas, estén o no eliminadas (ya que nunca se eliminan las notas).

  • El importe por cada 1.000 notas será de una donación anual de 12$ USD (unos 10€).

  • En esa cuota no se cuentan las notas ofrecidas gratuitamente.

  • El importe indicado en Pagos será el importe que hayas ido pagando.

  • Ya te digo que solamente debes pagar si quieres más cantidad de notas. La aplicación es totalmente gratuita. Salvo que prefieras hacer un donativo voluntario.

  • El donativo lo puedes hacer mediante este enlace: Donativo para elGuille.

  • Todos los donativos serán siempre bienvenidos 🙂

Puedes realizar búsquedas en las notas (tanto en la base local como en la externa).

  • La búsqueda se realiza sin tener en cuenta el case (no diferencia entre mayúsculas y minúsculas).

  • Por ahora solo hace la búsqueda en el Texto de las notas.

  • En una nueva actualización incluiré que se pueda hacer tanbién (o solo) en los nombres de los grupos).

  • En el resultado de la búsqueda puedes pulsar (hacer clic o tap) en la nota para editarla.

  • Aunque estés usando las notas de la base de datos remota (de SQL Server) puedes mostrar las notas de la base de datos loca, en este caso las notas no son editables, solo se muestran en la lista y haciendo tap o clic en ellas no se muestran. ⋅⋅⋅ Si quieres editar una nota local, debes cambiarlo en la configuración seleccionando la opción Usar las notas locales.

En la pantalla principal además te encontrarás con estas opciones:

  • Validar Email. Esto tendrás que usarlo cuando te registres con un nuevo usuario. O al crear un nuevo usuario.
  • Sincronizar. Esta opción te sirve para comprobar si las notas están sincronizadas (deberían estarlo), pero en caso de que no lo estuvieran, puedes sincronizar las locales al romoto o al revés.
  • Comentarios. Por si quieres enviarme alguna sugerencia, bug o cualquier cosa que me quieras decir. Esta opción te permite indicar un comentario y al pulsar en el botón de ENVIAR… abrirá una cuenta de email que tengas configurada en tu dispositivo para poder enviar el mensaje. El texto que hayas escritor aparecerá en el cuerpo del mensaje.
  • Acerca de Abre una ventana con un poco de ayuda sobre la aplicación. Seguramente añadiré un enlace a esta página descriptiva, ya que tanto texto no se puede poner en ese tipo de páginas… o al menos no se vería bien.
  • Cambiar de usuario. Desde ahí puedes hacer login, si no lo has hecho ya, o bien poder registrar un nuevo usuario.

En todas (o casi todas) existe un botón POLÍTICA DE PRIVACIDAD que al pulsarlo te muestra (en el navegador) la política de privacidad, es decir, qué datos personales se recogen.

Ahora muestra el contenido de elguillemola.com: Política de privacidad en elguillemola.com pero seguramente lo cambiaré a una que sea específica de esta aplicación.

De todas formas, comentarte que con los datos que facilitas o las notas que escribe yo no hago nada, ni cambairé nada, salvo que tú me lo pidas expresamente, bien porque no tengas acceso o cualquier otra circunstancia que te impida acceder a las notas o tu cuenta de usuario.

Bueno y creo que esto es todo…

He escrito tanto con idea de crear una página en elguillemola.com y así poder usarla como ayuda de la aplicación.

También crearé un video explicativo con las cosas que debes saber sobre la aplicación.

Si has llegado leyendo hasta aquí… ¡muchas gracias! 🙂

Y como estamos en las fechas que estamos (30 de diciembre de 2020) te deseo ¡FELICES FIESTAS!

 

Galería de fotos / capturas de la versión 2.0.0.32
(al menos en las que hay cambios, el resto es de la v2.0.0.31)

 

Puedes descargar el "paquete" de instalación desde GitHub:

Este enlace es para la versión v2.0.0.31.

Este otro es para la versión v2.0.0.32 (si no te funciona el enlace es que lo has pulsado antes de que yo lo haya publicado 😉 )

 

NOTA

Hay una nueva vaersión: v2.0.0.33

Usa este enlace para no perderte lo último: gsNotasNET.Android v2.0.0.33

 

Nos vemos.
Guillermo

Los de Xamarin (Visual Studio 2019) también gastan inocentadas

Pues eso… o es que se le ha ido la olla al Visual Studio 2019 con los emuladores para Android… ya que se supon que estoy usando el emulador del Google Pixel 2 y me muestra algo parecido a los antiguos Nokias… jum!

Mira lo que me muestra el emulador:

alt text

Figura 1. El supuesto emulador del Pixel 2

Así que… he tenido que crear otro emulador (para el Pixel 3) que ya se parece más a lo que me mostraba antes:

alt text

Figura 2. El emulador del Pixel 3

A ver si al menos en este último funcionan las pruebas que estoy haciendo… ya que le he hecho un montón de cambios, entre ellos el que se pueda usar la base de datos local en lugar de la de SQL Server en la nube y poder sincronizar las notas entre las dos bases de datos…

Aunque primero estoy con los problemas de Login, ya que parece que no comprueba bien esos accesos, al menos con la versión 28 (que en mi móvil físico si me funciona) pero hay un par de usuarios que les dice que nones… en fin… ¡a probar toca!

Nos vemos.
Guillermo

Se rueda en folleskilandia (Río de la Miel) la segunda parte de Lo que el viento se llevó

Según comentan la gente de #folleskilandia (Río de la Miel) esta mañana se presentaron en estas tierras unos productores de Jolivu para rodar escenas de la segunda parte de Lo Que El Viento Se Llevó y según dicen es por el ventazo que desde esta mañana de lunes 28 de diciembre del año de nuestro Señor de 2020 se ha instalado en estas tierras.

Según nos informa la agencia de prensa FolleskiNius los productores de Holywood fletaron un avión especial supersónico para poder estar a primeras horas de la mañana de hoy lunes con todos los atrezos para rodar la segunda parte de la película mítica, llamada en inglés Gone with the Wind, pero esta vez no estará basada en la Guerra de Secesión estadounidense, sino es mostrar las maravillosas vistas de esta zona del sur de España.

Algunos de los vecinos dicen que son muchos los que han venido con sus cámaras y arreos para el rodaje, llenando todos los huertos, curiosamente solo los que tienen árboles de aguacates, con sus cacharros.

Uno de los vecinos comenta que después que se fueran el personal del rodaje al huerto de su vecino, notó que sus árboles de aguacates "estaban pelao, no queaba ni uno… zeguramente zerá por el viento tan fuerte" dice uno de los lugareños.

En otro de los campos, siempre según comentan los vecinos folleskes, espantaron a tos los jabalines, argo bueno ha traío esto del rodae.

En la foto no se aprecia el viento, pero sí que los árboles de aguacates están pelaos y que en los olivos no quedan aceituras, pero esto último seguramente será de antes de la llegada del personal jolivudiense.

Informó desde #folleskilandia el reportero folleske del diario North.

Salva Do you remenbe el diario North? 😉

 

 

Nos vemos.
Guillermo