Foro de elhacker.net

Programación => Java => Mensaje iniciado por: NetJava en 31 Marzo 2011, 12:18 pm



Título: Generar palabras de la mejor manera.
Publicado por: NetJava en 31 Marzo 2011, 12:18 pm
Buenas,

Bueno la verdad es que ya he estado haciendo preguntas más o menos sobre el mismo tema del proyecto que me había planteado, y ahora llego a la conclusión de que tengo que abandonarlo. La idea era crear una tabla con todas las palabras posibles, y poner su SHA1 y su MD5. En su momento ya me enfrente a crear todas las posibilidades de palabras y era imposible por el tiempo. Bueno las ideas que se me ocurrieron y que hice.

1.- Como se creaban muchas palabras "inservibles" hice que el programa cogiera libros en .txt, los filtrase para quitar signos, y después guardaba las palabras obtenidas, todas servibles, aun que ya sabemos que una contraseña es compleja frente a una palabra normal. Y más si tenemos una palabra con acento, o con una letra en mayúscula, pero bueno...

2.- Volví a generar palabras aleatoriamente pero con Thread (bueno para ser más exactos cada función de la aplicación se hacía en Thread diferentes). Bueno la cuestión es que aunq empiece a generar por un lado palabras con 10 caracteres y 32 posibilidades en un hilo, y en otro palabras de 9 caracteres con 32 posibilidades los tiempos siguen siendo demasiado... Así que os pongo un ejemplo.

Bueno el bucle normal (para 6 caracteres en la palabra) seria "for(int a = 0; a < 32; a++)" etc... Lo que pense e hice fue el bucle de para 6 caracteres separarlo en 4 bucles, cada uno en thread diferente. Pero aun así es imposible, por que hablamos de millones...

