MadeInFlex
Cairngorm 2.2
Abril 30th, 2007 - [Enlace local]
Hace unos días apareció una pequeña actualización de la micro-arquitectura de patrones Cairngorm. La nueva versión 2.2 la podeis descargar desde su página en Adobe Labs. La principal novedad es la separación del framework base de la parte empresarial representada por los Live Cycle Data Services, de forma que no exitan dependencias. Es decir, ahora tendremos también un Cairngorm Enterprise que usaremos si trabajamos con Live Cycle Data Services.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
White Papers de Arquitectura de Software
Abril 30th, 2007 - [Enlace local]
Pocos pero sustanciosos documentos de arquitectura de Software auspiciados por Cephas Consulting, me da gusto que las empresas compartan su conocimiento en el cyberespacio.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Proceso de Pruebas
Abril 30th, 2007 - [Enlace local]
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Entrevista sobre YARV
Abril 30th, 2007 - [Enlace local]
Vía la sección de reddit de programación (que a pesar de su sistema de filtrado y puntuación, también tiene el mal del exceso de información... ) he encontrado una serie de entrevistas sobre la nueva máquina virtual que ejecutará Ruby: YARV. Responden las dos personas más involucradas en ello, Matz (recordemos, el creador del lenguaje) y a Koichi Sasada, el desarrollador principal.
En la segunda parte de la entrevista se habla de las distintas implementaciones de los entornos de ejecución de Ruby. Por resumir, Koichi dice: "Necesitamos especificaciones, buenos test y buenos benchmarks". Por las bitácoras de barrapunto se ha hablado de ello, porque Robert h Quinn está trabajando en los test, según comentaba en GSoC 2007 : De que va mi proyecto
Sobre todo me ha gustado la tercera parte, sobre el pasado el presente y el futuro de los threads en Ruby.En esta parte se argumentan las razones por las que se abandonó la implementación de threads en espacio de usuario por el uso de los threads nativos del sistema, además de explicar como eso afecta el soporte de continuaciones.
(Hablamos de estas cosas hace unos meses en Noticias sobre Ruby 2.0 (que al parecer no son sobre 2.0 estrictamente...)
"Entrevista sobre YARV" en barrapunto
» Leer más, comentarios, etc...
Variable not found, 0:1
Obtener Guids en .NET (C# y VB.Net)
Abril 30th, 2007 - [Enlace local]
Ya comentaba en otros posts (como este y este otro) qué eran los GUID (Globally Unique IDentifiers), y lo buenos que podían resultar como identificadores de elementos de forma única y universal.
Sin embargo, su utilidad se vería reducida en la práctica si su creación fuera compleja. Pero nada más lejos de la realidad, la obtención de un Guid es extremadamente sencilla:
// C#:
Guid g = Guid.NewGuid(); // Obtiene un nuevo GUID
Console.WriteLine(g); // Lo muestra por consola
' Visual Basic .Net:
Dim g as Guid = Guid.NewGuid() ' Obtiene un nuevo GUID
Console.WriteLine(g) ' Lo muestra por consola
Podemos observar que la clase (estructura) Guid (incluida en el namespace System) contiene un método estático que nos permite generar y obtener objetos de este tipo de forma directa. Además, recordemos que cada vez que generamos un GUID tenemos la seguridad casi absoluta de que será único, lo que hace que podamos utilizarlo directamente como identificador del elemento deseado.
» Leer más, comentarios, etc...
Pensamientos ágiles
Dentro del roadmap de Adobe Apollo
Abril 30th, 2007 - [Enlace local]
En los últimos días he estado investigando sobre Flex y sus Data Services, eso sí, contando siempre con la inestimable ayuda de Carlos Rovira.
Hoy, haciendo un repaso a las noticias del fin de semana he dado con el resumen de una interesante entrevista a Mike Downey, Product Manager de Adobe Apollo en la que cuenta lo que propone el proyecto más ambicioso de Adobe.
Soporte para lectura y visualización de ficheros PDF, soporte de aplicaciones para móviles en la versión 2.0 de la herramienta, habilidad para ejecutar funciones en el cliente, soporte de actualizaciones automáticas progresivas, detección automática de la plataforma, etc. Parece que habrá una versión para Linux, pero sólo el próximo año (y se deja muy en el aire el que no haya retrasos).
La herramienta es prometedora, especialmente si tenemos en cuenta que Flex ha tenido muy buena acogida, aunque quedan en el aire muchas cosas. Una es el soporte multiplataforma que intuyo que va a ser malo (por la nota sobre Linux), otra es el rendimiento en el que parece que no entran.
Por ahora habrá que esperar a la beta.
» Leer más, comentarios, etc...
PHP Senior
Solución Semana 4: “Sistema Modular” (III de V)
Abril 30th, 2007 - [Enlace local]

El punto III de los requerimientos de la Semana 4 decía:
"Clases Abstractas: hacer una lista de todas las clases que no son necesarias instanciarlas en el sistema y que deban ser "abstractas". Explicar la implementación, justificar la selección y la razón de esta decisión."
Veamos algunos conceptos, tenemos la definición de lo que es una Clase Abstracta según Wikipedia:
Clase Abstracta
La herencia permite que existan clases que nunca sean instanciadas directamente. En el ejemplo anterior, una clase "perro" heredaría los atributos y métodos de la clase "mamífero", así como también "gato", "delfín" o cualquier otra subclase; pero que ocurra que en el sistema no haya ningún objeto "mamífero" que no pertenezca a alguna de las subclases. En ese caso, a una clase así se la conocería como Clase Abstracta. La ausencia de instancias específicas es su única particularidad, para todo lo demás es como cualquier otra clase.
También tenemos la explicación técnica según el manual oficial de PHP:
No es permitido crear una instancia de una clase que ha sido definida como abstracta. Cualquier clase que contenga por lo menos un método abstracto debe también ser abstracta. Los métodos definidos como abstractos simplemente declaran el método, no pueden definir la implementación Cuando se hereda desde una clase abstracta, todos los metodos marcados como abstractos en la declaración de la clase padre, deben de ser definidos por la clase hijo; adicionalmente, estos metodos se deben definir con la misma o menor visibilidad.
Bien, ya tenemos los conceptos técnicos definidos, ahora la pregunta sería... ¿cómo las uso? ¿para qué las uso? ¿cuando las uso?
Las estrategias para usarlas, donde usarlas, son:
En el primer caso podemos usar la clase como un esqueleto o un molde que permita solo ser heredada con el argumento de que es tan genérica que es poco probable que se use directamente. Por consiguiente siempre heredaremos de ella, como la clase Persona, para crear objetos más especializados como la clase Usuario. Es poco probable que nuestros sistemas necesiten una clase Persona de forma directa, pero sí la usaremos como molde para crear UsuarioAdmin, UsuarioOperador, etc.
En el segundo caso una clase que no tiene atributos, que sirve como "fachada" para esconder otras clases, por consiguiente no tiene sentido que sea instanciada y se puede usar directamente como una clase, ejecutando sus métodos. También podría ser una clase que sirva de "herramienta genérica" que agrupe un conjunto de funcionalidades que usaremos de manera aislada del resto del objeto. Por ejemplo, podríamos tener una clase Fecha que solo tuviera métodos que reciben valores y luego procesan los resultados, sin necesitar atributos para la clase.
Por eso todas las "fachadas" (Patrón Facade) son generalmente abstractas.
Nota: como no hace falta instanciar la clase para invocar un método, creo una clase "abstracta" y ejecuto directamente la clase e invoco su método, evitando crear una instancia, con la ventaja de tener menos código y no reservar memoria para una variable. La otra ventaja, menos visible pero más importante, es que al obligar por código a hacer que la clase sea abstracta estamos reforzando el diseño de nuestro sistema (nadie podrá usar esa clase de forma directa, evitando un error de desconocimiento por parte de los desarrolladores)
¿Qué se pedía en la letra del problema?
El sentido del requerimiento para esta parte era que buscaran clases que fueran candidatas a convertirse en abstractas basándose en la forma de uso o en que directamente no tenían atributos propios, solo un conjunto de métodos que ofrecen una funcionalidad concreta en cada uno de ellos.
Rápidamente podemos concluir que donde se podría pasar a clases abstractas sería en la Capa de Presentación y las clases claramente candidatas son:
- ConsultarUsuario.class.php
- ListadoDeUsuarios.class.php
- MostrarUsuario.class.php
ConsultarUsuario::ejecutar(); En vez de:
$ConsultarUsuario = new ConsultarUsuario();
$ConsultarUsuario->ejecutar(); ¿Y la clase Index?
Sí, tal vez, actualmente no tiene mucho sentido pues aunque existen dos atributos (título y texto), perfectamente podría evitarse y pasarlos por parámetros directamente al método ejecutar.
¿Y las clases BaseDeDatos y Persona (ambas del framework)?
Estos últimos casos son una decisión de diseño ajustada a un contexto, donde deberemos pensar qué es lo que queremos desarrollar dentro de esta clase y cómo trabajará nuestro sistema. Por el momento no es tan evidente como los casos anteriores, así que no necesariamente esta clase deberá ser abstracta.
Ya está la planilla actualizada, como así también el repositorio con los fuentes y como siempre, en los comentarios de esta entrada se pueden sacar las dudas sobre este tema :-)
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Blogeando en el cyberespacio
Abril 29th, 2007 - [Enlace local]
Algoritmo de aprendizaje ID3: Buen pot en el blog sobre programación lógica sobre el algoritmo de aprendizaje ID3 . Posee links a otras páginas que explican y extienden el tema.
Fuente: Programación lógica
Compilador de PHP para .net: Phalanger es una implementación de PHP que permite incluir código PHP en el entorno del framework .NET de forma rápida y compatible con la mayoría del código PHP.
Fuente: sentidoWeb
Medición y Análisis (CMM - CMMI): Si andas buscando una herramienta para gestionar los procesos del área de Medición y Análisis de CMMI, esta es una muy buena opción, y además gratuita: PSM Insight , que también es conforme con las prescripciones del estándar ISO/IEC 15939.
Fuente: navegapolis
» Leer más, comentarios, etc...
SobreRaíles - Home
Finders dinámicos en ActiveRecord
Abril 29th, 2007 - [Enlace local]
Desde que trabajo con Ruby on Rails de manera intensiva cada día, una de las cosas que más me incordia es abandonar el cómodo entorno de script/console para lanzar la (al menos para mí) menos cómoda interfaz de mysql La razón por la que me veo obligado a hacer esto con cierta frecuencia es para encontrar los ids de los objetos ActiveRecord que me interesan para investigar o depurar alguna funcionalidad. Cuando la aplicación tiene cientos de registros en las tablas, viene muy bien poder hacer consultas por el nombre aproximado con la construcción LIKE de SQL. ActiveRecord nos permite escribir nuestro propio SQL pero como soy un vago me resulta bastante tedioso escribir la condición completa con la sintaxis que pide Rails, así que normalmente ando saliendo de la consola, escribiendo una sentencia SELECT ... LIKE en mysql y volviendo a la consola con el id apuntado.
Hasta hoy, que me he terminado de cansar y he escrito un plugin que permite hacer sentencias LIKE desde ActiveRecord de manera dinámica.
Finders dinámicos en ActiveRecord
Los finders dinámicos de ActiveRecord son una de las primeras perlas de Ruby con las que uno se encuentra cuando investiga las tripas de Rails. Supongo que serán conocidos, pero no está de más repasarlos un poco.
Supongamos que tenemos una clase ActiveRecord mapeada sobre una tabla MyTable con los atributos atributo1, atributo2 y atributo3, sabemos que podemos escribir:
Mytable.find_by_id(87) |
Y ActiveRecord tratará de encontrar el registro identificado con el id 87. No parece nada del otro mundo, porque entre otras convenciones ActiveRecord asume que la clave primaria en nuestras tablas será una columna llamada id, por lo que podría ser que existiese un método find_by_id en ActiveRecord::Base
Pero resulta algo más sorprendente toparse con que sentencias como:
Mytable.find_by_atributo1('Valor') |
también funcionan. Aquí comienza a saborearse el dinamismo de Ruby, y podemos asumir que ActiveRecord, de manera astuta, construye tantas funciones Mytable::find_by_... como atributos tengamos en la tabla, que lanzarán la correspondiente consulta SQL a la base de datos.
Pero.. ¡un momento!
1 2 |
Mytable.find_by_atributo1_and_atributo3('Valor', 58) Mytable.find_by_atributo1_and_atributo2_and_atributo3('Valor',58,'Valor3') |
¡También! funcionan. Y sería ridículo pensar que ActiveRecord construye funciones de manera dinámica para todas las combinaciones posibles de los atributos (y, además, en cualquier orden que queramos)
Nuestro propósito es añadir más finders dinámicos, que en lugar de búsquedas exactas hagan búsquedas aproximadas, invocándose de la siguiente manera:
Mytable.find_like_atributo1('al')
Para hacerlo, tenemos que entender bien qué hace ActiveRecord con estas misteriosas funciones dinámicas…
La magia de method_missing
A estas alturas ya nos imaginamos que no se añaden métodos para cada atributo, sino que hay algún otro mecanismo actuando en este caso. Se trata de method_missing que es el método que ejecuta una clase Ruby cuando se le invoca un método que no tiene implementado. Aquí podeis ver otro uso muy creativo de method_missing
ActiveRecord se aprovecha de method_missing para articular los finders dinámicos. Si abrís el fichero lib/active_record/base.rb vereis que la clase ActiveRecord::Base define un method_missing muy especial (si no estais viendo ese código, hacedlo ahora: leer código del core de Rails es siempre un ejercicio inspirador). Este método se activa cuando llamamos a Mytable.find_by_attributo('valor'), y lo primero que hace es comprobar con una expresión regular si el método invocado tenía la pinta find_by o find_all_by, en cuyo caso pasa a construir una sentencia SQL de búsqueda según los atributos y parámetros recibidos. Parece evidente que nosotros tendremos que puentear este método y hacer algo parecido por nuestra cuenta pero construyendo sentencias SQL con el modificador LIKE.
Cómo construir nuestro propio finder
Lo primero es preparar un plugin, lo cual es tan fácil como crear un directorio find_like en vendor/plugins, y ahí escribiremos un fichero init.rb con el siguiente contenido:
require 'find_like' |
A continuación, creamos el directorio vendor/plugins/find_like/lib y ahí pondremos el código de nuestro plugin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
module ActiveRecord class Base class << self private def construct_conditions_from_like_arguments(attribute_names, arguments) conditions = [] attribute_names.each_with_index{ |name, idx| conditions <<= "#{table_name}.#{connection.quote_column_name(name)} LIKE '%%" << arguments[idx] << "%%'"} [conditions.join(" AND "), *arguments[0..attribute_names.length]] end alias_method :previous_method_missing, :method_missing def method_missing(method_id, *arguments) if match = /find_(all_like|like)_([_a-zA-Z]\w*)/.match(method_id.to_s) finder = (match.captures.first == 'all_like' ? :find_every : :find_initial) attribute_names = extract_attribute_names_from_match(match) super unless all_attributes_exists?(attribute_names) conditions = construct_conditions_from_like_arguments (attribute_names, arguments) options = {:conditions => conditions} set_readonly_option!(options) send(finder, options) else previous_method_missing(method_id, *arguments) end end end end end |
El código más o menos es fácil de seguir: usamos class << self para abrir la clase ActiveRecord::Base y modificar sus propias tripas. Dado que estamos volviendo a escribir el método method_missing no querremos perder la funcionalidad ofrecida por el method_missing originalmente incluido con ActiveRecord::Base (el que veíamos antes en base.rb) así que simplemente haremos un alias a este método y lo llamaremos desde nuestro method_missing si detectamos que el método invocado no es uno de los que nosotros queremos controlar (find_like o find_all_like)
Tras esto, podemos lanzar una consola y comprobar que, por arte de birlibirloque, ya tenemos nuestros finders operativos:
1 2 3 4 5 6 7 8 9 |
Tamarindo:~/src/repos/dconrails juan$ script/console development Loading development environment. >> Algoritmo.find_all_like_nombre("oyal") => [#<Algoritmo:0x245c908 @attributes={"status"=>"BEGIN", "nombre"=>"RoyalRoadDemo"}>, #<Algoritmo:0x245c82c @attributes={"status"=>"RUN", "nombre"=>"RoyalRoad2">] >> Algoritmo.find_all_like_nombre_and_status("oyal", "UN") => [#<Algoritmo:0x243dabc @attributes={"status"=>"RUN", "nombre"=>"RoyalRoad2"}>] |
» Leer más, comentarios, etc...
Navegapolis
Gratis para el área de Medición y Análisis (CMM - CMMI)
Abril 29th, 2007 - [Enlace local]
Si andas buscando una herramienta para gestionar los procesos del área de Medición y Análisis de CMMI, esta es una muy buena opción, y además gratuita: PSM Insight, que también es conforme con las prescripciones del estándar ISO/IEC 15939.
No es un programilla para instalarlo y probar por probar, ni tampoco para ponerlo en la empresa por implantar algo, pero si se trabaja con modelos de procesos tipo CMMI o 15504, y no se han puesto por por moda, sino por convencimiento y por eltipo de proyectos; este es un buen programa.
» Leer más, comentarios, etc...
fetishcode
Instalar Beryl es facil .Si sabes como
Abril 29th, 2007 - [Enlace local]
Pero acabo de encontrar dos formas verdaderamente sencillas de instalar beryl.
La primera, mediante Automatix2 Bleeder, este se puede descargar desde Synaptic e instalaremos beryl como cualquier otro programa.
La segunda, y la que yo he usado(la primera me dio problemas con los drivers de la tarjeta garfica) la podeis encontrar en: plinux.wordpress.com
Importante
Les adelanto un resumen:
-Agregar los repositorios de beryl en /etc/apt/sources.list :
deb http://www.beerorkid.com/compiz edgy main-edgy
-Seguidamente:
wget http://www.beerorkid.com/compiz/quinn.key.asc -O - | sudo apt-key add -
-Actualiza la lista de repositorios:sudo apt-get update
-Instalamos beryl:sudo apt-get install beryl emerald emerald-themes
-Finalmente reiniciamos el ordenador
» Leer más, comentarios, etc...
Buayacorp
Web 2.0 Hacking, Defending Ajax & Web Services
Abril 28th, 2007 - [Enlace local]
El título hace referencia a una presentación de Shreeraj Shah hecha en el evento HITB 2007 - Dubai.
Este material se complenta bastante bien con el que puse la semana anterior sobre XSS, CSRF y Ajax Hacking, espero que lo disfruten
» Leer más, comentarios, etc...
Blog de Diego Gómez Deck
¡Ladran Sancho! Señal que cabalgamos…
Abril 28th, 2007 - [Enlace local]
¡Cómo me gusta que esta gente se ponga nerviosa!
Véanlo ustedes mismos, en barrapunto: Microsoft y Extremadura
» Leer más, comentarios, etc...
avemundi
presentando findemes
Abril 28th, 2007 - [Enlace local]
Findemes es mi nuevo programa que estará en breve en fase beta disponible para probar. Se trata de un programa de contabilidad personal que permite controlar los ingresos y gastos que tengamos. El programa es multiactividad, podemos tener ingresos y...
» Leer más, comentarios, etc...
Buayacorp
XSS en el tema Kubrick de Wordpress
Abril 27th, 2007 - [Enlace local]
Kubrick, tema por omisión de Wordpress, es vulnerable a ataques CSRF, esto tiene como consecuencia que un atacante pueda almacenar HTML arbitrario en sus opciones, si alguno de ustedes usa este tema, puede probar los siguientes ejemplos (o variantes) para determinar si su blog se ve afectado o no por este problema.
XSS persistente que sólo funciona en IE http://localhost/wp/wp-admin/themes.php?page=functions.php&action=save&fontcolor=expression(alert(document.cookie)) XSS persistente, funciona en todos los navegadores: http://localhost/wp/wp-admin/themes.php?page=functions.php&action=save&headerimage='--></style><script>alert(document.cookie)</script>
Es muy probable que otros temas también sean vulnerables a este tipo de ataques, por lo cual, si vuestro blog les importa, deben tener cuidado con los plugins y temas que instalan o usan.
» Leer más, comentarios, etc...
Null Pointer Exception
El curioso comportamiento del indice de google
Abril 27th, 2007 - [Enlace local]
Llevo un tiempo observando que Google no acaba de incluir en su índice la página que hice hace tiempo con la ayuda del Custom Search Engine del propio google para fabricar un buscador de cursos de java "a medida" ( Cursos de Java ) y me extrañaba que tardara...
» Leer más, comentarios, etc...
Null Pointer Exception
El curioso comportamiento del indice de google
Abril 27th, 2007 - [Enlace local]
Llevo un tiempo observando que Google no acaba de incluir en su índice la página que hice hace tiempo con la ayuda del Custom Search Engine del propio google para fabricar un buscador de cursos de java "a medida" (Cursos de Java) y me extrañaba que tardara tanto en hacerlo, sobre todo teniendo en cuenta que había detectado varias visitas provenientes de otros buscadores como yahoo, msn, ask jeeves, etc., aunque la mayoría de las visitas vienen provenientes de los enlaces que hay en este blog.
Es más, hoy he comprobado que en algunos de estos buscadores, como por ejemplo yahoo, la web está bastante bien posicionada para algunas búsquedas interesantes. Por ejemplo para la búsqueda 'cursos de java' aparece en quinta posición, para la búsqueda 'cursos sobre java' aparece en tercera posición y si buscamos 'cursos de java me' entonces Cursos de Java aparece en primera posición !!.
Esto me hace preguntarme ¿qué le pasa a google? En teoría la pagina contiene un buscador CSE, y eso google lo sabe, por lo tanto cuantas más visitas tenga la página más ingresos obtendrá google (y yo, pero yo no vivo de esto y google si
), así que no entiendo muy bien las causas por las que la web no está incluida en el índice de google, y más aún teniendo en cuenta que en otros buscadores si aparece y con bastante éxito (acabo de comprobar que los resultados de msn son muy parecidos a los de yahoo). A lo mejor es que a estos chavales les sobra el dinero ...
» Leer más, comentarios, etc...
Buayacorp
Exportar reportes a PDF desde código
Abril 27th, 2007 - [Enlace local]
A partir de Visual Studio 2005, se incluyeron nuevos controles (ReportViewer) y clases (LocalReport, ServerReport, etc) con los cuales se pueden diseñar reportes tanto para aplicaciones de escritorio como para aplicaciones Web.
Una característica útil de estas nuevas clases, al igual que los reportes diseñados en Crystal Reports, es que permiten automatizar el proceso de conversión de los reportes a diferentes a diferentes formatos: MS Excel, PDF e Imagenes (en formato TIFF).
Revisando documentación acerca de este conjunto de clases encontré un ejemplo publicado por Raj Kaimal que justamente exporta los reportes a formato PDF desde ASP.NET usando el método Render de la clase LocalReport:
private void RenderReport() { LocalReport localReport = new LocalReport(); localReport.ReportPath = Server.MapPath("~/Productos.rdlc"); ReportDataSource reportDataSource = new ReportDataSource("Ejemplo_Productos", GetData()); localReport.DataSources.Add(reportDataSource);string reportType = "PDF";string mimeType; string encoding; string fileNameExtension; //The DeviceInfo settings should be changed based on the reportType //http://msdn2.microsoft.com/en-us/library/ms155397.aspxstring deviceInfo ="<DeviceInfo>" +" <OutputFormat>PDF</OutputFormat>" +" <PageWidth>8.5in</PageWidth>" +" <PageHeight>11in</PageHeight>" +" <MarginTop>0.5in</MarginTop>" +" <MarginLeft>1in</MarginLeft>" +" <MarginRight>1in</MarginRight>" +" <MarginBottom>0.5in</MarginBottom>" +"</DeviceInfo>";Warning[] warnings; string[] streams; byte[] renderedBytes; //Render the report renderedBytes = localReport.Render( reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); Response.Clear(); Response.ContentType = mimeType; Response.AddHeader("content-disposition", "attachment; filename=productos." + fileNameExtension); Response.BinaryWrite(renderedBytes); Response.End(); }
En la primera porción de código resaltada, reportType puede tomar los siguientes valores: PDF, Excel o Image; los valores para deviceInfo varían de acuerdo al formato que se use y están documentados en MSDN
Por si alguien está interesado, he preparado un pequeño ejemplo basado en el código mostrado.
» Leer más, comentarios, etc...
Pensamientos ágiles
La reina de las transacciones
Abril 26th, 2007 - [Enlace local]
Curioseando por blogs relacionados con mi trabajo, he llegado a esta entrada de Chris Skinner, donde explica algunos detalles sobre lo que podríamos llamar la compañía reina de las transacciones.... Visa.
Algunos datos que quitan el hipo:
- 1.6 billones de tarjetas en circulación.
- 6.803 transacciones por segundo en hora punta.
- 56.3 billones de transacciones en el 2006.
- 4.5 trillones de dólares en volumen transaccional el pasado año.
- Su red se ha construido sobre 9 millones de millas de cable que se extienden a lo largo de todo el mundo.
Por último, siguiendo las cuentas de Mr. Skinner parece que Visa procesa... ¡más transacciones en un minuto en hora punta que todas las bolsas del mundo!
Bueno, esto habría que corroborarlo la verdad, porque la cifra de transacciones por segundo con la que se hace el cálculo es en la hora punta del año, es decir en Navidad. Pero vamos, que desde luego las cifras marean.
Sería muy interesante encontrar material donde explique las arquitecturas para manejar este monstruo transaccional. Si alguien lo tiene... ya sabe :)
» Leer más, comentarios, etc...
PHPBSD.net
Instalación del APC (Alternative PHP Cache) sobre FreeBSD
Abril 26th, 2007 - [Enlace local]
Como prometía en el post dedicado a la optimización de ADOdb voy a explicar como instalar el sistema de cache APC sobre un servidor FreeBSD 6.x. El APC (Alternative PHP Cache) es un sistema de cache de opcode para PHP, sirve para cachear el código intermedio del PHP y así no tener que interpretar todos los scripts en cada ejecución. Para almacenar este código “compilado” se usa la memoria compartida del sistema. A parte el APC nos ofrece funciones para poder almacenar y recuperar datos de cache.
El APC es una extensión PECL que no viene incluida por defecto con el PHP (esto cambiará con la futura versión 6). A continuación describo como instalar y configurar el APC sobre FreeBSD.
[1] Instalar el port
Suponiendo que tenemos instalado y funcionando un servidor web (Apache+PHP) sólo nos falta añadirle la extensión PECL con:
# portinstall pecl-APC
Si no trabajas con portupgrade:
# cd /usr/ports/www/pecl-APC/
# make install clean
Con esto compilamos e instalamos el APC. Si todo va bien acabará el proceso y podremos ver esta nueva linea en el archivo /usr/local/etc/php/extensions.ini:
extension=apc.so
Cuando lo compilas se dan a escoger tres opciones: MMAP, SEMAPHORES y PHP4_OPT. Es aconsejable seleccionar sólo MMAP y si trabajas con PHP4 la última también. La opción de SEMAPHORES dependiendo de tu sistema puede provocar cierta inestabilidad y no ofrece muchas mejoras en rendimiento.
La última versión del APC (pecl-APC-3.0.14) se compila siempre con soporte mmap aunque desactives la opción (o esto es lo que me pasa a mi en los servidores bajo FreeBSD).
Ahora sólo falta configurar correctamente las directivas apropiadas en el php.ini y un restart (o reload) del Apache.
[2] Configurando el APC
La configuración por defecto del APC es apropiada en muchas situaciones aunque bajo FreeBSD deberíamos configurar correctamente el tamaño de memoria compartida. Esto se consigue con las siguientes directivas:
apc.shm_segments=1
apc.shm_size=32
En FreeBSD el tamaño de memoria compartida por defecto es de 32MB. Puedes optar por aumentarlo o por dejarlo igual y usar varios segmentos configurando la directiva apc.shm_segments. Para aumentar el tamaño de la memoria compartida a 128MB en FreeBSD:
# sysctl kern.ipc.shmmax=134217728
Si quieres conservar este valor después de reiniciar el sistema puedes añadirlo en /etc/sysctl.conf.
También hacer notar en este punto que con la última versión del APC bajo FreeBSD no permite usar varios segmentos de memoria compartida y estás obligado a sólo usar un segmento, si necesitas más memoria debes aumentar el tamaño de memoria compartida del sistema.
El resto de directivas de configuración dependen mucho del tipo de aplicación PHP. Dependiendo del número de visitas, cantidad de archivos a cachear, frecuencia de cambio de los archivos, etc. Una configuración de ejemplo con pequeñas notas acerca del significado de las directivas usadas (en el archivo /usr/local/share/doc/APC/INSTALL tienes todas las directivas disponibles detalladas):
; Activa el APC
apc.enabled=1
; Número de segmentos de memoria compartida
apc.shm_segments=1
; Tamaño de la memoria compartida
apc.shm_size=128
; Un número aproximado de archivos fuente a cachear
apc.num_files_hint=6000
; Un número aproximado de variables a cachear
apc.user_entries_hint=100
; Segundos que dejamos en cache una entrada que ya no se usa
apc.ttl=600
; Idem al anterior pero para las variables de usuario
apc.user_ttl=600
; Segundos que dejamos una entrada cacheada en el recolector de basura
apc.gc_ttl=0
; Indica si se cachea por defecto.
apc.cache_by_default=On
; Expresiones regulares para saber que archivos cacheamos
; Resulta útil si se usa en combinación con la directiva anterior
apc.filters=”"
; Indica si se activa el APC para el modo CLI del PHP
apc.enable_cli=0
; Indica el tamaño máximo de archivos a cachear
apc.max_file_size=1M
; Indica si el APC ha de verificar si los archivos han sido modificados
; para actualizar la cache
apc.stat=1
De todos los cacheadores de código que he usado APC es con diferencia el más estable aunque no es perfecto. En situaciones de mucho tráfico y si constantemente estás cambiando los archivos al final consigues un fantástico segfault del Apache. Una gran opción si dispones de una aplicación que no está en constante desarrollo es usar la directiva apc.stat a 0, con este parámetro consigues mucha más estabilidad.
Es un gran invento y es muy recomendable su uso, puedes llegar a ver loads de CPU reducidos al 50% y ganar un 20% de memoria. Pero como todo tiene bugs y al menos yo en el escenario donde lo uso (decenas de millones de páginas vistas por mes + clúster de decenas de servidores BSD) es un tanto inestable en ciertas situaciones… pero mucho más estable que algo como EAccelerator el cual en el anterior escenario no aguanta ni 5 minutos.
Si usas APC sobre FreeBSD en webs con mucho tráfico y no tienes ni un segfault nunca… no te cortes y comenta que directivas/opciones estás usando.
En un siguiente post explicaré como usar las funciones que proporciona el APC para almacenar datos de aplicación en cache.
Etiquetas en Technorati: apc, articulos, bsd, cache, documentos, freebsd, howto, php, programacionapc, articulos, bsd, cache, documentos, freebsd, howto, php, programacion
» Leer más, comentarios, etc...
Navegapolis
Software libre por política de gobierno
Abril 26th, 2007 - [Enlace local]
Hoy, Rafael Correa , presidente de la República de Ecuador, ha grabado y colgado en Youtube el siguiente vídeo con el mensaje que presentará pasado mañana en las sedes del Festival Latinoamericano de Instalación de Software Libre : Argentina, Bolivia, Brasil, Chile, Colombia, Costa Rica, Cuba, Ecuador, El Salvador, Guatemala, Honduras, México, Nicaragua, Panamá, Paraguay, Perú, Uruguay y Venezuela.
En él dice cosas como: "es necesario que todos adoptemos, tanto a nivel público cuanto a nivel privado, el software libre". "El Gobierno ecuatoriano ya lo estableció como una política de Gobierno y de Estado".(?)
» Leer más, comentarios, etc...
Navegapolis
Cronómetro y registro del tiempo empleado en cada tarea
Abril 26th, 2007 - [Enlace local]
Open source, gratuito, funciona en Windows y en Linux (en cualquier sistema con máquina virtual java), es un simple fichero "jar" de 296 Kb. que no necesita instalación, se puede llevar en una memoria USB y hereda el idioma configurado en el operativo (hay ocho disponibles, entre los que está el español).
Para cronometrar, registrar y consultar el tiempo invertido en cada tarea. Es bastante configurable y fácil de usar.
» Leer más, comentarios, etc...
MadeInFlex
Curso de Flex en Sevilla
Abril 26th, 2007 - [Enlace local]
Método Profesional junto con Made In Flex ofrecen el curso Flex Profesional nivel 1 pionero en la región de Andalucía.
» Leer más, comentarios, etc...
Pensamientos ágiles
Flex será Open Source
Abril 26th, 2007 - [Enlace local]
Lo leo en Made in Flex que Flex será Open Source. No se liberan todas las herramientas ni el IDE sino que tan sólo el SDK, por ahora. De todos modos, parece un movimiento muy inteligente por parte de Adobe y que sin duda le dará todavía más momento a la plataforma.
Este es el anuncio oficial y felicidades a todos los Flexadictos!
» Leer más, comentarios, etc...
Joan Garnet
Adobe Flex Open Source
Abril 26th, 2007 - [Enlace local]
No es una broma no… la gente de Adobe ha decidido abrir el código del SDK de Flex (no el FlexBuilder) bajo la licencia MPL. Esto es: las librerías AS3 y el compilador mxmlc.
A finales de este año la transición total será efectiva.
Enlaces: * Adobe to Open Source Flex [vía MIF]

