Herramientas Informaticas

Etiqueta: Programacion Página 1 de 2

🚀 Apache NetBeans 29: ¿Qué mejoras trae en Git y vale la pena actualizar? 🤔

Entrada fija

Si eres desarrollador 👨‍💻 y trabajas todos los días con Git, seguramente te interesa saber qué cambió en Apache NetBeans 29.

Aunque a simple vista no parece una actualización “wow” ✨, sí trae mejoras importantes que hacen que trabajar con repositorios sea más rápido, estable y menos frustrante 😌.

Aquí te lo explico fácil y directo 👇

🔧 1. Mejor compatibilidad con Git moderno

Git ha cambiado bastante con los años.

Antes era común ver repositorios con la rama principal llamada:

master

Ahora la mayoría usa:

main

NetBeans 29 mejora la compatibilidad con estas configuraciones modernas ✅

¿Qué mejora?

  • ✔ Detecta mejor las ramas nuevas
  • ✔ Menos errores con repositorios recientes
  • ✔ Mejor soporte para nuevas configuraciones

👉 Si clonas proyectos modernos, todo funciona más fluido.


🔐 2. Mejor autenticación con GitHub (HTTPS y SSH)

GitHub ya no permite usar usuario y contraseña para hacer push o pull por HTTPS ❌

Ahora se usa:

  • 🔹 Token personal (PAT)
  • 🔹 Llave SSH

NetBeans 29 mejora ambos métodos 👇

📌 HTTPS con Token

Más estabilidad al hacer:

  • ✅ Push
  • ✅ Pull
  • ✅ Clone
  • ✅ Fetch

Menos errores de credenciales 🙌

🔑 SSH más confiable

Mejor soporte para llaves como:

id_rsa
id_ed25519

👉 Si ya configuraste tu carpeta .ssh, todo debería funcionar mejor.


⚡ 3. Más rápido en proyectos grandes

Si trabajas con proyectos pesados en:

  • 🐘 PHP
  • ☕ Java
  • 🟨 JavaScript

Seguro has notado lentitud al revisar cambios.

NetBeans 29 optimiza:

  • ✅ Status
  • ✅ Diff
  • ✅ Commit
  • ✅ Historial

👉 Menos tiempo esperando ⏳


🔍 4. Mejor comparación de archivos (Diff)

La herramienta para comparar archivos ahora es más confiable.

Te ayuda a ver mejor:

  • 🟢 líneas agregadas
  • 🔴 líneas eliminadas
  • 🟡 líneas modificadas

Y también mejora la resolución de conflictos 🔥

Ideal si trabajas en equipo 👥


🌐 5. Mejor soporte para otras plataformas Git

No todos usan GitHub.

Ahora NetBeans 29 trabaja mejor con:

  • 🦊 GitLab
  • 🏔 Codeberg
  • 🏢 servidores privados

👉 Más compatibilidad con repos remotos.


❌ Lo que NO cambió

Para no vender humo 😅

NetBeans 29 todavía NO tiene:

  • ❌ Login directo con GitHub tipo VS Code
  • ❌ Panel para Pull Requests
  • ❌ Integración con Issues
  • ❌ Marketplace de extensiones como VS Code

Sigue siendo una experiencia más clásica.


🤔 Entonces… ¿vale la pena actualizar?

Si usas Git diario:

✅ Sí vale la pena.

Porque aunque no se vea “bonito”, sí mejora lo importante:

  • 🚀 Más rápido
  • 🔐 Más estable
  • ⚡ Menos errores
  • 🌐 Mejor compatibilidad

Si vienes de NetBeans 26 o menor, sí notarás diferencia.


🧠 Conclusión

Apache NetBeans 29 no reinventa Git…

Pero sí hace que trabajar con repositorios sea:

  • ✔ más sólido
  • ✔ más confiable
  • ✔ más rápido

Y muchas veces eso vale más que una interfaz bonita 😎

INTRODUCCIÓN – INSTALACIÓN – TUTORIAL VISUAL BASIC 2022

Anteriormente hemos visto como hacer fácil aplicaciones básicas y sencillas en cualquier distribución de GNU/Linux usando Gambas 3.

Ahora haremos la aplicación usando la ultima versión de Visual Basic que esta dentro de la versión community 2022

Como introducción ya deben saber que a estas alturas Gambas3 y Visual Basic Entran a la categoria de entornos RAD (Rapid application development) o en español (desarrollo rapido de aplicacion)

Ventajas de la versión 2022 sobre las anteriores

Como publicar proyecto de gambas3 en la granja de software

