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 - WHK

#1531
Este no es un foro smf 1.x, es una version totalmente modificada, el código de smf 1.x no aplica a este foro y por ende algunas funcionalidades no son las mismas ni tampoco los agujeros de seguridad.

Estamos pensando en migrar a smf 2 pero migrar todo es complicado porque como dije antes, este foro no es puro smf.
#1532
Foro Libre / Re: Busco un tema de música :3
21 Julio 2014, 16:59 PM
Cita de: #!drvy en 21 Julio 2014, 16:53 PM
Eyes Cream - Fly Away (Bye Bye)

https://www.youtube.com/watch?v=ZuHNB4lQmcs

Es del 2000 :P

Saludos

Buenaaa!!! ese mismo estaba buscando :D gracias!!, y como lo encontraste?
#1533
Foro Libre / Busco un tema de música :3
21 Julio 2014, 16:22 PM
Hola a todos nuevamente :D

Como algunos ya saben, me gusta la música d elos 80's :P y bueno, hace mucho tiempo que ando buscando un tema y no se ni como se llama xD ni mucho menos el nombre del autor pero tengo algunas pistas para que me puedan ayudar a encontrarlo por favor.

El tema es un tema modificado xD o sea, el tema original se llama "you make me feel" de sylvester, y el tema que busco lo canta otra persona y es mas moderno, talves de los 90's porque tiene un ritmo dance (como electrónico) y lo daban antiguamente por la tv pero ya no lo dan :( , en el video aparece el que canta con un instrumento que parece cuerno y muestran a un hombre y a una mujer caminando hacia atras por toda una ciudad hasta que al final del videoclip se encuentran y comienzan a bailar :P

