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

#2881
Ineficiente. La solución que pones usa dos bucles con cada negativo hallado, desplazas todo el contenido del array por encima de él, cada vez.

La solución que yo te ofrecí (que puedes ponerla en una función o no), solo requiere recorrer una única vez el bucle, luego necesita 'k-n' comparaciones y 'n' asginaciones. Incluso para poner a 0 los valores finales en el array (que entonces las asginaciones serían n+ (k-n)) ). Siendo k el tamaño del array y n los positivos encontrados (y k-n los negativos).
#2882
Es que debería ser así...
Los equipos deberían tener una batería pequeña y potente de tal modo que cuando detecte una caída de energía significativa, opere con la batería y mediando con el S.O. para entrar en estado de hibernación... ...más o menos una ayuda como los SAI, pero integrada en el equipo y con carga suficiente y al único propósito de hibernar el equipo cuando falte el suministro eléctrico.
#2883
Sin duda la minería sobre tu equipo, sin tu permiso va en aumento... una nueva lacra de internet que crece sin control y ante lo cual los gobiernos callan como perros con bozal.

es más que probable que en lo sucesivo surjan webs, sin más intención que aprovecharse de la potencia de cálculo del os equipos de los usuarios que visiten sus páginas...

El mundo cada vez da más asco, está lleno de vampiros despiadados y nadie hace nada al respecto...
#2884
Curioso. Y yo que rechacé gastarme unos miles de euros cuando estaba entre 12 y 20 euros... y ahora hay gente que vende su casa para comprar un puñado de bitcoins a cuánto ¿miles de euros el bitcoin?.

El bitcoin, sería sensato que cualquiera lo comprara cuando apenas tenía valor, te gastabas unos cientos  o miles de euros y si salía mal, no sería el fin del mundo... solo una pequeña mala inversión. Arriesgar tu casa y todos tus ahorros, sin entender nada sobre el tema, es una locura... cuánto más va a seguir subiendo?. Todo lo que se pueda seguir manipulando.

Bitcoin, se enfrenta a un gran problema, el mismo problema que trataba de resolver... la manipulación del precio. Lo único que ha cambiado son las manos que lo manipulan... así que para mi, cada vez va perdiendo más crédito siguiendo por ese camino.

Y estoy de acuerdo con Orubatosu... es absurdo el gasto energético. Minar bitcoins, sale indudablemente mucho más caro que minar oro, pero el oro, aparte de moneda, y su uso en joyería, tiene uso industrial... el bitcoin, no deja de ser 'humo', si se achicharraran todos los ordenadores del planeta, sería la quiebra de todos los portadores de bitcoin...

#2885
Simplemente debes generar un bucle, con dos índices, el del propio bucle (avance) y el de colocación.


entero k, n

bucle para k desde 0 hasta array.length
   Si (array(k)>=0) luego
       array(n) = array(k)
       n += 1
   Fin si
fin bucle


k es el índice de avance del bucle.
n es el índice de escritura sobre el array. Éste deja de avanzar cuando encuentra un número negativo.

Es algo que si tomas un papel y lápiz y lo haces paso a paso a mano, lo sacas...

Al final del bucle quedarán (array.length - n) ítems sin alterar, que equivale a la cuenta de números negativos encontrados, tu sabrás que se te pide que hagas con ellos, quizás simplemente ponerlos a 0:

Bucle para k desde n hasta array.length
   Array(k) = 0
fin bucle
#2886
Programación Visual Basic / Re: Ayuda Launcher
13 Diciembre 2017, 13:54 PM
jejeje... pués si, Elektro, entendí mal... con L2.exe suena simplemente a nombre de cualquier ejecutable que uno ha hecho... y que parece (parecía) indicar que subiría a alguna parte disponible para otros usuarios.

Creo que no leí el párrafo previo donde lo aclara bien...
#2887
Programación Visual Basic / Re: Ayuda Launcher
13 Diciembre 2017, 03:31 AM
Hay una sencilla forma, no costosa ni invasiva, pero igualmente restrictiva...

Crea tu ejecutable del juego, esperando un comando.... (command$)
Sólo cuando se reciba el comando específico, que arranque
por ejemplo:
lL2.exe /Play:xMnfi5689FgjEodf84W78sH34

Tu ejecutable deberá arrancar desde un módulo, no desde el formulario... y en Main, harías algo como:

En el módulo este código:
Código (vb) [Seleccionar]

Option Private Module

Private Const KeyPriv As String = "pH91jksdet4YU83ReWab..+gX"
Public Ok As String

#Const DebugP = True ' Poner a true, para generar una key oculta dadas dos keys; una privada aquí y otra en el ejecutable que invoca a éste.
                                  ' poner a false, cuando ya se haya generado, copiado y pegado en su sitio, para probar el funcionamiento, pero sobre todo para compilar...


