Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#1231
Es curioso, pero yo también creía que no solo que erra gratis, sino que todos los números cortos eran gratis, precisamente porque cumplen una función. Son un servicio del estado al ciudadano (servicios por los que ya pagamos en impuestos), ergo no entiendo ni acepto sobrecostes.

Podría entender que a un 'bromista' que llamara a los bomberos le cobraran la llamada, pero no a un ciudadano que ve un incendio y llame a los bomberos para que acudan a auxiliar a quienes estuvieren allí o en caso de no haber peligro personal simplemente sofocar el fuego. ...cobrar solo incentiva que uno diga: ¿Qué, qué encima de perder i tiempo en avisar a los bomberos me vayan a cobrar una factura de tf. a mi por avisarles?" y desista de llamar...

Si esa es la forma de agradecer a un ciudadano comprometido con la sociedad, por su ayuda, mal camino resulta...
#1232
Cita de: crazykenny en 30 Noviembre 2019, 14:11 PM
favorecen cada vez menos al trabajador y menos a las empresas.
Supongo que ha habido un desliz y uno de los 'menos' debiera poner 'más'.

Para las empresas sería ideal vender en un solo día todo lo que ahora venden en un año, así solo necesitarían pagar a sus empleados por 1 solo día en vez de pagarles todo el año.

Así que con esos ahorros puede afirmarse que incluso aunque una empresa no baje los precios esos días, tiene más beneficio que el resto del año (es que ya he oído a algún G1L190LL@5 quejarse de eso mismo, de que como sus precios son los mismos no son distinto del cualquier otro día del año, lo cual es falso).
#1233
Foro Libre / Re: Desfile de modelo
30 Noviembre 2019, 15:53 PM
Cambiaría el título del artículo, de "Desfile de modelos" incluso por el que figura en tu firma: "Perros anónimos"...
#1234
Si fuera en España, seguro que le detenían... aquí es muy raro que acaben matándolo a tiros (es lo que procede, se envía el mensaje a cualquiera que lo quiera intentar en otra ocasión, que no saldrá vivo).

La muerte del terrorista, no acaba necesariamente con las pistas tras él, de hecho a buen seguro que a la inmensa mayoría ya las propias agencias de inteligencia tendrán un perfil del mismo, que haga innecesario 'su captura'.

A éste terrorista, le dejaron vivo la vez anterior... y tras cumplir condena ha vuelto a lo mismo. ...cabría acusar a los que decidieron dejarlo vivo/en libertad, de esta nueva acción, pués son ellos quienes lo posibilitaron.

El caso es que cada acto terrorista, repercute en mucha población del país donde sucede con una respuesta emocional de odio hacia las culturas de las que provienen estos individuos... De igual modo en su propia cultura repercute en mucha población a un sentimiento de satisfacción emocional igualmente de odio. Así un acto terrorista tiene repercusiones posteriores al propio acto que hacen aumentar el odio mutuo entre culturas.

Por ello a un terrorista debería declarársele como enemigo de su propia cultura, cosa que nunca se ve. Jamás oímos al gobernante del país del terrorista de turno, pedir perdón por la atrocidad de uno de sus súbditos (al menos que cuando es en suelo extranjero). Lo que enoja y motiva más aún ese odio en ambas partes, pués ese silencio parece una aprobación tácita.

Los actos terroristas no solucionan nada, en cambio si vienen a complicar las relaciones entre los habitantes del planeta sembrando discordias innecesarias...

...en definitiva, el planeta y la especie humana tiene demasiados frentes abiertos.
#1235
No es por cabezonería que sean 2 caracteres.

Viene de las máquinas de escribir mecánicas...
Cuando escribías, el carro (que soporta el rodillo que contiene el papel) se iba desplazando a la izquierda (las teclas repiquean siempre en un sitio fijo en la maquinaria), por lo que al pasar a una nueva línea exigía desplazar el carro completamente a la derecha.
...pero si sólo desplazabas el carro, y seguías escribiendo, sobreescribías la misma línea. Luego falrtaba un segundo mecanismo...
Girar el rodillo para acceder a la siguiente línea.
En el mecanismo, cuando desplazas el carro al llegar al tope, hay un moviemiento extra que siguiendo empujando entra en acción otro mecanismo que es el que hace girar el rodillo que mueve el papel arriba.