Alguien lo conoce por favor? :D se lo agradecería muchísimo :) yo ya lo busqué en youtube, googleé bastante y no pillo nada :(
#1534
PHP / Re: Guardar Session en PHP
8 Julio 2014, 17:00 PM
A tu carrito de compras le falta el session_start();, por eso no te aparecen los datos obtenidos de la base de datos.

Donde dice:
if(!$_SESSION['tipo_usu']=='a' or !$_SESSION['tipo_usu']=='ca'){
         header('location:index.php');
       }


Ponle un exit; después de header() ya que el código continuará hacia abajo y mostrará todo y después hará la redirección, es mejor que redireccione sin mostrar nada.

Saludos.
#1535
Mucho cuidado con este tipo de usos porque no siempre funcionará bien, por ejemplo tu dices que para contar la cantidad total de registros haces esto:

Código (php) [Seleccionar]
$ssql = "select * from pais " . $criterio;
$rs = mysql_query($ssql,$conn);
$num_total_registros = mysql_num_rows($rs);


Si haces eso en una base de datos transaccional con varios cientos de miles de registros tu consulta se puede demorar facilmente hasta unos 7 o 15 segundos dependiendo del hardware del servidor sin mencionar que vas a utilizar muchisima memoria ram para poder almacenar tu resultado en una tabla temporal y poderla leer.

En estos casos se pueden hacer varias cosas:

Primero que nada nunca usar asterisco para contar registros porque puedes tener campos que no necesariamente están en el índice de la base de datos, asi que si vas a contar debes contar índices:

Código (sql) [Seleccionar]
SELECT COUNT(id) FROM pais WHERE ...

MySQL tiene un registroi propio con la cantidad de índices por tabla asi que una consulta sin condicionales (sin wheres) te va a arrojar un resultado instantaneo porque no cuenta nada, solo te retorna el número que tiene guardado en una variable de conteo interno.

Ahora, cuando haces un where el tema es distinto, digamos que tu consulta arrojó 300 mil resultados, entonces mysql tendrá que mandar a una tabla temporal en memoria de 600 mil registros, uno con tu conteo y otro con tu resultado (independiente del limit ya que el limit se resuelve después de toda la selección), por lo tanto tu consulta puede tardar muchisimo tiempo si tienes una cantidad considerable de columnas como por ejemplo los datos de una persona v/s los datos de una empresa, ahora si haces joins olvidate, puedes estar pegado esperando por lo menos de 30 a 60 segundos que resuelva.

Para prevenir estas situaciones se utiliza el argumento "SQL_CALC_FOUND_ROWS" el cual se encarga de enviar a una variable la cantidad de registros de tu consulta evitando tener que hacer dos consultas.

Por ejemplo:

Código (sql) [Seleccionar]
SELECT SQL_CALC_FOUND_ROWS * FROM pais WHERE ... LIMIT 0, 10

Eso te retornará los primeros 10 registros de tu búsqueda, ahora desde una segunda consulta sql obtienes el valor de la cantidad de registros que habian:

Código (sql) [Seleccionar]
SELECT FOUND_ROWS()

Y te devolverá la cantidad exacta de registros sin considerar la propiedad limit, como por ejemplo 300 mil.

Otro tema es acelerar las búsquedas indexando columnas y utilizando la propiedad fulltext para la indexación de campos, tablas de caché temporal para busquedas muy grandes con muchos joins, etc.

Un buén amigo mio una ves me dijo que cuando uno necesita hacer busquedas en bases de datos transaccionales con muchos miles o millones de registros necesitaba utilizar servidores de búsqueda y no hacer las consultas directamente hacia la base de datos, como por ejemplo apache solr ( http://lucene.apache.org/solr/ ), pero como yo soy porfiado utilizo tablas en memoria (si, mysql soporta tablas en memoria que son ultra rápidas) el cual contiene todas mis busquedas.

Por ejemplo yo necesito buscar un médico y en el campo de texto puedo buscar por nombre, apellido, especialidad, localización, nombre del centro médico y en cualquier orden. Ahora, imaginense cuantos joins debo hacer, aproximadamente 18 donde cada una tiene alrededor de 400 mil registros con campos de tipo text (gigantes) los cuales no puedo indexar por su tamaño y la cantidad de columnas son alrededor de 20 por tabla. En este caso yo tengo una tabla llamada cache_busqueda el cual tiene el campo id, usuario_id, payload, orden_natural, entonces yo tengo esta consulta SQL con muchos joins en un php llamado mantenedor el cual cuando lo hago correr me hace la consulta que se demora varios minutos y procesa uno por uno los medicos tomando todos los datos y uniendo todos los valores en un solo campo de tipo text en la columna "payload", luego lo unico que debo hacer cuando quiero buscar un médico es hacer un like a esa columna y ordenar por la columna orden_natural el cual tiene una serie de reglas como por ejemplo "comienza con la letra A si tiene una foto, continua con la letra A si tiene x campo, luego el apellido y luego el nombre", de esta manera se ordenan alfabeticamente y prioriza los que tienen fotos, pero la consulta de búsqueda no ordena nada, el orden es natural de la tabla asi que el motor ya no tiene que ordenar 400 mil registros y se ahorra mucha memoria, tampoco debe hacer joins ni nada.

Ahora, esa selección que yo hago solo obtengo el id del usuario medico y luego con esos 10 items retornados los cargo completamente, nombres, edad, sexo, etc etc.

Para mantener esta tabla viva lo que hago es actualizarla cada ves que se actualiza un medico, pero solo actualizo ese registro, no toda la tabla y eso no se demora mas de 0.01 segundos asi que jamás pierdo la integridad de los datos.

Esto me da la ventaja de hacer consultas grandes en servidores pequeños, con 400 mil registros una busqueda de esta magnitud no me demora mas de 1 segundo en un servidor compartido con una cpu doble nucleo.

--------

Terminando con el post, quiero decir que esta es una manera extrema de llevar el rendimiento de una búsqueda SQL, ustedes si tienen la posibilidad de utilizar un servidor optimizado para búsquedas, haganlo.

Saludos.
#1536
PHP / Re: Guardar Session en PHP
8 Julio 2014, 15:55 PM
compras.php
Código (php) [Seleccionar]
<?php 
$nombreCliente 
'Pedro';
echo 
htmlspecialchars($nombreClienteENT_QUOTES); 
?>


Así? ahora reemplazas pedro por el nombre del usuario que sacaste de la sesión después de haber ingresado.

Podrías ser un poco mas explicativo porque nosotros no conocemos tu web, no sabemos como está hecha, no sabemos que tipo de seison usas si sesion de php o mysql o nosql, etc etc, no sabemos si usas objetos o si tienes la sesion en una variable o si el cliente no te loguea etc etc.
#1537
Podemos vivir sin computadores? claro que si, pero eso no quita que sean útiles.

El tema es que esta pregunta es una pregunta un tanto engañosa y muy fabricada psicologicamente ya que una respuesta obvia sería que si, que si se puede vivir sin google y eso te lleva de forma instantanea a elegir lo que el creador de la pregunta te propone.

Por ejemplo: Yo soy el creador de una buena bebida cola y les pregunto... podemos vivir sin cocacola? la respuesta inmediata es si y eso nos lleva indirectamente a mirar a la competencia y a decir si, si se puede, pero no quiere decir que la bebida que me estan ofreciendo sea mejor que cocacola o que deba escoger otra.

Podemos vivir sin google? claro que si pero mientras exista es una gran herramienta que no la voy a reemplazar por bing y el día en que google se vaya a quiebra me cambiaré a cualquier otra que no pertenezca a las sucias manos de Microsoft ni Facebook.
#1538
Bueno, depsués de ver que aun no hay solución me di unos 15 minutos para crear un pequeño script que automatiza el marcar como leido a todo xD

Que hay que hacer?:

1. Tener Firefox
2. Instalar el complemento GreasyMonkey ( https://addons.mozilla.org/es/firefox/addon/greasemonkey/ )
3. Crear un nuevo user-script
4. Pegar mi código:

Código (javascript) [Seleccionar]
// ==UserScript==
// @name        Elhacker.net - Mark all as read
// @namespace   elh-maar
// @description Habilita el botón para marcar todos los temas como leidos en la sección de temas no leidos.
// @include     http://foro.elhacker.net/unreadreplies.html
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @version     1
// @grant       none
// ==/UserScript==

$(document).ready(function(){
   
   /* Existe el botón para marcar como leidos? */
   if($('img[alt="Marcar TODOS los mensajes como leídos"]').length){
       
       /* Establece el evento del botón */
       $('img[alt="Marcar TODOS los mensajes como leídos"]')
          .closest('a')
          .click(function(evento){
             
              /* Previene la redirección con problemas */
              evento.preventDefault();
             
              try{
                  /* Crea la ventana de informaciones */
                  $('<div />')
                     .css({
                         position          : 'fixed',
                         width             : '400px',
                         height            : '59px',
                         top               : '50%',
                         left              : '50%',
                         marginLeft        : '-200px',
                         marginTop         : '-50px',
                         backgroundColor   : '#FFFFFF',
                         color             : '#333333',
                         fontFamily        : 'Arial',
                         fontSize          : '17px',
                         border            : '1px solid #666666',
                         borderRadius      : '5px',
                         boxShadow         : '9px 12px 10px -10px #000000',
                         textAlign         : 'center',
                         paddingTop        : '41px'
                     })
                     .addClass('ehn_maar_mensaje')
                     .text('Preparando ...')
                     .appendTo($('body'));
                 
                  /* Parsea los datos convirtiendolos en objetos */
                  data = {
                      'accionUrl' : $(this).attr('href').split('topics=')[0] + 'topics=',
                      'sesc'      : ';sesc=' + $(this).attr('href').split(';sesc=')[1],
                      'ids'       : $(this).attr('href').split('-'),
                      'totalIds'  : 0
                  };
                 
                  /* Limpia los ids */
                  if(data.ids){
                     for(_llave in data.ids){

                         /* Remueve la basura del costado izquierdo del id */
                         if(data.ids[_llave].indexOf('=') > -1)
                             data.ids[_llave] = data.ids[_llave].split('=')[1];
                         
                         /* Remueve la basura del costado derecho del id */
                         if(data.ids[_llave].indexOf(';') > -1)
                             data.ids[_llave] = data.ids[_llave].split(';')[1];
                     }
                     
                      data.totalIds = data.ids.length;
                     
                      /* Envía los ids al servidor de 5 en 5 */
                      for(var loop1 = 1; loop1 <= data.totalIds; loop1 = loop1 + 5){
                         
                          /* Hay ids? */
                          if(data.ids.length){
                             
                              /* candidatos de ids a enviar */
                              idsEnviar = new Array();
                             
                              for(var loop2 = 1; loop2 <= 5; loop2++)
                                 
                                  /* Aun hay ids? */
                                  if(data.ids.length)
                                     
                                      /* Completa el stack */
                                      idsEnviar.push(data.ids.pop());
                             
                                  else /* No hay mas ids */
                                      break;
                             
                              /* Hay ids candidatos a enviar? */
                              if(idsEnviar.length){
                                 
                                  $('.ehn_maar_mensaje').text('Marcando del ' + loop1 + ' al ' + (loop1 + (idsEnviar.length - 1)) + ', de ' + data.totalIds + ' ...');
                                 
                                 /* Envía la solicitud al servidor */
                                 $.ajax({
                                      url      : data.accionUrl + idsEnviar.join('-') + data.sesc,
                                      type : 'get',
                                      cache : false,
                                      async    : false
                                  });
                              }
                             
                          }else{
                              /* No hay mas ids */
                              break;
                          }
                      }
                     
                      $('.ehn_maar_mensaje').text('Finalizado! Redireccionando ...');
                      document.location.reload();
                     
                  }else{
                      /* No hay ids */
                      alert('No hay mensajes para marcar como leido');
                  }
                 
              }catch(e){
                  /* Problema con el código? */
                  alert('Error: ' + e.message);
              }
          });
   }
});


Después cierran todas las ventanas del greasymonkey y lo dejan activado.

Ahora cada ves que entren a la sección de temas no leidos ( http://foro.elhacker.net/unreadreplies.html ) y le den click al botón de marcar como leidos a todos aparecerá un recuadro que dice "marcando x de 45 ..." y lo que hace es lo siguiente:

Como el problema del servidor es procesar las urls largas tomé todos los ids que van por url y los agrupé y hago que se envíen de 5 en 5 y listo :D , cuando termina dice "Redireccionando ..." y verás que tus temas no leidos desaparecieron:





Saludos.
#1539
Yo lo uso y a veces me llegan notificaciones pero solo cuando estoy logueado y navegando, cuando lo cierro no aparece nada, además no debería ser un problema porque si alguien no quiere mensajes en el area de notificaicones las puede deshabilitar desde la configuración de la aplicación del mismo android:

#1540
No te preocupes, aca en chile si tienes un celular bloqueado por imei o por hardware te los desbloquean en media hora por unos 3 dolares xD