• Sábado 5 de Julio de 2025, 03:54

Mostrar Mensajes

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


Mensajes - Nebire

Páginas: 1 ... 24 25 [26] 27 28 29
626
Seguridad y Criptografía / Re: Sha-1 Y Colisiones
« en: Domingo 23 de Septiembre de 2007, 19:49 »
Cita de: "mjesun"

 
Citar
1º SHA-1 genera hashes o claves de 20 bytes... esto quiere decir que como mucho puede producir 256^20 claves diferentes, sin ningun tipo de colisión.

Ahora mismo no estoy seguro que sea exactamente así, pero para lo que preguntas es trivial.

Citar
2º si construimos cadenas (o arrays, mal usada la palabra cadenas) de 20 bytes exactos, realizando todas las combinaciones posibles, ocuparemos exactamente todas las claves generadas de SHA-1, ya que estas son también 256^20..

Si tomas la calculadora y hechas cuentas, verás que arroja un resultado de 48 cifras, esto significa que computacionalmente hablando una rutina que tarde 1 msg. tardaría 1*10^45 segundos... es decir 1*10^41 horas * 4, es decir 1'69 * 1*10^40 días, es decir: 4'63 *1*10^37 años, es decir: 463439129036942833017403866284,97 millones de siglos. incluso aunque redujeras esa rutina de 1 milisegundo a una millonésima de segundos no tendría apensa sconsecuencias..

Citar
3º si no se ha producido colisión, cosa bastante curiosa, pero que demostraría una gran pericia, obviamente se producirá con cadenas de 21 caracteres... es mas... si no hay colisión con 20 bytes, hay colisión al menos entre una cadena de 20 y una cadena de 21...
si yo tomo cadenas de 256 caracteres, y tu me envías cadenas de de 264 caracteres una de 2 o arroja error de tipo de datos o en el mejor de los casos, tomando los datos secuencialmente, sólo tomo los enésimos 256 caracteres , de modo que si tu has enviado cadenas de 264 caracteres, se va truncando en cadenas de 256...

Citar
¿entonces porqué se pone siempre en juicio el hecho de que no haya colisiones en un algoritmo? en arrays de bytes cuya longitud sea superior a la del hash siempre habra colision... no?
Sólo si yo no aprovechara el rango completo del tipo de datos que estoy utilizando pero al momento de comparar truncara el exceso. Me explico si el número mayor de mi tipo de datos que utilizo en x función fuera 4096.... pero mi rango máximo fuera 999, parece razonable suponer que tanto 999 como 1999, como 2999 y 3999 dieran positivo pero cuando yo establezca una igualdad se pierde y sólo valida con 999, a excepción de que validadra con  'x mod 1000' en cuyo caso entrarían los anteriormente descritos. Por eso siempre se aprovecha el rango completo del tipo de datos que manejas, porque para eso tiene su límite.

nota: puedes aplicar los mismos razonamientos con los números negativos caso de ser numérico y no de cadenas el valor...

saludos...

627
Visual Basic 6.0 e inferiores / Re: Consulta Con Checkbox
« en: Domingo 23 de Septiembre de 2007, 19:22 »
Vamoa suponer que la query se ejecuta correctamente es decir que tienes el collation en CI (case insensitive) y que por tanto no falla si tienes guardado 'septiembre'  en vez de 'Septiembre', etc...

Entonces dado que parece ser que tienes 12 controles referidos a meses, yo haría algo como un array de controles checkbox llamados cheMes, donde los índices irían desde 0 para enero hasta 11 para diciembre y meter en una matriz los nombres de los algo así....
Código: Text
  1.  
  2. Dim mes(0 To 11) As String
  3.  
  4. Private Sub Form_Load()
  5.     Call asignaMeses
  6. End Sub
  7.  
  8. Private Sub asignaMeses()
  9.     mes(0) = "Enero"
  10.     mes(1) = "Febrero"
  11.        ...
  12.        ...
  13.     mes(10) = "Noviembre"
  14.     mes(11) = "Diciembre"
  15. End Sub
  16.  
  17.  
  18.  

Entonces puesto que es de esperar que cada consulta chequee los 12 meses (supongo que por abreviar has puesto el ejemplo con 2 meses), entonces haría un bucle que recorriea todas las posibilidades:

Citar
For i = 0 To 11
        cheMes(i).Value = (ucase(rspago.Fields("MesPagado")) = ucase( mes(i))) and 1
Next

Esto implica que no tienes que tener 12 controles con nombre propio, si en un momento dado tienes que setearlos todos a false, con un bucle del tipo 'for i= 0 to 11 : mes(i).value=0 : next' lo puedes hacer frente al caso que pones que tendrías 12 líneas de código redundante.

Aparte del array de controles y de las constantes del nombre de los meses, la expresión:  'rspago.Fields("MesPagado")' es lel result set que devuelve tu consulta, que se compara con la expresión 'mes(i)' , las funciones 'ucase' convierten a matúsculas ambas expresiones sólo en la comparación (lo lógico es que en la asignación de nombre del mes ya lo quedaras en mayúsculas, así se ahorra tiempo de convertir a mayúsuculas el mes), esto evita la sorpresa de que en la bd se haya metido 'enero', 'Enero', 'ENERO', o cualquier otra posibilidad... aún podrías poner un trim(texto) para dado los casos de haber introducido ' enero  ', es decir espacios en la cadena.

Como la evaluación de la expresión da un true-false si el resultado de la consulta es igual que el texto contenido en el indice de la matriz, y puesto que el checkbox recibe sólo valores '0' ó '1' , con 'and 1' convertimos desde true-false a 1-0 .

Saludos....

628
VB .NET / Re: Saber Si Esta Asigando El Focus
« en: Viernes 21 de Septiembre de 2007, 23:35 »
yo anduve por el 2003 sólo de pasada me pasé rápido al 2005 y no recuerdo ahora si el 2003 incluía o no esos eventos, en cualquier caso es probable que los llamaran con otro nombre

Pero te recomiendo que te pases al 2005...  incorporó nuevas mejoras, mayor compatibilidad con el VB6 (por si venías de allí) y corrección de rrores, además así no te quedarás descolgado... el 2008 está ya en el bote, cuanto antes se pille la 'onda' menos anticuado se queda tu software...