Código
  1. public void GenerarDiccionario6_1(JLabel jlbl_0){
  2. DBManagementx DBM11 = new DBManagementx();
  3. String ContentCarac = "";
  4. String c1 = "";
  5. String c2 = "";
  6. String c3 = "";
  7. String c4 = "";
  8. String c5 = "";
  9. for(int a = 0; a < 10; a++){
  10. c1 = caracteres1[a];
  11. for(int e = 0; e < 15; e++){
  12. c2 = caracteres1[e];
  13. for(int i = 0; i < 32; i++){
  14. c3 = caracteres1[i];
  15. for(int o = 0; o < 32; o++){
  16. c4 = caracteres1[o];
  17. for(int u = 0; u < 32; u++){
  18. c5 = caracteres1[u];
  19. for(int A = 0; A < 32; A++){
  20. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  21. DBM11.fillTablex(ContentCarac, jlbl_0);
  22. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  23. ContentCarac = "";
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. DBM11 = null;
  31. }
  32.  

Código
  1. public void GenerarDiccionario6_1_1(JLabel jlbl_0){
  2. DBManagementx DBM11 = new DBManagementx();
  3. String ContentCarac = "";
  4. String c1 = "";
  5. String c2 = "";
  6. String c3 = "";
  7. String c4 = "";
  8. String c5 = "";
  9. for(int a = 0; a < 10; a++){
  10. c1 = caracteres1[a];
  11. for(int e = 15; e < 32; e++){
  12. c2 = caracteres1[e];
  13. for(int i = 0; i < 32; i++){
  14. c3 = caracteres1[i];
  15. for(int o = 0; o < 32; o++){
  16. c4 = caracteres1[o];
  17. for(int u = 0; u < 32; u++){
  18. c5 = caracteres1[u];
  19. for(int A = 0; A < 32; A++){
  20. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  21. DBM11.fillTablex(ContentCarac, jlbl_0);
  22. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  23. ContentCarac = "";
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. DBM11 = null;
  31. }
  32.  

Bueno pues os cuento un poco más. Esto aun así tarda mucho. Lo que se hace: a través de un hilo se ejecuta el bucle va al método donde se guarda en la BD, pero antes se coteja con lo que ya hay guardado en la BD, para que no se dupliquen palabras.

Se os ocurre algo para hacerlo mejor en cualquier sentido.

Muchas gracias y saludos.  :-\

P.D:
32 * 32 = 1024

32 * 32 * 32 = 32.768

32 * 32 * 32 * 32 = 1.048.576

32 * 32 * 32 * 32 * 32 = 33.554.432

32 * 32 * 32 * 32 * 32 * 32 = 1.073.741.824






Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 31 Marzo 2011, 12:26 pm
Bueno algo más. Cuanto hilos puede ejecutar a la vez¿? Pues para mi ordenador para que la aplicación "aguante" unos cuatro hilos aprox, el gadgets de la CPU con el primer hilo 25%, y así sucesivamente. Cuando digo que la aplicación "aguante" es por que cuanto más hilos pongo a rular en paralelo más fallos se producen al insertar en la BD. Aun q hasta 4 hilos es asequible por que se produce un error de 800 inserciones, teniendo en cuanta que con un solo hilo, no se produce ni un solo error. Para dar algo más de inf.

Saludos!!


Título: Re: Generar palabras de la mejor manera.
Publicado por: KuraraGNU en 31 Marzo 2011, 12:50 pm
Ufff la verdad es que son muchisimos bucles, normal que tarde tanto, habria que cambiar por completo el planteamiento del ejercicio, manteniendo lo de buscar en el txt ese. No se, quizas usando una matriz de mas de una dimension? Me lo mirare en mi tiempo libre a ver si se me ocurre algo. Exactamente cuantos hilos tienes y que hace cada uno? Es que no me entero lo de los hilos e.e


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 31 Marzo 2011, 13:19 pm
Buenas, pues muchas gracias, te voy a poner más inf.

Lo primero es decir que se crea un objeto thread para cada bucle. Al igual que hay un objeto diferente de conexión con la BD para cada bucle.

Código
  1. ...
  2. ...
  3. ...
  4. //este código esta dentro de la clase Thread, en un case dentro del método run()
  5. case 15:algoritx.GenerarDiccionario6_1(this.jlbl_0); break;
  6. case 16:algoritx.GenerarDiccionario6_1_1(this.jlbl_0); break;
  7. case 17:algoritx.GenerarDiccionario6_2(this.jlbl_0); break;
  8. case 18:algoritx.GenerarDiccionario6_2_1(this.jlbl_0); break;
  9. case 19:algoritx.GenerarDiccionario6_3(this.jlbl_0); break;
  10. case 20:algoritx.GenerarDiccionario6_3_1(this.jlbl_0); break;
  11. ...
  12. ...
  13. ...
  14. //algoritx el el objeto de la clase algoritmo donde se encuentran todos los bucles.
  15. public void GenerarDiccionario6_1(JLabel jlbl_0){
  16. DBManagementx DBM11 = new DBManagementx();
  17. String ContentCarac = "";
  18. String c1 = "";
  19. String c2 = "";
  20. String c3 = "";
  21. String c4 = "";
  22. String c5 = "";
  23. for(int a = 0; a < 10; a++){
  24. c1 = caracteres1[a];
  25. for(int e = 0; e < 15; e++){
  26. c2 = caracteres1[e];
  27. for(int i = 0; i < 32; i++){
  28. c3 = caracteres1[i];
  29. for(int o = 0; o < 32; o++){
  30. c4 = caracteres1[o];
  31. for(int u = 0; u < 32; u++){
  32. c5 = caracteres1[u];
  33. for(int A = 0; A < 32; A++){
  34. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  35. DBM11.fillTablex(ContentCarac, jlbl_0);
  36. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  37. ContentCarac = "";
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. DBM11 = null;
  45. }
  46.  
  47. public void GenerarDiccionario6_1_1(JLabel jlbl_0){
  48. DBManagementx DBM11 = new DBManagementx();
  49. String ContentCarac = "";
  50. String c1 = "";
  51. String c2 = "";
  52. String c3 = "";
  53. String c4 = "";
  54. String c5 = "";
  55. for(int a = 0; a < 10; a++){
  56. c1 = caracteres1[a];
  57. for(int e = 15; e < 32; e++){
  58. c2 = caracteres1[e];
  59. for(int i = 0; i < 32; i++){
  60. c3 = caracteres1[i];
  61. for(int o = 0; o < 32; o++){
  62. c4 = caracteres1[o];
  63. for(int u = 0; u < 32; u++){
  64. c5 = caracteres1[u];
  65. for(int A = 0; A < 32; A++){
  66. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  67. DBM11.fillTablex(ContentCarac, jlbl_0);
  68. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  69. ContentCarac = "";
  70. }
  71. }
  72. }
  73. }
  74. }
  75. }
  76. DBM11 = null;
  77. }
  78.  
  79. public void GenerarDiccionario6_2(JLabel jlbl_0){
  80. DBManagementx DBM11 = new DBManagementx();
  81. String ContentCarac = "";
  82. String c1 = "";
  83. String c2 = "";
  84. String c3 = "";
  85. String c4 = "";
  86. String c5 = "";
  87. for(int a = 10; a < 20; a++){
  88. c1 = caracteres1[a];
  89. for(int e = 0; e < 15; e++){
  90. c2 = caracteres1[e];
  91. for(int i = 0; i < 32; i++){
  92. c3 = caracteres1[i];
  93. for(int o = 0; o < 32; o++){
  94. c4 = caracteres1[o];
  95. for(int u = 0; u < 32; u++){
  96. c5 = caracteres1[u];
  97. for(int A = 0; A < 32; A++){
  98. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  99. DBM11.fillTablex(ContentCarac, jlbl_0);
  100. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  101. ContentCarac = "";
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. DBM11 = null;
  109. }
  110.  
  111. public void GenerarDiccionario6_2_1(JLabel jlbl_0){
  112. DBManagementx DBM11 = new DBManagementx();
  113. String ContentCarac = "";
  114. String c1 = "";
  115. String c2 = "";
  116. String c3 = "";
  117. String c4 = "";
  118. String c5 = "";
  119. for(int a = 10; a < 20; a++){
  120. c1 = caracteres1[a];
  121. for(int e = 15; e < 32; e++){
  122. c2 = caracteres1[e];
  123. for(int i = 0; i < 32; i++){
  124. c3 = caracteres1[i];
  125. for(int o = 0; o < 32; o++){
  126. c4 = caracteres1[o];
  127. for(int u = 0; u < 32; u++){
  128. c5 = caracteres1[u];
  129. for(int A = 0; A < 32; A++){
  130. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  131. DBM11.fillTablex(ContentCarac, jlbl_0);
  132. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  133. ContentCarac = "";
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }
  140. DBM11 = null;
  141. }
  142.  
  143. public void GenerarDiccionario6_3(JLabel jlbl_0){
  144. DBManagementx DBM11 = new DBManagementx();
  145. String ContentCarac = "";
  146. String c1 = "";
  147. String c2 = "";
  148. String c3 = "";
  149. String c4 = "";
  150. String c5 = "";
  151. for(int a = 20; a < 32; a++){
  152. c1 = caracteres1[a];
  153. for(int e = 0; e < 15; e++){
  154. c2 = caracteres1[e];
  155. for(int i = 0; i < 32; i++){
  156. c3 = caracteres1[i];
  157. for(int o = 0; o < 32; o++){
  158. c4 = caracteres1[o];
  159. for(int u = 0; u < 32; u++){
  160. c5 = caracteres1[u];
  161. for(int A = 0; A < 32; A++){
  162. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  163. DBM11.fillTablex(ContentCarac, jlbl_0);
  164. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  165. ContentCarac = "";
  166. }
  167. }
  168. }
  169. }
  170. }
  171. }
  172. DBM11 = null;
  173. }
  174.  
  175. public void GenerarDiccionario6_3_1(JLabel jlbl_0){
  176. DBManagementx DBM11 = new DBManagementx();
  177. String ContentCarac = "";
  178. String c1 = "";
  179. String c2 = "";
  180. String c3 = "";
  181. String c4 = "";
  182. String c5 = "";
  183. for(int a = 20; a < 32; a++){
  184. c1 = caracteres1[a];
  185. for(int e = 15; e < 32; e++){
  186. c2 = caracteres1[e];
  187. for(int i = 0; i < 32; i++){
  188. c3 = caracteres1[i];
  189. for(int o = 0; o < 32; o++){
  190. c4 = caracteres1[o];
  191. for(int u = 0; u < 32; u++){
  192. c5 = caracteres1[u];
  193. for(int A = 0; A < 32; A++){
  194. ContentCarac = c1 + c2 + c3 + c4 + c5 +caracteres1[A];
  195. DBM11.fillTablex(ContentCarac, jlbl_0);
  196. //JOptionPane.showMessageDialog(null,""+ContentCarac,"Message",JOptionPane.INFORMATION_MESSAGE);
  197. ContentCarac = "";
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. DBM11 = null;
  205. }
  206. ...
  207. ...
  208. ...
  209. //Ahora se llama a al método fillTable (el nombre del método no importa jejeje). En este método se llama la otro que coteje primero.
  210. public void fillTable(String dato){
  211. if(Cotejar(dato) == 0){
  212. newCodigo();
  213. idpalabra +=1;
  214. String SQL = "INSERT INTO palabras (idpalabras, palabras, sha1, md5) Values ('" + idpalabra + "','" + dato + "', '', '');";
  215. try{
  216. st.executeUpdate(SQL);
  217. }catch(Exception e){
  218. e.printStackTrace();
  219. }
  220. }
  221. }
  222. ...
  223. ...
  224. ...
  225.  

Y este es el proceso. Lo importante esq se genera un objeto thread por cada bucle, y también para las conexiones. hay muchos bucles es verdad... para generar cadenas de 10 caracteres...

Lo que necesites! Gracias.


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 1 Abril 2011, 18:07 pm
Buenas,

os pregunto unas cuantas cosas que son especificas y supongo que esos conocimientos los da la experiencia jejeje. Todo esto en cuanto a rendimiento de la aplicación.

1.- Que es mejor, crear un objeto y utilizar el mismo 4 veces o crear 4 objetos¿? Por ejemplo yo cuando lanzo hilos, por cada botón tengo un objeto de la clase hilo. A lo mejor debería crear una variable private instanciarla, y llamarla en los botones con el método necesario.

2.- Cuando se conecta a una base de datos, que resulta más eficiente, conectar una vez, ejecutar tus acciones y cerrar conexión. O mantener la conexión "abierta" para siempre que la necesitéis.

Esta aplicación puede llegar a saturar mi ordenador en cuanto más hilos ponga a rular, afectando a la CPU. Ya habéis visto como va, por el código. ¿Es normal que el ordenador se sature?

Muchas gracias y saludos!

Aun q ya es un poco tarde por que hace tiempo que estoy con este tema, intento ver hasta donde puedo llegar, aun q esto se tenía que hacer antes, pero bueno. 


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 4 Abril 2011, 17:18 pm
Buenas,

pues nada os voy a poner hasta donde he llegado. He eliminado el método cotejar, que lo que hacía era comprobar si esa palabra ya existía. De esa manera me quito un acceso a la BD. Ahora solo se accede para insertar.

Para evitar que se dupliquen palabras inserto por orden, primero de 1 carácter, cuando acabe 2 caracteres, y así sucesivamente.

El proceso lo lanzo desde un thread, de esa manera tengo un "JLabel" que me va diciendo cuantos caracteres van siendo insertados. Ahora he añadido más caracteres para crear otra BD.

1) 44 = 44

2) 44 * 44 = 1936

3) 44 * 44 * 44 = 85184   

4) 44 * 44 * 44 * 44 = 3.748.096  ******

5) 44 * 44 * 44 * 44 * 44 = 164.916.224

6) 44 * 44 * 44 * 44 * 44 * 44 = 7.256.313.856

Cuando llegue a cantidades grandes modificaré los bucles para que haga la parte proporcional a un día. Al día siguiente o por la noche, lo dejare con la cantidad correspondiente.

No se si esto os sirve de algo. Pero me he dado cuenta que MySQL no hace distinciones entre:

a, á
....
u, ú
n, ñ
tampoco hace distinción entre mayúsculas y minúsculas.

Por lo que si busco en la BD "que", el resultado será:

que
qué
qúe
qúé

Seguiré con este tema formando la BD, si a alguien se le ocurre una idea, perfect.

Saludos, y espero que sirva la inf que he dejado.



Título: Re: Generar palabras de la mejor manera.
Publicado por: KuraraGNU en 12 Abril 2011, 14:48 pm
Ya que me pierdo bastante con lo que intentas, se ve que no soy tan lista, te respondo esto, jeje:
1.- Que es mejor, crear un objeto y utilizar el mismo 4 veces o crear 4 objetos¿? Por ejemplo yo cuando lanzo hilos, por cada botón tengo un objeto de la clase hilo. A lo mejor debería crear una variable private instanciarla, y llamarla en los botones con el método necesario.
Hombre, ten en cuenta que a mas objetos creados, mas consumo de memoria, pero si controlas que dejas a un hilo en espera mientras se ejecuta otro el ordenador lo tendra mas facil a la hora de controlar los ciclos de tiempo.

2.- Cuando se conecta a una base de datos, que resulta más eficiente, conectar una vez, ejecutar tus acciones y cerrar conexión. O mantener la conexión "abierta" para siempre que la necesitéis. 
A mi siempre me han dicho que mejor que se cierre, no se :/.


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 12 Abril 2011, 19:06 pm
Buenas,

muchas gracias por responder,  lo tendré en cuenta, llevo ya días generando. El tema de la memoria del ordena me rallaba bastante. Esta claro que tengo que mejorar el manejo con los objetos XD gracias. Justamente hoy pensando un poco se me ha ocurrido que las palabras que genere las podría ir guardando en un arraylist, en vez de generar una y guardar continuamente, y cuando haya llegado a 1 millón poner un hilo en paralelo a insertar en la base de datos, mientras que otro sigue generando palabras en otro arraylist, y cuando llegue a 1 millón pasarlo al hilo que inserta y reutilizar el hilo anterior. Creo que así podría ir más rápido... Voy a probarlo hoy XD

Un saludo y gracias!!!


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 13 Abril 2011, 19:03 pm
Buenas,

bueno sigo preguntando o escribiendo para mi mismo jajjaja. He probado la idea que se me ocurrió ayer, y es increíblemente más rápido, y ahora es ese el problema, 1 millón se genera enseguida, entonces comienza un thread paralelo para hacer la inserción en la base de datos, la inserción se hace repetidamente dentro de un bucle... El bucle no se desborda, esta siempre limitado a 1 millón, pero va tan rápido que llega un momento en el que no para de generar excepciones. Se os ocurre alguna idea¿?

Gracias y saludos!!!


Título: Re: Generar palabras de la mejor manera.
Publicado por: KuraraGNU en 14 Abril 2011, 10:11 am
pero va tan rápido que llega un momento en el que no para de generar excepciones. Se os ocurre alguna idea¿?

Gracias y saludos!!!
Que clase de excepciones? pega unas pocas aqui XD Ponle un sleep() si va muy rapido o un pause() o como se llame. Es que no se que metodo es el que esta deprecated y cual es el que hay que usar, tu me entiendes. Cuando lo hagas quedamos por msn y me explicas lo que estas haciendo que me gustaria saber como funcioa tu programa pero no lo pillo con tanto bucle o yo que se por que.


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 14 Abril 2011, 15:43 pm
Buenas,

bueno, pues hice la prueba como dije, y el problema que comente de las excepciones jejeje se debía a que con los hilos y con los bucles a toda lechela BD no respondia bien... pero el problema principalmente era en la gestión de los hilos.

De lo que se trata es de generar todas las palabras posibles de la manera más rápida y guardarlo en una BD. Sobre la ultima forma de hacerlo, es "más rápida"... Lo que hace la cosa lenta es insertar en la BD. Cuando se generan palabras y se guardan en un ArrayList se hace casi al instante, pero ya en la BD se relentiza bastante.

Lo que plantee de que un hilo generase y aguardase en un ArrayList las palabras, y que cuando llegase a 1000000, por ejemplo, otro hilo lo guardase en la BD, mientras otro hilo se hacía cargo se volver a generar y guardar en otro arraylist, yBLABLABLABLA todo en paralelo:

Se coge1..
Se guarda1         Se coge2
Se guarda2         Se coge1
Se guarda1         Se coge2

Bueno pues esto tal cual no vale jejeje por que el tiempo de "coger" no es para nada equivalente al de "guardar".

Bueno, pues ya que he empezado a escribir, termino... Después hice la aplicación que "coge" las palabras por ejemplo 10.000.000 que lo hace en apenas 3 ó 5 minutos y después se dedica a guardar todas esas palabras, y tarda algo menos que la primera aplicación, la que explique con código al principio del post.

Jajajajajaja me voy callando. Por qué tantos bucles¿? Pues nada es lo que se utilizo para generar palabras:

5 bucles -> todas las palabras con 5 caracteres.
6 bucles -> todas las palabras con 6 caracteres.
blablablabla

Bueno la verdad es que me he puesto a escribir como si estuviera pensado, sin orden y sin na, así que no se si se entiende algo jajajajaja Si te interesa o tienes alguna duda ya sabes, y cualquier inf perfect.

P.D: Cuando los bucles iban demasiado rápido para la base de datos metía bucles sin instrucciones dentro, para letenrizar las instucciones de inserción. Pero bueno el problema era de los hilos... Se podría pensar que mi problema esq no gestiono bien los hilos, que es cierto, pero no me sirve de nada, la ultima idea, si los hilos no trabajan paralelamente, qii decir, que poner un hilo a la espera mientras otro espera no me vale para ahorrar tiempo. ME CALLO!!!!!

Saludos y gracias!!!




Título: Re: Generar palabras de la mejor manera.
Publicado por: KuraraGNU en 15 Abril 2011, 11:15 am

P.D: Cuando los bucles iban demasiado rápido para la base de datos metía bucles sin instrucciones dentro, para letenrizar las instucciones de inserción. Pero bueno el problema era de los hilos... Se podría pensar que mi problema esq no gestiono bien los hilos, que es cierto, pero no me sirve de nada, la ultima idea, si los hilos no trabajan paralelamente, qii decir, que poner un hilo a la espera mientras otro espera no me vale para ahorrar tiempo. ME CALLO!!!!!


No se por que dices tantas veces: Me callo, me dejas to loca.

Pues si, ya parece que mas o menos lo he entendido :P pero bueno, es complejo, si. Lo de controlar que los hilos sean paralelos... No se si lo has conseguido, pero los hilos van cuando quieren (cuando el CPU quiere), es lo primero que me enseniaron y eso de paralelos... es complicado aunque para lo que quieres quizas aparentemente vayan paralelos. Entonces lo solucionaste todo?


Título: Re: Generar palabras de la mejor manera.
Publicado por: NetJava en 18 Abril 2011, 20:57 pm
Pues la verdad esq todavía no, pero con esto de semana santa y el movimiento XD Me tengo que poner... volver a comerme la cabeza, en el buen sentido. Saludos!