Julio 27th, 2010

Frases celebres del desarrollo

Las 3 grandes mentiras del programador

  1. El programa está completamente probado y libre de errores
  2. Estamos trabajando en la documentación
  3. Por supuesto que podemos modificarlo

– Anónimo

“Debugging es dos veces más difícil que escribir el código en primer lugar. Entonces si escribes el código tan astutamente como sea posible, no eres -por definición- tan listo como para debugearlo.”

Brian Kernighan

“Sólo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa.”

Bjarne Stroustrup

“Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender.”

Martin Fowler

“Hay dos formas de diseñar software: la primera es hacerlo tan simple que obviamente no hay deficiencias y la segunda es hacerlo tan complicado que no hay deficiencias obvias. La primera forma es mucho más difícil.”.

C.A.R. Hoare

“Mucho del software hoy en día se parece a una pirámide egipcia: con millones de ladrillos apilados uno encima del otro, sin integridad estructural y hecho por pura fuerza bruta y miles de esclavos.”

Alan Kay

“Medir el progreso de la programación por líneas de código es como medir el progreso en la construcción de aviones por el peso.”

Bill Gates

“Si deseas empezar y desarrollar algo grandioso, no necesitas millones de dólares de capitalización. Necesitas suficiente pizza y Diet Coke en la nevera, una PC barata y trabajo y dedicación para realizar tu idea.”

John Carmack

“Los programas deben ser escritos para que la gente los lea y sólo incidentalmente, para que las máquinas los ejecuten.”

Abelson / Sussman

“Pregunta: ¿Cómo se atrasa un año un proyecto grande de software? Respuesta: Un día a la vez.”

Fred Brooks

“Nadie debe empezar un proyecto grande. Empiezas con uno pequeño y trivial y nunca debes esperar que crezca; si lo haces solamente sobre-diseñarás y generalmente pensarás que es más importante de lo que lo es en esta etapa. O peor, puedes asustarte por el tamaño de lo que tu esperas que crezca. Así que empieza pequeño y piensa en los detalles. No pienses acerca de la foto grande y el diseño elegante. Si no resuelve una necesidad inmediata, seguramente está sobre-diseñado. Y no esperes que la gente salte a ayudarte, no es así como estas cosas funcionan. Primero debes tener algo medianamente usable y otros dirán “hey, esto casi funciona para mí” y se involucrarán en el proyecto.”

Linus Torvalds

Julio 27th, 2010

Módelo Vista Controlador y algunas variantes

Flex es un framework creado para poder llegar a usar otros frameworks. Nos centraremos en este artículo en la base de otros frameworks, como PureMVC o Cairngorm, esta característica es el patrón Módelo Vista Controlador (MVC). Analizaremos este patrón que tanto nos gusta y entonces veremos algunas otras aproximaciones para compararlas y adjuntaré proyectos de ejemplo para entender el concepto que representa cada uno.

Módelo Vista Controlador (MVC)

El Módelo Vista Controlador es el patrón arquitectural más usado en la ingeniería del software. Este patrón nos separa el modelos de datos, el modelo de la capa de presentación (vista) y de la parte de control.

De este modelo podemos decir, que gestiona la información y advierte a las otras capas de cambios en sus datos. Representa el dominio de datos. La vista representa gráficamente el modelo para que el usuario pueda interactuar él, es la interfaz de datos. El controlador recibe las peticiones de la vista y le responde actualizando el modelo de datos. Debido a que la vista observa los cambios en el modelo de datos, esta actualiza sus componentes en función de éstos.

La finalidad de este patrón será la de conseguir un bajo acoplamiento en sus aplicaciones. Este lo logra desacoplando los modelos de las vistas, reduce la complejidad en el diseño arquitectural e incrementando la flexbilidad y mantenimiento del código.

La aplicación para el ejemplo será esta:

Módelo Vista Presentación (MVP)

Módelo Vista Presentación

Este patrón es un derivado del anterior. Está centrado en la interfaz de usuario y también pensado para facilitar el la unidad de testeo y mejorar la separación conceptos en la presentación de la lógica del programa. Genera una implementación limipia del patrón Observer entre el modelo y la vista.

El modelo funciona como una interface que define los datos que serán mostrados luego en la vista. La vista es una interface que nos muestra los datos del modelo y lanza llamadas a la capa presentacion para que luego actúe con los datos. La presentacion recupera los datos del modelo y los modera y hacia la vista.

