|
3441
|
Programación / Java / Re: Duda a nivel de optimizacion, con página "acepta el reto"
|
en: 8 Diciembre 2017, 19:21 pm
|
Hay varios quids a los que atender... De entrada el bucle priuncipal no está óptimamente planteado. Verás si haces un bucle 'Mientras X', es una redundancia inútil, preguntar acto seguido lo mismo Si x luego... Piensa en un condicional como un bucle de un solo ciclo, si se cumple se entra y se ejecuta 1 vez y si no, no... un bucle persé es lo mismo, solo que permite entrar muchas más veces retornando al origen. Tu bucle debiera se rmejor así: texto = sc.nextLine(); Si (!texto.equals("FIN")) luego Hacer ... todo el trabajo que realizas texto = sc.nextLine(); Repetir mientras (!texto.equals("FIN")) Fin si Y aún más ióptimo cuando un lenguaje admite en el bucle condcionarlo al comienzo: texto = sc.nextLine(); Hacer mientras (!texto.equals("FIN")) ... todo el trabajo que realizas texto = sc.nextLine(); Repetir Luego, llamas múkltiples veces desde dentro del bucle a un rutina externa a la propia donde yace el bucle, cada llamada externa a otra función es una sobrecarga porque exige depositar en la pila el estado actual en dicha función, antes de llamar a la función (cifrar) y a su vez tras la llamada, volver a restablecer el estado en dicha función sacando los datos de la pila... y esto se hace por cada letra... ergo... mete ese código dentro del bucle, no en una función aparte. Sólo con eso ganarás en velocidad. Por último, aunque tu función "cifrar" es clara, no es nada óptima, esto no debe resolverse invocando a una función, desde el momento en que F=X, es deicr en que hay una asignación directa, lo correcto es meterlo en un array, ya que no requiere un cálculo complejo tal que con la misma entrada pudiera dar lugar a diferentes salidas... Ergo genera una array, al inicio de tu aplicación donde se establezca la igualdad d ela asignación: Array(0) = 65 /A Array(1)= 66 /B Array(2)= 67 /C ... Array(25) = 90 //Z Array(26) = 65 //A Y ahora en tu código simplemente codificas para redirigir un valor a un índice correcto. Tu array podría llamarse Cifrar (para más inri) CadenaSalida += Cifrar(ValorASCII(Texto.CharEn(I))-65+dpz) Esto es: debe tomarse el valor ASCII del caracter obtenido en: Texto.charEn(i) Como "A", es el carácter 65º y nuestro array comienza en 0, le restamos 65 y como estmaos haciendo una codificación césar, el dpz, suma el valor a desplazar en este caso dpz=1, si en vez de 1, usas dpz la misma función te vale para codificar con diferentes valores. Más eficaz aún sería si el array en vez de asignarse la "A" en el índice 0, se asignara en el propio indice 65, así se evitaría también la resta de -65 para cada carácter. Así al inciio crea un array estático así: Bucle para k desde 0 a 255 ArrayCifrado(k) = k Fin bucle Que es una tabla ASCII, es decir cada índice contiene el código de cáracter de la tabla ASCII, ArrayCifrado(65) = 65, qeu es el código de la letra "A". Todavía queda ajustar cuando excede la suma del desplazamiento. en el previo yo he provisto un índice 26 par ala "A" cuando la letra a codfificar fuera la "Z", pero si el desplazamiento fuera mayor de 1, necesitaría un indice 27 y contener la "B", etc... mejor que eso es ver si el ídnice supera el límite y en tal caso 'modular'... indice = ASCII(Texto.CharEn(i)) + dpz Si indice> 90 luego indice = ((indice modulo 90) + 65) Fin si Cadenasalida += CharFromASCII(ArrayCifrado(indice)) //CVharFromASCII, sería la función opuesta a ASCII, es decir le das un código ASCII y te devuelve el carácter correspondiente. Y por último tu código peca de ineficiencia en la concatenación de la cadena que vas generando... CadenaSalida += ... Cada vez que concatenas un carácter o un texto a otro, requiere construir otra cadena del tamaño adecuado (del tamaño exacto que se reclama tendrá), y copiar allí el texto original y luego el otro que se concatena, y luego destruir la cadena previa, esto es, supone buscar espacio libre en la memoria, reservarlo, copiar y luego apuntar la dirección de esa memoria a la variable cuyo nombre se usa... El modo óptimo es que si se puede precalcular el tamaño que tendrá el texto al final, se genere de una sola vez una cadena de texto de ese tamaño (aunque sea repleto de espacios) y luego en vez de concatenar se va alterando el contenido del carácter en la posición x... Con todos estos consejos llevados a cabo, ten por seguro que incluso vas a superar los valores que tu señalas como más rápidos que el tuyo...
|
|
|
3442
|
Programación / Java / Re: Ayuda con Busqueda dicotomica
|
en: 8 Diciembre 2017, 18:34 pm
|
Debes pensar las cosas, no 'solo escribir' ni 'solo oir', la "velocidad" de enseñanza en las univesidades suele ser contraproducente, porque al final solo aprenderías cosas de memoria, sin entenderlas, así que haces bien en preguntar... aunque si por tu propia cuenta lo pensaras despacio un poco, tú mismo descubrirías el proqué. 1 - Veamos al comienzo, la línea: int fin = modelos.length - 1; el -1 responde al hecho de que el tamaño de un array indica SIEMPRE la cantidad de elementos que contiene, por ejemplo si dice 10, tiene 10 elementos, pero contados a partir del 0, el último será el índice 9, si fueran 87 elemento, empezando en 0, el último sería el 86, ídem si tuviera 2514 elementos, el último sería el índice 2513, ergo el último índice siempre es: tamaño-1 Si en vez de empezar en 0, empezaras en 5, sería tamaño-1+5, porque para 10 elementos iría desde el 5,6,7,8,9-10,11,12,13,14. Y si empezara en un índice de valor negativo, (por ejemplo -11 con tamaño 27) el último índice sería: tamaño-1+(-11) = 27-1-11 = 15 (-11,-10,-9,-8,-7; -6,-5,-4,-3,-2; -1,0,1,2,3; 4,5,6,7,8; 9,10,11,12,13; 14,15) Es decir la fórmula general para conocer el último índice en un array, siempre es: Tamaño-1+límiteInferior. Y dado que la casi absoluta comunidad de lenguajes arranca sus indíces en el 0, la suma del límite inferior es redundante. 2 - Búsqueda dicotómica, (como no), es nombre muy apropiado para libros y universidades, pero es más universal y entendible para todo el mundo (y no solo el mundillo informático), "Búsqueda binaria". La búsqueda binaria requiere que el array (o el tipo de colección que se utilice) esté ordenada. Luego si se desea buscar un valor concreto, pongamos el 22 y pongamos (que el array de partida tiene 100 elementos, (sí del 0 al 100-1), y que en cada índice contiene casualmente el valor cuyo índice señala: Arr(0) = 0, Arr(1)=1, Arr(2)=2 ... Arr(99)=99, por simplicidad en las comprobaciones)... 3 - Entonces tendremos que (eliminado la morralla que oscurece la sencillez del algoritmo, esto es expresándolo en pseudocódigo): entero = Funcion BusquedaBinaria(array de enteros Valores(), entero Valor) //el que se busca entero ini, medio, fin fin = Tamaño(Valores)-1: ini = 0 Hacer mientras (ini <= fin) //menor o igual que medio = (ini + fin) \ 2 Si Valores(medio) > Valor luego fin = medio - 1 Osi Valores(medio) < Valor luego ini = medio + 1 Sino devolver medio //valor encontrado fin si repetir // Si no se encuentra el valor puede devolverse el índice evaluado (medio) en negativo, // queriendo indicar con ello que de existir se alojaría en ese índice // (es ideal si se quisiera insertar ordenado) // y eso es mucho mejor que -1, pero si te reclaman devolver -1, pues hale... Devolver -medio Fin Funcion 4 - AQUÍ: la devolución de un índice negativo, expresa 'no encontrado', y a la devolución mejor que considerar: Si Buscarbin(x,y) =-1 luego no hallado mucho mejor expresarlo así: Si BuscarBin(x,y)<0 luego no hallado Y ahora pasando ese array preestablecdio de 100 elementos con valores numerados del 0 al 99 y buscando el valor 22, hagamos paso a paso lo que sucede (que es lo que tu deberías haber hecho, dibujar una tabla y en cada línea anotar los valores que tienen cada variable, así como el resultado de las comparaciones evaluadas (True/False) ): Previo: ini=0 fin = 100-1 Primer ciclo Medio= (0+99)\2 = 49 // hacmeos una división entera, los ínidces siempre son enteros, no decimales, luego 49'5 se trunca en 49. Ahora la primera comprobación (dentro del bucle): Si Valores(49) >22 luego //que es la condición que se cumple fin= (medio-1), = 49-1 = 48, es decir el valor en el medio es mayor que el buscado, nos queda que mirar or debajo del medio, el índice inmediatamente por debajo del medio es justamente: medio -1, ese pasa a ser ahora el fin, el último hasta el que buscaríamos... Siguiente ciclo: Medio = (0 + 48)\2= 24 Si Valores(24) > 22 luego //nuevamente se cumple esta condición... Fin = (24-1) =23 // ahora el límite superior será 1 menos que el valor que ya hemos visto que era superior al buscado. Siguiente ciclo: Medio = (0 + 23)\2 = 11 Si Valores(12) > 22 luego // esta vez no se cumple, pasamos a ala sigueinte condición Osi Valores(11) < 22 luego //si se cumple esta, luego inicio podrá ser ahora mayor que 0, toda vez que ehmos visto que el valor está más arriba que la posición 11. Ini = (medio +1) = 11+1 = 12 // es decir de existir, estará entre los índices 12 y 23 Siguiente ciclo: Medio = (12+23)\2 = 17 Si Valores(17) > 22 luego // no se cumple, Osi Valores(17) < 22 luego Ini = (medio+1) = 17+1=18 Siguiente ciclo: Medio = (17+23)\2= 20 Si Valores(20) > 22 luego // no se cumple, Osi Valores(20) < 22 luego Ini = (medio+1) = 20+1=21 Siguiente ciclo: Medio= (21+23)\2= 22 Si Valores(20) > 22 luego // no se cumple, Osi Valores(20) < 22 luego //Tampoco se cumple, se pasa el caso siguiente que es expresada como ninguno d elos previos: Devolver Medio // hallado, se devuelve el índice 22, porque contiene el valor 22 Recuerda que por comodidad pusimos en el array como valor el mismo valor numérico que es el índice, luego Valores(22) = 22, que es el valor buscado y está en el índice 22. Si has seguido las explicaciones paso a paso, el -1, +1 debe quedarte claro, para que sirve en cada caso, para mover el límite al punto deseado (no revisar dos veces valores ya verificados). Seguirá funcionando si pones: Fin = medio -1 Ini = medio +1pero en general requerirá más ciclos y podría darse el caso de entrar en un bucle infinito si al hallar en el siguiente ciclo el punto medio, resultare ser nuevamente el mismo punto medio del ciclo previo, precisamente por no acotar los límites convenientemente. 4 - La última duda, son los símbolos matemáticos (que esto ya tiene tela, en la Universidad y aún no conocer los símbolos matemáticos "Mayor que y Menor que). Menor que: < Mayor que: > Distinto de: <> //desigualdad, no universalmente usado en todos los lenguajes pero matemáticamente es aceptado, gracias a que misteriosamente en el ASCII (cuando el American Standard..., creó la tabla), no se incluyó el símbolo "= tachado" para expresar desigualdad, distinto de... La forma de no equivocarte es ver que en un extremo hay 2 'puntos'(de los 2 trazos) y en el otro solo 1 (donde comfluyen), luego puesto, escrito el símbolo considera que exige que adónde apuntan los 2 'puntos' se espera que sea mayor que adonde apuntan solo un 'punto' A > B; C < D.
|
|
|
3443
|
Foros Generales / Noticias / Re: Las tecnologías emergentes supondrán una importante perdida de empleos
|
en: 30 Noviembre 2017, 03:08 am
|
Creo que la idea de Bill Gates, sobre que los robots deban cotizar lo mismo que un trabajador lo hace, es de momento lo único al parecer, que podrá paliar el problema que se avecina.
En un futuro donde la tecnología podría llevar al ser humano a una etapa superior, donde la meta del ser humano, no tuviera que ser ya jamás perder el tiempo trabajando para poder sobrevivir, si no vivir para dedicarse a lo que uno pretenda como su meta, se augura, sin embargo como al final verbigracia a la avaricia de una minoría, la humanidad seguirá siendo esclava para servir a unos pocos...
Realmente la esclavitud de siglos o milenios atrás, no ha desaparecido, solo se ha transformado. Antes enjaulaban y forzaban a tu cuerpo ahora lo hacen con tu voluntad, lo que no ha cambiado es el cebo, sigue siendo la supervivencia.
|
|
|
3445
|
Foros Generales / Foro Libre / Re: Me estoy quedando calvo!!!
|
en: 30 Noviembre 2017, 02:52 am
|
Mensaje tipo El_andaluz, a ver quien no ve las estupicitas... El pelo de la cabeza se llama cuero cabelludo (como pone en wikipedia) El cuero cabelludo es la piel que reviste el cráneo del ser humano y que posee cabello. y esta formado de queratina (pongo cita porque seguramente los lectores son tan ignorantes que jamás en su vida lo han oído) el cuero cabelludo es una barrera física, protectora, en el que crece el pelo. El cabello es muy resistente y está hecho de queratina. Un adulto tiene entre 100.000 y 150.000 cabellos en su cabeza. y si estás perdiendo más pelo del que te sale, es que tienes calvicie (cita de la RAE) calvicie Del lat. calvities. 1. f. Falta de pelo en la cabeza. puedes acudir al médico para que te derive a un especialista (fuente: https://definicion.de/medico/)Definición de médico Médico es aquello que pertenece o que forma parte del ámbito de la medicina. El término también permite referirse al profesional que, tras cursar los estudios necesarios y obtener el título correspondiente, cuenta con una autorización legal para ejercer la medicina.
Es aconsejable no echar cualquier producto sobre el cuero cabelludo, porque si es prolongado puede modificar el ph y estroperarte el pelo. Cita: El pH es una medida de acidez o alcalinidad de una disolución. El pH indica la concentración de iones hidrógeno [H]+ presentes en determinadas disoluciones.
También puedes estroperarte el pelo si usas con excesiva frecuencia colorantes y más si son de mala calidad. fuente: http://www.ellahoy.es/belleza/articulo/tintes-vegetales-para-el-pelo-que-son-y-como-funcionan/286215/Los tintes permanentes están formulados con compuestos químicos: amoniaco o agua oxigenada para decolorar y permitir que los pigmentos de color penetren en el cabello. Además, suelen contener parabenos, colorantes, rosorcinol, plata y otros compuestos químicos tóxicos que a muchas mujeres les dan alergia, irritan su cuero cabelludo o dañan el cabello.
Y así... Vamos que la gente es tan tonta que no sabe lo que es 'cuero cablleudo', ni tampoco 'calvicie' ni por supuesto 'médio', 'pH' ni un colorante para el pelo... cuando el tonto, suele ser el que cree que los demás son tontos. Todas y cada una de estas citas sobran y más que sobrar, estorban exactamente como las tonticitas de El_Andaluz. Ni vienen a cuento, ni explican nada que no sepa todo el mundo, ni deja claridad en su texto... lo alarga inútilmente. además d ela propia pérdida de tiempo que supone, pero bueno se da pompa asímismo. Cada loco con su tema.
|
|
|
3446
|
Foros Generales / Foro Libre / Re: La lacra de internet
|
en: 30 Noviembre 2017, 02:25 am
|
Internet no podría prosperar sin un lenguaje client-side. Así de sencillo. Si no llega a ser javascript habría sido cualquier otro. Pero un lenguaje del lado cliente, hace falta y punto. Al fin llegamos a la cuestión... Exactamente, cualqueir otro... no uno donde la seguridad está por demostrarse. Ni de lejos. ActiveX permite el control total del equipo incluyendo leer/modificar/borrar archivos sin aviso previo. Lo unico que tenia que hacer el usuario es activarlo. Tu reclamas de ActiveX que basta activarlo para tener acceso a todo el equipo, lo cierto es que la firma digital, no es así como así. Si tu ActiveX hace cosas ilegales se te puede perseguir, porque para firmarlo debes dar tus datos, y si eres empresa tu prestigio queda en entredicho o directamente de capa caída. Además en el propio navegador podías restringir la descarga de ActiveX, del mismo modo que hoy día puedes desactivar javascript. No tenia ningun tipo de sandbox ni nada. Así que tal como se presentó, bastaba poner algunas limitaciones respecto de permisos, de todos modos es una tecnología que nació a comienzos de los 90, cuando Internet estaba naciendo al mundo. y la única forma de meter un poco de control era signing trust que se resumía en: " Toma Microsoft, te pago 200$ y te prometo que mi código no lleva malware". Una estupidez completa. - De entrada necesitabas confiar en la web a la que accedes (igual que hoy día). - Para continuar debías confiar en las autoridades de certificación (JavaScrip pàrece el niño bonito, no necesita pasar por ninguna CA). - Y para terminar, en efecto, debías confiar en Microsoft (los desarroladores de ActiveX), exactamente como hoy debes confiar en Oracle (los desarrolladores de javascript) - Además, precisamente porque te costaba un precio, por tu propio bolsillo ta te encargaba uno mismo de que no contuviera bugs (o por lo menos estaba bien probado y pulido), no necesitando actualizaciones cada semana como sucede con el software mierdoso de hoy día. Que si, que javascript puede hacer inseguro un navegador.. pues igual que ActiveX y Flash y HTML y cualquier tecnología. Todo es propenso a bugs.. pero decir que ActiveX es más seguro que javascript es ser tecnológicamente analfabeto. Es que aquí te has colado. yo no he afirmado eso ni por asomo. Yo lo que he dicho y sostengo es que ActiveX era una tecnología potente que necesitaba ser pulida para ciertos aspectos y que en materia de seguridad javascript, no responde mucho mejor, sobretodo teniendo en cuenta la tira de años que ha pasado desde la maldición de ActiveX hasta hoy día (vamos que era de esperar una evolución en materia de seguridad de javascript mucho más elevada con tanto como ha llovido. Mirate en el espejo, y preguntate porque javascript sigue aquí y porque ActiveX se fue al garete. No sera por nada, creeme. Básicamente porque Microsoft, mató a su criatura, cuando dió a luz a NET, es algo que suelen hacer... encumbran una tecnología y cuando sacan sustituto, matan la anterior para que no le haga sombra y si no mira... qué fastidio los win-Xp, los vista, los win7 y win8, para que Win10 se alce en la cumbre d elos S.O. de PC. Así que si, es cierto, no fue por nada, fue por puro interés de migración de Microsoft... Bien pudo reorientarlo, pero ellos son los padres de la critatura. [/quote] Lo cierto es que a día de hoy, parece mentira que existan tantos fallos de seguridad en materia de redes. a estas alturas, ya todo el mundo debería estar más que harto. 1 - Todo los datos del tráfico de red DEBERÍA viajar cifrado sí o sí. 2 - Todo el software de red DEBERÍA estar firmado digitalmente sí o sí...Y mientras esto no sea así, cualquier mindundi, seguirá entrando hasta en sitios insospechablemente seguros... lo cual roza la burla. Cuando lees una noticia de que no se quien, ha entrado en ciertos sitios, no sabes si reir o acongojarte... pero no es sorprendente. javascript está en mi lista de lacras de Internet, me da igual que no te guste (a ti o a cualquier otro).
|
|
|
3447
|
Foros Generales / Foro Libre / Re: El misil lanzado por el régimen coreano puede alcanzar cualquier punto de EE UU
|
en: 30 Noviembre 2017, 01:54 am
|
No me explico de donde saca tanto combustible para lanzar estos misiles intercontinentales se supone que la ONU, EEUU, Japón y Corea del Sur votaron por sanciones fuertes de las mas fuerte en décadas es mas no se tiene ni constancia de tantas sanciones tan severas que se le ha puesto a este país y parece que no le afectan..
Esto de 'de dónde saca combustible' carece de sentido. Los misiles intercontinentales usan combustible sólido en general, no requiere petróleo, ni gasolina, ni queroseno, luego los embargos no afectan a esto para nada. El combustible sólido es pura química que se encuentra en cualquier terreno a grande que sea, solo requiere tiempo de proceso y un laboratorio donde sepan hacerlo. Y a la antigua usanza se usaba pólvora + nitrato de potasio + azufre, o la forma amateur: azúcar + nitrato de potasio. Hay varias opciones muy asequibles en realidad, otra cosa es hasta donde haya llegado su tecnología en el asunto... Y por otro lado, el combustible para UN SOLO MISIL, no requiere de 1.000 toneladas. de hecho todo podría ser una fantasmada y no poseer más arsenal que los '4' misiles que han lanzado... y poner cara de póker.
|
|
|
3448
|
Foros Generales / Foro Libre / Re: Me estoy quedando calvo!!!
|
en: 30 Noviembre 2017, 01:34 am
|
NEBIRE Tu tienes un problema muy grave creo yo o no te enteras de nada o no te informas primero pongo las citas que me da la gana, dado que no informas y hablas sin saber y esto no es un foro para tratar debatir estas cosas creo yo, si tienes algún problema lo hablas con un especialista y te lo explique como mejor exactitud.
El problema lo tienes tú, que dices palabras donde no corresponden y tratas a todo el mundo de tonto, con estúpidas citas, como si la gente fuera tan lerda como tu pareces suponer... Y sabe de una vez que por muchas citas que pongas nada de lo que uno diga, es más verdad ni más falso, antes bien, cuando uno tiene que recurrir a citas (y más si son innecesarias como ocurre el 90% de las veces en tu caso), refleja carencias afectivas como si esperara ser aceptado o como si pretendiera que se aprobara su dictado, interponiendo a un tercero, como si fuera una autoridad, cuando no sabes ni con quien estás hablando. Esto no es la Universidad, no seas cansino poniendo citas sin venir a cuento, úsalas cuando sean estrictamente necesarias... o si te las piden. Pareces un crío con ese comportamiento, quizás hasta lo seas... Respecto del tema, el chico no ha vuelto a pronunciarse, y es de suponer que ha leído o podrá leerlo cuando quiera, el tema no da más de sí, sus opciones son: - Que se acepte (como hace la inmensa mayoría). - Si no lo soporta que vaya al psicológo. - Y si tampoco le sirve, siempre tiene a disposición los implantes... no hay límite de edad para ello. No hay que darle más vueltas.
|
|
|
3449
|
Programación / .NET (C#, VB.NET, ASP) / Re: C# - Hackear una contrasena de un servidor
|
en: 30 Noviembre 2017, 01:01 am
|
Si, más o menos... Cada cual siempre pondrá más o menos capas de seguridad y hará cosas a su manera, pero es básico no guardar nombres ni contraseñas si no un hash de los mismos a lo sumo, o incluso como te decía un hash del hash concatenado a otra cosa... Fíjate que tras esa línea luego aparece esta: pwd = sha1.ComputeHash(SecurePassword(pwd, client.Cookie, ip)); ...que invocas a la función SecurePassword donde como te indicaba concatena algún string más (en este caso, la cookie y la ip aunque delante, da igual al caso) y devuelve el array de bytes. private static byte[] SecurePassword(byte[] password, uint cookie, IPAddress ip) { List<byte> buffer = new List<byte>(); buffer.AddRange(BitConverter.GetBytes(cookie)); buffer.AddRange(ip.GetAddressBytes()); buffer.AddRange(password); return buffer.ToArray(); }
El único modo de lograr algo, es intervenir el propio proceso, para lo cual debes tener bien infectado el equipo y además conocerlo en cierta medida. Si al final del proyecto, usas algún sistema para ofuscar el código antes de compilarlo mejor, cualquiera que quisiere desentrañarlo, lo tendrá más difícil y si al final es un programa que usarán pocos cientos o miles d epersonas, lo más probable es que nadie pierda el tiempo con ello. Un hacker perderá el tiempo cuando haya cierto 'interés', potencialmente millones de personas... a menos que maneje dinero en cantidades sustanciales... Sólo indicarte que no es estrictamente necesario que utilices un hash complejo o que te cueste entender, para tus propósitos un MD5, incluso un MD4 u otro vale... de hecho incluso sería más acertado tener tu propia función hash, pero si te acomoda las funciones que incluye NET (tiene varias), listo... También te señalo que no escatimes en hacer llamadas de una función a otra, es decir no dejes que una única 'megafunción' realice todo el login, mucho mejor si distribuyes la carga de trabajo entre varias funciones... aparte de serte más fácil el mantenimiento y cambio del código, también complicas a posibles intrusos (si los llegare a haber)...
|
|
|
|
|
|
|