October 4th, 2010 Category: Programacion
11 Comments »
Cada vez es hay mayor cantidad de herramientas y tecnicas para realizar sistemas web, esto le da muchas mas complejidad dia a dia al desarrollo web, pero tambien mucha herramientas que facilitan el desarrollo de un sistema web.
Antes con saber programar en PHP/Mysql/Html/Css era mas que suficiente para conseguir clientes, y poder trabajar en cualquier proyecto web. Hoy en dia esto no es suficiente.
Los sistemas al ser mas complejos, requieren mas profesionalismo en el desarrollo, y gente mas capacitada. Hay muchas herramientas que hoy son indispensable para proyectos medianos/grandes, que requieren mas de un programador.
Control de versiones.
Es real que los sistemas son cada vez mas grandes y mas robustos, generalmente vemos que un sistema tiene varios desarrolladores, disenadores, QA, y otros, solo para crear un sitio de e-commerce, o un portal mediano. Esto hace indispensable el uso de un sistema para el control de versiones, pero no solo alcanza con saber hacer un checkout y commit con svn, ahora se necesita un conocimiento general sobre la teoria del control de versiones, branch, tags, mergear ramas. Tambien manejo de otros sistemas de control de versiones como mi actual favorito Git, o mercury, entre otros.
Testing Unitarios.
El trabajo en grupo es algo de todos los dias, siempre nos acomplamos a un grupo de desarrolladores, son muy pocos los proyectos que hacemos solo para que los desarrolle una sola persoa, esto si bien acelera los tiempos de desarrollo, tambien puede generar conflictos con el codigo de otras personas, puede pasar que alguien suba algo y rompa todas las funcionalidades del resto de los desarrolladores. Esto es tan normal que ya tenemos asumido que puede pasar en cualquier momento. Pero tenemos los unit testing, que hacen que estas cosas se puedan prevenir. Antes de hacer un commit, corremos todos los testing unitarios, y podemos saber si rompimos algo, antes de subir nuestro codigo al repositorio global. Igual, lo ideal es que cada developer trabaje en su branch, y que alguien o un script, mergee los branch al trunk cuando haya pasado todos los testing, y se considere que puede pasar al trunk (rama principal). Hay sistemas open source como crouisecontrol, que mantienen informado a todo el equipo como salieron los unit testing despues de que alguien del equipo subiera sus cambios. Si alguien subio y rompio algun unit testing, este le envia un mail a todo el equipo avisando del problema, para que lo solucionen rapido, ademas podemos hacer que sino pasa los testing, revote los cambios.
SEO
El SEO es un tema importante hoy en dia, no necesitamos ser “expertos” en SEO, pero necesitamos entender que es y cuales son las buenas practicas que podemos aplicar en nuestros desarrollos para facilitar la indexacion de parte de los motores de busqueda. Url amistosas, xhtml estricto y semantico, jerarquizacion de nuestro contenido utilizando correctamente los tags html, edicion de metatags, etc.
Servidores
Este siempre fue un tema que todo desarrollador esquivo, para delegar la responsabilidades al sys admin correspondiente. Es increible la cantidad de desarrolladores que se consideran senior, y no saben configurar un Virtual Host en apache, o usar minimamente la consola de linux. Linux/Unix nos brinda un monton de herramientas para los desarrolladores increbiles, que nos pueden hacer la vida mucho mas facil, y no lo digo solo por los comandos mas usados como tail, cat, vim y grep, tambien tenemos muchas otras herramientas que aumentarian considerablemente la velocidad y calidad de nuestros trabajos.
Uso de Frameworks.
Coincidas o no con la filosofia de usar uno u otro framework, te guste ZF y detestes Cake, o no te guste ninguno, la realidad es que tenes que tener la capacidad de poder manejar cualquiera de estos. Obviamente no estoy diciendo de manejarlos en profundiad sino manejar sus conceptos basicos, como configuracion, como maneja el modelo de datos, las vistas, etc. La mayoria de frameworks en PHP usan el Patron de diseno MVC. Conocer como funciona MVC es vital hoy en dia, pero tambien lo es entender los conceptos de ORM, Smarty (sistemas de plantilla), y tantos otros “Frameworks” / Libreria que complementan el desarrollo de una aplicacion.
Aplicaciones Pre Armadas.
Antes teniamos PHP-Nuke y gracias, en la actualidad que un cliente te presente la posibilidad de usar Joomla, Drupal, o Magento, es algo casi de todos los dias, nosotros como developers, tenemos que conocer no solo las ventajas de cada sistema de este tipo, sino tambien estar preparado para utilizarlo en el caso de que creamos que es necesario. Drupal para desarrollar webs es una herramienta increiblemente facil, ahorramos muchisimo tiempo de desarrollo configuracion, etc, etc. Lo mejor de estas aplicaciones es que es muy facil integrarlas a otros sistemas como Wikimedia, wordpress, u otros sistemas similares, o propios. Crear un modulo o plugin tambien es muy simple y las comunidades brindan una ayuda que vamos a poder valorar muchisimo cuando las necesitemos.
Social Media.
Muy lejos estoy de aceptar este rubro como algo importante, pero cuando yo me refiero a social media, lo hago desde el lado de desarrollo, orientando la aplicacion para que tenga las funcionalidades para integrarse con las redes sociales mas importantes. Un ejemplo excelente para mi gusto es stackoverflow, intenta registrarte y loguearte, son geniales. Esta claro que un usuario web comun y corriente hoy en dia tiene alguna cuenta o en gmail, facebook, wordpress, twitter, entre otros, porque no usar las api de esas redes sociales para facilitar el registro y login de usuarios en nuestros sistemas?
Compartir el contenido de nuestros sitios, con herramientas tan facil de usar como el “Me gusta” de facebook, o twittear un contenido, son muy utilies no solo para que nuestros usuarios puedan compartir sus intereses dentro de sus circulos “sociales”, sino tambien para que podamos conseguir usarios nuevos por este medio.
Herramientas para el desarrollo
No quiero volver a empezar la discusion de Vim o Eclipse, esto es algo que sobrepasa cualquier discusion, hoy en dia necesitamos todas las herramientas que aumenten nuestra productividad y el mejor manejo para el trabajo en equipo. El IDE hoy en dia es esencial, no quieras desarrollar algo en Vim, porque si estas trabajando por hora, vas a generar perdidas a la empresas en un monton de aspectos, que la verdad esos problemas no lo vas a tener con el correcto uso de un IDE, Eclipse PDT / Netbeans, son herramientas geniales para cualquier developer. Pero tambien estas herramientas no son las unicas. Necesitamos algo con el que puedas ver tus tareas asignadas, estado de las mismas, y porque no las de tus otros companeros de equipos. Un tracker como Trac, o Pivotal Tracker, yo estoy usando este ultimo y la verdad es que es bastante complejo pero muy util una vez que le hagarraste la mano. Necesitas trackear tus horas para aumentar la productividad?, usa Toggl, es un servicio web publico con una version gratuita muy flexible. Con una herramienta para instalar que tiene su version en windows, mac , y linux
.
Conclusion
Pareciera que estoy dejando de lado los temas importantes que son conocimientos del lenguaje del lado del servir, motor de base de datos, javascripts, frameworks en JS, Css, xhtml, html5. Todos estos son conocimientos que ya deberiamos tener en claro, sinos consideramos experimentados.
Trabajando en entornos Norte americanos, las exigencias son aun mayores. Estos exigen un nivel, que es muy dificil encontrar en latino america. Pero podemos adaptarnos, tenemos la capacidad, y ellos tienen que entender que somos la mejor opcion. Lo mismo para el mercado europeo.
Espero que entiendan que mi idea no es hablar como absolutista, mas bien compartir la experiencia de haber estado tanto tiempo en el desarrollo web.
March 18th, 2010 Category: Programacion Zend Framework
14 Comments »
Mi idea era subir un archivo dentro de un formulario, renombrar ese archivo con un id conseguido en esa misma operacion con el siguiente formato logo_{$id}.jpg . El problema es que cuando agregaba el setDestination del form me copiaba el archivo con su nombre original en la carpeta de destino. No conseguia renombrarlo.
Vi muchisimos ejemplos pero al parecer con la nueva version no andan ninguno, porque los que probe no me sirvieron de forma literal (es decir copy/paste ) .
Asi que tuve que ponerme a leer un poco
. Despues de ver como funcionaba Zend_Form_Element_File. Trate de implementar la forma mas logica. La cual no me anduvo. Me acorde que cuando usas isValid de un Zend_Form, este ejecuta los filtros y las validaciones correspondientes. Pero encontre dentro de la documentacion la solucion a mi primer problema, el metodo setValueDisabled( true ) evita que se ejecute el filtro del elemento, asi puedo aplicar mi filtro para renombrar mi archivo despues de validarlo.
Mi segundo problema es que cuando implemente esto, no me guardaba el archivo en donde habia establecido. Para entender esto un poco Zend_Form_Element_File usa Zend_File_Tranfer que es el encargado de manipular el archivo. Lo que siguio fue traerme el adapter de Zend_File_Transfer de mi elemento, agregar los filtros y ejecutar el upload. Y listo tenia mi archivo subido ‘in the ZF way’.
Este es el formulario
class Application_Form_Company extends Zend_Form
{
public function init()
{
$this->setAttrib('enctype', 'multipart/form-data');
$this->addElement('text', 'name', array(
'required' => true,
'validators' => array(
),
'class' => 'sf'
));
$this->addElement('file', 'logo', array(
'class' => 'sf'
));
$this->logo->addValidator( 'Extension', false, 'jpg,png,gif,jpeg' );
$this->logo->addValidator( 'Size', false, '10024000' );
$this->logo
->setDestination( APPLICATION_PATH . '/../public/empresas/imgs/' )
->setValueDisabled( true );
$this->addElement('text', 'website', array(
'required' => true,
'class' => 'sf'
));
$this->addElement('text', 'telephone', array(
'required' => true,
'class' => 'sf'
));
$this->addElement('textarea', 'information', array(
'required' => true,
'class' => 'sf'
));
$this->setDecorators(
array(
array(
'ViewScript',
array( 'viewScript' => 'company/form.phtml' )
)
)
);
}
}
Asi quedo mi action
...
$form = new Application_Form_Company();
if ( $this->getRequest()->isPost() ) {
$file = $form->logo;
if( $form->isValid($this->getRequest()->getParams()) ) {
$bind = $form->getValues();
$company = new Application_Model_Company();
if( $company->exists( $bind['name'] ) ) {
$form->name->addErrorMessage( "La empresa ya existe" );
} else {
try {
$id = $company->save( $bind );
}catch( Exception $e ) {
$this->_helper->flashMessenger()
->addMessage( 'Hubo un problema, revise los datos' );
}
// Traemos el adapter de Zend_File_Transfer
$upload = $form->logo->getTransferAdapter();
// Lo ideal es que el path lo trajeramos de un archivo de configuracion.
$upload->addFilter('Rename', array(
'target' => APPLICATION_PATH . '/../public/empresas/imgs/logo_'. $id .' .jpg',
'overwrite' => true
));
var_dump( $upload->receive() );
...
March 9th, 2010 Category: Programacion
2 Comments »
En el ultimo google fest que se realizo en Buenos Aires, la gente de Google, comento varias de las ventajas de HTML 5 y como podriamos aprovechar la geolocalizacion. Todavia no hay mucho soporte para HTML 5, las proximas versiones de los Browsers van a empezar a tener mas sopoprte para las nuevas especificaciones.
Armando Sosa realizo un video tutorial explicando claramente que es y cuales son las ventajas de HTML 5
HTML5 para principiantes from Armando Sosa on Vimeo.
Via Buzz Cesar Casas compartio unos ejemplos de juegos y manipulacion de graficos con html 5, sin la necesidad de Flash.
http://www.benjoffe.com/code/games/torus/
http://29a.ch/jswars/
http://www.kevs3d.co.uk/dev/asteroids/
http://9elements.com/io/projects/html5/canvas/
http://www.benjoffe.com/code/demos/canvascape/textures
http://www.benjoffe.com/code/tools/functions3d/
http://www.benjoffe.com/code/toys/spirograph/
www.benjoffe.com
Al parecer HTML 5 va a traer muchos beneficios, en reduccion del codigo html. Hoy en dia podemos ver youtube con el reproductor de HTML 5, aunque no es tan bonito ni tenga las mismas funcionalidades es una alternativa muy fuerte a los reproductores FLASH.
Hay que prestar atencion en como afectara en el SEO con las etiquetas
March 8th, 2010 Category: amazon cloud Programacion
No Comments »
Estuve teniendo unos problemas con un servidor en produccion, y me ocupo la mayor parte de mi ultimo tiempo, por eso no continue los capitulos de … “Escalando nuestras web”. La verdad que en este tiempo lei mucho sobre todo lo que este relacionado con la nube. Uno de los casos de exito que mas me intereso fue el de meneame. Como la mayoria debe saber meneame es un servicio de publicacion de noticias, donde los usuarios menean la noticia o no. Mientras mas meneos tenga mejor vista estara la noticia y conseguiras mas visitas a la misma, ademas de aumenta nuestro karma que es la valorisacion en meneame de un usuario. Pero lo que nos importa a nosotros es que es un sitio con muchisimo trafico. El cual su creador y director Ricardo Gallir decidio montar meneame en la nube.
Los videos que vamos a ver a continuacion son unas charlas que dio, donde explica, el porque y como migro a Amazon toda la estructura de meneame, que como nos va a explicar el no es nada sencillo. El audio esta bastante bajo pero el material es de altisima calidad para perderselo, suban lo maximo que puedan el volumen y disfruten de la conferencia.
Parte 1.
En el video van a encontrar una explicacion sobre el contenido estatico muy interesante en el cual Ricardo nos recomienda tener un dominio totalmente diferente para manejar este tipo de contenido, y tambien nos aconseja si vamos a manejar imagenes muy chicas no conviene usar cloudfront para esto porque encarece mucho los costos, y si usar otro servidor tipo lighthttp o nginx que la tienen mas clara con el manejo de contenido de este tipo. Siempre sobre el puerto 80 y no esas locuras de ponerlo en el 8080 que limitan a los usuarios que acceden desde lugares donde tienen restringidos los puertos.
Tambien nos explica bastante bien como funciona EC2 y que son las instancias. Los costos en un monstruo como Meneame y lo compara con los presupuesto que le dieron empresas como arsys.es entre otras.
Presten atencion a la parte que habla sobre escalado vertical y horizontal, y las herramientas que amazon EC2 nos brinda para esto.
Parte 2.
En la segunda parte vamos a un ejemplo practico como configurar Amazon EC2 para tener nuestra propia instancia y un sitio corriendo
Despues de estas charlas, y algunos comentarios en su blog y en el blog de meneame, Ricardo Gallir practicamente se convirtio en un promotor de Amazon. Tampoco es raro verlo en twitter haciendo comentarios sobre el buen servicio de amazon.
Esta es una opcion que todos deberiamos analizar cuando nuestro trafico requiere recursos que ningun hosting de usd 3 puede ofrecernos.
February 12th, 2010 Category: base de datos mysql Programacion Zend Framework
5 Comments »
Una transacción es un conjunto de operaciones en la base que se
ejecutan por separadas pero están relacionadas la una con la otra y
necesitamos que si se ejecuta una operación se asegure que también lo
haga en las operaciones siguientes.
En los tipos de tablas transaccionales (InnoDb y DBD ) de MySql,
tenemos la opción de determinar cuando hacer un commit, esto nos
permite hacer un rollback en el caso de que no estemos felices con el
resultado de nuestra transacción.
En las tablas del tipo no transaccional (MyIsam) esta opción no
existen porque están seteadas para que se haga un auto commit, esto
significa que no vamos a poder usar transacciones para tablas de Tipo
MyIsam, solo para InnoDb.
Con las tablas InnoDb nosotros podemos controlar cuando hacer el
commit. Podemos revisar que todas las operaciones se hayan realizado
de forma correcta y recién ahí hacer un commit de la transacción.
Con esta forma nosotros nos aseguramos que una operación se ejecute en
su totalidad, e informar al usuario o a quien sea necesario el
resultado de la misma.
La gente de Doctrine en su blog comentan que su ORM aumenta la
velocidad de mysql, ya que ellos manejan transacciones de forma nativa
en todas sus operaciones,
http://www.doctrine-project.org/blog/transactions-and-performance .
Les recomiendo que lean el articulo, aunque esta en ingles es bastante
claro. Quizás el articulo los entusiasme y se metan un poco en el
mundo de los ORM.
Zend Framework como no podía de ser de otra forma tiene soporte para
transacciones. Si tenemos ZF en un sistema con MVC, y tenemos que
hacer una transacción que involucre mas de un modelo, la transacción
la podemos abrir en cualquiera de ellos, y comitearla.
La forma correcta es conseguir el adapter. El cual nos brinda la
interfaz con la conexion a la base de datos. El mismo lo podemos
conseguir llamando al metodo getAdapter de cualquiera de nuestros
modelos.
class TestController extends Zend_Controller_Action
{
public function createAction()
{
$params = $this->_getAllParams();
$model1 = new MyFirstModel();
$model2 = new MySecondModel();
//Conseguimos el Adapter de nuestra conexion
$db = $model1->getAdapter();
// Iniciamos la transaccion
$db->beginTransacction();
try{
$model1->insert( $params );
$model1->insert( $params );
// Sino hubo ningun inconveniente hacemos un commit
$db->commit();
} catch( Exception $e ) {
// Si hubo problemas. Enviamos todo marcha atras
$db->rollBack;
}
}
}
En el código de ejemplo podemos ver como recibimos ciertos datos por
POST/GET y los datos los guardamos en dos modelos diferentes, esas
acciones están dentro de un try/catch, el que nos permite atrapar las
excepciones que podrían ser enviada por alguna de las operaciones que
tenemos dentro de la transacción en cuyo caso ejecutamos el rollback.
Si todo salio bien llamamos al metodo commit.
Si nosotros queremos forzar dentro de nuestros modelos un rollback lo
mas transparente es tirar una excepcion, y desde el controller se
ejecuta el rollback. La forma de generar una excepcion es la
siguiente.
Para saber mas de transacciones nada mejor que ir a las fuentes originals.
MySql http://dev.mysql.com/doc/refman/5.0/es/ansi-diff-transactions.html
Zend Framework http://framework.zend.com/manual/1.10/en/zend.db.adapter.html#zend.db.adapter.transactions
February 8th, 2010 Category: Programacion Zend Framework
1 Comment »
Si ejecutamos un script desde el shell, y necesitamos ejecutar algún resources en particular, como el de la base de datos. Necesitamos instanciar Zend_Application, y ejecutar los resources que necesitemos.
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
set_include_path(implode(PATH_SEPARATOR, array(
APPLICATION_PATH . '/../library',
get_include_path(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
// Iniciamos Zend_Application
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
// Ejecutamos el resource que trae los datos de conexion.
$bootstrap = $application->getBootstrap();
$bootstrap->bootstrap('db');
$dbAdapter = $bootstrap->getResource('db');
$query = 'SELECT count(*) total from users where date(creation_date) = date(now())'
$row = $dbAdapter->fetchRow( $query );
$mail = new Zend_Mail();
$mail->setBodyText( "Hoy se registraron {$row['total']}" );
$mail->setFrom( "mimail@pablo-morales.com" );
$mail->setSubject( "Reporte de nuevos usuarios" );
$mail->send();
February 3rd, 2010 Category: Programacion SOA Zend Framework
4 Comments »
En esta serie de artículos voy a tratar de explicar como hacer para que nuestros sitios web sean escalables. Trabaje en varios proyectos donde inicialmente eran webs para unos pocos usuarios pero con el tiempo fueron tomando fuerza y hoy tienen grandes cantidades de visitas y consumo de recursos. El problema es que estos sistemas no tuvieron una gran inversión y no están preparado para el consumo que generar.
Esta situación es muy común hoy en dia. En cualquier libro de escalabilidad, o web, foros, etc. uno de los puntos mas recurrentes es tratar de que las tareas que no requieran una interacción directa con el usuario se ejecuten en segundo plano. También podríamos agregar que lo ideal es que para ejecutar estas acciones en segundo plano se ejecuten a través de un único proceso, la centralización de estas acciones nos permite migrar a otro servidor el dia de mañana en caso de que sea requerido o si el servidor se cae y poder retomar las acciones sin procesar una vez que el servidor vuelva, y sin que el usuario se haya enterado de este problema. Para hacer esto vamos a aplicar la teoría de colas.
Teoria de colas.
La teoría de colas es según la wikipedia, el estudio matemático de las lineas de espera. Básicamente se encolan procesos en orden de llegada, cuando la aplicacion libera un proceso toma el que entro después, y así sucesivamente. En todos los aspectos de la vida podemos encontrar colas, en el supermercado, cuando vamos a pagar impuestos, cuando vamos a la cancha a ver a Boca, etc.
La forma ideal de evitar estos cuellos de botella y evitar que el usuario espere inecesesariamente, es enviar todos los procesos a una cola, esta cola podría contener un objeto serializado, que al correr el proceso que desencole deserealizaria el contenido pudiendo ejecutar la acción del usuario, sin que el usuario tenga que esperar a que se desencolen todos los procesos anteriores, o sobrecargar el servidor.
Podemos usar una única cola. O crear una cola para cada tarea diferente. Una cola para el envió de mails, otra para subir los comentarios de un producto, otra para procesar visitas en el sitio, etc.
Por que usar Colas.
La idea de usar colas es para evitar usar insert/update/delete en la base de datos en tiempo real haciendo al usuario esperar que se termine este proceso antes de mostrarle la pagina cargada para que pueda seguir usando el sitio. Que este encolado no significa que tengamos que esperar 10 minutos para correr un cron y ejecutar los cambios estos cambios pueden demorar un minuto o quizás menos. Pero todo varía dependiendo de la velocidad que necesitemos esa información. También podemos evitar el cron y correr un deamon que ejecute un evento cada vez que recibe un nuevo evento encolado.
Lo ideal seria reemplazar todos los insert/update/delete a la base por un envió a una cola x, para ser procesada en segundo plano. Esto a veces no es posible, en este caso podemos ver otras opciones.
Las colas simplifican nuestro trabajo. Supongamos que tenemos un proceso que envía mails. Este proceso (mailer) recibe un mail de envio, uno de respuesta, un asunto, y mensaje. Con estos datos que recibe el mailer envia mails, sin importar que sea de registro, de recuperación de clave, de aviso que un usuario le envió un correo interno, etc.. Esto hace que un unico lugar tengamos la logica necesaria para enviar un mail.
Supongamos que tenemos 3 servidores en nuestra red. Y solo uno esta configurado para enviar mails correctamente usando sendmail o postfix, da la casualidad que por necesidad el frontend del sitio tuvimos que moverlo o inicialmente esta en un servidor diferente. En nuestro caso lo unico que tenemos que procurar es instalar el mailer en nuestro servidor que si puede enviar mail. Sin importar en que servidor esta instalado el frontend.
Lo mismo podemos aplicar para diferentes procesos. El calculo de estadísticas del sitio, la carga de datos de nuestro backoffice, etc. No tienen porque compartir la misma base, ni el mismo servidor. El proceso de sincronización se puede hacer mediante colas.
Esto nos permite evitar la recarga de la base de datos, cuando la gente de administración necesita saber cuantos usuarios se registraron a las 16:45 del martes anterior, o alguna de esos reportes extraños que a ellos les encanta pedir, y que generalmente significan querys con un costo altísimo en cuanto a procesos. Procesos que necesitamos libres en nuestro frontend para que el usuario navegue sin problemas.
Distintos tipos de colas disponibles para nuestros sistemas web.
$key = 'Mi Clave provista por Amazon';
$secretKey = 'Mi Clave Secreta provista por Amazon';
$data = Zend_Json::encode( $objetoAProcesar );
$sqs = new Zend_Service_Amazon_Sqs($key, $secretKey );
$queueUrl = $sqs->create( 'to_process_message' );
$sqs->send($queueUrl, $data);
Desencolar y procesar.
$config = Zend_Registry::get("config");
$sqs = new Zend_Service_Amazon_Sqs($key, $secretKey );
$queues = $sqs->receive( $queueUrl );
foreach ($queues as $message) {
// Aca procesamos el mensaje. Si el objeto esta serializado lo deserializamos, y ejecutamos el proceso correspondiente.
// Si usamos un proceso unico para desencolar todas las colas. No estaria de mas establecer una interfaz para pasar estos objetos.
$data = Zend_Json::decode( $message );
print_r($data);
// Terminado de procesar lo borramos, asi no volvemos a traerlo
$sqs->deleteMessage( $queueUrl, $message['handle']);
}
Este es un inicio al escalamiento de sistemas web. En el proximo capitulo contenido estatico en un dominio y servidor diferente.
December 10th, 2009 Category: Programacion
8 Comments »

Es común siendo parte de este rubro que al comentar con alguien que te dedicas al desarrollo web, comenten cosas como “ahhh haces paginitas web“, “yo con el dreamweber hice algunas paginas”. Y la verdad es entendendible viniendo de alguien que desconoce el rubro, pero nosotros tenemos que ser consientes de que es algo mas que hacer paginitas.
Muchas personas alguna vez agarraron el frontpage o dreamweber e hicieron la pagina de su empresa o la del colegio. Pero esto no es un problema ya que no varia mucho de hacer una presentacion con el Powerpoint, de hecho hay una funcion de MS Word para exportar un documento como web. Esto es lo genial de html, es realmente simple.
El problema viene que muchos intentaron hacer sitios un poco mas complejo o con una idea mas amplia que solo dar a conocer una empresa. Muchos intentaron dar servicios a traves de la web, vender productos, o armar redes sociales, pero siguieron usando el frontpage o algun editor parecido. Hoy en dia vemos cantidad infinita de estos sitios que se caen a pedazos pero por antiguedad por suerte, o vaya a saber porque, tienen un trafico superior a lo que realmente se merece el producto que están mostrando. No hablo solo de una cuestión estética sino un sitio en general, vemos sitios con trafico de 400000 visitas mensuales donde ni siquiera aplicaron uno de las herramientas basicas que nos brinda un lenguaje del lado del servidor como php, como es la inclusión de partes de nuestra web para no tener que repetir el header, menu, footer, etc. Sitios donde cada pagina es toda una web, donde el mismo archivo se procesa toda la informacion que se va a mostrar, se envian mails y se genera el html a mostrar. No estoy hablando de aplicar MVC, sino un poco de sentido comun.
Me sorprenderia que algun programador con mas de un año de experiencia no haya visto sitios como este que doy como ejemplo.
La verdad es que en mis desarrollos anteriores cometi muchos errores (en los actuales tambien), pero siempre tuve la intencion de hacer lo mejor posible. Siempre busque la forma de mejorar, y veo que esto no le paso a todo el mundo.
El tiempo que estuve en Easytech valore siempre las ganas de todos de hacer el mejor desarrollo posible, esto encabezado por los jefes, y seguido de toda la cuadrilla de programadores, no había un solo eslabon en la cadena de produccion que no le interesara hacer el mejor desarrollo. Creo que se lograron grandes cosas y realmente aprendi muchisimo.
Es importante aunque sea una temporada corta encontrarse con gente de estas caracteristicas, porque mas alla de que uno tenga mas experiencia que otros, siempre vas a aprender algo nuevo.
La contra cara de easytech es bothmedia, lamentablemente herede un desarrollo de ellos, y dia a dia estoy sufriendo por cada error que encuentro, increiblemente el desarrollo no es de los 90, es de ahora, creo que lo terminaron hace 7 u 8 meses, sin embargo es increible ver como hay gente que se vende como una super consultora internacional, hace desastres. No son mas que diseñadores de paginitas web con su super frontpage 2022, que copian y pegan codigo de phpclasses, o hotscripts, ni saben para que sirven, pero esto les sirve para considerarse programadores PHP. No conozco a la gente que esta a cargo de esta consultora, mi intención no es desprestigiar, lamentablemente este ultimo mes estuve lidiando con este software, y quizás me volví intolerante con bothmedia, pero tengo mis razones.
Creo no exagerar en las criticas como la gente de scriptia.net
Pero devuelta aclaro, todos fuimos novatos, cometimos errores, hicimos DESASTRES, pero siempre a pesar de nuestras limitaciones tenemos que buscar perfeccionarnos.
Para mi una forma de perfeccionarme fue usar un framework, ser estricto con el estilo de mi codigo, ser estructurado en algunos sentidos, y flexibles en otros. Buscar soluciones en la experiencia de otros usuarios, ver un problema y tratar de ver las diferentes posibilidades.
Es importante que aprendan a leer directamente de la documentacion oficial. Leer blogs para aprender sobre la experiencia de otros usuarios. Estar en alguna lista o foro donde se toquen los temas que te interesan. Aprender todos los puestos que involucran el desarrollo web, Diseno, Programacion, DBA, SysAdmin, esto nos va a dar una amplitud mayor a la hora de plantear una nueva arquitectura. Busquen nuevas herramientas, esten al tanto de las novedades. Apoyen el Open Source, que el les va a retribuir de forma que ni se imaginan.
Bueno es todo, sufienciente por hoy, ya me descargue, esa es la magia de tener un blog.
December 8th, 2009 Category: Programacion SEO Zend Framework
2 Comments »
Me paso muchas veces de hablar con gente que necesitaban un sistema web o una web institucional, y al comentarles que iba a utilizar Zend Framework mucho coincidían en preguntar, si Zend Framework era compatible con SEO.
Si bien esta pregunta puede sonar ridícula para la mayoría de los programadores web, es una realidad que hay muchas personas que piensan que ZF o cualquier framework puede llegar a tener problemas con lo que a SEO se refiere.
La respuesta es fácil, si, ZF es compatible con SEO, por muchas razones, pero principalmente porque el SEO no es afectado por la tecnología que uses del lado del servidor para procesar los pedidos.
Hace un tiempo que estoy siguiendo bastante el tema de SEO, aprendí mucho este ultimo año sobre las manías de los buscadores, y como lograr posicionase mejor. Es un trabajo de hormiga y requiere mucho trabajo de análisis, por mas que nosotros como desarrolladores armemos toda la tecnología necesaria para hacer un buen SEO, todo esto no sirve sin alguien que este encima de lo que buscan o necesitan los usuarios. Es impresionante ver como cambiando alguna palabra en el contendio url, h1, o title, puede variar tanto el resultado de búsqueda. Pero centremonos en la parte tecnológica.
ZF nos brinda muchas herramientas para que podamos implementar un buen SEO en nuestros sistemas web. En la version 1.8 o 1.9 no recuerdo bien se agrego un helper para generar sitemaps. Si bien no es ninguna ciencia hacer un sitemap de nuestro contenido nunca viene mal una ayudita o helper
. También se agrego un helper para los breadcrumbs quie es otro de los eslabones para un buen SEO. Con Zend_Layout podemos editar facilmente nuestros metas y title, pudiendo controlar facilmente desde nuestros action el valor que van a tener estos en la pagina a mostrar. Pero sin duda uno de los mas importantes es Zend_Controller_Router, con este componente nosotros podemos enrutar todos nuestros actions, con url mucho mas amistosas y lo mas importante, es super facil de configurar. No solo rutas estaticas, sino dinamicas, que varíen dependiendo de algún parámetro que podamos capturar con alguna regular expresión.
Hace poco una familia amiga me pidio hacer un sitio con un catalogo de revistas importadas para empezar a captar clientes por internet y no depender de la forma tradicional que era distribuyendo revistas a los canillitas de Buenos Aires.
Lo particular de esto es que es el unico distribuidor de revistas importadas del pais, lo que lo hacia bastante atractivo para captar clientes por internet. La idea del sitio era bastante basica, un catalogo de revistas importadas online, la gente que estaba interesada los llamaba por telefeno y se les acerca al canillita mas cercano. Pero creo que le dimos una vuelta de rosca mas al sitio refinandolo para que realmente sea atractivo para google.
Todavia hay varias cosas que estamos refinando pero el sitio ya tiene a unas pocas semanas de estar online suficiente visitas por google para saber que el esfuerzo valio la pena.
Los puntos que tuve en cuenta para lograr esto son simples, una organizacion clara del contenido por categorias un buscador y una forma facil y rapida de comunicarse con los empleados de la distribuidora. Es importante tambine un interlinkeado de contenido, por eso en los detalles de las revistas no solo se sugiere otras revistas que esten en la misma categoria sino tambien busquedas relacionadas.
Usar un motor de busqueda que genere una url por cada busqueda y hacer que esos links sean indexables por google es uno de los recursos mas comunes, por eso hoy en dia vemos sitios como ar.emagister.com con mas paginas que Taringa. Siendo esto un poco ilogico ya que taringa tiene miles de usuarios generando contenido e emagister argentina unos cuantos data entries. Pero este es un recurso totalmente legal, y util, ya que no solo generamos mas url para nuestro sitio, y mas contenido, sino que ademas generamos urls con las palabras claves que usan nuestros usuarios para llegar al contenido.
Todo esto no tendria sentido si solo agregaramos el contenido al sitemap, tambien es necesario darle fuerza a traves del interlinkeado como es en el caso que les estoy presentando.
El mundo de SEO es muy interesante debido a los resultados que obtenemos con el. Pero tambien nos ayuda a hacer mejores web, a veces vamos a sufrir un poco de spam en el contenido con urls rozando el limite de lo tolerante o h1 que superan el ancho total de una pagina, pero esto seguramente sea penalizado en algun momento con mas firmeza por los buscadores, y tengamos una web mejor.
Es importante que como desarrolladores tengamos en cuenta las mejores practicas para hacer web semanticas y validas. Con funcionalidades que permitan mayor usabilidad.
Zend Framework en cada release nos da nuevas herramientas para llevar esto a cabo, pero el exito que tengamos va a depender de como nostros implementemos estas herramientas.
El sitio que les comentaba es http://www.revistasimportadas.com no hace falta mucha perspicacia para darse cuenta que tambien el nombre el dominio fue elegido para favorecer el SEO.
December 3rd, 2009 Category: Programacion Zend Framework
7 Comments »
Cron para Backup y Optimizacion de tablas con PHP + Zend Framework
Hace mucho no escribía un post, y quiero volver a retomar el habito con este pequeño scripts realizado con Zend Framework para optimizar todas las tablas de una base de datos mysql y además generar un dump por cada tabla, los resultados los vamos a comprimir para que no ocupe espacio innecesario.
Mantener un backup de nuestras tablas es mas que recomendable, uno nunca sabe cuando lo va a necesitar, sobre todo porque es muy fácil implementar un sistema automatico para generar backups como vamos a ver a continuacion.
En este post aunque es corto quiero demostrar que es posible realizar lo siguientes puntos:
1- Correr php desde la consola de linux
2- Correr Zend Framework desde la consola ( si es posible! ) y usar componentes de Zend Framework sin la necesidad de usar MVC, Zend_Application.
3- Realizar backups diarios de sus base de datos.
1- Correr php desde la consola de linux.
Esto espero que no sea una ciencia para ninguno, realmente es muy fácil. Creamos un scripts antes de los tags <?php ?> agregamos #!ruta_de_php en mi caso seria #!/usr/bin/php con esta linea le decimos a quien llamar para ejecutar el código que viene a continuación.
Un ejemplo simple seria el siguiente.
#!/usr/bin/php
echo "Estoy imprimiendo directamente en la consola";
Guardamos el archivo como test.php, y le damos permisos de ejecución con el comando
$ chmod a+x test.php
Ahora lo ejecutamos
$ ./test.php
El resultado es el siguiente
2- Correr Zend Framework desde la consola ( si es posible! ).
Zend Framework mas allá de un montón de herramientas que nos brinda y formas de trabajo. Así como Zend_Application, Estructura de directorios organizadas, MVC, etc tambien nos permite usar sus componentes individualmente.
Si nosotros quisieramos usar Zend_Db, y todos los beneficios que este trae, solo necesitamos una configuracion mínima y listo. Podemos usar Zend_Db sin usar MVC o Zend_Application y mantener nuestra estructura de directorios.
En este caso voy a usar Zend_Db para conectarme a una base y conseguir un listado de tablas.
El código es el siguiente.
#!/usr/bin/php
set_include_path( implode( PATH_SEPARATOR, array(
realpath( 'library' ),
get_include_path(),
)));
require_once( "library/Zend/Db.php" );
/** Conectamos a la base de datos con ZF */
$db = Zend_Db::factory( 'Pdo_Mysql',
array(
'adapterNamespace' => Zend_Db_Adapter,
'dbname' => 'mysql',
'host' => 'localhost',
'username' => 'test',
'password' => 'qwerty'
)
);
$db->getConnection();
$rowset = $db->fetchAll( "SHOW TABLES" );
print_r( serialize( $rowset ));
Para el ejemplo yo use Pdo_Mysql pero puden usar el adapter que quieran. Yo serialize el array $rowset para que sea mas claro en la imagen que se ve a continuacion que muestra todas las tablas que tiene la base de datos mysql.
3- Incentivar a realizar backups diarios de sus base de datos.
Es muy comun que una tabla se rompa o alguien cometa algun error y se pierdan datos o dañe una tabla o toda una base. Hay mil factores que pueden hacer que necesitemos un backup reciente de nuestra base. Si creamos un dump entero de nuestra base cuando queramos recuperar una tabla se nos va a complicar un poco realizar esta tarea sin tener que abrir un archivo que vaya a saber cuando miles de mega ocupe. Por eso es conveniente hacer backup de las tablas individualmente, asi en el caso que tengamos problemas con una sola tabla recuperar esa tabla se hace una tarea facil .
Hacer un script que genere este backup diariamente no es complicado, creamos el scripts, y configuramos el cron para que se ejecute a la hora que tengamos la menor cantidad de visitas.
Este script esta en PHP, en realidad la manera mas optima seria hacerlo en shell scripting pero tambien queria demostrar los 2 puntos anteriores.
Mi script es muy sencillo y es facil de entender. Primero trae todas las tablas de la base que estamos usando. Ejecutamos un optimize para cada tabla, inmediatamente generamos un backup de esa tabla en una carpeta temporal, cuando terminamos de hacer estas acciones con todas las tablas comprimimos la carpeta y borramos la carpeta orginal, para que no ocupe espacio.
Para ejecutar los comandos de linux use noFollow y no me preocupe mucho en validarlo, cada uno puede buscar la forma de optimizar el codigo.
El script cuenta con dos archvios. Un application.ini donde guardo toda la info de la base de datos
config/application.ini
[db]
adapter = Pdo_Mysql
params.adapterNamespace = Zend_Db_Adapter
params.host = localhost
params.username = test
params.password = “qwerty”
params.dbname = mibase
params.port = 3306
params.options.autoQuoteIdentifiers = 0
Y el script completo
#!/usr/bin/php
set_time_limit( 0 );
set_include_path( implode( PATH_SEPARATOR, array(
realpath( 'library' ),
get_include_path(),
)));
require_once( "library/Zend/Config/Ini.php" );
require_once( "library/Zend/Db.php" );
/** Conectamos a la base de datos con ZF */
$applicationConfig = new Zend_Config_Ini( 'config/application.ini' );
$db = Zend_Db::factory(
$applicationConfig->db
);
$db->getConnection();
$rootPath = "/home/backup/db/";
$destination = $rootPath . date("Y.m.d") ;
mkdir ( $destination );
$config = $db->getConfig();
$rowset = $db->fetchAll( "SHOW TABLES" );
foreach ( $rowset as $row ){
/** Optimizamos la tabla */
$query = "OPTIMIZE TABLE " . $row['Tables_in_' . $config['dbname'] ] ;
$db->query( $query );
$path = $destination . "/{$row['Tables_in_' . $config['dbname'] ]}." . date("Y.m.d") . ".sql" ;
/** Generamos un dump de la tabla */
system( "mysqldump --opt -u {$config['username']} -p{$config['password']} -h {$config['host']} {$config['dbname']} {$row['Tables_in_' . $config['dbname'] ]} > $path " );
}
/** Comprimimos la carpeta con los dump de la fecha y borramos la carpeta */
system( "tar zcf {$destination}.tar.gz {$destination}" );
system( "rm -rf $destination" );
$db->closeConnection();
echo "ndone!nn";
Antes de ejecutar el script tienen que crear la carpeta /home/backup/db y darle permisos de escritura
$ sudo mkdir -p /home/backup/db
$ sudo chmod -R a+rw /home/backup/db
lo agregamos al crontab y listo.
$ sudo vim /var/spool/cron/crontabs/root
Agregamos la siguiente linea para que se ejecute todos los dias a las 2:20 am
20 2 * * * /var/www/html/scripts/cronOptimize.php > /dev/null 2> /dev/null
Y listo
Recuerden que tienen que tener instalado php5-cli
$ sudo aptitude install php5-cli





