melkorcete.com
Convertir saltos de linea
Agosto 31st, 2006 - [Enlace local]

print $fila["Columna"], no respetaba los saltos de carro (tecla enter) que no fueran creados en XHTML con <br />. A partir de ahora no tendras ese problema, sólo tienes que usar esta función:
$resultado = mysql_query("select * from posts where idpost = 2") or die (mysql_error());
$fila = mysql_fetch_array($resultado);
// Si solo quereis convertir el /n en <br /> :
print nl2br( $fila["POST"]);
// Si ademas quereis convertir el XHTML para evitar que se interprete:
print nl2br(htmlentities($fila["POST"]));
A los que os preocupe un posible fallo de validación de XHTML, no os preocupeis, se renderiza con
<br /> no con <br> así que es perfectamente válido. Artículos Relacionados:
- 20 Ago # Como crear un RSS para tu página (y II)
- 29 Ago # Enlaces para enviar a las Comunidades
Technorati Tags: Programming, PHP, MySQL, XHTML» Leer más, comentarios, etc...
AlexdwBlog()
GridEditor 1.0
Agosto 31st, 2006 - [Enlace local]
Después del post sobre el uso de remoting para realizar consultas a bases de datos se me ocurrió que en numerosas ocasiones necesitamos cargar datos pero no deseamos que aparezcan en el Datagrid. En nuestro caso podríamos desear que no apareciese el dato usuarioID, pero este es necesario que lo tengamos para posteriormente poder eliminar [...]
» Leer más, comentarios, etc...
melkorcete.com
Feliz BlogDay2006
Agosto 31st, 2006 - [Enlace local]

Buayacorp. Me encanta, trata los artículos con mucho mimo para que lleguen a todos los públicos. Me encantó su reciente iniciativa de sortear un voucher para una certificacón de Microsoft. Recomendable sin duda para todos.
Anieto2k. ¿Qué decir que no se sepa ya? La he descubierto gracias al Planet Webdev y desde entonces soy un lector asiduo. Me encanta su diseño y su visión de la Programación Web. Sus artículos te traerán lo más novedoso de nuestro mundillo de forma clara y con ejemplos.
Recortex. Aunque no sea un Blog propiamente dicho, es uno de mis fijos en el RSS. Directorio de Códigos con explicaciones y a disposición de todos los visitantes. Todo el material a tu disposición. (Por cortesía de Juanjo Navarro)
ASP.NET. Por motivos de trabajo, me aficione a este directorio donde la gente sube sus artículos relacionados con el ASP.NET. Muchos me han sido de gran utilidad, o me han dado ideas para otros métodos. Sinceramente recomendado a todos aquellos que se dediquen al .NET
El cajón Desastre. Esta es la nueva web de mi gran amigo dubas. Se centra en programación más que en diseño. Contenidos muy currados, sin dejar nada al azar. Aprende todo lo que tiene que enseñarnos, ¡que es mucho!
Technorati Tags: BlogDay2006, Programming» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
El IDE ha muerto viva el ISE
Agosto 31st, 2006 - [Enlace local]
La noticia la encontré en el Blog de Arquitectura Orientada a servicios, ampliamente recomendado.
powered by performancing firefox
» Leer más, comentarios, etc...
el feRoRcarril
Problemas con pruebas en Rails
Agosto 31st, 2006 - [Enlace local]
Hace poco, con la publicación de PatchServer y toda la pesca, me puse a juguetear con las pruebas de Rails, para actualizar las que tenía y escribir algunas nuevas.
En general todo fue más o menos bien, excepto dos cosas:
Tenía problemas para crear una vista en el volcado de la base de datos de pruebas funcionales, ya que no puede estar dentro del
db/schema.rb(yo lo podría haber añadido a mano, pero al siguienterake migratese iba a borrar, así que vaya gracia).Dos de las pruebas funcionales me fallaban con un error interno de
Test::Unit. Los dos errores daban en unassert_redirect_to. Mu raro.
Crear una vista en el volcado de pruebas
Después de estar investigando un rato, vi que una solución podía ser crear la vista a mano (no me gusta, porque viola el DRY, pero ahora mismo, el uso de vistas y otras cosas no muy «Raileras» suele llevar a problemas así).
El caso es que no parecía haber soluciones mucho mejores, así que investigué cómo era, y resultó ser bastante sencillo: simplemente añadir un nuevo trozo de código para la tarea db:test:prepare del Rakefile. Y hacer eso es tan fácil como crear un fichero *.rake en el directorio lib/tasks, tal que así:
namespace :db do
namespace :test do
task :prepare do |t|
ActiveRecord::Migration.execute <<EOS
CREATE VIEW patch_view AS SELECT patches.*, ...
EOS
end
end
end
Problema 1 solucionado. Ahora quedaba, con todas las demás pruebas funcionales dando positivos, ver por qué quedaban dos que fallaban.
Problema con el assert_redirect_to
El error que daba era algo así:
1) Error:
test_add_item(PatchesControllerTest):
RuntimeError: The number of parameters does not match the number of substitutions.
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:92:in `assert_redirected_to'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:313:in `clean_backtrace'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:74:in `assert_redirected_to'
./test/functional/patches_controller_test.rb:49:in `test_add_item'
2) Error:
test_update(PatchesControllerTest):
RuntimeError: The number of parameters does not match the number of substitutions.
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:92:in `assert_redirected_to'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:313:in `clean_backtrace'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:74:in `assert_redirected_to'
./test/functional/patches_controller_test.rb:67:in `test_update'
14 tests, 48 assertions, 0 failures, 2 errors
rake aborted!
Command failed with status (1): [/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby...]
(See full trace by running task with --trace)
Lo cual no tenía ningún sentido para mí. Entonces, busqué en Internet el error, a ver si le había pasado a alguien…. y nada :-( Así que seguí mirando, y me di cuenta de que había otras llamadas a assert_redirect_to que no fallaban… ¿qué diferencia había entre unas y otras?
La diferencia era que las dos que fallaban necesitaban una sesión abierta con un usuario con permisos apropiados. Jur.
Si a alguien le pasa, espero que encuentre esta entrada :-) Ahora, a ver cómo creo una sesión de pega para que la aplicación de pruebas se lo crea…
ACTUALIZACIÓN (2006-08-31): Se me olvidó comentar que, para el que no use o no conozca la de objetivos útiles que tiene el Rakefile que viene de serie con los proyectos Rails, hay una orden muy interesante: rake --tasks. Más sobre esto en el wiki de Rails, en WhatIsRakeAndWhatDoesItDo.
» Leer más, comentarios, etc...
Buayacorp
ClickOnce y Firefox
Agosto 31st, 2006 - [Enlace local]
La implementación ClickOnce permite publicar aplicaciones basadas en Windows en un servidor Web o en recurso compartido de archivos de red para simplificar la instalación. Visual Studio ofrece compatibilidad total para la publicación y actualización de aplicaciones implementadas con ClickOnce. La implementación ClickOnce está disponible para los proyectos creados con Visual Basic, Visual C# y Visual J#, pero no para Visual C++
Fuente: MSDN.
Leyendo uno de los mensajes de la lista de desarrollo de mono, me enteré que existe -desde hace un buen tiempo- una extensión para Firefox, que permite instalar las aplicaciones desplegadas con ClickOnce de una manera similar a lo que se hace con IE.