629
Visual Basic 6.0 e inferiores / Re: Ejecutar Cualquier Cosa
« en: Viernes 21 de Septiembre de 2007, 22:57 »
te sobra eso de ..start... ya que le estás indicando que la ruta es: 'startC:\Archivos de programa\MSN Messenger\msnmsgr.exe' es decir has concatenado 2 cadenas, y el intérprete es incapaz de encontrar un archivo ccuya ruta sea ese texto.

Si al menos start fuera una variable cuyo contenido fuera una carpeta y con sfile apuntarías a diferentes archivos en una rutina al caso...

 El código sería éste:

Código: Text
  1.  
  2. Private Sub Command1_Click()
  3.       Dim ret As DOUBLE  'no [U]Long[/U]
  4.       Dim sfile as string
  5.  
  6.       sfile = "C:\Archivos de programa\MSN Messenger\msnmsgr.exe"
  7.       ret = Shell(sfile)
  8. End Sub
  9.  
  10.  

la estrucutura de shell es shell(rutaAlPrograma, estiloVentana) cuando pongas la coma, vb6 ya te propone el modo... de ventana

630
VB .NET / Re: Como Cerrar Un Formulario
« en: Jueves 20 de Septiembre de 2007, 21:18 »
Vamos a ver, cuando vuelves a ese formulario ejecuta esto desde un botón

MsgBox(CStr(My.Application.OpenForms.Count))

te dirá cuantos formularios hay abiertos...

pero es falso que tengas varios formularios, según dices aquí
Citar
dim formulario1 as new form1
formulario1.show ()
tienes un formulario llamado form1 y x instancias de form1 llamados formulario1. Si es así, nunca podrás cerrar form1 y que queden abierto sus instancias. Es decir puedes ejecutar ese código cuantas veces quieras y cerrarlos, pero si cierra el original form1 todas las instancias creadas también se cerrarán.

Si no entiendes lo que son referecnias a objetos léete algo aobre ello...

631
SQL Server / Re: Integridad Referencial
« en: Jueves 20 de Septiembre de 2007, 20:22 »
Lomás lógico es tener otra tabla de clientes eliminados, así antes de eliminar un cliente, pasas todos los datos de sus compras a la tabla de compras_de_clientes_eliminados luego eliminas los datos de las tablas vigentes y finalmente el cliente. no hagas relación entre esta tabla y los id de clientes, esta tabla solo será para consultas de histroiales.

Mantener datos que no se van a usar o se usarán poco en tablas que se usan con frecuencia ralentiza el trabajo de la Bd, así que no seas ceporro y no mantengas datos que vas a consultar 2 veces al año en una tabla que manejas a diario.

De todos modos por la descripción del problema que realizas, tengo la sensación de que tienes un cacao de Bd de 3 pares de coj*****, te recomendaría  una lectura sobre 'Normalización' de las bases de datos... busca en google y aplícate al cuento.

632
SQL Server / Re: Dudas Con Create View
« en: Jueves 20 de Septiembre de 2007, 20:11 »
Aunque no pones todo el código he de suponer que te falta el use @basededatos_donde_quieres_guardar_la_vista  go

633
VB .NET / Re: Saber Si Esta Asigando El Focus
« en: Jueves 20 de Septiembre de 2007, 19:58 »
en diseño ... pincha (doble-click) en uno de esos controles que quieres controlar, por ejemplo un textbox...

se te abre la ventana de código por el evento text1_click ...bien arriba del todo en el combo de la derecha (sin salir de la ventana de código) tienes todos los métodos que admite el control actualmente seleccionado en el cóodigo.

Localiza el evento gotFocus.... y pincha en él.... cuando el control del programa llegue allí tiene el foco...

Ahora pregúntame como controlas cunado mueves el cursor sobre un control o cuando levantas el ratón de un control....

634
VBA / Re: Matrices En Visual Basic
« en: Jueves 20 de Septiembre de 2007, 19:53 »
los post de tareas no se borran después de unos 7-10 días ????

635
VBA / Re: Vb Traduccion
« en: Jueves 20 de Septiembre de 2007, 19:50 »
Cita de: "EnergyX"
la aplicacion tiene una 35+ ventanas asi que es una aplicacion un poco grande, creo que voy a tenar hacerlo por la bd ya que por ini tardaria mucho
No me digas ????....

Desde cuando tomar los datos de un archivo binario es más lento que de una base de datos ????.

En lo que tardas en hacer la conexión a la bd ya se han cargado el idioma de 100 ventanas.

En XML es lo mismo que en un ini, sólo que algo más lento porque tendrás un intérprete de XML por medio.

Lo lógico es cargar el idioma al inicio, lo primero ver si se estableció idioma . Leyendo en el ini una estructura básica, que indica que idioma es el seleccionado actualmente, en esa estructura le indicas el puntero al byte donde se lee el idioma actual y lo lees de un golpe o formulario a formulario y lo asignas a los controles.

Una base de datos lo que si te va a permitir es actualizar mucho mejor cualquier cambio posterior que hagas...sugiero una tabla por cada formulario... de ese modo no tendrás nombres de control repetidos en cada tabla.

636
VBA / Re: Búsqueda De Archivos
« en: Jueves 20 de Septiembre de 2007, 19:30 »
monta un control file en el formulario (es como un listbox),

entonces le dices:

file1.path=ruta a la carpeta que quieres
file1.pattern= "archivo*.*a"  'se admiten comodines en cualquier parte
 de modo que si es bak haces "*.bak"

numFich=file1.listcount-1

numfich te indica todos los archivos que pasaron el filtro. si quieres que te aparezcan archivos ocultos y de sistema, tendrás que activar los atributos...

637
Visual Basic 6.0 e inferiores / Re: Aclaración Con Decimales
« en: Jueves 20 de Septiembre de 2007, 18:30 »
Lo lógico es que el punto se trate como el separador entre cifras enteras y cifras decimales en el entorno de VB, al obtenerse de un string, en cambio una coma se interpreta como un string, ya que en VB es así.

Vete al panel de control, pincha en 'configuración regional..'  pasa a la ficha 'idiomas' y pulsa en 'detalles'..... ahí elimina el teclado inglés y activa el teclado español internacional, dale a aceptar y nuevamente a aceptar... guarda el proyecto y vuelve a abrirlo. Es posible que tuvieras que reiniciar el equipo para que se lleven a efecto los cambios.

No hagas como indica el compañero mjesun, ya que no es el caso sustituir algo por lo que no es.

