Rodrigo Borrego Bernabé - Freelance Software Developer



Ahorra dinero, o no lo pierdas, sabiendo matemáticas básicas

Category : Uncategorized · No Comments · by Jun 17th, 2011

Me parece increíble. Pero me acabo de encontrar con un error básico de cálculo. Y corregir a la persona que lo cometió me ha permitido ahorrarme más de 150€ (aparte de ganarme una mirada asesina, pero ese es otro tema).

Lo diré claro  INCREMENTAR UNA CANTIDAD EN DOS PORCENTAJES NO ES LO MISMO QUE INCREMENTAR LA SUMA DE LOS PORCENTAJES.

Es decir, no es lo mismo incrementar el IVA (18%) y luego aplicar un descuento (25%) que incrementar (o decrementar en este caso) la suma (-7% = 18% – 25%).

MAL HECHO/ERROR/NO

  1. Cantidad inicial: 100€ (bien redonda).
  2. Le quitamos el 7%: 100€ – 7€
  3. Total: 93€

BIEN

  1. Cantidad inicial: 100€
  2. Le añadimos el IVA: 100€ + 18€ = 118€
  3. Al resultado le aplicamos el 20% de descuento: 118€ – 29,5€ = 88,5€
  4. Total: 88,5€

En definitiva, con estos datos hacerlo bien nos ha permitido ahorrar 4,5€. ¿No te parece mucho? Prueba a rehacer las cuentas para un coche (23.000€ por ejemplo). Ya te lo digo yo: 1.035€

¡Ay! ¡Qué a gusto me he quedado!

Redimensionado de background que simula columnas

Category : breves, HTML/CSS, Programación · No Comments · by Jun 10th, 2011

Este artículo es muy interesante para redimensionar automáticamente imágenes, videos,  etc.

http://www.alistapart.com/articles/fluid-images/

Y tiene una segunda parte tan interesante o más acerca de “layout de dos columnas de la misma altura y redimensionable (líquido)”. ¿Sabes de qué hablo? Si lo has sufrido fijo que sí.

Artículo útil sobre CSS layouts

Category : HTML/CSS, Programación · No Comments · by May 31st, 2011

He encontrado un artículo interesante sobre layouts en CSS y bordes para dos columnas. No he probado lo que aquí cuentan, pero tendré que echarle un vistazo…
http://www.smashingmagazine.com/2010/11/08/equal-height-columns-using-borders-and-negative-margins-with-css/

Invocando url_for desde el modelo

Category : Programación, Symfony · No Comments · by Apr 5th, 2011

El modo ‘feo’ (AKA The Ugly Way), dado que rompe el paradigma MVC:

sfContext::getInstance()->getConfiguration()->loadHelpers(array('Url'));
$url = url_for('mi_url', true); // El segundo parámetro (absolute) depende del destino de la variable $url

El modo ‘elegante’:

$url = sfContext::getInstance()->getController()->genUrl('mi_url', true);

o en una acción:

$this->getController()->genUrl('string');

Reemplazar texto con imágenes vía CSS

Category : HTML/CSS, Programación · No Comments · by Mar 22nd, 2011

Motivación

  1. Quiero una imagen en mi botón/enlace/elemento de menú/loquesea
  2. Quiero que los que no vean las imágenes (navegadores modo texto, bots, lectores de pantalla, etc.) tengan un texto equivalente
  3. Quiero que los demás no vean ese texto

HTML:

<div class="miclase">Mi texto alternativo</div>

CSS:

.miclase {
 text-indent: -100em;
 overflow: hidden;
 background: url(miimagen.png) no-repeat;
 height: 100px;
 width: 100px;
 }

Japón

Category : Uncategorized · No Comments · by Mar 15th, 2011

Una parte de mí siente vergüenza cuando sigo con mi vida, preocupado por menudencias. Una parte de mí siente vergüenza al agobiarme por tonterías cuando miles de personas lo han perdido todo barrido por el agua.