Suponiendo que ya esta listo el programa lo que sigue puede ser lo siguiente
1. Crear un simple Ejecutable
2. Crear un paquete de instalación para instalarlo en cualquier distribución de Linux a través de un empaquetado .deb
3. Publicarlo en la granja de software de Gambas3

Lo que haremos es publicarlo en la granja de software

Primero le asignamos un icono al proyecto en las propiedades del proyecto

Aprovechamos para escribir la descripción del proyecto y los autores

Ahora nos vamos al menú Proyecto -> Publicar

Le rellenamos mas datos en caso de ser necesario
Elegimos las etiquetas
Elegimos una captura del programa, esto de mostrara cuando alguien quiera descargar nuestro programa
Elegimos las dependencias
Elegimos si publicarlo con nuestro usuario, aunque se puede publicar bajo el anonimato sin crear usuario en gambasfarm.org

Finalmente le damos Publicar y mostrara el siguiente mensaje comunicándonos de que el proyecto se ha publicado correctamente
Si nos vamos a la granja de software ya estará publicado nuestro proyecto

Como guardar archivos en disco duro con GAMBAS3 File.Save

Ya tenemos las funciones para crear automáticamente los códigos del Modelo/Vista/Controlador para PHP ahora lo que sigue es crear los archivos en el directorio del directorio del proyecto en PHP

Para guardar archivo en Gambas3 usaremos la función File.Save(“ruta donde se va a guardar”,”contenido del archivo”)

Pasos

Le damos doble click al botton para generar el evento _Click
Quedara de la siguiente forma

Insertamos en ese evento el siguiente código

  Dim strModel1 As String
  Dim strControlador As String
  Dim strVista As String 
  
  ' GUARDAR CONFIGURACION

  
  Settings["ruta"] = ruta.SelectedPath
  Settings["tabla"] = txtTabla.Text
  
  ' CREA ARCHIVO DEL MODELO
  strModel1 = creadorModelo.creaModelo()
   
  File.Save(ruta.SelectedPath & "/" & "modelos/" & txtTabla.Text & ".modelo.php", strModel1)
  
  ' CREA ARCHIVO DEL CONTROLADOR
  strControlador = creadorControlador.creaControlador()
  
  File.Save(ruta.SelectedPath & "/" & "controladores/" & txtTabla.Text & ".controlador.php", strControlador)
   
   
  ' CREA ARCHIVO VISTA 
  strVista = creadorVista.creaVista()
  
  File.Save(ruta.SelectedPath & "/" & "vistas/modulos/" & txtTabla.Text & ".php", strVista)
  
  ' MANDAMOS MENSAJE DE QUE TODO SE HA GUARDADO CORRECTAMENTE
  Message.Info("Guardado Correctamente")
Se observa como se usan las funciones para crear el código, por ejemplo, para crear el modelo se usa creadorModelo.creaModelo() y guarda todo el texto/código generado en la variable strModel1

Luego guarda con File.Save en la ruta que seleccionamos con el control llamado “ruta” el texto que esta en strModel

Esta misma lógica se usa para el controlador y la vista

En la siguiente publicación veremos como asignarle un icono al proyecto

Crear función en GAMBAS3 para crear el código para el archivo controlador en php8

Ya hemos visto como crear el archivo modelo en base a la nueva tabla

Para crear el contenido del archivo controlador la lógica es igual

Función en GAMBAS3 para convertir la primera letra de una cadena a Mayúscula

Vimos en la publicación anterior que usamos una función para convertir la primera letra de un texto a mayúsculas por lo tanto vamos a explicar como funciona este código

Es decir si ponemos strPrimeraMayuscula(“prueba”) nos va a devolver “Prueba“, con la P Mayúscula

Primero creamos otro modulo llamado utilitarias, este nos servirá para meter funciones generales

Vemos que se usa la funcion Mid$ que en el primer caso mandamos los parametros 1,1 lo cual solo tomara en cuenta la primer letra del texto y a eso lo metemos a la funcion UCase que lo convierte a mayuscula, luego concatena con Mid$ sin usar UCase pero empezando desde la segunda posición
' Gambas module file

Public Function strPrimeraMayuscula(strCadena As String) As String
  
  Return UCase(Mid$(strCadena, 1, 1)) & Mid$(strCadena, 2, 100) 

End

En la siguiente publicación veremos como generar el texto que va dentro del archivo controlador

Conexión a la base de datos MySQL en GAMBAS

Es necesario podernos conectar a la base de datos del punto de venta para poder leer los campos y en base a esto crear los archivos del catalogo de la tabla nueva