Private Sub Main()
    Dim f As Form1
    Dim cm As String
    Dim k As Long
   
   
    If (Len(Command$) > 0) Then
        k = InStr(UCase$(Command$), "/PLAY:")
        If (k = 1) Then
            cm = Right$(Command$, Len(Command$) - Len("/play:"))
            #If DebugP Then
                On Local Error GoTo NoCompilar
                Call GenerarKeyOculta(cm)
            #End If
            On Local Error Resume Next ' otros errores no deben mostrar dicho mensaje...
            If VerificarKey(cm) = True Then
                Set f = New Form1
                f.Show 1  ' modal...
            End If
        End If
    End If
    Exit Sub
   
NoCompilar:
    MsgBox "Si ya ha generado y colocado la key oculta, y quiere compilar (o ha compilado) el proyecto debiera desactivar la función GenerarKeyOculta, poniendo DebugP a false"
End Sub

Private Function VerificarKey(ByRef Key As String) As Boolean
    Dim k1() As Byte, k2() As Byte, k3() As Byte
    Dim k As Long, n As Long
   
    k1 = StrConv(Key, vbFromUnicode)
    Debug.Print StrConv(k1, vbUnicode)
    k2 = StrConv(KeyPriv, vbFromUnicode)
    Debug.Print StrConv(k2, vbUnicode)
   
    k3 = StrConv("WW^E\\2S3WW4]c6U]cTl", vbFromUnicode)
    Debug.Print StrConv(k3, vbUnicode)
   
    For k = 0 To UBound(k1)
        If (k1(k) Xor k2(k)) <> k3(k) Then Exit Function
    Next
    Ok = CStr(Now)
    VerificarKey = True
End Function

' No puede formar parte del código del programa, solo durante diseño...
#If DebugP Then
Private Sub GenerarKeyOculta(ByRef Key As String)
    Dim k1() As Byte, k2() As Byte, k3() As Byte
    Dim k As Long, n As Long
   
    If (Len(Key) <> Len(KeyPriv)) Then
        Call Err.Raise(vbObjectError + 1, "mi programa", "Las dos claves deben tener la misma cantidad de caracteres: (Key y KeyPriv))")
    Else
        k1 = StrConv(Key, vbUnicode)
        k2 = StrConv(KeyPriv, vbUnicode)
       
        ReDim k3(0 To UBound(k1))
        For k = 0 To UBound(k1)
            k3(k) = (k1(k) Xor k2(k))
        Next
       
        Debug.Print StrConv(k3, vbFromUnicode)
        Call MsgBox("Ahora puede copiar (de la ventana de debug) y pegar el valor resultante en 'k3' en la función 'VerificarKey'..." & vbCrLf & StrConv(k3, vbFromUnicode), vbExclamation, "Key oculta generada") 'strconv
    End If
End Sub
#End If


En el formulario, añadir un control Timer y colocar este código:
Código (vb) [Seleccionar]

Private Sub Form_Load()
    Randomize Timer
    Timer1.Interval = Int((30000 - 12000) * Rnd + 12000) ' espera un tiempo aleatorio entre 12 y 30 segundos...
    Timer1.Enabled = True
   
    ' otras cosas que requieran ser inicializadas...
End Sub

' Hace una comprobación posterior.
' Es muy básico simplemente busca si hay algún carac´ter 'raro' en el valor de 'ok'
'   el cual debiera tener solo caracteres propios de fecha y hora.
Private Sub Timer1_Timer()
    Dim salida As Boolean
    Dim s As String
   
    Timer1.Enabled = False
    If (Len(Module1.Ok) > 0) Then
        For k = 1 To Len(Module1.Ok)
            s = Mid$(Module1.Ok, k, 1)
            If (InStr("0123456789 :-\/", s) = 0) Then
                salida = True
                Exit For
            End If
        Next
    Else
        salida = True
    End If
   
    If (salida = True) Then End
End Sub


El funcionamiento es como sigue:
El módulo tiene una clave, por comando se le pasa otra key, luego una función verifica mediante un ximple xor, si se valida o no... adicionalmente se añade otra simple tontería de control si se parchea la función verificar para arrojar true sin ejecutarse, el formulario cuando arranca pone en marcha un timer con un intérvalo al azar entre 12 y 30 segundos, transcurrido el cual verifica si un texto generado cuando se ejecutó la función que verificaba la key, tiene texto y si el mismo es inválido.

NOTA: Que las keys debes generalas tú con cada versión, pon lo que te dé la gana pero que tengane l mismo tamaño, una vez creadas la que se pase por comando y la que se alamcene en KeyPriv, invocar la función GenerarKey, para tener la 3 contra la que se verifican las dos previas...

Ambas protecciones son muy elementales y fáciles de romper, pero si tu programa no va tener una popularidad fuera de serie, posiblemente sea suficiente...

Algo más elaborado es que tu proyecto sea una librería dll, que arranque luego el formulario principaly ya desde ahí tu programa se inicia. El programa que arranca el otro, crea una instancia de la librería y utiliza métodos "Friend", para hacer validaciones simples como las previas, solo que por métodos y propiedades directas, en vez de un comando que puede fácilmente ser interceptado por una aplicación que suplante la identidad de tu programa y/o se interponga en medio.



