Unite al grupo
|
|
| Suscribirte a webandbeer |
| Consultar este grupo |
sábado, 31 de mayo de 2008
CodeIgniter - Un framework interesante
Al entrar al site del framework la verdad es que me llamo la atension lo interesante que se veia.
Tienen 2 videos donde muestran como usarlo, y el pibe escribe un blog muy simple (post mas comentarios) en 20'.
http://codeigniter.com/
Me tome el laburo de subir el video a youtube (ya que estaba en .mov) para poder incluirlo en el post.
Tambien mande los links a la lista de correo del grupo:
http://groups.google.com/group/webandbeer
Aca va el video.
NOTA: intente subir el video a youtube, pero no lo convirtio por que dice que era muy grande. Lo subi a Wixi y no hubo problema... a tener en cuenta !.
lunes, 26 de mayo de 2008
Demian Rodriguez - Explicacion JavaScript grosa
2008/5/25 Andrés Gattinoni :
Comparto un artículo que vi en el blog de YUI (Yahoo User Interface), donde explica una forma (un hack en definitiva) para aplicar una suerte de visibilidad en javascript.
http://yuiblog.com/blog/2008
En definitiva esto es una variación de algo que el chabonito que escribió el artículo definió como "Module Pattern", que lo explican aca: http://yuiblog.com/blog/2007
Saludos
A
Esa forma de implementar propiedades y metodos privados es muy villera e ineficiente. Al definir los metodos dentro del constructor estas copiandolos para cada instancia de la clase, o sea que se debe evaluar e interpretar cada funcion. Si en cambio se definen en el prototype, hay una sola copia del metodo para cada instancia de la clase. Hice una siemple prueba de rendimiento:
function Test() {
var value = [];
this.method = function() {
for (var i=0; i<10; i++) {
value.push(i);
}
};
this.getValue = function() {
return value;
}
}
function Test2() {}
Test2.prototype = {
value : [],
method : function() {
for (var i=0; i<10; i++) {
this.value.push(i);
}
},
getValue : function() {
return this.value;
}
};
var o;
var start = Date.now();
for (var i=0; i<10000; i++) {
o = new Test();
o.method();
}
alert(Date.now() - start); // 85ms~
start = Date.now();
for (var i=0; i<10000; i++) {
o = new Test2();
o.method();
}
alert(Date.now() - start); // 45ms~
Y sin tener en cuenta el consumo de memoria.
Bue ya que estamos entonces pongo un ejemplo de propiedades estaticas privadas. Esto no tiene el problema q antes mencioné, pero no se hasta que punto es útil. Se podria hacer una especie de Singleton, q se yo...
function Constructor() {}
Constructor.prototype = (function(){
var privateStaticProperty = "Hola mundo";
var privateStaticMethod = function() {
}
return {
publicProperty : 1,
publicMethod : function() {
}
};
})();
Ahi solo demuestran como tener propiedades y metodos privados pero no mencionan nada en cuanto a rendimiento. Si vas a tener unas pocas instancias de la clase esta todo bien, pero para mi no sirve de nada hacer ese quilombo ya que ademas en los comentarios pusieron varias formas de hackear esa privacidad.
El ejemplo que puse yo sería la forma mas óptima de definir los metodos y propiedades de una clase. Al instanciar una clase (función), el objeto hereda los metodos y propiedades del prototipo de esa función, incluso si fueron agregados despues de la instanciación. Esto es lo que permite extender los objetos nativos de JS y el DOM como hacen muchos frameworks.
Por ej, en Gecko yo puedo agregarle un metodo a todos los
HTMLDivElement.prototype
Pero como el famoso IE no permite esto hay que agregar el metodo nodo x nodo. Ahi esta la diferencia básicamente, aunque se vería mejor si tuviera una herramienta para medir el uso de memoria de un script. Alguien conoce?
viernes, 23 de mayo de 2008
Sobre Estilos
Yo empleo otro hack para definir estilos diferentes para IE6 e
inferiores sobre la misma hoja de estilos:
#contenedor{
width: 94px !important;
width: 100px;
padding: 2px;
border: 1px solid #693
background: #ef9
}
Qué sucede:
El modelo de cajas en IE6 e inferiores no corresponde al estándar w3c
CSS 2.1. En la especificación se establece que el tamaño (ancho o
alto) de la caja se computa de la siguiente manera: width (or height)
+ padding + border-width
en IE6 se toma tan solo el tamaño especificado en la directiva width ó
height.
Empleando este hack, IE6 utilizará último ancho especificado,
omitiendo la directiva !important (Microsoft haciendo lo que le da la
gana). Esto hace la hoja de estilos mucho más legible y manejable.
Este hack funciona con cualquier parámetro así que prácticamente se
podrían reescribir todas las propiedades y tener dos hojas de estilos
en una (aunque esto no tiene mucha gracia).
A partir de IE7, el soporte al modelo de caja del estándar sí
corresponde a la realidad, lo mismo que la relevancia de !important,
así que se verá igual de bien en este navegador.
Sin embargo, si se necesitan especificaciones muy diferentes, lo mejor
es hacer algo como esto:
Este tipo de comentarios sólo los procesa IE y tienen una serie de
reglas que en el momento no recuerdo, pero que son muy útiles a la
hora de hacer habilitar bloques de código para cada versión de IE.
Espero que esto les sirva tanto como a mi me ha prestado utilidad.
viernes, 16 de mayo de 2008
Wixi Video
Lighthttpd y los proxy
El otro día me había puesto a hacer algunos experimentos con el tema de Proxy en Apache, y me di cuenta que la verdad era medio complicado conseguir cosas interesantes.
Como soy compañero de uno de los difusores mas importantes de lighthttpd en Argentina (Martin Sarsale), me puse a investigar este tema de Proxy en lighthttpd.
La verdad, es que es increíble los simple y rápido de implementar, y las posbilidades que tiene.
Primero que nada, vamos a explicar un poco lo que yo puntualmente tenia que resolver, y como lo hice.
Tengo un Server que tiene millones de fotos y videos en formato flv, y muchos js y css, mas el apache con PHP.
Por otro lado, tengo un servidor con MySQL.
El problema radica en que cada vez que se solicitaba una imagen (el sitio muestra galerías de imágenes) se instanciaban muchos procesos de apache que ocupaban sus buenos MB en RAM. Esto generaba que cuando había 100 usuarios concurrentes, todo se caiga pero mal.
Bien, la solución que se me ocurrió fue poner un servidor mas con todo el contenido estático. Implemente el lighthttpd, y la verdad es que el contenido se servia de maravilla, era muy rápido, y re livianito.
El tema estaba ahora en que, no podía ir a cambiar todas las referencias de imágenes, js, css y videos a una nueva URL (onda static.server.com que apuntaría al nuevo Server) por que había mucho hardcode.
La solución que encontré fue simple, en el servidor con Apache y PHP, instale un lighthttpd en el port 80, mande el Apache al 8080, y aplique estas pequeñas líneas de config:
proxy.server = ( ".php" =>
( (
"host" => "127.0.0.1",
"port" => 8080
) ),
".css" =>
( (
"host" => "192.168.1.50",
"port" => 80
) ),
".gif" =>
( (
"host" => "192.168.1.50",
"port" => 80
) ),
".jpg" =>
( (
"host" => "192.168.1.50",
"port" => 80
) ),
".flv" =>
( (
"host" => "192.168.1.50",
"port" => 80
) ),
".js" =>
( (
"host" => "192.168.1.50",
"port" => 80
) )
)
Creo que es bastante entendible como funciona esto.
No quiero explicar cosas de mas, ni ponerme en detalles, solo quiero presentarles una mínima idea de las cosas que se pueden hacer fácilmente con lighthttpd.
Saludos.
jueves, 1 de mayo de 2008
Sphinx : la solucion a la busqueda de texto
Hoy vamos a hablar de sphinx, una solucion interezante a la hora de solucionar el problema de la busquedas de texto.
Normalmente sacrificamos el modelo de entidad/relacion e integridad referencial con alguna tabla MyISAM (en MySQL claro esta) para aplicar un full-text y hacer que las busquedas de texto sean mas rapidas.
La verdad, eso es una verdadera porqueria, y todos lo sabemos.
Ahora bien, unos simpaticos rusos nos dieron una solucion llamada Sphinx, que es un programa que toma un query SQL, indexa el resultado, y despues nos deja un indece propio para las busquedas de texto.
Por ejemplo, tenemos una tabla de users con mas de 1 millon de registros, y queremos buscar users por username, email, nombre y apellido.
En Sphinx creamos un indice que se alimentara del query
select username, password, email, fname, lname from Users;
Y le indicamos que el "id" sera el user_id.
Sphinx corre el query intermamente, y armar el indexe de texto.
Las busquedas con Sphinx son de lo mas rapida que se vio, asi que les sorprendera.
Trae una API para PHP (para usarlo desde PHP) y hacer las busquedas.
Tiene una gran varidad de parametros para la relevancia de la busqueda y cosas asi, les aseguro que es ideal.
En proximos post se hablare de ejemplos, casos de implementacion, tips, etc.