Los pasos son los siguientes

En caso de tener dificultades para encontrar el componente nos podemos ayudar del buscador de arriba
Creamos el modulo creadorModelo en la carpeta módulos, este archivo contendrá la función con la cual se conectara a la base de datos y leerá la la tabla y con esos datos creara el archivo modelo.php

Ahora pegamos el siguiente código

' Gambas module file

Public Function creaModelo() As String

Dim strModelo As String
Dim conexion As New Connection

  ' AQUI ABRIMOS LA CONEXION
  With conexion
    .Type = "mysql"
    .Port = "3306"
    .Host = Settings["servidor"]
    .User = Settings["usuario"]
    .Password = Settings["password"]
    .Name = Settings["baseDeDatos"]
    .Open()
  End With
  
  Dim $result As Result
  Dim strCampos As String
  Dim strCamposNoLLave As String
  Dim strLLavePrimaria As String
  Dim strCamposValue As String
  Dim strBindingInsert As String
  Dim strBindingUpdate As String
  
  Dim strCamposUpdate As String
  
  
  
  ' Hacemos el query para detectar la llave primaria
   $result = conexion.Exec("SHOW KEYS FROM  " & FMain.txtTabla.Text & " WHERE Key_name = 'PRIMARY'")
   strLLavePrimaria = $result["Column_name"]
   
   
  ' Identificamos los campos de la tabla nueva
   $result = conexion.Exec("describe " & FMain.txtTabla.Text)


' A partir de aqui vamos creando todo el texto que contendra el archivo tabla.modelo.php

Dim contador As Integer


contador = 0 

While $result.Length > contador
  
 ' CAMPOS PARA EL Select
  If contador == 0 Then 
    strCampos = $result["Field"] & gb.CrLf
     Else 
     strCampos = strCampos & "," & $result["Field"] & gb.CrLf
  Endif
  
  'CAMPOS PARA EL INSERT
  
  If $result["Key"] <> "PRI" Then
    If contador == 1 Then 
      strCamposNoLLave = $result["Field"] & gb.CrLf
      Else 
      strCamposNoLLave = strCamposNoLLave & "," & $result["Field"] & gb.CrLf
    Endif
    
  Endif
  
  
  
    ' CAMPOS PARA EL VALUE
    
    If $result["Key"] <> "PRI" Then
      If contador == 1 Then 
        strCamposValue = ":" & $result["Field"] & gb.CrLf
      Else 
        strCamposValue = strCamposValue & "," & ":" & $result["Field"] & gb.CrLf
        Endif
    Endif
    
     If $result["Key"] <> "PRI"
      strBindingInsert = strBindingInsert & "     $stmt -> bindParam(\":" & $result["Field"] & "\", $datos[\"nuevo" & UCase(Mid$($result["Field"], 1, 1)) & Mid$($result["Field"], 2, 100) & "\"], PDO::PARAM_STR);" & gb.CrLf
    Endif
    
    ' CAMPOS UPDATE
    If $result["Key"] <> "PRI" Then
      
      If contador == 1 Then 
          
          strCamposUpdate = strCamposUpdate & $result["Field"] & "= :" & $result["Field"] 
          
        Else 
          
           strCamposUpdate = strCamposUpdate & "," & $result["Field"] & "= :" & $result["Field"] 
          
      Endif
      
    Endif
    
    strBindingUpdate = strBindingUpdate & "     $stmt -> bindParam(\":" & $result["Field"] & "\", $datos[\"editar" & utilerias.strPrimeraMayuscula($result["Field"]) & "\"], PDO::PARAM_STR);" & gb.CrLf

  $result.MoveNext
  contador = contador + 1



Wend

strModelo = ""
strModelo &= "<?php" & gb.CrLf
strModelo &= "require_once \"conexion.php\";" & gb.CrLf
strModelo &= "" & "" & gb.CrLf



strModelo &= "" & "Class Modelo" & UCase(Mid$(FMain.txtTabla.text, 1, 1)) & Mid$(FMain.txtTabla.text, 2, 25) & " {" & gb.CrLf
strModelo &= "" & "   /* =============================================" & gb.CrLf
strModelo &= "" & "     MOSTRAR " & UCase(FMain.txtTabla.text) & gb.CrLf 
strModelo &= "" & "      ============================================= */" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "    Static Public Function mdlMostrar($tabla, $item, $valor) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       If ($item != Null) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           $stmt = Conexion:: conectar() -> prepare( \"Select " & strCampos