Normalmente, la vista instancia su objecto presentacion con el que se relacionará y luego le proporciona una referencia suya.
El grado de lógica permitida en las vistas variara en función de la implementación que usemos: podremos hacer que la vista sea totalmente pasiva, alegando todas las operaciones a la presentacion. Otras versiones del MVP nos permiten más autonomía a la vista.

Si nos centramos en un punto de vista de capas, la presentacion se consideraría la capa de aplicación entre el modelo y la vista.

El creador del patrón MVP, Martin Fowler, decidió separarlo en dos patrones de presentación que ya hemos tratado en madeinflex, son el supervising presenter y el passive view.

MVC vs MVP

Los une la idea de que el modelo alberga los datos y la vista los representa. Tanto el controller como el presenter se encargan de coordinar la aplicación y es en estas clases donde está la diferencia: el Presenter tiene más responsabilidades, maneja los datos del modelo y trata las propiedades de la vista que recibirá como parámetro.

Modelo Vista Adaptación (MVA)

Como en los dos patrones anteriores, se pretende separar el modelo de datos de la vista para poder realizar cambios en la vista y que estos no afecten al modelo de datos.

MVA y MVC intentan solucionar este problema con dos aproximaciones diferentes:

  • MVC mantiene un estructura triangular entre el modelo, la vista y el controller, en la cual las tres entidades serían los vértices del triángulo y las aristas las vías de comunicación entre éstas.
  • MVA lo soluciona de otra forma, lo hace mediante una estructura lineal en la cual en una punta estará la vista, en la otra el modelo y en el centro el adapter o mediating controller, pero se evita la comunicación directa entre la vista y el modelo.

Así pués, en este modelo, la vista está totalmente separada del modelo de datos y estas entidades sólo se pueden comunicar a través el adapter, dicho de otro modo, sólo el adapter tiene conocimiento del modelo y de la vista.

Con esta separación de comportamientos, conseguiremos que una amplia variedad de vistas puedan acceder indirectamente al modelo de datos mediante el mismo adapter. Las vistas también se olvidan del modelo de datos, ya que es el adapter quien las comunica con éste.

Esto también nos permite poder usar diferentes adapters para cada par vista / modelo. Un ejemplo podría ser la aplicación de una entidad bancaria, para cada una de sus delegaciones, puede ser que con los mismos datos y la misma vista se tengan que manipular los datos de maneras diferentes, para eso podremos tener diferentes adapters sin tener que modificar ni la vista ni el modelo de los datos.

MVA también es conocido como “mediating-controller”. Hay quien cree que como base sigue la misma idea que MVP, aunque hay gurús del software que se matan y defienden diferencias entre ellos.

Aquí os dejo un enlace de un proyecto de ejemplo para que podais analizarlo vosotros mismos.

Abril 10th, 2010

Optimizando nuestro código PHP

1 – Inicializa las variables antes de utilizarlas. Estás, se inicializan solas, pero con un coste de tiempo.

2 – Debes estar en constante aprendizaje, cada vez el lenguage PHP se hace más fuerte, y salen nuevas características interesantes sobre este..

3 – Incrementar una variable en el método de una clase es lo mas rápido, que incrementar una variable global.

4 – Incrementar una variable global a un fichero puede llegar a ser hasta dos veces más lento que en un entorno local.

5 – Incrementar una variable local en un método es lo más rápido. Casi lo mismo que llamar a una variable local en una función.

6 – Incrementar una variable indefinida puede ser hasta 9 ó 10 veces más lento que una ya declarada.

7 – Declarar una variable global, a pesar de que no la llegues a utilizar en ninguna función hace más lento tu script, PHP tiene que chequear si la variable existe.

8 – Llamar a una función a una función con un parametro puede tomar aproximadamente el mismo tiempo que de 7 a 8 operaciones con variables locales, y esa misma llamada a un método supondrían unas 15 operaciones. Aún así, es más rapido que usar variables globales.

9 – Si necesitas saber el timestamp (tiempo de ejecución) de acceso a un script, considera utilizar la variable $_SERVER['REQUEST_TIME'] en lugar de time(), es mucho más rapido.

10 – $row['id'] es hasta 7 veces más rápido que el mecanismo $row[id].

11 – $localvar++ es hasta 15 veces más rápido que function inc(){ $localvar++; }, debido a que debe acceder a la función.

