Archivo de la categoría ‘Programación’

Linex Software libre

Miércoles, 21 de abril de 2010

La Junta de Extremadura apuesta por las nuevas tecnologías como motor de progreso para la sociedad. El mundo ya está más que convencido del papel que desempeñan los ordenadores, Internet o de las grandes redes telemáticas en el futuro de la sociedad. Pero hace casi una década formular un plan estratégico que comprometiese unas más que considerables inversiones públicas en su desarrollo resultaba bastante más arriesgado.

vía gnuLinEx.org.

Error con acentos y eÑes en PHP/MySQL [Solución Definitiva]

Miércoles, 21 de abril de 2010

Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando en áóñ y cosas parecidas. Cuando me pasa esto suelo empezar a toquetear cosas, cambiar charsets y traducir a ? o ? pero nada funciona. El problema es que la configuración del cotejamiento de los caracteres especiales como acentos, eñes y demás símbolos no es el mismo entre la base de datos (MySQL), el lenguaje de servidor (PHP) y el servidor (Apache).

Así que me puse a buscar y después de encontrar comentarios buenísimos de gente por los foros puedo hacer un resumen de todo lo necesario cuando nos ocurre un problema de estos (id haciendo y testeando si ya funciona todo bien paso a paso).

Guía paso a paso para solucionar el problema de los acentos y eñes

1. Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en utf8_spanish_ci y el cotejamiento de las tablas en

utf_unicode_ci (más tarde en Operations > Collation de phpMyAdmin se puede cambiar)

2. Pon en el <head> de todos los archivos HTML:

<meta http-equiv=”Content-type” content=”text/html; charset=utf-8″ />

3. Y en los puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon el código:

header(“Content-Type: text/html;charset=utf-8″);

4. Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión:

mysql_query(“SET NAMES &apos;utf8&apos;”);

5. Quita el DefaultCharset del Apache o modifícalo

6. Como última y desesperada opción, quita todos los htmlentities();

vía Error con acentos y eÑes en PHP/MySQL [Solución Definitiva] by XaviEsteve.

IEEE754

Martes, 19 de agosto de 2008

Unos de los puntos mas importantes en la evolución de los compiladores fue la coma flotante, los compiladores de la época de apple I, ibm PC, etc, no resolvía directamente este problema, por lo que obligaban a los programadores a implementar soluciones para el calculo de decimales.

Este fue un punto de controversia entre apple y microsoft, quien de los dos fue el primero en desarrollar un compilador que soportase la coma flotante.

Como funciona

Un número entero se almacena en memoria como un dato cualquiera, salvando las distancias del famoso litlle o big endian, de intel, un numero se descompone en bytes que es la unidad mínima de almacenamiento, de esta forma:

3000 se almacena como => (3000/256), (3000 % 256)

en little endian se almacenaría así:

3000 se almacena como => (3000%256), (3000/256)

En un inicio el microprocesador no tenia funcionaes especificas para cálculos en coma flotante, esto obligo a desarrollar una unidad llamada FPU, asi que este elemento unido a los que ya había, producía un entorno de formatos caóticos para un modelo que debería ser fundamente en el calculo informático, así que la IEEE, dio un golpe en la mesa y presento el estandar IEEE754, en el que el numero en coma flotante se almacena como un formato compuesto de signo, exponente y mantisa en un formato de 32 bits.

El formato IEE754

El formato IEEE754 utiliza notación exponencial en la forma Número = Mantisa * BaseExponente, con la base binaria implícita. Se reserva un bit para el signo. El exponente se codifica en representación sesgada o en exceso.

La mantisa se almacena generalmente en posición normalizada con el primer 1 implícito, es decir la coma fraccionaria va a la derecha de este 1. Se reserva 1 bit para el signo 8 bits para el exponente y 23 para la mantisa.

Caso práctico

Pondremos un ejemplo, vamos a codificar un numero con coma flotante, p.e. 17,5, asi que lo primero es hayar los 3 elementos; signo, mantisa y exponente;

Obtener el Signo

El signo es facil es posititvo luego sera =>0 (si fuese negativo sera 1)

Obtener la Mantisa

La mantisa codificamos la parte entera 10001, y la parte decimal en este caso 1, por lo tanto el numero en binario quedara asi; 10001.1

la norma indica que el punto debe ir a la derecha del primer 1, entonces… esto queda 1,00011×2^4, asi que ya tenemos la mantisa (que es todo lo que esta a la derecha del punto)

…y el Exponente

y el exponente, 4 codificado sera 100, otra cosa que indica la norma es que los exponentes empiezan en 127, por lo tanto 4 sera 127+4 = 131, en binario= 100000011

Resultando

Por lo tanto quedara codificado asi;

signo = 0 [1 bit]

exponente= 100000011 [8 bits]

mantisa= 00011000000000000000000 [23 bits]

Otro ejemplo

Otro ejemplo un poco mas complicado: -118,625,

El signo

codificamos el signo: [-]=> 1

La Mantisa

Codificamos la mantisa 118 [1110110] y la parte decimal 0,625[101] asi que esto queda 1110110,101, como la norma dice lo del punto después del primer 1, seria 1,110110101×2^6

El Exponente

Para el exponente 0 es 127 luego para 6 = 127+6 [10000101]

Resultado

signo = 1 (por ser -)

exponente = 10000101

mantisa = 1101101010000000000000

Problemas de precisión

Esto es la teoría y esta muy bien, pero intenta codificar números tan raros como 108,65×0,3, el resultado es que no tienes mantisa suficiente para codificar esto, se requieren mantisas del orden de 68 bits, por lo que en una mantisa de 23, no daría, a esto hay que sumarle los bits que se necesitan para la parte entera.

Así que un trivialidad como decir cual es el resultado de restar 0.5-0.1 puede dar un resultado como

El tratamiento de la coma flotante ha sido uno de los mas problemáticos a la hora de realizar cálculos de precisión, dando como resultado números absurdos e infinidad de errores, por ejemplo era normal que el compilandore en casos tan triviales como 10-9 no diese 1, que era lo esperado sino un numero muy cercano a 1, por ejemplo 0,9999999, esto daba como resultado errores no esperados.

En España esto pasaba mas o menos desapercibido, y exploto en el momento del euro, aquí todos nos encontrábamos asombrados como, los malditos decimales bailaban y los contravalores finales no se ajustaban con lo esperado, por diferencias tontas, pero diferencias matemáticamente inaceptables.

así que lo suyo, era aumentar el espacio de almacenamiento en lugar de tener un numero codificado a 32bits, se paso a 64 y 128 bits