Opino como Elektro, es tontería... si publicas un ejecutable será para que sea usado, no para impedir que se use. Y si tu problema se resume en que alguien lo tome y luego lo publique como propio dentro de algo más, lo adecuado al caso, es forzar dependencias, así o se lo lleva todo o nada y si se lo lleva todo, ya no puede pasar desapercibido como 'suyo'... si lo que te preocupa es la autoría.
#2888
De entrada el tema debías haberlo puesto en el foro de NET.

Aunque estés importando un control Activex de vb6, estás operando en NET.

...de entrada usas (en ambos casos) el evento keydown, claramente sería mejor al menos el KeyUp y aún mejor el Click e inmejorablemente el dobleclick... dejando el clik para play/pausa.

Además para ponerlo en pantalla completa estás usando el propio formulario... si no tienes más objetos que el control WMP, vale pero si no... todavía estás pasándolo a pantalla completa pero solo si pulsas F5, pero no es coherente, sí o sí fuerzas pantalla completa... y para regeresar de ella, debes hacerlo pisando el control... tampoco es coherente...


Yo modificaría el código... de esta manera:
Con doble click, sólo si está en play o pausa, cambia el estado de pantalla completa (al otro estado).
Código (vb) [Seleccionar]

Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.DoubleClick, Handles wmp.DoubleClickEvent
   If ((Wmp.playState = wmppsPlaying) or (Wmp.playState = wmppsPaused)) Then
       'if (wmp.fullScreen = false) then
       '    wmp.fullScreen = True
       'else
       '    wmp.fullScreen = false
       'en if  
       wmp.fullScreen = not (wmp.fullScreen) ' más breve y claro, alternamos el estado cuandos e pulsa doble click.
   End If
End Sub


Y dejaría el evento KeyUp para cuestiones específicas... incluso pantalla completa si se pulsa la letra F
Si solo vas a usar Play-pausa, mejor usar el evento click, para alternar entre ambos estados. en esta pieza de código se usa el evento KeyUp...
Código (vb) [Seleccionar]

Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp, Handles wmp.KeyUpEvent
   Select Case e.KeyCode
       Case Keys.Space, keys.Pause    
           If Wmp.playState = wmppsPlaying Then
               Wmp.Controls.pause
           Elseif ((Wmp.playState = wmppsPaused) oralso (Wmp.playState = mppsStopped)Then
               if (wmp.url.length >0) then
                   Wmp.Controls.play
               end if
           End if
       Case Keys.Clear, Keys.Delete
           Wmp.Controls.stop
       case keys.Escape
           Wmp.Controls.stop
           if (wmp.fullScreen = True) then wmp.fullScreen = False
       case keys.F
           wmp.fullScreen = not (wmp.fullScreen)
       ' otros casos a considerar... por ejemplo, manejar volumen, pasar a la siguiente pista en la lista de reproducción (keys.PageDown) o previa (keys.pageUp), etc...
   End select
End sub


- Nota que las constantes las he puesto de memoria, es posible que se llamen de otra manera, especialmente al importarlo a NET... el wrapper, las haya modificado.
- Donde proceda coloca el conveniente try...catch...
- Por último, nota también que yo he preferido abreviar el nombre desde: AxWindowsMediaPlayer1 a wmp, luego si copias cambia donde proceda...
#2889
Yo les hubiera respondido lo mismo que éste usuario:
"Keep your nose out of our business"
Pero como español, tenemos un texto más prosaico para la ocasión...
"Donde tengas la olla, no metas la p...."
#2890
Ya te han respondido los compañeros...

Sin embargo, si tú (u otro) no ha cambiado la codificacón de tu equipo, no debieran aparecer caracteres chinos.
Prueba a abrirlo en el equipo de un amigo y a ver si sale igual.
Abriendo en binario, podrás ver los bytes, fíjate en alguna contraseña que reconozcas de memoria como 2es la primera en el ficheor del correo de x sitio" y que sabiendo que por ejemplo empieza por una "A", el byte debeiera ser 65... viendo la distribución de bytes en el fichero (por ejemplo si ves muchos bytes por encima del valor 127), se puede concluir si está dañado/cifrado...

En cualquier caso, con los ficheros de texto plano que almacenen contraseñas, aconsejo comprimirlos y cifrarlos y tener copia en un equipo sin conexiones de red (para solventar el peor caso).
Y mejor aún, nunca poner la contraseñas tal cual son, regálales algún pequeño truco, como añadir x caracteres, número, etc... por ejemplo si tu contraseña fuera algo tan tonto como: cigüe389ña, mira de hacer algo como
vtxcig56üe389PTañ
básicamente simplificando: los 3 primeros caracteres son al azar, y hay que desecharlos, las cifras si aparecen solo 2 se eleimina, las buena son 3, también las desaparecen las letras mayúsculas si están al final, y las dos letras del final cambiadas de orden... complícalo como quieras, es una sencilla idea... pero si mantienes algo así, tu siempre podrás seguir conociendo y usando tus contraseñas y quien tuviere acceso a ellas, no lo tendría tan fácil... pouedes complicarlo más, pero no quiero extenderme, usa tu imaginación.