Sin duda una extensión muy útil para los zealots de .NET y Firefox.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Crea documentos PDF con .NET
Agosto 31st, 2006 - [Enlace local]
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Aprediendo SCRUM
Agosto 30th, 2006 - [Enlace local]
Planificación del Sprint
El Sprint BackLog
El Daily Meeting
Otros links que he encontrado muy interesantes desde su blog son:
Five signs of trouble in an Iteration
An XP Team Room
» Leer más, comentarios, etc...
design-nation.blog/es
Aplicaciones multiusuario con Unity ( y actionscript y xml )
Agosto 30th, 2006 - [Enlace local]
Hace poco, y tras una demostración, a la empresa le entró el proyecto de una aplicación multiusuario. Una comunidad virtual que recientemente vio la luz ( y de qué manera, con anuncio en el telediario de la cadena incluido ).
Como ya se había utilizado tanto para la demo, como para un proyecto interno de la empresa, se decidió utilizar Unity Socket Server, y UClient, el set de librerías AS2 desarrolladas por Colin Moock,( el autor de los famosos libros de actionscript ) para trabajar con Unity. El resultado: fabuloso. A pesar de ciertos fallos, que según reflejaba Colin en la lista de correo, se corregirán en la versión 3 de Unity, me parece un servidor fabuloso. Eso sí, hay ciertas pegas o al menos una gran pega. A pesar de que la API está relativamente bien documentada ( desde luego mucho mejor que mis desarrollos ( documentando v1 / documentando v2 ) ), los tutoriales son muy escasos y relacionados con aplicaciones muy básicas y sencillas. El desarrollo de una aplicación tan grande ( en cuanto a complejidad y comprensión del servidor ) ha sido muy costoso.
Algunas características de UClient son:
- Uso del paradigma MVC
- Envío y recepción de eventos, mediante el Modelo de Delegación de Eventos
- Desarrollado por tanto pensando en interfaces y no en la implementación concreta de las clases, lo que es fabuloso y permite una flexibilidad enorme.
Algunas características del desarrollo para la aplicación son:
- Separación de la lógica de la aplicación en tres grandes áreas:
- Motor principal que se encarga de gestionar las comunicaciones entre cada una de las zonas de la aplicación, sin que ninguna de ellas tenga que saber de la existencia de las otras.
- Zona de comunicaciones con el servidor de sockets. Expresamente desacoplada del resto de la aplicación y comunicada con la misma mediante la emisión de eventos permitiendo una "relativamente fácil" migración a otro servidor de sockets si fuese necesario, de forma que afectase mínimamente al resto de la aplicación ( En caso de realizarse dicha migración, posiblemente se hiciese mediante un adapter a la clase que extiende de Uclient, que a diferencia de lo que ocurre en los ejemplos de Unity, no es la clase principal de la aplicación )
Además este desacoplamiento y comunicación por eventos, permite perfectamente el uso de estas clases en otros proyectos sin necesidad de modificar nada ( acaso creando alguna clase que extienda de alguna de estas para sobreescribir algún método concreto )
- Zona isométrica. Que se encarga de gestionar toda la isometría. Emite eventos que son recibidos por el motor principal que se los envía a la zona de comunicaciones. Cuando se reciben eventos desde el servidor en la zona de comunicaciones, esta se la envía mediante eventos al motor principal que se la envía a su vez a la zona isométrica. De nuevo, esta zona al estar desacoplada de las demás, es altamente reutilizable en otros proyectos multi o mono usuario que requieran de la perspectiva isométrica.
- Uso extensivo de interfaces.
- Uso de factorías abstractas ( y por tanto de interfaces ) de creación de elementos
- Uso de callbacks
- El uso de los interfaces y las factorías , permite, tener diferentes salas ( en cuanto a comportamientos ) , con más o menos cuadrículas, con más o menos tipos de celdas, etc.. sin necesidad de tocar código del motor principal isométrico, sino estableciendo el valor de unos parámetros en la clase principal de cada sala ( que extiende de la clase isométrica general, que a su vez implementa el interface de isometría )
- El uso de máquinas de estados para los elementos de la aplicación ( típicamente los avatares de los usuarios ). Todas las máquinas de estados, se conectan a un único engine. Esto quiere decir, que aunque tenga 30 usuarios en pantalla, tengo un único enterframe que controla las 30 máquinas de estado. Lo que evidentemente, es muy óptimo para el procesador.
- Completa separación del chat de texto de los grafismos de las salas, siendo una capa y una película independiente. Esto permite construir salas de chat que no tengan la representación isométrica, sin tocar código.
- Gracias al departamento de animación, y a diferencia de lo que suele ser habitual en estas comunidades, personajes realistas.
Conclusión. Otro desarrollo costoso ( ha sido como un parto ). Pero por primera vez en mi vida como desarrollador ( en lo que a proyectos muy grandes se refiere ) estoy muy contento con los códigos realizados. La aplicación no solo es robusta, sino que es muy fácilmente extensible, gracias al ya comentado uso de interfaces. La abstracción y desconocimiento de unas zonas de la aplicación por otras, ayuda muy mucho en esto.
Hay desarrollos en los que el resultado final es muy vistoso, pero el código no es extensible o es directamente código espagueti. En este caso no solo estoy contento con el resultado, sino que también estoy muy satisfecho con los códigos. Baste decir una cosa. Aunque la comunidad ha visto la luz ahora, se desarrolló en enero y febrero. El caso es que dada la favorable acogida que ha tenido por los usuarios a los que iba dirigida ( el cliente está como se dice coloquialmente "que no mea" ), está en proceso el desarrollo de más salas, y a pesar de haber pasado seis meses, y haber tirado miles de línea de código entre medias, no estoy teniendo dificultades en añadir los nuevos contenidos ( vamos, que me sorprendo hasta yo mismo a medida que repaso los códigos de lo bien que estaba ).
Así que ya saben, a tunear el coche del neng, que es lo que me da de comer. ;D
( Como verán hago mucho hincapié en el uso de interfaces. En los cursos avanzados de programación que he impartido he notado como la mayoría de los flasheros, o no sabían lo que era un interfaz, o se habían quedado en la definición "es un contrato que obliga a desarrollar los métodos en la clase que implementa el interfaz que los declara" sin ir más allá. Si me permiten un consejo, investiguen más, esfuércense y entiendan el polimorfismo a través de interfaces. Cuando pasar un interface como parámetro, o tipar un objeto no como el tipo de la clase de la que es instancia, sino como tipo interface implementado por esa clase, sea parte habitual de su trabajo, vivirán mucho más felices, al menos si tienen que realizar desarrollos grandes o pretenden reutilizar códigos entre proyectos )
» Leer más, comentarios, etc...
design-nation.blog/es
Motor de aventuras gráficas con AS2 y XML ( version 2 )
Agosto 30th, 2006 - [Enlace local]
En una entrada anterior, hablamos del desarrollo de un motor para aventuras gráficas, con ActionScript 2 y gestionado completamente por XML, que permitía una muy rápida generación de aventuras gráficas.
Con aquel motor, y si no me engaña la memoria, fueron 26 los cdroms que se realizaron ( entre castellano, catalán, valenciano y gallego ) en 4 meses.
En el momento de escribir esta entrada, ya son varios los cdroms ( en diferentes lenguas ) que han salido con la "versión 2" del motor.
¿ En qué consiste ?. Repasemos primero lo que ofrecía la versión 1.
- Todos los textos genéricos del cdrom, estaban en un xml de configuración ( textos como por ejemplo: "Nombre", "Contraseña", "¿Es la primera vez que juegas?", "El nombre o contraseña introducidas no son correctas. Si es la primera vez que juegas regístrate". Es decir, los textos de las pantallas de introducción ( de los botones, etc..) Permitiendo una traducción muy simple de las mismas, con traducir simplemente el xml de configuración.
- La aventura, está dividida en unidades. En cada unidad hay tantas escenas como se indique en el xml de configuración de la unidad ( sin haber límite numérico ).
- Cada escena, está controlada por un xml de la escena. En este xml se especifica lo siguiente:
- Los objetos que aparecen en la escena.
- El comportamiento de cada uno de los objetos. Cada objeto especifica en el xml su propia máquina de estados, con las acciones a realizar en cada uno de los estados.
- La forma de interactuar con cada objeto, si es por hacer click sobre el o si es porque el personaje de la aventura "toca" o colisiona en pantalla con el objeto.
- La posición ( o posibles posiciones ) en la que ha de estar el personaje controlado por el usuario en pantalla para que la actuación sobre el objeto tenga efecto ( en caso de no estar en una de estas posiciones, aparece un mensaje en pantalla pidiendo al usuario que se acerque más al objeto )
- El resultado de interactuar con cada objeto en cada uno de los estados de la máquina de estados de dicho objeto. Es decir, por defecto, cada objeto tiene 7 posibles estados ( mas un número indeterminado de estados ficticios ). Estos estados son "visible", "activo", "invisible" etc..Cuando interactuamos con un objeto que está en uno de estos estados, podemos indicarle que o bien permanezca en el mismo estado, o bien que transite hacia otro estado ( lo que viene acompañado de un cambio gráfico pues la película del objeto se mueve hasta el fotograma asociado a cada estado, donde habitualmente hay un movieclip con una animación ).
Además, la actuación sobre un objeto, puede modificar el estado de otros objetos, haciendo que cambien su estado ( y su representación gráfica por tanto ) - En el xml se especifica también que la interacción con un objeto puede dar lugar al paso del mismo a un inventario.
- En el xml se especifica también que en los objetos en los que se indique, para poder interactuar con ellos, es necesario utilizar alguno de los objetos que tenemos en el inventario.
- Se especifica la posición inicial del personaje en pantalla.
- Se especifican los textos que aparecen en los avisos que surgen en la escena
- Los cdroms son didácticos ( acompañan a libros de texto ) y por tanto su finalidad es hacer preguntas al alumno sobre las materias. En el xml de la escena se indica dónde ( al interactuar con que objeto(s)) aparecen las preguntas.
- La perspectiva utilizada. Hay varias perspectivas posibles. En función de lo indicado en el xml, el personaje aparecerá en pantalla más o menos grande, y su tamaño se reducirá o ampliará más o menos cuando se acerca al fondo o al comienzo de la pantalla.
- En el xml de configuración de cada unidad, además de indicar las escenas, también se indica el xml con el repositorio de preguntas para cada unidad ( tantos xml de preguntas como unidades ).
- Cada xml de preguntas de unidad, consta de un número determinado de preguntas ( 15 ). En dicho xml se especifica por cada pregunta:
- El tipo de pregunta ( hay varios tipos de preguntas, de selección simple, de selección múltiple ) etc.. el motor interpreta este atributo y presenta en pantalla la pregunta con uno u otro grafismo según sea el valor del mismo.
- Las posibles opciones de respuesta y cual ( o cuales pues puede haber selección múltiple ) son las correctas.
- Por supuesto, y aunque no está realizado en perspectiva isométrica, el personaje puede pasar por delante y por detrás de los objetos. Esto fue especialmente complejo, pues a priori, y dado que el número de objetos que aparecen en pantalla viene dado por el xml, nunca se sabe cuantos objetos habrá ( ni donde estarán situados )
- Cada cdrom podía tener unos 600 objetos, es decir unos 600 swf. Ninguno tenía dentro ni una sola línea de código ( excepto los stops de las animaciones ) pues su comportamiento está definido en los xmls.
La conclusión es que, con este motor se podía trabajar-y se trabajaba- ( sin tener que escribir ni una sola linea de código ) en varios cdroms a la vez con un equipo de guionistas, animadores y personas escribiendo archivos xml de configuración de escenas por cada cd.
Todo esto está muy bien, pero.. ¿ se podía mejorar ?. Sí, y eso es lo que se hizo en la versión 2 del motor, en la que se añadieron:
- Más perspectivas del personaje. Permitiendo ( dada la habilidad de los animadores ), diferentes tipos de escenas, con mayor o menor sensación de amplitud, pues en algunas la línea del horizonte está más baja, lo que unido a un factor de escala del personaje determinado, proporciona perspectivas muy variadas.
- Comunicación con el usuario mediante el uso de una "PDA". Al usuario se le muestran avisos de texto o se le mandan preguntas ( recordamos, cdroms didácticos ) mediante un interface gráfico en forma de PDA.
- Añadimos que desde el xml de configuración de la sala, no solo indicamos donde salen preguntas, sino cuántas salen cada vez ( permitiendo así, las baterías de preguntas )
- A los 5 tipos de preguntas existentes, se añaden otros 6, llegando a 11 tipos diferentes de preguntas. Añadiendo preguntas de unir mediante flechas, o de arrastrar y soltar. Como decimos todo indicado mediante atributos xml.
- Diálogos. Elaboración de un motor de diálogos que permite conversaciones de alto nivel de anidamiento y varios posibles finales. Por cada diálogo tendremos un xml de configuración del diálogo, donde indicaremos cada línea de diálogo tanto del usuario como del objeto con el que interactúa. Es decir, en función de la selección realizada por el usuario, en cada "turno" de palabra, el diálogo será diferente. En caso de llegar al final del árbol del diálogo por alguna de las ramas que no llevan a una de las frases indicadas como finales en el xml, el diálogo comenzará de nuevo. Cada vez que elegimos una frase, el personaje cambiará su estado para presentar una animación del mismo hablando. Cuando el turno es del objeto con el que interactuamos ( que obviamente, de normal representa a una persona ), será dicho objeto el que se pondrá gráficamente a hablar y nuestro personaje se pondrá en posición de escucha. Estos dos estados, de hablar y de escuchar, son dos de los estados que tienen todos los objetos en su máquina de estados ( que luego, habrá objetos que los usen y objetos que no ).
- Inventario múltiple. Se "extiende" la funcionalidad de inventario, para tener varios objetos en el mismo. Esto implica que cada vez que interactuemos con un objeto, que necesita ( porque así lo hemos indicado en el xml ) que se haga uso de un objeto del inventario, tendremos que comprobar que se está usando el objeto correcto.
- Mientras en el primer motor, cada unidad lleva asociada un temario, y siempre el mismo ( por ejemplo, unidad 1 del cd de matemáticas, los números primos. Unidad dos la división, etc.. ) la versión actual del motor, permite una asociación dinámica entre las escenas del juego y las preguntas de las unidades de cada asignatura. De este modo, la historia de la aventura gráfica será siempre la misma y mantendrá el mismo orden consecutivo en el argumento ( se jugará secuencialmente y siempre en el mismo orden las etapas ), pero las preguntas de cada unidad didáctica podrán plantearse indistintamente en cada etapa. Cada vez que se comience una aventura con un usuario nuevo, existirá la posibilidad de realizar una asociación distinta entre las etapas y las preguntas.
Con este motor, y gracias a los divertidos guiones realizados por el departamento de guión, a las fabulosas animaciones realizadas por el departamento de animación, los grafismos del departamento de diseño, y la elaboración de los xml de configuración de escenas por tecnología, se han podido realizar ( y se siguen realizando ) numerosos cdroms, en diferentes idiomas, y trabajando en tres o cuatro a la vez ( dado que no es necesario tirar una sola línea de código ). Y a los niños, les gusta el juego ( aunque haya preguntas de matemáticas, o de lengua ).
Y sí, realizar el motor, .... ha sido difícil. Pero ha quedado chulo. Podéis ver el resultado a partir de septiembre, cuando empiece el curso escolar y distribuyan los discos ( creo que se los entregan a los profesores y estos los instalan en los ordenadores de los colegios, pero no estoy seguro ). Y podréis seguir las aventuras de los agentes secretos "Zeta" y "Hache".
( Por cierto, ya hay una versión tres del motor, que permite lo que todas las buenas aventuras gráficas, una navegación no lineal, pudiendo volver a escenas ya pasadas en donde, mediante el uso de mementos, se recuerda el estado de las mismas, y un montón de novedades más que ya contaré )
» Leer más, comentarios, etc...
ZingZang.org
Regalar palabras
Agosto 30th, 2006 - [Enlace local]
Sé que no suelo escribir sobre estas cosas, pero creo que lo voy a convertir en una costumbre:
Guantánamo es una vergüenza. El hecho de que exista un sitio donde se recluye a gente, en la mayoría de los casos (¿en todos?) sin tener siquiera una acusación de un delito común reconocible, y encima a la vista del mundo, es primitivo e incivilizado, una vergüenza para La Humanidad.
Algunas organizaciones (Amnistía es sólo con la que tengo más relación) llevan años haciendo grandes esfuerzos porque esta situación pare, y porque no se vaya de la memoria de la gente. Una de las actividades que monta A.I. con frecuencia (no sólo para los de Guantánamo; para cualquier preso) es un ejercicio de regalar tus palabras. El ejercicio es muy sencillo, y en algunos casos muy efectivo. Consiste simplemente en escribir una carta pequeña (ni siquiera tienes que sacar lápiz y papel ni comprar sellos; es todo por Internet) a alguno de los presos que te presentan. Esto tiene varios objetivos:
1) No olvidar que hay gente que sufre, pudriéndose en cárceles, que necesita nuestro apoyo. Generalmente los casos de Amnistía son gente encarcelada por defender los derechos humanos, o en general por sus convicciones, por oponerse al gobierno de su país, o por su orientación sexual. Presos políticos o de conciencia, vamos. En este caso concreto, tampoco olvidar que sigue existiendo el centro de detención de Guantánamo.
2) Dar ánimos a la gente que está encarcelada. Recibir de pronto cientos de cartas debe levantar bastante la moral, después de estar más solo que la una sin dejarte ver ni a tus familiares.
3) Alertar a sus potenciales torturadores, y a los que lo tienen retenido, de que se sabe lo que están haciendo y de que no lo olvidamos. Eso hace mella (no sé si en este caso hará mucha, pero en general sí hace).
Pues eso, les recomiendo que regalen sus palabras, que se hace en un momento y es bastante efectivo.
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
XHTML 2.0… el futuro
Agosto 30th, 2006 - [Enlace local]
En el sitio sigt.net publicaron un resumen sobre el último borraro presentado sobre XHTML 2.0
Luego de leer la nota hay cosas que me llamaron la atención... muchas etiquetas y atributos pasarán a ser muy generales y "multifaceticos", como la etiqueta objet que podran cargar tanto archivos swf (flash), imagnes, archivos css, etc o atributo href que ya no estara limitado a la etiqueta a... son cosas realmente interesantes pero tambien puede llevar a confuciones.
Creo que su adopción podría ser un poco drástica y lenta si consideramos que aún hay muchos desarrolladores que sigen programando con HTML, maquetan sitios con tablas, no usan las bondades de CSS, etc...
Fuente: sigt.net
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
XHTML 2.0… el futuro
Agosto 30th, 2006 - [Enlace local]
En el sitio sigt.net publicaron un resumen sobre el último borraro presentado sobre XHTML 2.0
Luego de leer la nota hay cosas que me llamaron la atención... muchas etiquetas y atributos pasarán a ser muy generales y "multifaceticos", como la etiqueta objet que podran cargar tanto archivos swf (flash), imagnes, archivos css, etc o atributo href que ya no estara limitado a la etiqueta a... son cosas realmente interesantes pero tambien puede llevar a confuciones.
Creo que su adopción podría ser un poco drástica y lenta si consideramos que aún hay muchos desarrolladores que sigen programando con HTML, maquetan sitios con tablas, no usan las bondades de CSS, etc...
Fuente: sigt.net
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
XHTML 2.0… el futuro
Agosto 30th, 2006 - [Enlace local]
En el sitio sigt.net publicaron un resumen sobre el último borraro presentado sobre XHTML 2.0
Luego de leer la nota hay cosas que me llamaron la atención... muchas etiquetas y atributos pasarán a ser muy generales y "multifaceticos", como la etiqueta objet que podran cargar tanto archivos swf (flash), imagnes, archivos css, etc o atributo href que ya no estara limitado a la etiqueta a... son cosas realmente interesantes pero tambien puede llevar a confuciones.
Creo que su adopción podría ser un poco drástica y lenta si consideramos que aún hay muchos desarrolladores que sigen programando con HTML, maquetan sitios con tablas, no usan las bondades de CSS, etc...
Fuente: sigt.net
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Script para separar los post por meses
Agosto 30th, 2006 - [Enlace local]
Si vemos cualquier blog que haya en internet veremos un menu que contiene los posteos separados por meses y años de la siguiente manera
Diciembre 2005
Enero 2006
Febrero 2006
...
Un ejemplo de eso lo podemos ver en el menu de este blog.
Para poder realizar esto debemos tener en la tabla de posteros un campo llamado "fecha" del tipo date.
Luego mediante la consulta SQL dividimos por meses
<div class="menu">
<ul>
<li class="m-tit">Archivos</li>
<?
$meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
$sql = "SELECT distinct(month(fechaPost)) mes, year(fechaPost) anio FROM posteos order by anio desc, mes desc";
$r = $this->bd->bbdd_query($sql);
while($row = $this->bd->bbdd_fetch($r)){
?>
<li class="cat"><a xhref="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>" title="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>"> <?=$meses[$row["mes"]-1]." ".$row["anio"]?></a></li>
<?}?>
</ul>
</div>
Saludos
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Script para separar los post por meses
Agosto 30th, 2006 - [Enlace local]
Si vemos cualquier blog que haya en internet veremos un menu que contiene los posteos separados por meses y años de la siguiente manera
Diciembre 2005
Enero 2006
Febrero 2006
...
Un ejemplo de eso lo podemos ver en el menu de este blog.
Para poder realizar esto debemos tener en la tabla de posteros un campo llamado "fecha" del tipo date.
Luego mediante la consulta SQL dividimos por meses
<div class="menu">
<ul>
<li class="m-tit">Archivos</li>
<?
$meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
$sql = "SELECT distinct(month(fechaPost)) mes, year(fechaPost) anio FROM posteos order by anio desc, mes desc";
$r = $this->bd->bbdd_query($sql);
while($row = $this->bd->bbdd_fetch($r)){
?>
<li class="cat"><a xhref="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>" title="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>"> <?=$meses[$row["mes"]-1]." ".$row["anio"]?></a></li>
<?}?>
</ul>
</div>
Saludos
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Script para separar los post por meses
Agosto 30th, 2006 - [Enlace local]
Si vemos cualquier blog que haya en internet veremos un menu que contiene los posteos separados por meses y años de la siguiente manera
Diciembre 2005
Enero 2006
Febrero 2006
...
Un ejemplo de eso lo podemos ver en el menu de este blog.
Para poder realizar esto debemos tener en la tabla de posteros un campo llamado "fecha" del tipo date.
Luego mediante la consulta SQL dividimos por meses
<div class="menu">
<ul>
<li class="m-tit">Archivos</li>
<?
$meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
$sql = "SELECT distinct(month(fechaPost)) mes, year(fechaPost) anio FROM posteos order by anio desc, mes desc";
$r = $this->bd->bbdd_query($sql);
while($row = $this->bd->bbdd_fetch($r)){
?>
<li class="cat"><a xhref="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>" title="<?=$_SERVER["PHP_SELF"]?>?mes=<?=$row["mes"]?>&anio=<?=$row["anio"]?>"> <?=$meses[$row["mes"]-1]." ".$row["anio"]?></a></li>
<?}?>
</ul>
</div>
Saludos
» Leer más, comentarios, etc...
Buayacorp
Mono 1.1.17
Agosto 30th, 2006 - [Enlace local]
Acaba de liberarse la versión 1.1.17 de mono, una de las novedades más importantes de este release es que las versiones anteriores del compilador y runtime de Visual Basic .NET -hechas en C#- han sido eliminadas en favor de un nuevo runtime y compilador, ambos desarrollados íntegramente en Visual Basic .NET. Otra de las "novedades" es que mi primer y muy simple parche ha sido incluido esta versión
.
Las descargas están disponibles en http://www.mono-project.com/Downloads
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Filtrando registros en un listado
Agosto 29th, 2006 - [Enlace local]
En mas de una oportunidad, todos los que hacemos ABMs, nos hemos encontrado con listados interminables (por ejemplo, un ABM de productos podria terner mas de 100 registros).
Al tener tantos registros surgen dos problemas, el primero es como hacer para listar tanta cantidad de registros y el segundo es la busqueda de algun/os registro/s particular/es.
La solución al primero es utilizar "paginados", esta técnica funciona como un "libro" en el cual dividimos los registros en varias paginas y mediante una serie de links vamos navegando dichas páginas, hace un tiempo realice dos posteos hacerca de esto (Link1 , Link2 )
El segundo problema se soluciona con la realización de filtros. Un filtro es como un buscador, solo que la busqueda se realiza en una/s tabla/s de nuestra base de datos, y devuelve una cierta cantidad de registros satisfagan una condicion.
Para ejemplificar esto, itilizaremos como ejemplo una tabla de la siguiente manera.
CREATE TABLE `articulo` (
`cod_articulo` varchar(11) default NULL,
`proveedor` varchar(10) NOT NULL default '',
`id_tipo_producto` int(11) default NULL,
`descripcion_articulo` text,
`precio` int(11) default NULL,
)
Teniendo esta tabla podriamos buscar por uno o varios de sus campos. Para ello debemos tener un formalario que nos permita espesificar los valores que necesitamos buscar.
Un formulario de ejemplo podria ser este
<form action="" method="POST">
<div>
<label>Proveedores</label>
<select name="proveedor">
<option value="0">Eleguir... </option>
<option value="idProv1">Prov1</option>
<option value="idProv2">Prov2</option>
<option value="idProv3">Prov3</option>
</select>
</div>
<div>
<label>Precio</label>
<input type="text" name="precio" value=""/>
</div>
</form>
Nota: Podes mirar el post sobre formularios accesibles desde aca
Luego el SQL de la consultar la armariamos de la siguiente manera
<?
$sql = "SELECT * FROM articulo";
$where = "";
if($_POST["proveedor"] != 0)
$where = ($where=="")?" WHERE proveedor = '".$_POST["proveedor"]."'":" AND proveedor = '".$_POST["proveedor"]."'";
if($_POST["precio"] != "")
$where = ($where=="")?" WHERE precio= '".$_POST["precio= "]."'":" AND precio= = '".$_POST["precio= "]."'";
$sql .= $where." ORDER BY id_articulo ASC";
?>
De esta forma la consulta solo nos devolveria aquellos registros que cumplan con las condiciones del WHERE.
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Filtrando registros en un listado
Agosto 29th, 2006 - [Enlace local]
En mas de una oportunidad, todos los que hacemos ABMs, nos hemos encontrado con listados interminables (por ejemplo, un ABM de productos podria terner mas de 100 registros).
Al tener tantos registros surgen dos problemas, el primero es como hacer para listar tanta cantidad de registros y el segundo es la busqueda de algun/os registro/s particular/es.
La solución al primero es utilizar "paginados", esta técnica funciona como un "libro" en el cual dividimos los registros en varias paginas y mediante una serie de links vamos navegando dichas páginas, hace un tiempo realice dos posteos hacerca de esto (Link1 , Link2 )
El segundo problema se soluciona con la realización de filtros. Un filtro es como un buscador, solo que la busqueda se realiza en una/s tabla/s de nuestra base de datos, y devuelve una cierta cantidad de registros satisfagan una condicion.
Para ejemplificar esto, itilizaremos como ejemplo una tabla de la siguiente manera.
CREATE TABLE `articulo` (
`cod_articulo` varchar(11) default NULL,
`proveedor` varchar(10) NOT NULL default '',
`id_tipo_producto` int(11) default NULL,
`descripcion_articulo` text,
`precio` int(11) default NULL,
)
Teniendo esta tabla podriamos buscar por uno o varios de sus campos. Para ello debemos tener un formalario que nos permita espesificar los valores que necesitamos buscar.
Un formulario de ejemplo podria ser este
<form action="" method="POST">
<div>
<label>Proveedores</label>
<select name="proveedor">
<option value="0">Eleguir... </option>
<option value="idProv1">Prov1</option>
<option value="idProv2">Prov2</option>
<option value="idProv3">Prov3</option>
</select>
</div>
<div>
<label>Precio</label>
<input type="text" name="precio" value=""/>
</div>
</form>
Nota: Podes mirar el post sobre formularios accesibles desde aca
Luego el SQL de la consultar la armariamos de la siguiente manera
<?
$sql = "SELECT * FROM articulo";
$where = "";
if($_POST["proveedor"] != 0)
$where = ($where=="")?" WHERE proveedor = '".$_POST["proveedor"]."'":" AND proveedor = '".$_POST["proveedor"]."'";
if($_POST["precio"] != "")
$where = ($where=="")?" WHERE precio= '".$_POST["precio= "]."'":" AND precio= = '".$_POST["precio= "]."'";
$sql .= $where." ORDER BY id_articulo ASC";
?>
De esta forma la consulta solo nos devolveria aquellos registros que cumplan con las condiciones del WHERE.
» Leer más, comentarios, etc...
BLOG - 3wstudio.com.ar
Filtrando registros en un listado
Agosto 29th, 2006 - [Enlace local]
En mas de una oportunidad, todos los que hacemos ABMs, nos hemos encontrado con listados interminables (por ejemplo, un ABM de productos podria terner mas de 100 registros).
Al tener tantos registros surgen dos problemas, el primero es como hacer para listar tanta cantidad de registros y el segundo es la busqueda de algun/os registro/s particular/es.
La solución al primero es utilizar "paginados", esta técnica funciona como un "libro" en el cual dividimos los registros en varias paginas y mediante una serie de links vamos navegando dichas páginas, hace un tiempo realice dos posteos hacerca de esto (Link1 , Link2 )
El segundo problema se soluciona con la realización de filtros. Un filtro es como un buscador, solo que la busqueda se realiza en una/s tabla/s de nuestra base de datos, y devuelve una cierta cantidad de registros satisfagan una condicion.
Para ejemplificar esto, itilizaremos como ejemplo una tabla de la siguiente manera.
CREATE TABLE `articulo` (
`cod_articulo` varchar(11) default NULL,
`proveedor` varchar(10) NOT NULL default '',
`id_tipo_producto` int(11) default NULL,
`descripcion_articulo` text,
`precio` int(11) default NULL,
)
Teniendo esta tabla podriamos buscar por uno o varios de sus campos. Para ello debemos tener un formalario que nos permita espesificar los valores que necesitamos buscar.
Un formulario de ejemplo podria ser este
<form action="" method="POST">
<div>
<label>Proveedores</label>
<select name="proveedor">
<option value="0">Eleguir... </option>
<option value="idProv1">Prov1</option>
<option value="idProv2">Prov2</option>
<option value="idProv3">Prov3</option>
</select>
</div>
<div>
<label>Precio</label>
<input type="text" name="precio" value=""/>
</div>
</form>
Nota: Podes mirar el post sobre formularios accesibles desde aca
Luego el SQL de la consultar la armariamos de la siguiente manera
<?
$sql = "SELECT * FROM articulo";
$where = "";
if($_POST["proveedor"] != 0)
$where = ($where=="")?" WHERE proveedor = '".$_POST["proveedor"]."'":" AND proveedor = '".$_POST["proveedor"]."'";
if($_POST["precio"] != "")
$where = ($where=="")?" WHERE precio= '".$_POST["precio= "]."'":" AND precio= = '".$_POST["precio= "]."'";
$sql .= $where." ORDER BY id_articulo ASC";
?>
De esta forma la consulta solo nos devolveria aquellos registros que cumplan con las condiciones del WHERE.
» Leer más, comentarios, etc...
Navegapolis
RecorteX
Agosto 29th, 2006 - [Enlace local]
Recortex es un lugar de intercambio útil y enriquecedor para programadores. Se trata del recién estrenado proyecto de Juanjo Navarro: un repositorio para guardar y compartir colecciones de código, esas rutinas y fragmentos que se necesitan de forma recurente.
Se pueden consultar las rutinas a través de tags, y suscribirse a los que nos interesen para recibir las novedades en el lector RSS.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
SCRUM II
Agosto 29th, 2006 - [Enlace local]
- SCRUM II the Agile Enterprise
- Recomendado para Scrum Masters y Scrum Developers avanzados
- La satisfacción del cliente es la prioridada mas alta
- Si los clientes deciden cambiar un Sprint, el Sprint BackLog cambia en tiempo real
Además presenta gráficas comparativas con otras metodologías.
» Leer más, comentarios, etc...
Blog de Diego Gómez Deck
SWT (Squeak Widgets Toolkit) - Algo para mostrar
Agosto 29th, 2006 - [Enlace local]
Usando el JS2JS, ahora estoy desarrollando un juego de widgets para los navegadores de Internet. Esta primera versión es muy simple, pero ya tiene lo suficiente para ver la idea completa: Se escribe código Smalltalk y se ejecuta en los navegadores de internet (previa conversión ST > JS). Pueden descargar la versión actual en SqueakSource.
Esto es un método, de la clase SWTExampleApplication, que crea unos simples (y aburridos) textos.
| SWTExampleApplication>>createSimpleTexts | root | root := self rootWidget. root addHorizontalRule. root addWidget: (SWTHeader level: 2 contents: 'Simple texts'). root addWidget: (SWTText contents: 'some plain text. bla, bla, bla, bla, bla.'). root addWidget: (SWTText contents: 'text in red'). root lastWidget color: S2SColor red. root addWidget: (SWTText contents: 'text in blue/green'). root lastWidget color: S2SColor blue; backgroundColor: S2SColor green. root addBreak. |
El método que está a continuación muestra como es el manejo de eventos. Se ve claramente el uso de los bloques de Smalltalk (que se mapean a funciones de JS):
| SWTExampleApplication>>createButtons | root button | root := self rootWidget. root addHorizontalRule. root addWidget: (SWTHeader level: 2 contents: 'Buttons'). root addWidget: (SWTButton caption: 'inspect event' onClick: [:event | event inspect]). root addWidget: (SWTButton caption: 'inspect root panel' onClick: [:event | root inspect]). root addWidget: (button := SWTButton caption: 'button with several event handlers'). button onClick: [:event | event inspect]. button onClick: [:event | self inform: '2st handler: ' , event asString]. button onClick: [:event | self inform: '3rd handler: ' , event asString]. button color: S2SColor blue; backgroundColor: S2SColor blue muchLighter. button onFocus: [:event | event source color: S2SColor red; backgroundColor: S2SColor red muchLighter ]. button onBlur: [:event | event source color: S2SColor blue; backgroundColor: S2SColor blue muchLighter ]. |
Si algo tiene de interesante esta primera versión es que ya estoy jugando con los widgets "Edit In Place" (Modificar en el Lugar) que usaré para la modificación en vivo del LiveWiki. Este es el método que crea algunos textos "EditInPlace" y, también, crea un botón para crear más textos editables.
| SWTExampleApplication>>createEditableTexts | root | root := self rootWidget. root addHorizontalRule. root addWidget: (SWTHeader level: 2 contents: 'Edit-In-Place texts'). root addWidget: (SWTButton caption: 'add a new edit-in-place text' onClick: [:event | self addNewEditInPlaceText]). root lastWidget backgroundColor: S2SColor yellow muchLighter. root addBreak. root addWidget: (SWTEditInPlaceText contents: 'One edit-in-place text, click on me to edit'). root addBreak. root addWidget: (SWTEditInPlaceText contents: 'Another edit-in-place text (with background color), double click on me to edit'). root lastWidget editOnDblClick; backgroundColor: S2SColor blue muchLighter. root addBreak. root addWidget: (SWTEditInPlaceText contents: 'Just another edit-in-place text (with background color), move mouse over me to edit'). root lastWidget editOnMouseOver; backgroundColor: S2SColor red muchLighter. root addBreak. root addWidget: (SWTEditInPlaceText contents: 'And just another edit-in-place text (with background color), move mouse over me to edit'). root lastWidget editOnMouseOver; backgroundColor: S2SColor green muchLighter. root addBreak. |
Para los bagos de siempre (que no quieren instalar nada en sus Squeaks) les subí un HTML 100% autónomo que incluye todo el código Javascript generado desde Smalltalk (126Kb).
Los próximos pasos, en el desarrollo, es integrar los widgets con el Asteroid (Implementación de Comet para Squeak) para poder implementar un Observer Pattern (aka un MVC) distribuido entre el Squeak y los navegadores de Internet.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
SQL Server Data Types and Their .NET Framework Equivalents
Agosto 29th, 2006 - [Enlace local]