Cuando se crearon los primeros teclados, para la informática, básicamente se trataba de reproducir tanto las teclas como los mecanismos de la máquina de escribir que por supuesto llevaba muchas décadas de perfeccionamiento... como por ejemplo el bloqueo de las mayúsculas (que en la máquina de escribir variaba verticalmente el soporte donde están enclavadas todas las teclas, de modo que una copia en mayúsculas de cad aletra ahora e sla que golpeaba donde golpeaban las minúsculas).

En fin, la sorpresa es realmente que haya sistemas que usen un solo carácter, porque si solo:
- Avanzas la línea: Solo estarías escribiendo una línea más abajo, pero en la misma posición (columna) que la actual.
- Retrocedes el carro: Solo estarás llevando la columna al comienzo, pero en la misma línea.
Luego lo exactamente correcto es tener 2 caracteres, cada uno hace una cosa. Y cada carácter individual debiera hacer solo la parte que le corresponde.
#1236
Cita de: Machacador en 28 Noviembre 2019, 14:59 PM
...
Alrededor de 13,7 millones de ciudadanos de los 28 países miembros de la UE descargan ... lo que supone un movimiento anual de 941,7 millones de euros
...

Las cifras resultan irrelevantes... RIDÍCULAMENTE IRRELEVANTES
Si dicen 'perder' 941'7 millones a causa de 13'7 millones de personas, resulta que sale a 68'7euros por persona (al año), luego al mes =  5'7€. lo cual es francamente ridículo, equivale a ver una peli en el cine. Si ahora se divide esos 5'7 euros entre los 28 países miembros, se verifica la cifra ridícula de: 0'2045euros.

Como digo las cifras resultan irrelevantes, es preciso cuantificarlas por año y juntando 28 países para que así parezcan muy abultadas....

Para hablar con más propiedad sería adecuado mencionar también cuantos millones de usuarios hay que no son piratas... para verificar el porcentaje y así mismo cuanto recaudan a través de ellos, porque dar solo la parte 'negativa' es decir media verdad (dando por ciertas dichas cifras).