Mi apoyo a toda la gente que tratará de seguir adelante, de crearlo todo de nuevo desde cero. Un abrazo, virtual, pero sentido.

Escribir mensajes de log desde el modelo que funcionan en las tareas CLI de Symfony

Category : Programación, Symfony · No Comments · by Mar 5th, 2011

El problema de echo es que aparece por pantalla de la web y no queremos que eso ocurra en producción.
El problema del sfLogger es que se accede a través del contexto y no lo tenemos en las tareas de línea de comandos (task in CLI) de Symfony.

Entonces, ¿Cómo escribir un mensaje de log desde el modelo que funcione en ambas situaciones?


ProjectConfiguration::getActive()
->getEventDispatcher()
->notify(new sfEvent(NULL, 'application.log', array('message' => "Mi mensaje",
'priority' => sfLogger::INFO)));

No puede ser tan costoso sacar una lista de idiomas

Category : Programación · No Comments · by Jan 27th, 2011

Os voy a soltar el código así sin anestesia ni nada.

implode (', ', array_intersect_key($_languages_, array_combine ( $object->getLanguagesArray(), $object->getLanguagesArray())));

Y ahora os explico qué hace. Básicamente tenemos un array no asociativo obtenido con $object->getLanguagesArray() que contiene una lista de claves de lenguajes (es, fr, en, por ejemplo). Y por otro lado tenemos un array asociativo con los nombres de todos los lenguajes como valor y sus códigos como clave. Algo como esto:

Array (
  [0] => en
  [1] => pt
  [2] => fr
  [3] => es
)
Array (
  [aa] => Afar
  [ab] => Abjasio
  [af] => Afrikaans
  [am] => Amárico
...)

Y todo lo que quiero es una cadena, separada por comas con los nombres de los idiomas de $object.

Bueno, pues me ha costado casi una hora buceando en las funciones de array de PHP. Espero que a alguien por ahí le ahorre tiempo.

Invocando el helper i18n (for translation) desde una acción

Category : breves, Programación, Symfony · No Comments · by Jan 11th, 2011

A menudo necesitas invocar el helper de tradicción, __(), desde fuera de la vista. Se puede hacer de dos maneras:

a) Cargarlo explícitamente y llamarlo igual que desde la vista (aunque se cargará dos veces, pues se seguirá cargando en la vista).

sfLoader::LoadHelpers(array('I18N'));

b) O utilizar una llamada puntual:

sfContext::getInstance()->getI18n()->__($text, $args, 'messages');

Traducción libre de: http://snippets.symfony-project.org/snippet/65

Filtrando en symfony con un selector los campos de texto

Category : Programación, Symfony · (5) Comments · by Dec 16th, 2010

A menudo se declara en el esquema un campo como string (texto) cuando en la práctica va a ser una clave de un conjunto de valores. ¿Por qué no lo ponemos en el esquema como ‘type: Enum’? Por ejemplo porque no sabemos, en principio, cuales son los valores que se van a guardar ahí.

En ese caso el filtro no pondrá un desplegable con los valores, lógicamente, sino un input[type=text].

Si posteriormente queremos que en el filtro aparezcan los valores en forma de desplegable hacemos algo como esto:

$choices = array_merge(array('' => ''), <array_con_valores>);
$this->widgetSchema['myField']   = new sfWidgetFormSelect(array('choices' => $choices, 'multiple' => false));

Pues bien, esto mostrará el filtro tal y como lo queremos, pero no funcionará. ¿Qué falta? Pues que le digamos al filtro que tiene que filtrar por un conjunto de claves:

public function getFields() {
 return array('myField' => 'Enum') + parent::getFields();
 }

Es importante el orden, porque al existir ya ‘myField’ en el esquema, si hacemos la unión de los arrays al revés el valor recibido en el padre pisará el nuestro.