638
Visual Basic para principiantes / Re: Ayudaa
« en: Jueves 20 de Septiembre de 2007, 18:17 »
Si eres nuevo debes empezar por conocer el lenguaje. Cuando conozcas lo suficiente podrás meterte con un programa, mientras deberás ensayar con 'programitas' de pocas líneas...

639
Visual Basic para principiantes / Re: Teclado Con Vb
« en: Jueves 20 de Septiembre de 2007, 18:14 »
Me llama la curiosidad de porqué no has puesto la letra Ñ, si tu programa es para español, sería lo crrecto, porque 'Manana quería ir a la montana si a la nina le sale del cono'.

Es más puesto que tienes 4 filas de 7 yo las haría en 3*10  + otra fila para los números... +  el bloqueo de mayúsculas, la tecla suprimir y borrar (suprimir borra caracteres a la derecha, borrar borra caracteres a la izquierda) y la tecla espacio le daba una línea entera, quizás partida en 2 por el medio donde se podría añadir alguna tecla extra...

640
Visual Basic 6.0 e inferiores / Re: Atención Programadores / Attention Programmers
« en: Martes 18 de Septiembre de 2007, 03:47 »
Esto suena a chanchullo...

Me explico.:
Como una empresa va a solicitar cualquier cosa... todo vale... sólo hay 2 razones, es una empresa excesivamente mediocre, o simplemente es un ardid para que incautos envíen sus emails a un buzón de spammers.

Si realmente es una empresa seria y establecida, no tendrá ningún inconveniente en dar su número de registro industrial, así como la dirección y teléfono de la empresa. Si no facilita dichos datos puedo y cualquiera pensar justamente que son una pandilla de timadores sin escrúpulos.


Bien grande que no sea que algún incauto se lance a la desesperada...

641
VB .NET / Re: Motor
« en: Martes 18 de Septiembre de 2007, 03:26 »
Personalmente no me gusta leer párrafos de líneas que están sin indentar, y creo que no habrá mucha gente al que le guste.

Tómate la molestia de meterlo entre 2 tags de CODE y edítalo indentando para que sea legible.... entonces es posible que no de pereza revisar tu código. Es lo mínimo que debes hacer, si tu no quieres perder tiempo en editar tu pregunta, debes comprender que nadie quiera perder el suyo en leer algo ilegible.

642
VB .NET / Re: Programa De Combinaciones
« en: Martes 18 de Septiembre de 2007, 02:34 »
Si sólo tienes que hacer permutaciones con 4 elementos, lo mejor es ni siquiera clacularlo, puesto que su factorial es 24, estas las puedes guardar directamente ya en una matriz, así no tienes que calcularlo cada vez que supuestamente pasares por una rutina dada, simplemente bastaría con leerlo de la función que toma las asignaciones:

sería algo como:

Código: Text
  1.  
  2.  
  3. rutina donde se usan las combinaciones
  4.    dim combina(0 to 23)
  5.     .....
  6.     .....
  7.    combina=asignaCombinas 'llamar a la asignación de combinaciones
  8.      ....
  9. fin rutina
  10.  
  11. funcion asignaCombinas() as string()
  12.    asignaCombinas(0)="ABCD"
  13.    asignaCombinas(1)="ABDC"
  14.    asignaCombinas(2)="ACBD"
  15.           ...
  16.          ...
  17.            ...
  18.    asignaCombinas(22)="DCAB"
  19.    asignaCombinas(23)="DCBA"
  20. fin funcion
  21.  
  22.  

Claro que si usas muy a menudo esto entonces es mejor hacer la variable combina pública, e invocar sólo una vez a la función asignaCombinas, es decir en el evento load del programa, así te quedaría disponible el resto del programa.

Es una solución rápida y eficaz para un problema concreto (4 elementos con 24 permutaciones), así que si es así de concreto, va adecuado.
p.d.: releyendo tu pregunta... dices que los guarismos a usar son los que entren por un inputbox, en ese caso tienes que llamar a otra función después de la de asignación que consisite en un bucle de sustitución.

en ese caso debes sustituir cada "J" por cada "A" que aparezca en los elementos de combina()... fíjate de no cometer el error, de si coinciden un guarismo que se entra con otro que está en uso (excepto que sea el último guarismo), ya que si haces así, como ocurriría con la entrada(1) ("C"), entonces todas las "B" existentes serían "C", pero como también existen "C" entonces el siguiente cambio daría erróneo.