strModelo &= "" & "           From " & FMain.txtTabla.Text & " a WHERE $item =:$item \"); " " " & gb.CrLf 
strModelo &= "" & "" & gb.CrLf


strModelo &= "" & "           $stmt -> bindParam( \":\" .$item, $valor, PDO::PARAM_STR);" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           Try {" & gb.CrLf
strModelo &= "" & "               $stmt -> execute();" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "                Return $stmt -> fetch();" & gb.CrLf
strModelo &= "" & "           } Catch (PDOException $e) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "               $arr = $stmt -> errorInfo();" & gb.CrLf
strModelo &= "" & "                $arr[3] = \" Error \";" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "               If ($e -> getMessage() == 23000) {" & gb.CrLf
strModelo &= "" & "                   $mensaje = \" El registro esta duplicado, Favor de checar el numero de nomina \";" & gb.CrLf
strModelo &= "" & "                   Return $mensaje;" & gb.CrLf
strModelo &= "" & "               } Else {" & gb.CrLf
strModelo &= "" & "                  Return $arr[2];" & gb.CrLf
strModelo &= "" & "              }" & gb.CrLf
strModelo &= "" & "           }" & gb.CrLf
strModelo &= "" & "           " & gb.CrLf
strModelo &= "" & "           " & gb.CrLf
strModelo &= "" & "       } Else {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           $stmt = Conexion:: conectar() -> prepare(\"Select * " "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           " & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           From " & FMain.txtTabla.Text & " a \"); " "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           $stmt -> execute();" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           Return $stmt -> fetchAll();" & gb.CrLf
strModelo &= "" & "       }" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       $stmt -> close();" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "        $stmt = Null;" & gb.CrLf
strModelo &= "" & "   }" & gb.CrLf
strModelo &= "" & "" & gb.CrLf

' REGISTRO

strModelo &= "" & "   /* ==================================================================" & gb.CrLf
strModelo &= "" & "     REGISTRO" & gb.CrLf
strModelo &= "" & "    ==================================================================== */" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "   Static Public Function mdlIngresar($tabla, $datos) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "      $stmt = Conexion:: conectar() -> prepare(\"INSERT INTO " & FMain.txtTabla.Text & "(" & strCamposNoLLave & "" "" & gb.CrLf
strModelo &= "" & "        " & gb.CrLf
strModelo &= "" & "                                                                       )" & gb.CrLf
strModelo &= "" & "                                                                       VALUES(" & strCamposValue & ")" & gb.CrLf
strModelo &= "" & "                          " & gb.CrLf
strModelo &= "" & "                                                                              \"); " "" & gb.CrLf
strModelo &= "" & ""

strModelo &= "" & strBindingInsert & gb.CrLf

strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       If ($stmt -> execute()) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           Return \"ok\";" & gb.CrLf
strModelo &= "" & "       } Else {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           $arr = $stmt -> errorInfo();" & gb.CrLf
strModelo &= "" & "           $arr[3] = \" Error \";" & gb.CrLf
strModelo &= "" & "          Return $arr[2];" & gb.CrLf
strModelo &= "" & "      }" & gb.CrLf

strModelo &= "" & "      $stmt -> close();" & gb.CrLf

strModelo &= "" & "      $stmt = Null;" & gb.CrLf
strModelo &= "" & "  }" & gb.CrLf



'EDITAR ACTUALIZAR
strModelo &= "" & "  /* ==================================================================" & gb.CrLf
strModelo &= "" & "   EDITAR " & gb.CrLf
strModelo &= "" & "     ================================================================== */" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "   Static Public Function mdlEditar($tabla, $datos) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       $stmt = Conexion:: conectar() -> prepare(\" UPDATE $tabla SET " & strCamposUpdate & " " "" & gb.CrLf
strModelo &= "" & ""
strModelo &= "" & "                                                                   WHERE id =:" & strLLavePrimaria & "  \"); " "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & strBindingUpdate
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       If ($stmt -> execute()) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "           Return \"ok\";" & gb.CrLf
strModelo &= "" & "     } Else {" & gb.CrLf
strModelo &= "" & ""
strModelo &= "" & "          Return \"Error\";" & gb.CrLf
strModelo &= "" & "      }" & gb.CrLf
strModelo &= "" & ""
strModelo &= "" & "     $stmt -> close();" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "      $stmt = Null;" & gb.CrLf
strModelo &= "" & "   }" & gb.CrLf
strModelo &= "" & "   " & gb.CrLf
strModelo &= "" & " " & gb.CrLf & gb.CrLf
strModelo &= "" & "  /* ===================================================================" & gb.CrLf
strModelo &= "" & "     BORRAR USUARIO" & gb.CrLf
strModelo &= "" & "     =================================================================== */" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "  Static Public Function mdlBorrar($tabla, $datos) {" & gb.CrLf

strModelo &= "" & "       $stmt = Conexion:: conectar() -> prepare( \" DELETE From " & FMain.txtTabla.Text & " WHERE id =:id \");" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "       $stmt -> bindParam(\":id\", $datos, PDO::PARAM_INT);" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "      If ($stmt -> execute()) {" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "Return \"ok\";" & gb.CrLf
strModelo &= "" & "      } Else {" & gb.CrLf

strModelo &= "" & "          Return \"Error\";" & gb.CrLf
strModelo &= "" & "      }" & gb.CrLf

strModelo &= "" & "        $stmt -> close();" & gb.CrLf

strModelo &= "" & "       $stmt = Null;" & gb.CrLf
strModelo &= "" & "    }" & gb.CrLf
strModelo &= "" & "" & gb.CrLf
strModelo &= "" & "}" & gb.CrLf

Return strModelo
  
End

Ahora explicamos las partes importantes

Aqui vemos como abrir una conexión a la base de datos, se observa como se usan las variables de configuración programadas en la publicación anterior
Y aquí vemos como ejecutar los querys en la base de datos y guardamos el resultado en la variable $result y luego leemos el nombre de la columna asignase la a la variable strLLavePrimeria

Podemos ejecutar cualquier query por ejemplo conexion.Exec(“select * from usuarios”)
Dentro del código vemos que usamos la función utilerias.strPrimeraMayuscula, pues lo que hace esta función es poner en mayúscula la primera letra de la cadena, en la siguiente publicación pondremos y explicaremos esa función

Crear otro formulario e invocarlo desde el menú

Ahora vamos a crear el formulario para guardar las configuraciones de la conexión a la base de datos pero antes de eso debemos de asegurarlos de tener el fuente bien organizado en carpetas para ello crearemos una carpeta llamada formularios y otra llamada módulos

Claro esta que en la carpeta llamada formularios se va a meter todos los formularios

En la carpeta módulos estarán los archivos con las funciones que se van a necesitar

Quedarían de la siguiente forma

Posteriormente le damos click derecho a la carpeta formularios no vamos a nuevo y seleccionamos formulario, le activamos la gestión de cuadro de dialogo y le damos aceptar

Nos quedaría de la siguiente forma dentro de la carpeta formularios

Ahora tenemos que agregar los controles necesarios para capturar la información necesaria que es el servidor, la base de datos el usuario y el password, se hara de la misma forma que se agregaron los controles en la publicación anterior

Quedaría de esta forma, también en los atributos del formulario le podemos poner que siempre aparezca en el medio

Ahora para que aparezca cuando demos click en el sub menu configuración es muy fácil, le damos doble click al sub menu y nos creara la siguiente función

Este es el evento y al darle click se va ejecutar toda instrucción que este escrito dentro de ella

Entonces escribimos la siguiente instrucción

frmFormulario.show
Es muy simple, queda de esta forma
Ahora cuando se le de click en Archivo -> Configuración mostrara la siguiente ventana

En la siguiente publicación mostraremos como guardar los datos de conexión de la base de datos en los registros, y estos siempre estarán guardados aunque se abra y cierre el programa

CORRECCIÓN EN EL REPORTE DE VENTAS POR FECHA 14

En este vídeo se vera como se hace la corrección del reporte de ventas con productos
Les dejo el fuente en los comentarios
Ver demo en linea
http://pos.cesarsystems.com.mx/
Pueden seguirme en las siguientes redes sociales
VK
https://vk.com/id543521033
FACEBOOK
https://www.facebook.com/rasec555
TWITTER
https://twitter.com/JulioLeyvaR
CHANNEL TELEGRAM
https://telegram.me/CesarSystems
PAGINA WEB
https://cesarsystems.com.mx
MOVIL
+52 6688612348

QUITAR EL NUMERO DE RENGLON DEL CODIGO FUENTE CON SUBLIME Y EXPRESIONES REGULARES

INTRODUCCIÓN

Es muy común que cuando volvemos a ver algún fuente que subimos antiguamente en nuestro blog y o necesitamos de nuevo algunas veces esta con el numero de renglón y cuando el código es muy extenso es muy difícil quitar uno a uno el numero de renglón.

OBJETIVO

Remplazar el numero de renglón por un espacio en blanco usando las expresiones regulares en sublime

Página 1 de 2

Creado con WordPress & Tema de Anders Norén