12 – Los scripts PHP se compilan/interpretan cada vez que son ejecutados, a no ser se guarde el código objeto en un cache. Las herramientas de compilación de PHP pueden incrementan el rendimiento hasta un 100%.

Febrero 20th, 2010

Validar ccc con PHP

Identificación de una cuenta corriente o libreta de ahorros
En España las cuentas corrientes y las libretas de ahorros tienen una identidad única que se compone de 20 dígitos, el denominado Código Cuenta Cliente. Este código identifica a la entidad bancaria, sucursal y cuenta de forma única de tal modo que actúa como dirección de la cuenta para la realización de cualquier operación financiera.

Esquema del código de identificación de una cuenta bancaria

esquema ccc

Proceso de cálculo de los dígitos de control
a) Dígito de control de la entidad y sucursal

Posicion Factor Datos Operación Resultado
Unidad: 6 8 6x8 48
Decena: 3 3 3x3 9
Centena: 7 3 7x3 21
Unidad de millar: 9 0 9x0 0
Decena de millar: 10 7 10x7 70
Centena de millar: 5 7 5x7 35
Unidad de millón: 8 0 8x0 0
Decena de millón: 4 2 4x2 8
Suma 191

Cálculos:

191/11 = 17; Resto = 191-(17x11) = 4; Dígito = 11-4 = 7

- Si el resultado es 11, el dígito buscado es 0

- Si el resultado es 10, el dígito buscado es 1

b) Dígito de control de la cuenta

Posicion Factor Datos Operación Resultado
Unidad: 6 1 6x1 6
Decena: 3 2 3x2 6
Centena: 7 3 7x3 21
Unidad de millar: 9 4 9x4 36
Decena de millar: 10 5 10x5 50
Centena de millar: 5 2 5x2 10
Unidad de millón: 8 0 8x0 0
Decena de millón: 4 0 4x0 0
Centena de millón: 2 1 2x1 2
Unidad de millar de millón: 1 3 1x3 3
Suma 134

Cálculos:

134/11 = 12; Resto = 191-(12x11) = 2; Dígito = 11-2 = 9

- Si el resultado es 11, el dígito buscado es 0

- Si el resultado es 10, el dígito buscado es 1
A continuación, implementaremos el algoritmo en php

PHP:
  1. function ccc_valido($ccc)
  2. {
  3.  
  4. //$ccc sería el 20770338793100254321
  5. $valido = true;
  6.  
  7. ///////////////////////////////////////////////////
  8. //    Dígito de control de la entidad y sucursal:
  9. //Se multiplica cada dígito por su factor de peso
  10. ///////////////////////////////////////////////////
  11. $suma = 0;
  12. $suma += $ccc[0] * 4;
  13. $suma += $ccc[1] * 8;
  14. $suma += $ccc[2] * 5;
  15. $suma += $ccc[3] * 10;
  16. $suma += $ccc[4] * 9;
  17. $suma += $ccc[5] * 7;
  18. $suma += $ccc[6] * 3;
  19. $suma += $ccc[7] * 6;
  20.  
  21. $division = floor($suma/11);
  22. $resto    = $suma - ($division  * 11);
  23. $primer_digito_control = 11 - $resto;
  24. if($primer_digito_control == 11)
  25. $primer_digito_control = 0;
  26.  
  27. if($primer_digito_control == 10)
  28. $primer_digito_control = 1;
  29.  
  30. if($primer_digito_control != $ccc[8])
  31. $valido = false;
  32.  
  33. ///////////////////////////////////////////////////
  34. //            Dígito de control de la cuenta:
  35. ///////////////////////////////////////////////////
  36. $suma = 0;
  37. $suma += $ccc[10] * 1;
  38. $suma += $ccc[11] * 2;
  39. $suma += $ccc[12] * 4;
  40. $suma += $ccc[13] * 8;
  41. $suma += $ccc[14] * 5;
  42. $suma += $ccc[15] * 10;
  43. $suma += $ccc[16] * 9;
  44. $suma += $ccc[17] * 7;
  45. $suma += $ccc[18] * 3;
  46. $suma += $ccc[19] * 6;
  47.  
  48. $division = floor($suma/11);
  49. $resto = $suma-($division  * 11);
  50. $segundo_digito_control = 11- $resto;
  51.  
  52. if($segundo_digito_control == 11)
  53. $segundo_digito_control = 0;
  54. if($segundo_digito_control == 10)
  55. $segundo_digito_control = 1;
  56.  
  57. if($segundo_digito_control != $ccc[9])
  58. $valido = false;
  59.  
  60. return $valido;
  61.  
  62. }