A falta de tales cifras... sí puede saberse más o menos claro que en Europa tiene unos 750 millones aprox. de habitantes: supondría pués menos de un 2% de la población (y en una cantidad rídicula de 5'7€ al mes).
Imaginemos un cine de 200 butacas, sería como si al mes 4 usuarios se colaran sin pagar entrada (1 a la semana en un cine de 200 butacas). Entonces se entiende lo absurdo del tema si los del cine alegaran que se iban a arruinar por ello, como tanto lloriquean en la industria audiovisual...
No es nada aventurado decir que un centro comercial tiene más pérdidas (por robo) que estas empresas por 'piratería', que al final ni son pérdidas porque son absorbidas en los precios del resto de artículos... sistema que cualquiera entiende que igualmente aplica cualquier otra industria.

...de hecho en el mismo artículo, se menciona que en el ramo trabajan unos 11 millones de personas en esos puestos, son casi tantos como los piratas, y estos son los 'peces pequeños', que a buen seguro percibirán entre todos a lo sumo 1/10 del total, así que es como si a ellos (dejando al margen a todos los grandes beneficiarios de la industria, es decir considerando solo estos 'pequeños peces', les costara cada mes, unos 0'6euros esa 'piratería', un café mal hecho te cuesta más caro)...

...pero francamente, la industria audiovisual necesita un 'perro mordedor' al que acusar contínuamente con cifras para 'vender' a los políticos leyes a su conveniencia y exclusividad. También resulta curioso que desaparecido los 'piratas' que dieron lugar a determinadas leyes, las leyes no cesan, siguen en vigor y así lo que en un principio era un 'resarcimiento' acaba como un 'privilegio'...
#1237
He sacado un tiempito rápido... quizás se haya escapado algún gazapo, pués no lo he probado... queda a tu esfuerzo corregirlos, si los hubiere.

Como desconozco la interfaz que tengas, yo he optado por un sencillo menú, con 4 opciones:
- Nuevo
- Leer
- Editar
- Borrar
Este formulario principal, no tiene nada más en la interfaz.
Hay dos ventanas adicionales, una para elegir el índice de registro y otra para mostrar/editar los valores de la estructura.
Para la fecha he elegido un control DateTimePicker... que actúa como un combobox, que al desplegar muestra un calendario...

Te pongo el código y luego adjunto un enlace de descarga...

En el módulo, yace solo la estructura y una enumeración de las acciones:
Código (vb) [Seleccionar]

Public Type Task
    Id                  As Integer
    Date                As Date
    Name                As String * 30
End Type

Public Enum Acciones
    ACCION_NUEVO = 0
    ACCION_LEER = 1
    ACCION_EDITAR = 2
    ACCION_BORRAR = 3
End Enum


La ventana principal:
Código (vb) [Seleccionar]

Dim Ruta                As String
Dim Numregs             As Long
Dim Canal               As Integer
Dim LenRegTask          As Integer
' Dim file               As Task





Private Sub Form_Load()
    Dim tk As Task
    LenRegTask = Len(tk)
   
    Ruta = App.Path & "\database.txt"
    Call AbriBaseDatos
   
    If (Numregs > 0) Then
        ' mostrar el primero:
       
    End If
End Sub
    Private Sub Form_Terminate()
        Close #Canal
    End Sub

Private Sub mnuRegistro_Click(Index As Integer)
    Dim tk As Task
    Dim Ix As Long
   
    Select Case Index
        Case 0 ' nuevo registro
            With frmRegistro          ' crear el registro
                .Titulo = "Nuevo"
                .Accion = ACCION_NUEVO
                .Show 1
               
                ' guardarlo al final...
                If (.Aceptado = True) Then
                    tk.Id = .Id
                    tk.Name = .Nombre
                    tk.Date = .Fecha
                   
                    Seek (Canal), (LOF(Canal) + 1)
                    Put #Canal, , tk
                   
                    Numregs = (Numregs + 1)
                End If
            End With
           
        Case 1 ' Leer Registro
            Ix = GetIndiceReg
            If (Ix >= 0) Then
                Seek (Canal), ((Ix * LenRegTask) + 1)
                Get #Canal, , tk
               
                With frmRegistro       ' exponer  el registro
                    .Titulo = "Leído"
                    .Accion = ACCION_LEER
                    .Id = tk.Id
                    .Nombre = tk.Name
                    .Fecha = tk.Date
                    .Show 1
                End With
            End If
           
        Case 2 ' Editar registro.
            Ix = GetIndiceReg
            If (Ix >= 0) Then
                Seek (Canal), ((Ix * LenRegTask) + 1)
                Get #Canal, , tk
                With frmRegistro       ' editar registro
                    .Titulo = "Editar"
                    .Accion = ACCION_EDITAR
                    .Id = tk.Id
                    .Nombre = tk.Name
                    .Fecha = tk.Date
                    .Show 1
               
                    ' guardarlo en su posición...
                    If (.Aceptado = True) Then
                        tk.Id = .Id
                        tk.Name = .Nombre
                        tk.Date = .Fecha
                   
                        Seek (Canal), ((Ix * LenRegTask) + 1)
                        Put #Canal, , tk
                    End If
                End With
            End If
           
        Case 3 ' Borrar registro.
            Ix = GetIndiceReg
            If (Ix >= 0) Then
                ' confirmar que es el correcto:
                MsgBox "A continuación se mostrarán los datos del registro." & vbCrLf & _
                    "Pulse 'Aceptar' si es el registro que desea borrar o 'Cancelar' si no lo es...", vbInformation
                   
                With frmRegistro       ' editar registro
                    .Titulo = "Confirmar"
                    .Accion = ACCION_LEER
                    .Id = tk.Id
                    .Nombre = tk.Name
                    .Fecha = tk.Date
                    .Show 1
               
                    ' borrarlo final...
                    If (.Aceptado = True) Then
                        Call Borrar(Ix)
                    End If
                End With
            End If
    End Select
End Sub

' Solicita el índice del registro...
Private Function GetIndiceReg() As Long
    If (Numregs > 0) Then
        With frmIndiceReg
            .Cantidad = Numregs
            .Show 1
            If (.Aceptado = True) Then
                GetIndiceReg = (.Indice - 1)
            Else
                GetIndiceReg = -1
            End If
        End With
    Else
        GetIndiceReg = -1
    End If
End Function

' Borrar un registro exige bastante esfuerzo y hay diferentes métodos
'  el más sencillo (pero que puede ser costoso en tiempo si el fichero es grande)
'  pasa por copiar los registros activos a otro fichero, eliminar el previo y renombrar el actual.
Private Sub Borrar(ByVal Indice As Long)
    Dim ff As Integer, k As Long
    Dim tk As Task
    Dim temp As String
   
    temp = Replace(Ruta, ".txt", ".tmp")
    ff = FreeFile
    Open temp For Binary As #ff
   
    Seek (Canal), 1
    ' copiar y pegar los registros previos al índice seleccionado
    For k = 0 To Indice - 1
        Get #Canal, , tk
        Put #ff, , tk
    Next
   
    ' saltamos el registro a borrar
   
    ' copiar y pegar los registros tras el índice seleccionado
    For k = Indice + 1 To Numregs
        Get #Canal, , tk
        Put #ff, , tk
    Next
   
    Close                   ' cierra ambos ficheros
    Kill Ruta               ' elimina el actual
    Name temp As Ruta       ' renombra el creado como el actual
    Call AbriBaseDatos      ' y lo abre como actual
End Sub

Private Sub AbriBaseDatos()
    Canal = FreeFile
   
    On Error GoTo falloFile
    Open Ruta For Binary As #Canal
    Numregs = (FileLen(Ruta) \ LenRegTask)
   
    Exit Sub
falloFile:
    Call MsgBox("Ocurrió un eror inesperado: " & CStr(Err.Number) & vbCrLf & _
        "Mensaje: " & Err.Description & vbCrLf & _
        "Se cerrará la aplicación...", vbCritical, "Error inesperado durante la apertura dle fichero")
    Err.Clear
    Unload Me
End Sub


La ventana de selección de índice:
Código (vb) [Seleccionar]

Public Aceptado As Boolean

Public Property Get Indice() As Integer
    Indice = HScrRegistros.Value
End Property
    Public Property Let Indice(ByVal X As Integer)
        HScrRegistros.Value = X
    End Property
   
Public Property Get Cantidad() As Integer
    Cantidad = HScrRegistros.Max
End Property
    Public Property Let Cantidad(ByVal X As Integer)
        HScrRegistros.Max = X
    End Property
   
   
   
   
   
   
   
Private Sub Form_Load()
    HScrRegistros.Min = 1
    Aceptado = False
End Sub

Private Sub HScrRegistros_Change()
    Me.Caption = "Indice de registro: " & CStr(HScrRegistros.Value)
End Sub

Private Sub ComCancelar_Click()
    Me.Hide
End Sub

Private Sub ComAceptar_Click()
    Aceptado = True
    Me.Hide
End Sub



La ventana de edición de la estructura:
Código (vb) [Seleccionar]

Public Aceptado As Boolean



Public Property Let Titulo(ByRef X As String)
    Me.Caption = "Registro: " & X
End Property
Public Property Let Accion(ByVal X As Acciones)
    Dim b As Boolean
   
    b = Not (X = ACCION_LEER)
   
    HScrId.Enabled = b
    TxtName.Enabled = b
    dtpFecha.Enabled = b
End Property


Public Property Get Id() As Integer
    Id = Me.HScrId.Value
End Property
    Public Property Let Id(ByVal X As Integer)
        Me.HScrId.Value = X
    End Property
   
Public Property Get Nombre() As String
    Nombre = Me.TxtName.Text
End Property
    Public Property Let Nombre(ByRef X As String)
        Me.TxtName.Text = X
    End Property
   
Public Property Get Fecha() As Date
    Fecha = dtpFecha.Value
End Property
    Public Property Let Fecha(ByRef X As Date)
        dtpFecha.Value = X
    End Property
   





Private Sub ComCancelar_Click()
    Me.Hide
End Sub

Private Sub ComAceptar_Click()
    Aceptado = True
    Me.Hide
End Sub

Private Sub Form_Load()
    HScrId.LargeChange = 100
    TxtName.MaxLength = 30 ' para que coincida con el campo Task.Name , en realidad puede hacerse sobre la interfaz en diseño.
    Aceptado = False
End Sub

Private Sub HScrId_Change()
    LabId.Caption = "Id: " & CStr(HScrId.Value)
End Sub


Por supuesto se puede hacer más simple y espagueti, pero así como mínimo te resultará muy fácil de ampliar... y tampoco resulta complejo que dificulte entenderlo.

Ejecútalo paso a paso con a tecla F8... para ir mirando donde te pudiera costar entender algo. Con cualquier duda, pregunta.

Descarga del proyecto:
https://workupload.com/file/bU8u4LZY

Alguna imagen de como se ve...


#1238
Tiene todo que ver... si cada valor en el array tiene siempre la misma equivalencia en el otro (perdona pero la explicación dada al comienzo es demasiado parca, como para terminar de entender su propósito).

Y si es siempre cambiante, o debe serlo, entonces usa el algoritmo de Fisher-Yates que es esa precisamente su funcionalidad.
#1239
Claro... posiblemente mañana jueves (si no saco un tiempito esta noche) te pongo un sencillo ejemplo que puedas despiezar, deglutir y modificar a tu antojo.

No importa si pones un scroll vertical u horizontal, aunque el horizontal se presta mejor a poner algún 'label' que refleje su cometido incluso un 'numericUpDown', vale perfectamente.
#1240
Foro Libre / Re: el ingles como barrera idiomática
27 Noviembre 2019, 21:03 PM
Claro que es una barrera.

Cualquier chaval de escasa edad que quiera adentrarse en la programación, encuentra como primera barrera el idioma de los lenguajes de programación... Conozco gente que aún sabiendo programar aún no conoce en profundidad el significado de muchos términos... han aprendido parcialmente su significado al usarlo, mejor dicho saben como usarlo sin conocer su significado real, lo cual limita precisamente profundizar más a fondo y lo hace admeás más lento.

Pero es peor aún, que el hecho de que se fabrique o no hardware y software en español, ya que muchos de los propios (los pocos que si lo 'fabrican'), se emperran sí o sí, en transcribirlo al inglés aún siendo su lengua materna el español y dirigido a un público casi exclusivamente español, lo cual resulta paradójico...

Básicamente el único modo que no sea una barrera es que los niños aprendieran inglés a los 2-3 años, lo cal ya sería sin ningún género de duda una imposición linguística (para mi) inaceptable. Creo que con que un niño aprenda otros idiomas que no sea el materno a los 10-12 años es más que suficiente de cara al conocimiento y aprendizaje.

Es muy probable que en los próximos 10-15 años, no sea preciso aprender ningún otro idioma por imposición, pués es de esperar que nuestra propia rama, acabe por hacer las traducciones simultáneas a casi cualquier idioma. tu hablas en tu idioma y otro interlocutor/es que te escuche/n, lo oirán en su idioma y viceversa...

La máxima es que las máquinas deben diseñarse para facilitar la vida al ser humano y no al revés. Aunque todavía hay quien ase empeña que en que sean los 'humanos' los que se adapten a las máquinas....... menos mal, que no les hicieron caso, si no los compiladores seguirían sin existir y seguiríamos escribiendo programas en tarjetas perforadas y escribiríamos 15 líneas de código al día (algo apto por supuesto solo para unos pocos, ni mucho menos se habría extendido como lo ha hecho)...