Esto se evita con un guarismo intermedio, es decir antes de intercambiar, debes comprobar que los guarismos de entrada noo son idénticos a los que ya hay, si los hay entonces aquel que ya exista (excepto si es el último, debes cambiarlo temporalmente por otro que no exista, por ejemplo por "~" ú otros poco frecuentes, después de terminar, ya no habra "C" 'ces' con lo que cambiarías "~" por "C".... si sólo hay una coincidencia, podrías hacer ese cambio el último, así no precisarías hacer un cambio intermedio....

Espero que me entiendas...

Es decir si el usuario introdjo: entrada(0)="J", entrada(1)="C", entrada(2)="K", entrada(3)="Y"
Código: Text
  1.  
  2. funcion remplazaCombinas
  3.    dim suelto(0 to 3)
  4.    dim temp(0 to 3)
  5.    dim usar(0 to 3)
  6.    temp(0)="#" : temp(1)="€" : temp(2)="@" : temp(3)="~" 'matriz supuesta para reemplazar temporalmente a la matriz entrada.
  7.  
  8.      suelto=deshaceCombina(combina(0))
  9.       existen=compruebaCoincidencias(entrada,suelto)
  10.       if existen=true entonces '
  11.           usar=temp '  usamos la matriz temp
  12.       no existen  'entonces usamos la matriz entrada
  13.          usar=entrada
  14.       fin existe
  15.   
  16.    for i=0 to 3
  17.       cambiarPor=usar(i)
  18.       for k=1 to 23
  19.          suelto=deshaceCombina(combina(K))
  20.          combina(k)=intercambia(suelto, cambiarPor)
  21.       fin k
  22.    fin i
  23.    if existen=true then  'si existen ya que se mudaron por algunos que 'supuestamente no existen, ahora los cambiamos por los que introdujo el usuario....
  24.       for i=0 to 3
  25.          cambiarPor=entrada(i)
  26.          for k=1 to 23
  27.             suelto=deshaceCombina(combina(K))
  28.             combina(k)=intercambia(suelto, cambiarPor)
  29.          fin k
  30.       fin i
  31.    end if
  32. fin funcion
  33.  
  34. ' intercambia los valores y los reune en una cadena que devuelve
  35. funcio intercambia(destino(),origen) as string
  36.     for i=0 to 3
  37.        if origen=destino(i) luego
  38.           destino(i)=origen(i)
  39.        end if
  40.        intercambia=intercambia & destino(i)
  41.     fin i  
  42. fin funcion
  43.  
  44. ' comprueba si un guarismo entrado ya existe en la cadena a sustituir
  45. funcion compruebaCoincidencias(a() as string,b() as string) as boolean
  46.    dim repes as byte
  47.    for i=0 to 3
  48.       for k=0 to 3
  49.          if a(i)=b(k) then
  50.                  repes=respes +1
  51.          end if
  52.       fin k
  53.    fin i
  54.    compruebaCoincidencias=(repes>0)
  55. fin funcion
  56.  
  57. ' entrando un string en la forma "ABCD" devuelve una matriz
  58. ' enla forma c(0)="A", c(1)="B", c(2)="C", c(3)="D"
  59. funcion deshaceCombina(cadena as string) as string()
  60.    deshaceCombina(0)=mid(cadena,1,1)
  61.    deshaceCombina(1)=mid(cadena,2,1)
  62.    deshaceCombina(2)=mid(cadena,3,1)
  63.    deshaceCombina(3)=mid(cadena,4,1)
  64.  
  65. fin funcion
  66.  
  67.  

Fíjate que no te he resuelto el caso de que sólo haya una equivalencia entre los guarismos usados, he asumido que todos están repes, y he asumido que dichos caracteres no los va a usar el usuario, en realidad eso es algo que tendrás que poner tú, yo te he puesto esos valores, para que no sea todo muy en el aire...con poco esfuerzo puedes mejorarlo, ya que yo lo he escrito de corrido...procurando que me entiendas sin liarte demasiado.

643
Diseño de Algoritmos / Re: Ayuda Con Algoritmo Para Calificaciones
« en: Sábado 15 de Septiembre de 2007, 14:29 »
Cita de: "sunsfallen"
Se me ha pedido hacer un algoritmo que imprima el promedio de tres calificaciones solo si el numero de calificaciones aprobadas es de 1a o mas, en caso que las tres calificaciones sean reprobatorias no sacar el promedio.

Nota: nos piden usar cualquier tipo de ciclos (mientras, repetir, desde).

Queria ver si alguien pudiera ayudarme con el ya que estoy perdido, y gracias de antemano.
Mira, la solución de los problemas se basan en el enunciado, sabiendo lo que se pide, se sabe lo que se necesita, luego es cuestión de unir las piezas..

Veamos, si son varias calificaciones (de varios alumnos), entonces tenemos una entrada de datos, el origen de esos datos.... entonces hay que canalizarlos, para eso hay que utilizar un tipo de bucle l, de entrada no es necesario especificar qué tipo...si sgues el flujo, aparece la 1ª condición 'que sean aprobadas de 1ª o superior', entonces tienes que hacer una comparación  esto cumple esta condición ? --si, no, entonces bifurcas cada caso, tratas primero uno y luego vas por el otro, siguiendo la línea de flujo de las malas calificaciones aparece la siguiente condición 'si son 3 malas calificaciones de deshecha, por lo tanto necesitas un contador de datos, vamos una variable, que cuente las veces que se cumple eso en un mismo alumno, si el otro camino cumple el requisito, entonces finalmente viene una función que calcula el promedio...

En fin hazte unos diagramas de bloques del flujo del programa y cuando lo veas claro luego decides con que lo implementas, que nombres le das a las variables, etc...

Pero currátelo, no esperes que te lo hagan.

644
VB .NET / Re: Limpiar Pantalla Consola
« en: Sábado 15 de Septiembre de 2007, 13:55 »
console.clear asi de sencillo

645
Visual Basic para principiantes / Re: Sentencia Para Reconocer Un Numero Real
« en: Sábado 15 de Septiembre de 2007, 13:44 »
La función int(número), retira los decimales y para convertir el string del textbox a cifras usa val(cadena).

Otra forma es controlar con una función, por ejemplo como esta:

Código: Text
  1.  
  2. Private Function comprobarValor(texto As String) As Double
  3.     Dim c As String, cadena As String
  4.  
  5.     For i = 0 To Len(Texto)
  6.         c = Mid$(texto, i, 1)
  7.         If (c > Asc(48)) And (c < 57) Then
  8.             cadena = cadena & c
  9.         End If
  10.     Next
  11.     comprobarValor = cdbl(cadena)
  12. End Function
  13.  

...pero recuerda limitar el número de caracteres al textbox, para evitar desbordamientos... en cualquier caso si has de usar números lo mejor es que uses un control slider ya que puedes limitar el rango menos y mayor, no hay posibilidad de error, tampoco hay que chequear por caracteres no válidos.. (el scrollbar tanto el vertical como el gorizontal tienen limitado su rango al de un entero (32767) el slider no tiene esa limitación, además puede orientarse tanto vertical como horizontal...

646
Visual Basic 6.0 e inferiores / Re: Leer Los Atributos De Un Nodo De Xml
« en: Martes 11 de Septiembre de 2007, 10:39 »
Bueno no se si quieres leer nodo a nodo porque quieres darles formato, modificar valor,etc.... ya que según lo que quieras te pasaría de ejemplo un código, otro u otro.

Vamos si quieres un código para leer el xml y mostrarlo en un datagridview, leer un xml y mostrarlo directamente un richtextbox o leer un xml nodo a nodo (o incluso leeer solo el esquema del xml), para procesarlo (y eventualmente mostrarlo en un richtextbox)... la diferencia entre el 2º y 3º método es que la velocidad del 2º es muy superior, la ventaja del 3º es que podrás controlar todo, por ejemplo añadir nodos, quitar nodos, reconvertir un nodo en otro, etc...

Aunque por otro lado una vez que está cargado en el richtextbox, siempre podrás manipularlo igualmente.... por ello en el párrafo anterior me refería más bién a manipular lo que quieres mostrar antes de que se muestre...

Dime cual de las 4 te interesa y te paso un ejemplo del que necesitas...

647
Visual Basic 6.0 e inferiores / Re: Visual Basic Para Linux
« en: Martes 11 de Septiembre de 2007, 09:27 »
Si lo que necesitas es ejecutar aplicaciones en Linux que están hechas en windows, debes usar el Wine, que por lo que tengo entendido es bastante eficaz..

Yo no lo he probado, Linux sigue sin interesarme aún....

648
VB .NET / Re: Crear Html
« en: Martes 11 de Septiembre de 2007, 09:15 »
En tonces no hay quien te entienda.. esta era tu pregunta inicial:

Citar
... y necesito mostrar esos mismos datos un una pagina html creada en vb.net ...

y ahora, parece que preguntas esto otro:
Citar
...Mi problema es que necesito mostrar valores de variables, por eso mi pregunta de si se podia hacer un html, porque necesito mostrar datos de variables que son llenadas en un formulario win, y html por si solo no puede...
Que en esencia es lo mismo que preguntabas arriba... así que aclaráte. Separa los comentarios, las dudas o las afirmaciones de lo que relamente preguntas.

Si necesitas hacer una transacción por la web y precisas pasar o tomar datos de un html, se puede hacer, pero si no necesitar hacer un transacción de web, sino simplemente mostrar datos, tal como dices tienes el Excel y si no te complace en la forma excesivamente cuadriculada y lleno de objetos con los que el usuario ni entiende ni va a interaccionar, puedes usar un DataGridview, desde él puedes tanto pedir datos como exhibirlos, sin el agobio de tantos objetos como el excel y sin tener que componer diferentes objetos html....

Si lo que preguntas es si el diseño de asp vino a cubrir algún defecto de html, la pregunta es que html no podía cubrir los aspectos de net (rompería las normas del estándar html) por eso se crea un nuevo formato que encubre el html pero con su nuevo estándar y librerías... son cosas de estrategia comercial y legal . Las compañías no pueden modificar el html a su antojo, porque entonces habría 100 html diferentes y sólo se vería en el navegador con el que fue creado, por eso existe la estandarización, que en definitiva es ponerse de acuerdo en que esto debe ser así y con estas reglas, y el que no esté de acuerdo puede proponer cosas, se estudian y ya se verá si se acptan o no.... cuando los cambios son profundos y no se tiene claro que te puedan aceptar tal o cual cosa, una compañía saca su propio formato que nada impide que esté basado en uno ya existente (no patentado o de dominio privado vamos) donde realiza lo que le de la gana y si al tiempo las diferentes compañías deciden adoptarlo quizás en un futuro se convierta en un estándar...

649
Otras Bases de Datos / Re: Que Deveria Tener Una Bd?
« en: Domingo 9 de Septiembre de 2007, 06:19 »
Hola -su, es curioso... a mi también me interesa mucho los motores de base de datos, de hecho estoy diseñando (en los tiempos libres) los esquemas y reuniendo ideas para hacer un miniSQL que en esencia tendría todo lo que tiene un SQL pero sin tanta tontería, es decir esos recovecos que casi nadie conoce y cuya utilidad es muy muy limitada y es la que sirve de pie a los fallos de seguridad.

Aparte de eso, pretendo algunas cosas más, lo más esencial es la sencillez de uso, para ello lo implementaré tal como es el español, donde cada parte de la oración gramatical puede casi cambiar de sitio y seguir teniendo el mismo significado, esto evita los errores por falta de ese aprendizaje concienzudo que se requiere para manjar bien las bases de datos.

También quiero proveerlo de sinónimos, es decir porqué usar siempre 'delete' y solo delete ?? .. en el lenguaje normal usamos hasta una veintena de sinónimos, entonces en mi bd 'borrar' 'eliminar' 'destruir' 'tirar' podrán usarse indistintamente, además daré soporte a sinónimos particulares, es decir si uno prefiere emplear el término 'ahorcar' para referirse a 'borrar' podrá hacerlo (de acuerdo a unas sencillas reglas.... aunque la idea del sinónimo libre de usuario va más enfocado a exportarlo a otros idiomas partiendo de una tabla o esquema que se tomaría de un archivo como tabla de traducción... dicho de otro modo que nadie tendrá que aprender el manejo de dicha base de datos en español o inglés, sino en su propio idioma de su país (o en el de su familia si así se quiere y contruye dicha tabla).

La parte más relevante ... el de velocidad lo tengo resuelto, pués he desarrollado el algortimo más eficiente del mundo en cuanto a ordenar listas se refiere, de hecho aun en alto nivel es el doble y más de rápido que cualquiera en escrito en bajo nivel, además sea el nivel de desorden que haya tarda siempre exactamente lo mismo en calcularlo, no hay por tanto ni mejor ni peor caso... ya que soy de lo más pobretón, quiero patentarlo y ver si me deja algún beneficio que me permita vivir un poco dignamente y tapar esos agujeros (si negros, negros.. vamos hacienda o no es negro ?)...

Quería comentarte de paso algo sobre tu esquema.... y ya me dirás:
Citar
cuando quieres sacar X dato que no es del primer archivo te toca buscar por cada archivo hasta llegar al que se quiere y eso consume muchos recursos  cuando la base de datos es muy grande.

Mi idea es poner todos los headers al inicio del archivo y asi solo tendria que ir al lugar en el que esta.
El problema es mantener los headers y los datos en el lugar correcto.

Te entiendo, pero yo lo que haría en este caso tuyo es mantener otro archivo sólo para esto, es decir por un lado los datos y por otro las referencias de los datos, es decir la tabla tal empiez en el byte 45678, esos punteros los pondría en otro fichero, y ese otro fichero si que tendría 'headers' para los nombres de las tablas (tal como indicas similar a la estructura xml) y por tanto haciendo su búsqueda en árbol tampoco en modo secuencial...

un esquema un poco rápido sería algo como esto:
esquema para el fichero de cabeceras de la BD
Código: Text
  1.  
  2. <ultraHeader>
  3.    <nombreHeaders> nombre de este fichero de headers para relacionar la BD, con el fichero de headersy de control</nombreHeaders>
  4.    <nombreControl>mi nombre aunque se cambie el del fichero este es el original cuando se creó<nombreControl>
  5.    <nombreBD>nombre de la bd, aunque se le cambie al archivo, se sabe como se llama</nombreBD>
  6. </ultraHeader>
  7.  
  8. <HeaderFile>  descripción: contendría info esencial de la BD
  9.    <finHeaderFile>byte en el que acaba el headerfile</finheaderfile>
  10.    <nºTablasAlojadas>cuantas tablas tiene alojadas dicho fichero</nºTablasAlojadas
  11.    <incrementoBD>tamaño en Mb. que se autoincrementará la BD (se reserva) para aumentar si queda cierto espacio libre... impedirá que una base de datos se cuelgue si no hay espacio en disco....habrá triggers para comprobar esta situación </incrementoBD>
  12.    <%libreParaIncremento>el incremento será automático cuando quede menos del tanto porciento de espacio libre en la BD</%libreParaIncremento>
  13.    <LibreDesde>puntero al byte  en el fichero de la bd donde ya está libre, para calcular espacio libre y ocupado , y puntero donde escribir nuevos datos</LibreDesde>
  14.     ..
  15.     ..
  16.     ..
  17. </HeaderFile>
  18. <nºTablas> cuantas tablas tiene la bd</nºTablas>
  19.    <Tabla>
  20.       <nombreTabla> nombre de una tabla dada</NombreTabla>
  21.       <PunteroTabla> puntero en byte donde comienza esta tabla en el fichero de datos</PunteroTabla>
  22.       <finPunteroTabla>puede no ser relevante, pero de entrada no está de más<finPunteroTabla>
  23.       <nºCampos> cuantos campos tiene para procesar su info</nºCampos>
  24.          <campo>
  25.             <tipoValor> string, booleano, integer...etc...</tipovar>
  26.             <EsId?>indica si está marcado como identificador</esId?>
  27.                <EsAutoIncremental>booleano que indica si se autoincrementa</.....>
  28.               ...
  29.               ...   otros datos que recoge cada campo
  30.               ...
  31.          </campo>
  32.          <campo>
  33.              ... los sigueintes campos  
  34.          </campo>
  35.       <nºRelaciones>cantidad de relaciones que tiene la tabla</nºRelaciones>
  36.          <RelacionConTabla> nombre de tabla relacionada</RelacionConTabla>
  37.          <CantidadCamposRelacionados>se usa para saber cuantas etiequetas de las que siguen hay que repetir</cantidadCamposRelacionados>
  38.             <relacion>
  39.                <RelacionDesdeCampo> nombre del campo LOCAL de esta tabla </RelacionDesdecampo>
  40.                <RelacionConCampo>campo INVITADO tabla relacionada,estos dos etiqetas van emparejas tantas como indique cantidad de campos relacionados</RelacionConCampo>
  41.                <primario>en esta relación el campode esta tabla es quien relaciona o es relacionado (dirección  de la relación)</primario
  42.            </relacion>
  43.            <relacion>
  44.                  ...
  45.                  ...datos de la relacion...
  46.                  ...
  47.            </relacion>
  48.          ...
  49.          ... mas datos de tabla
  50.          ...
  51.    </tabla>
  52.    <tabla>
  53.           ...
  54.           ...
  55.           ...
  56.    </tabla>
  57.        ...
  58.        ... más tablas
  59.        ...
  60.  
  61.  
Como puedes ver en este esquema, si se hace bastante completido ya puede ser complejo y profundo, por ello entiendo que es más fácil y mejor tratar independientemente cada aspecto de la base de datos, además esto facilita la concurrencia, me explico:
 Supongamos que tenemos creado esos dos ficheros de los datos de la BD (el de cabeceras con info de la tabla y el de los datos ) de entrada al abrir la base de datos hago DOS copias del fichero de cabeceras, usando el mismo nombre y canbiando la extensión como quiera que aunque una DB sea muy grande, este fichero siempre será bastante más pequeño por tanto esta copia es rápida... bien si ahora hago una solicitud de BUSQUEDA (no delete ni insert : table, ni modificar aspectos de los campos, es decir que no hace variar a este fichero)  mientras se procesa la solicitud buscando en dicho fichero(en una copia), otra consulta puede estar buscando en el fichero de datos, así no es preciso que quede libre el fichero de cabeceras para iniciarse otra query, ya que las querys alternan el uso de una copia u otra según la que no esté en uso, luego el primero que termina de procesar en el fichero de cabeceras 'marca' que ya empieza a usar el fichero de datos, así si mientras la otra query termina si debe esperar, pero al mismo tiempo que se marca que empieza a buscar en el fichero de datos, marca que el fichero de cabecera x ya está libre para otra concurrencia de query, así mientras se valida una query con el fichero de cabeceras, etc... otra consulta está trabajando cen el fichero de datos, luego los tiempos de espera se reducen...

Si en un momento dado la query solicitada es modificar una tabla, eliminarla o crear, implica modificar el fichero de cabeceras, en este caso,  esta query mientras se valida debe esperar a que se marquen libres las 2 copias, estas se eliminan y si aún no está libre el fichero de datos se espera, luego se rematan las acciones en aquella y mientras se hace esto se crean nuevamente esas copias de los ficheros de cabeceras... vamos que una query está en la BD(datos), mientras otras 2 pueden estar en las bd(cabeceras) validando las querys....

Fíjate que con tu sistema de todo en un sólo fichero sólo puedes indicar otro proceso cuando el primero termine totalmente su cometido, es decir hay muchos tiempos de espera, en bases de datos con muchos usuarios...

Y porque usamos las 2 copias y no la original BD(cabecera) ?: porque en ella cada query 'marca' , 'estoy trabajando en la tabla x.y,m si quereis consultar esperad'...claro que marcar esto es mucho más rápido que validar la query y más rápido aún que procesar los datos de la query en la BD(datos).... vamos es un esquema bastante más óptimo, dado que el tuyo queda monousuario.

Naturalmente debe haber un pequeño conjunto de reglas, si voy a alñadir datos a la tabla 'sueldos' y luego voy a hacer la media, pero debo esperar a la consulta saliente deje la bd, la 2ª consulta, pongamos que es más rápido en validarse la query 'hallar la media de la tabla sueldos en el campo medicos' que validar la query 'actualizar la tabla sueldos en los campos medicos, hospital, horario, extrax relacionado con la tabla atrasos_pendientes en los campos medicos, horarios,hospital,extras', en ese caso no puedo enviar a la query 2ª (la que hallaba la media) a la bd, ya que los datos de ésta dependen de la anterior.... una norma básica pués sería: si id_query (a cada query se le da un id, como en las colas del paro, que representa tu 'turno') que ha sido validada (query2 es mayor que la id_query(de la query en proceso de validación, llamémosla query1) y la query 2 trabaja en alguna tabla que la query 1 ha marcado y la query no es consultar datos(leer), sino escribir, entonces query2 debe esperar a que query1 termine...

....me estoy extendiendo...

Citar
la idea es mas amplia de lo que crees y tengo en mente unos conceptos nuevos que no deceo que mo los quiten

jejeje.... a mi me pasa lo mismo, pero suele ocurrir 2 cosas casi a igual promedio, que la mitad de esas ideas-conceptos nadie los tiene concebiso, y que por el contrario la mitad de esas ideas-conceptos gran parte tambien lo tiene concebido... normalmente los segundos surgen de los defectos o carencias que te vas encontrando, los primeros surgen de la lucidez cuando trabajs en otro campo y de repente una solución para una cosa extraña te das cuenta que con pocos cambios, o algunos más vale aplicarlo a otro campo, es por ello que resulta difícil que otros estén también en eso mismo, aunque estén en otras cosas que de algún modo compete por ahí pero de manera muy alejada...

ah...una cosa olvídate de las bases de datos en dbse, te recomiendo centrarte en bases de datos relacionales de última generación, aunque cualquier base de datos puede enseñar muchas cosas, las antiguas suelen llevar por el camino, cuyo final es un callejón sin salida, digo sin futuro ... no en vano van siendo abandonadas poco a poco (poco a poco porque de un plumazo no puedes dejar a los usuarios colgados, si no lo harían).

...Entonces retomando el hilo(que me he saltado), el fichero de datos tendría un esquema sin los headers de la tabla, más aún existe la necesidad de tener otro fichero con datos acerca del fichero de datos (no acerca de los datos contenidos, para eso era el fichero de cabeceras de tablas y campos) ni tampoco los datos que en si mismos se valen, sino de otros datos acerca del fichero como cualquier fichero, pero por lo mismo que lo anterior, para evitar problemas de concurrencia, digamos que aunque su escritura es rápida, impide lectura que es donde está el gran tiempo empleado en las querys, por tanto todo proceso que alivie a dicho archivo bienvenido sea... vamos que las piernas han de correr, no pensar , para eso está la cabeza que ella no puede correr...

...y aunque este puede tener algunos esquemas diferentes que pueden merecer su buena lógica, uno de ellos podrías ser algo como:
fichero de control del fichero de datos
Código: Text
  1.  
  2. <ultraHeader>
  3.    <nombreControl>mi nombre aunque se cambie el del fichero este es el original cuando se creó<nombreControl>
  4.    <nombreBD>nombre de la bd, aunque se le cambie al archivo, se sabe como se llama</nombreBD>
  5.    <nombreHeaders> nombre del fichero de headers para relacionar la BD, con el fichero de headers</nombreHeaders>
  6. </ultraHeader>
  7. <fileHeader> datos del fichero ajeno a los datos en si, estos son campos que solo son consultables por el motor de la BD no por los usuarios, o al menos no por una petición directa y sin privilegios, o al menos no para modificarlos a libre antojo, básicamente debe manejarlos el motor
  8.    <ficheroEnUso>ocupado, libre, en espera</ficheroenuso>
  9.       <Id_QueryEnuso> 0=ninguna, >1 esa id de query.. 0=bloqueado</Id_QueryEnUso>
  10.       <horaAccesoaFichero>momento en el que se le concedió el acceso</HoraAccesoaFichero>
  11.       <niveldePrivilegiodeQuery>dado un rango binario expresar dicho nivel</nivelPrivilegiodeQuery>
  12.    <permisodeAccesoBD>con contraseña, sin contraseña, partes con y sin contraseña, auditado desde un fichero de usuarios,etc...<permisodeAccesoBD>
  13.    ...
  14.    ... otros datos de la bd en general
  15.    ...
  16. <fileheader>
  17.  
  18. <querys> mantiene los datos de las querys en curso, siempre será un número limitado y pequeño 4-16-32...puede usarse un trigger para registrar cada query en un log...
  19.    <nºQuerysEnCurso>mantiene el ritmo de admitir querys otomándolas de una pila de llamadas de querys en espera de ser procesadas, por ejemplo si se tiene una query en BD dos en Headers está todo ocupado, pero si hay una menos el motor puede aceptar otra query a procesar...</nºquerysEncurso>
  20.    <nºQueysenPila>mientras halla más de una el motor de la Bd irá recoogiendo querys y procesando, si hay tareas internas pendientes con preferencia les dará una mayor prioridad si la pila de querys es casi nula que si hay acumuladas 300 peticiones..., por otro lado puede ser más efectivo no tanto llevar la cuenta de ellas sino si hay más de cierto número, lo cual se consultaría tras procesar ese número de consultas si las hay , o más a menudo si dicha cifra es menor, a tal efecto entonces se debería tener una variable.<nºquerysEnPila>
  21.    <queryBD>id de query en la BD actualamente 0=esta libre.</queryBD>
  22.       <queryValidada>1=si, 0=en proceso(en la query bd ya se supone validada, -1=error de query, la query es errónea, pero en control se indicó reportar si parcialmente la query podía ser procesada (esto ayuda a un usuario (junto al error devuelto) a saber y comprender mejor por donde van los fallos en función de lo que le devuelva) ¡¡¡-esta es una de mis ideas-!!! </queryValidada>
  23.       <queryString> por ejemplo Select all from sueldos where profesion='medico' and especialidad='otorrino' and provincia='Huesca'</queryBD>
  24.       <horaAceptacion>la hora en que se le asigno la id a la query(moemnto en le que fue cursada su entrada, luego es cuando se valida</horaAceptacion>
  25.       <horaSalida>hora a la que se devolvió la salida, este dato procesado con el hora de aceptación determina el tiempo de respuesta de la query, lo cual sirve para evaluar el motor y la propia query...en base a su optimización y rendimiento</horaSalida>
  26.       <devolvióDatos>-1=ninguno, no se halló resultados (por si se quiere procesar algún tipo de mensaje cuando len(respuesta)=0, 0=se devuelven pero se ignora si son adecuados (cuando se procesa parcialmente una query errónea, no se totaliza su reultado, ya que el error en si son datos devueltos, es este valor el que determina en destino si es error o no, los datos de error no se dan en formato mensaje emergente, sino igualmente estructurado como cualquier tabla de buen vecino, con todos y cada uno de sus campos bien definidos) esto permite al usuario si quiere ignorar el resultado , es decir para modo debug.... 1=se enviaron datos</devolvioDatos>
  27.       ...
  28.       ... otros datos
  29.       ...
  30.    </queryBD>
  31.    <queryHeader1>
  32.        ...
  33.        ... datos de la query en header, tablas afectadas, tipo de acción para determinar si se bloquea el acceso a la bd a la otra query sin esta terminar antes o no.... en fin cosas para controlar...
  34.        ...
  35.        ...
  36.        ... datos de la query en fichero de cabecera, salvo una query totalmente rechazada, o anulada toda query de este tipo pasa por la query de datos anteriormenete recogida
  37.    </queryHeader1>
  38.    </queryHeader2>
  39.           ...
  40.           ... igual que query 1
  41.           ...
  42.    </queryHeader2>
  43.    <queryPrincipal>
  44.         ...
  45.         ... cuando la query implique modificar el fichero de headers, dicha query se aloja aquí... ya que los ficheros de headers 1 2 deben ser eliminados y creados nuevamente como copia de este principal tras ser modificado.
  46.         ...
  47.    </queryPrincipal>
  48.    <queryConsultas>
  49.       <nºQuerysenCache> nº de querys guardadas temporalmente</nºQuerysenCache>
  50.       <queryConsultaCache1>
  51.           ...
  52.           ... a menudo una query se invoca más de una vez en escaso tiempo, en tal caso mantener en cache un cierto tipo de querys y sus repuestas asociadas, acelera la búsqueda porque solo hay que decidir si las consultas son idénticas y si  sigue vigente, es decr una query de consulta en cache, deja de ser vigente tras alterarse los datos a que hace referencia alguna de sus tablas y/o campos afectados (los datos de los campos o los propios campos). también deja de ser vigente tras cierto nº de querys (van rotando) .sería deseable tener al menos hasta 8 consultas en caché de cada tipo, en cualquier caso binario...
  53.           ...
  54.       </queryConsultaCache1>
  55.       <queryConsultaCacheN>
  56.             ...
  57.             ...
  58.             ...
  59.       </queryConsultaCacheN>
  60.    <queryConsultas>
  61.    <queryDelete>
  62.       <nºquerysenCache> nº de querys guardadas temporalmente</nºQuerysenCache>
  63.       <queryDeleteCache1>
  64.            ...
  65.            ...
  66.            ...
  67.       </queryDeleteCache1>    
  68.       <queryDeleteCacheN>
  69.            ...
  70.            ...
  71.            ...
  72.       </queryDeleteCacheN>
  73.    <queryDelete>
  74.    <queryUpdate>
  75.       <nºquerysenCache> nº de querys guardadas temporalmente</nºQuerysenCache>
  76.       <queryUpdateCache1>
  77.            ...
  78.            ...
  79.            ...
  80.       </queryUpdateCache1>    
  81.       <queryUpdateCacheN>
  82.            ...
  83.            ...
  84.            ...
  85.       </queryUpdateCacheN>
  86.    <queryUpdate>
  87.    <queryCreate> para mi crear una tabla nueva es una petición más al motor de ESTA BD y create una BD es ya de un nivel superior....
  88.       <nºquerysenCache> nº de querys guardadas temporalmente esto no suele ser frecuente por lo que su número podría ser más pequeño, aunque a favor tienen que sus datos ocupan menos espacio</nºQuerysenCache>
  89.       <queryCreateCache>
  90.            ...
  91.            ...
  92.            ...
  93.       </queryCreateCache>    
  94.       <queryCreateCache>
  95.            ...
  96.            ...
  97.            ...
  98.       </queryCreateCacheN>
  99.    <queryCreate>
  100.         ...
  101.         ... otros datos de control...
  102.         ...
  103.  
  104.  

Para mi la ventaja de la cachés es clara si se guardan ciertas cachés es más rápido servirlas que procesarlas, aún así puede haber unas reglas de uso,,, el admin de la BD decide si usarlas o no, si el tamaño de una salida de cahcé sobrepasa cierto tamaño queda desechada, el admin determina el tamaño en base a la memoria que dispone su sistema, una repesuesta procesada demasiado simple quizás no suponga excesiva ventaja meterla en caché. No obstante buscar entre 32 registros la coincidencia de una querystring es más rápido que realizarlo en la BD además la salida ya está procesada y además si sale coincidencia con la que exista en caché  la bd está libre para otra previa más tiempo que si esta estuviera en la cola... de todos modos el uso de cachés que sea acertado o no dependerá de como se utilice la bd, no es lo mismo un BD que aloja datos estadísticos de población  que una Bd de compras de como ebay, por poner un ejemplo o igual que una web corporativa de repuestos de automóovil... estás últimas posiblemente tengan poca carga de trabajo y no necesiten cachés y además sus consultas pueden ser muy sencillas limitándose en la mayoría de los casos a verificar si tienen un producto en stock y solicitarlo y consultar si fue enviado o totalizar facturas, etc...

bueno el esquema de los datos creo que ya puedes deducir más o menos como yo lo trazaría por tanto no me extiendo en hacerte algún esquema. Ahora bien si hay cosas en las que quieras profundizar, pués charlemos...

... bueno lo dicho me he estendido...
p.d.: se me olvidaba aclarar que eso del 'ultraHeader' sería para hacer corresponder los 3 ficheros entre si, ya que el motor debería mantener internamente una tabla con las bases de datos registradas en ellas y donde debería mantener campos para esos 3 ficheros, tanto el nombre del archivo como el nombre de la BD para evitar incongruencias, vamos que al abrir una bd el primer intentos es ir a dicha tabla localizar dicho nombre, tomar la ruta, comprobar que en dicha ruta existe ese archivo y que realmente es un archivo de la BD no un archivo cuialquiera renombrado...

650
Software / Re: Open Source O No Open Source?
« en: Domingo 9 de Septiembre de 2007, 01:48 »
Cuando los mensajes se convierten en un rifi-rafe y cruce de mensajes entre 2 o 3 usuarios, creo que es llegado la hora de dejar de escribir en el foro dichos mensajes y hacerlos por privado... ha quedado clara la postura de ambos, no es necesario esplayarse más, la gente no es tonta y sabe sacar sus conslusiones entre lo que se dice y lo que se quiere decir....

Mi opinión es casi idéntica a la primera que se vierte tras el que abre el hilo...

Páginas: 1 ... 24 25 [26] 27 28 29