Diciembre 30th, 2009

Homer Simpson en Css

o
o
o
o
(
O
O
O
\
L
(
O
O
O
O
O
\
L
(
O
|
|
\
\
|
|
\
\
\
\
(
(
8
o
o
o
(
(
8
o
o
o
o
)
)
b
o
O
o
o
o
o
o
o
)
b
o
O
o
o
o
o
o
o
o
o
o
/
/
/
_
_
_
C
C
O
(
-

Visto en Roman Cortes

Diciembre 30th, 2009

Como matar un proceso si conocemos el nombre

¿Como podríamos matar un proceso, si conocemos el nombre de este?, si suponemos que nuestro proceso es bash.

kill $(pgrep bash)
killall -v bash
pkill bash
kill 'ps -ef | grep bash | grep -v grep | awk '{print $2}''
ps -ef | grep bash | grep -v grep | xargs kill
killall bash

Esto es útil cuando no se conoce el nombre del proceso

Diciembre 30th, 2009

Reproducir un video sin descomprimir

Con este simple codigo ejecutado desde nuestra consola, podremos reproducir en linux un video que se encuentra dentro de un archivo comprimido:
unrar p -inul /path/to/movie_folder/movie.name.r00 | vlc -

Octubre 18th, 2009

Tabla de caracteres ANSI

Cuando escribimos en el ordenador, este no "interpreta letras", sino los códigos numéricos que representan a estas, esto es lo que se conoce como juego de caracteres, en este post, veremos un popular juego de caracteres ANSI (American National Standards Institute), que asigna letras y números.

La tabla es bastante útil cuando tienes que poner algún determinado código que no aparece en el teclado.

chr(33) = ! chr(34) = “ chr(35) = # chr(36) = $ chr(37) = % chr(38) = &
chr(39) = ‘ chr(40) = ( chr(41) = ) chr(42) = * chr(43) = + chr(44) = ,
chr(45) = - chr(46) = . chr(47) = / chr(48) = 0 chr(49) = 1 chr(50) = 2
chr(51) = 3 chr(52) = 4 chr(53) = 5 chr(54) = 6 chr(55) = 7 chr(56) = 8
chr(57) = 9 chr(58) = : chr(59) = ; chr(60) = < chr(61) = = chr(62) = >
chr(63) = ? chr(64) = @ chr(65) = A chr(66) = B chr(67) = C chr(68) = D
chr(69) = E chr(70) = F chr(71) = G chr(72) = H chr(73) = I chr(74) = J
chr(75) = K chr(76) = L chr(77) = M chr(78) = N chr(79) = O chr(80) = P
chr(81) = Q chr(82) = R chr(83) = S chr(84) = T chr(85) = U chr(86) = V
chr(87) = W chr(88) = X chr(89) = Y chr(90) = Z chr(91) = [ chr(92) = \
chr(93) = ] chr(94) = ^ chr(95) = _ chr(96) = ` chr(97) = a chr(98) = b
chr(99) = c chr(100) = d chr(101) = e chr(102) = f chr(103) = g chr(104) = h
chr(105) = i chr(106) = j chr(107) = k chr(108) = l chr(109) = m chr(110) = n
chr(111) = o chr(112) = p chr(113) = q chr(114) = r chr(115) = s chr(116) = t
chr(117) = u chr(118) = v chr(119) = w chr(120) = x chr(121) = y chr(122) = z
chr(123) = { chr(124) = | chr(125) = } chr(126) = ~ chr(127) =  chr(128) = €
chr(129) = chr(130) = ‚ chr(131) = ƒ chr(132) = „ chr(133) = … chr(134) = †
chr(135) = ‡ chr(136) = ˆ chr(137) = ‰ chr(138) = Š chr(139) = ‹ chr(140) = Œ
chr(141) =  chr(142) = Ž chr(143) =  chr(144) =  chr(145) = ‘ chr(146) = ’
chr(147) = “ chr(148) = ” chr(149) = • chr(150) = – chr(151) = — chr(152) = ˜
chr(153) = ™ chr(154) = š chr(155) = › chr(156) = œ chr(157) =  chr(158) = ž
chr(159) = Ÿ chr(160) = chr(161) = ¡ chr(162) = ¢ chr(163) = £ chr(164) = ¤
chr(165) = ¥ chr(166) = ¦ chr(167) = § chr(168) = ¨ chr(169) = © chr(170) = ª
chr(171) = « chr(172) = ¬ chr(173) = ­­ chr(174) = ® chr(175) = ¯ chr(176) = °
chr(177) = ± chr(178) = ² chr(179) = ³ chr(180) = ´ chr(181) = µ chr(182) = ¶
chr(183) = · chr(184) = ¸ chr(185) = ¹ chr(186) = º chr(187) = » chr(188) = ¼
chr(189) = ½ chr(190) = ¾ chr(191) = ¿ chr(192) = À chr(193) = Á chr(194) = Â
chr(195) = Ã chr(196) = Ä chr(197) = Å chr(198) = Æ chr(199) = Ç chr(200) = È
chr(201) = É chr(202) = Ê chr(203) = Ë chr(204) = Ì chr(205) = Í chr(206) = Î
chr(207) = Ï chr(208) = Ð chr(209) = Ñ chr(210) = Ò chr(211) = Ó chr(212) = Ô
chr(213) = Õ chr(214) = Ö chr(215) = × chr(216) = Ø chr(217) = Ù chr(218) = Ú
chr(219) = Û chr(220) = Ü chr(221) = Ý chr(222) = Þ chr(223) = ß chr(224) = à
chr(225) = á chr(226) = â chr(227) = ã chr(228) = ä chr(229) = å chr(230) = æ
chr(231) = ç chr(232) = è chr(233) = é chr(234) = ê chr(235) = ë chr(236) = ì
chr(237) = í chr(238) = î chr(239) = ï chr(240) = ð chr(241) = ñ chr(242) = ò
chr(243) = ó chr(244) = ô chr(245) = õ chr(246) = ö chr(247) = ÷ chr(248) = ø
chr(249) = ù chr(250) = ú chr(251) = û chr(252) = ü chr(253) = ý chr(254) = þ

Espero que sirvan de ayuda

Octubre 6th, 2009

El tag video en html 5

Entre los nuevos atributos de html 5, hay algunos muy importantes como los , , etc.. Pero sin duda, la estrella de este nuevo estándar, es el tag . Este tag, podrá revolucionar el mundo multimedia muy pronto. No obstante, hasta Youtube tiene una versión preparada para desprenderse del flash.

Hasta ahora

El método de visualizar un video web actualmente, es similar a la que muestro en el siguiente código. Mediante el elemento </object>

Con html 5

Con HTML5, además de poder dejar más claro que este contenido es un archivo de formato video, nos permite informar de una alternativa a los usuarios que no posean un navegador compatible o incluso insertando el <object>

<video src="mirutaalvideo" >formatos alternativos</video>
Si tu navegador acepta html 5, veras el reproductor

Conclusiones

Es un avance, pero parece haber problemas con el que será el códec estándar, parece que finalmente no habrá un códec estándar y cada navegador usara el suyo. Actualmente en firefox, hay que subir videos .ogg, y en webkit .mp4. IE no se ha pronunciado aún.

Junio 9th, 2009

Sincronizar directorios y copiar solo archivos modificados

Con esto sincronizamos todo el directorio remoto de un equipo en el directorio local que queramos.
Util para que compare los dos directorio y solo compie lo que ha sufrido cambios, respetando los permisos del archivo:

rsync -rvlpz root@<host remoto>:/<directorio remoto>/ /<directorio local>/
los parametros rvlpz son para:

-r = recursivo – procesa sub-directorios y archivos encontrado el la ubicación del fuente o SRC.
-v es utilizado para aumentar la verbosidad desplegado. Después, cuando estamos seguro que esta respaldando lo que deseamos, puede quitar el 'v'. Sigue incluido en este ejemplo porque el proceso esta ejecutado desde una tarea 'cron', y prefiero 'ver' lo que hizo. Es por cada individuo a decidir.
-l = links (acoplamientos) – cuando los acoplamientos simbólicas (symlinks) se encuentro, recrearlo en el sistema destinaría.
-p = permisos – dice a rsync a fijar los permisos en el destinaría igual que el fuente (SRC).
-z se utiliza para comprimir los datos que serán transferido o copiado, con el resulto que el proceso de copiado se realizo más rápido, porque los datos siendo transferido es más pequeño que el tamaño verdadero.