Sigueme en Twitter

Archivo de artículos en la categoría "Tutoriales"

Ir al inicio

Unit Tests en PHP con SimpleTest

29/05/2009

Hacer pruebas automatizadas de tu código siempre es una buena costumbre, en especial cuando te llega el tiempo de tener que refactorizar.

Para este ejemplo vamos a hacer una clase que calcula las áreas de triángulos, rectángulos y cuadrados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Area
{
	function triangle($base, $height) {
		return ($base * $height) / 2;
	}
 
	function rectangle($breadth, $height) {
		return $breadth * $height;
	}
 
	function square($side) {
		return $side * $side;
	}
}

Y vamos a utilizar la herramienta SimpleTest para probar que nuestras funciones están trabajando bien. Para empezar a usarlo solo tienes que bajarlo y colocar la carpeta simpletest dentro de tu proyecto o algún directorio global de PHP.

Una vez instalado podemos comenzar a escribir nuestros casos de prueba.

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
require_once 'simpletest/autorun.php';
require_once 'area.php';
 
class AreaTestCase extends UnitTestCase
{
	var $area;
 
	function setUp() {
		$this->area = new Area();
	}
 
	function testTriangle()
	{
		$result = $this->area->triangle(6, 10);
		$this->assertEqual(30, $result);
	}
 
	function testRectangle()
	{
		$result = $this->area->rectangle(2, 5);
		$this->assertEqual(10, $result);
	}
 
	function testSquare()
	{
		$result = $this->area->square(4);
		$this->assertTrue(is_numeric($result));
	}
}

El incluir autorun.php nos da la habilidad de poder extender la clase UnitTestCase, permitiéndonos ejecutar las aserciones. Además el autorun.php se encarga de correr las pruebas sin necesidad de que tu tengas que instanciar nada y también es suficientemente inteligente para darte si cuenta si estas en la consola o directamente en el navegador.

La funcion setUp se ejecuta automáticamente antes de correr cualquier prueba. Aquí como todas nuestras pruebas hacen uso de la clase Area, entonces aprovechamos para hacer la instancia una sola vez.

Finalmente SimpleTest corre todas las pruebas que note comienzan con el nombre test y nosotros tenemos 3 de ellas:

  • testTriangle: Prueba que el resultado de la operación sea igual a 30.
  • testRectangle: Prueba que el resultado de la operación sea igual a 10.
  • testSquare: Prueba que el resultado de la operación sea un número.

Cualquier otro resultado nos arrojaría errores. Estas pruebas ejecutadas en el navegador se verían así, pero también puedes ejecutarlas en consola sin ningún problema.

Oh si, la confirmación del código perfecto

SimpleTest tiene muchas opciones más como el agrupar casos de prueba, escribir tus propias aserciones, mockups (simulaciones de escenarios) y pruebas web (aunque limitado). Así que no te dejes de llevar por el nombre no es simple, solo es fácil de usar.

Sin Comentarios

¿Qué es la recursividad?

16/01/2009

En programación la recursividad es un concepto básico que se enseña cuando das tus primeros pasos de programación, aún así siempre es un tema confuso y que suele causar problemas a los programadores mas maduros también. Ya que antes tonteamos con la definición, ahora toca tratar de explicarla.

Existen varios tipos de recursividad pero todos ocurren cuando una función se llama así misma -aunque sea indirectamente-. Al pensar en esto te preguntaras -acertadamente- si esto no provoca un bucle infinito, pero para evitar este problema se construye una “condición de escape”, cuando el número es suficiente pequeño se termina la recursión y se regresa un valor fijo.

Las Matrioska son un gran ejemplo de recursividad

Fibonacci al rescate

La sucesión de Fibonacci (si pasaste de noche las clases, la sucesión se conforma de dos números iniciales, donde el siguiente se calcula con la suma de los dos anteriores, es decir; 0,1,1,2,3,5,8,13.. ) es un problema que se utiliza casi siempre para codificar un ejemplo de recursión, su formula sería algo así:

f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)

Y se puede programar casi literalmente:

1
2
3
4
5
6
7
function fibonacci($n)
{
    if ( $n <  2 )
        return 1;
    else
        return fibonacci($n-1) + fibonacci($n-2);
}

Esto no es ni de cerca la manera mas eficiente de resolver Fibonacci, pero si es un buen ejemplo de recursión. Como pueden ver la función se va llamando a si misma con cantidades cada vez mas pequeñas hasta que llegamos a la “condición de escape”, que nos permite que se termine la recursión y se devuelvan los resultados.

Si colocamos mensajes a la entrada y salida de la función podemos seguir paso a paso la secuencia y entenderlo mejor. Por ejemplo, para n = 4, esto es lo que se despliega:

entrada: 4
entrada: 3
entrada: 2
entrada: 1
salida: 1
entrada: 0
salida: 1
salida: 2
entrada: 1
salida: 1
salida: 3
entrada: 2
entrada: 1
salida: 1
entrada: 0
salida: 1
salida: 2
salida: 5

¿No te queda claro? Aquí tienes una mejor explicación: ¿Qué es la recursividad?

3 Comentarios

¿Como instalar Ruby on Rails en Ubuntu?

12/01/2009

Es común que nos encontremos guías que nos recomiendan la instalación de Rails por medio de Rubygems, el gestor de paquetes y librerías de Ruby. Esto causa confusión en varias distribuciones de Linux, donde ya existen gestores de paquetes que se encargan de este tipo de instalaciones.

A la manera de Debian

Debian en especial tiene políticas acerca de Rubygems, como no cumple sus requerimientos ellos mismos se encargan de proveer el paquete para Rails y que tu lo puedas instalar directamente con apt. También proveen con un paquete de Rubygems, si quieres tener el comando gem a tu disposición.

Desafortunadamente para los que nos gusta tener las últimas actualizaciones pronto, si seguimos el consejo de Debian agregamos otra capa de complejidad a la distribución, y esto provoca que los paquetes que provee apt siempre vayan atrás de lo que se nos ofrece con Rubygems (que ademas nos ofrece muchas cosas mas aparte de Rails)

A la manera recomendada

Instalar Rubygems con los archivos fuente (aunque me moleste esto) y Ruby desde el repositorio es la mejor opción para estar bien actualizado y evitar conflictos entre los gestores de paquetes.

Así que manos a la obra (esa frase es de lo mas chusca n_n)

Lo primero es instalar Ruby desde los repositorios y de paso las herramientas para compilación, que podrían ser utilizadas por Rubygems en un futuro.

sudo apt-get install ruby-full build-essential

Enseguida podemos instalar Rubygems con sus archivos fuentes, puedes tomar la versión mas reciente desde sourceforge. Aquí instalaremos la versión 1.3.1, pero no importa realmente que instales una versión un poco mas vieja, ya que Rubygems se puede actualizar a si mismo con un solo comando justo como apt.

wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
tar -xvzf rubygems-1.3.1.tgz
cd rubygems-1.3.1/
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
sudo gem update --system

Y entonces podemos instalar Rails con Rubygems. Voila!

sudo gem install rails

Probando 1,2,3

Una rápida prueba para comprobar que nuestra instalación ha funcionado:

rails railstest
cd railstest
ruby script/server

Esto ha creado un proyecto de Rails y ha puesto a correr un servidor de pruebas en el puerto 3000. Si entras con tu navegador a http://localhost:3000 veras tu nuevo proyecto.

Proyecto de prueba de Ruby on Rails

10 Comentarios

Depura código de PHP con Komodo IDE y Xdebug

2/01/2009

Tengo cerca de dos años utilizando Komodo Edit, la versión libre de Komodo IDE, para programar aplicaciones web y estoy bastante feliz con el. Cubre mis necesidades mínimas como tener un buen coloreado de código, autocompletado, marcadores, snippets y ser agradable a la vista.

Ahora (gracias a Hunk) comencé a utilizar Komodo IDE 5 que tiene muchas características importantes (en serio, muchas), pero entre ellas destaca la posibilidad de integrar un depurador completo (breakpoints, watchers, etc) que se integra perfectamente con Xdebug.

Otras opciones

Esto no es nada nuevo claro, he probado otras opciones como Vim + Xdebug, PDT (Eclipse). Con Vim la integración no se siente natural y ademas el nerd dentro de mi no es suficientemente bueno para recordar shortcuts que no utilizo continuamente.

PDT no me gusta porque esta basado en Eclipse, contra el que no tengo nada en contra, pero es demasiado generalista y Java nunca se ha distinguido por su ligereza. Zend Studio es el IDE oficial de los creadores de PHP, pero con el puro precio no quiero ni mirarlo, no lo he probado en años y ahora parece que se mudaron también a Eclipse.

¿Como funciona?

La cosa es así: Xdebug es una extensión de PHP que le da la habilidad de proveer muchos mas datos para depuración, esta extensión (por medio de «depuración por remoto») se comunicará directamente con Komodo, quien crea un proceso que espera por datos todo el tiempo.

Tu puedes usar tu aplicación en tu navegador favorito y Komodo sabrá cuando te has topado con un breakpoint, inmediatamente iniciará una sesión de depuración y avisará por ello.

Configurando Komodo IDE con Xdebug

Configurar es muy sencillo (en cualquier sistema operativo), si tienes Ubuntu la instalación de Xdebug es una simple linea.

sudo aptitude install php5-xdebug

Ubuntu habrá creado un archivo de configuración solo para Xdebug en la ruta /etc/php5/apache2/conf.d/xdebug.ini (si tu sistema operativo no separa las configuraciones lo meterás directo al php.ini), que sera cargado la próxima vez que reinicies tu servidor web.

En este archivo vamos a habilitar depuración por remoto agregando los siguientes parámetros:

xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

Existe un parámetro llamado xdebug.idekey al que debes de poner atención si varias personas comparten el mismo servidor web. El parámetro zend_extension Ubuntu ya lo debió haber agregado.

El parámetro xdebug.remote_port manda los datos por dicho puerto a tu IDE. Para decirle a Komodo que utilice ese puerto tienes que ir a «Preferences -> Debugger -> Connection» y agregarlo manualmente. Asegúrate de aprobar también la opción de «Debug -> Listen for Debugging Connections» para que levante el proceso que espere por datos.

Reinicia tu servidor web para que cargue la configuración de Xdebug y listo.

¡A probarlo!

Para probar solo tienes que agregar este parámetro en la URL:

?XDEBUG_SESSION_START=1

Aquí por ejemplo coloque un breakpoint en una aplicación hecha con CakePHP (que tiene bastantes capas tan solo contando el framework) y al probar con Firefox, Komodo abrió automáticamente la sesión de debuggeo.

URL con el parametro adicional

Komodo depurando

Tremendo no tener que depender de imprimir a pantalla suciamente cuando se necesita depurar algo complicado :-)

8 Comentarios

Instalando Oracle 10g Enterprise en Ubuntu 8.10

27/11/2008

La versión Express de Oracle 10g si que viene con soporte directo para Ubuntu, pero si por alguna mágica razón necesitas instalar la Enterprise, que solo viene con soporte oficial para Red Hat, SUSE y Oracle Linux. Seguiremos la sencilla guía de Taw.

Vamos a instalar la versión 10.2.0.1.0, así que la puedes ir bajando y desempacando que pesa casi 700MB.

El instalador espera que los binarios de basename y awk esten en /bin y no en /usr/bin, asi que crearemos unos soft links.

$ sudo ln -s /usr/bin/basename /bin/basename
$ sudo ln -s /usr/bin/awk /bin/awk

SUSE y Red Hat utilizan el grupo nobody para el usuario nobody, pero los sistemas basados en Debian utilizan el grupo nogroup. Así que creamos el nuevo grupo.

$ sudo addgroup nobody

Ahora podemos correr el instalador gráfico, pero con un parámetro indicándole que ignore los pre-requisitos, sino detectara que estas utilizando una distribución no soportada oficialmente y cancelara la instalación. Si evitas instalar la base de datos desde este punto y solo instalar las herramientas la instalación durara mucho menos, pero si el tiempo no es problema para ti, créala de una vez y así te ahorras crear el listener y la base de datos manualmente.

$ ./runInstaller -ignoresysprereqs

Al finalizar la instalación, el instalador te pedirá instalar un archivo de bash como root, ejecútalo con sudo tal cual te lo muestra y no tendrás problemas.

Probablemente tengas problemas con librerías faltantes, entonces es muy recomendable incluir las librerías que trae oracle y así te evitas estar compilandolas. Ademas de ejecutarla una vez puedes meterla a tu archivo .bashrc y que se cargue automáticamente cuando inicies sesión.

$ export LD_LIBRARY_PATH=/path/de/tu/instalacion/lib/

En mi caso también me dio problemas por una librería faltante llamada libaio, pero sin problemas se instala porque se encuentra también en los repositorios de ubuntu.

$ sudo aptitude install libaio-dev

Listo! Ya tienes una instalación funcional de Oracle 10g Enterprise.

Ojo, que Oracle no te instalara los menús de accesos directos a la diferentes aplicaciones, pero aún asi tienes todo dentro del directorio /bin. Por mencionar algunos comandos útiles:

Para administrar (crear, borrar, editar) listeners y otras herramientas de red, como conectarte a una base de datos externa:

$ netca

Para administrar tus bases de datos (crear, borrar, etc):

$ dbca

Para iniciar o parar el database control:

$ emctl start dbconsole
$ emctl stop dbconsole

Para iniciar o parar el servicio web de iSQL*Plus:

$ isqlplusctl start
$ isqlplusctl stop

Para iniciar o parar listeners:

$ lsnrctl start
$ lsnrctl stop

Para entrar a la consola de SQL*Plus

$ sqlplus
5 Comentarios

Una embarradita de Ajax

23/04/2007

En estas épocas de tanto framework, lo mejor es simplemente bajarnos una libreria y empezar a utilizar sus funciones sin preocuparnos por lo que pasa detras, pero nunca esta demas aprender a hacerlo desde cero, no es tan complicado como comunmente se cree.

Introducción

La definición de Ajax según la Wikipedia:

“..es una técnica de desarrollo web para crear aplicaciones interactivas. Éstas se ejecutan en el cliente, es decir, en el navegador del usuario, y mantiene comunicación asíncrona con el servidor en segundo plano.”

Esta técnica no parte de nada nuevo, sino que se basa en las tecnologias existentes, como Javascript, DOM y sobre todo el objeto XMLHttpRequest, quien es el que se encarga de realizar las transacciones asíncronas y que el usuario no tenga que esperar por cada petición al servidor.

“..De esta forma es posible realizar cambios sobre la misma página sin necesidad de recargarla. Esto significa aumentar la interactividad, velocidad y usabilidad en la misma.”

Un ejemplo básico de una aplicación Ajax

Este ejemplo tiene 3 campos que se utilizan para la selección de un alumno, al hacer click sobre cualquiera de los campos, se manda llamar a un script de PHP, que conectandose a una base de datos devuelve la información del individuo seleccionado sin necesidad de recargar la página.

Es un ejemplo simple y que no tiene ninguna clase de comprobaciones con el fin de que sea sencillo de entender.

Se utilizan 2 archivos que realizan todo el trabajo:

intro.html:

Un html que contiene nuestras 2 funciones básicas de javascript, con la primera función obtenerAlumno(), recibimos los datos provenientes del usuario y mandamos llamar al script de PHP que se encargara de sacar la información de la base de datos.

La segunda función callbackAlumnos(), se ejecuta solamente cuando haya recibido la señal del que archivo de PHP termino su ejecución, en este caso tomamos los datos que el script de PHP nos regreso y se los asignamos al div resultados.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<html>
<head>
<title>Introduccion a Ajax</title>
 
<script languague="Javascript">
 
/* esta funcion se encarga de iniciar la peticion asincrona */
function obtenerAlumno(id)
{
 
	/* 
	* tratamos de crear un objeto XMLHttpRequest, 
	* si esto falla usamos ActiveX que es el caso de Internet Explorer 
	*/
	try {
		xmlhttp = window.XMLHttpRequest?new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");
	}
	catch (e) {
		alert("oh noes! no se que navegador estas utilizando!");
	}
 
	/* cuando la peticion al script de php se complete, llamaremos a la funcion callbackAlumo */
	xmlhttp.onreadystatechange = callbackAlumno;
	/* abrimos y mandamos una peticion al script de php, mandandole la id del alumno por get en la url */
	xmlhttp.open("GET", 'regresa_datos.php?id=' + id);
	xmlhttp.send(null);
}
 
/* esta function se ejecuta cuando el script de php termina su labor */
function callbackAlumno() {
	/* finalmente buscamos el div con id resultados y lo llenamos con la respuesta del script php */
	document.getElementById("resultados").innerHTML = xmlhttp.responseText;
}
 
</script>
 
</head>
<body>
<!-- unos simples inputs que mandan la id del resgistro que queremos --!>
<input type="radio" onclick="obtenerAlumno('1')" />Primer Alumno
<input type="radio" onclick="obtenerAlumno('2')" />Segundo Alumno
<input type="radio" onclick="obtenerAlumno('3')" />Tercer Alumno
<p>
<div id="resultados"></div>
<p>
 
</body>
<html>

regresa_datos.php:

Este script de PHP recibe la id de algun alumno, lo busca en la base de datos e imprime su información en pantalla.

1
2
3
4
5
6
7
8
9
10
$id_alumno =  $_REQUEST['id'];
 
mysql_connect('localhost', 'usuario', 'password');
mysql_select_db('base_datos');
 
$resultado = mysql_query("select nombre, domicilio, email from alumnos where id={$id_alumno}");
 
$fila = mysql_fetch_object($resultado);
 
echo "Yo soy {$fila->nombre}, y vivo en {$fila->domicilio}. Mandame un mail a {$fila->email}!";

Si son demasiado ociosos para crear la tabla de ejemplo, aqui les dejo la que utilize:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP TABLE IF EXISTS alumnos;
CREATE TABLE alumnos (
id int NOT NULL AUTO_INCREMENT,
nombre varchar(50) NOT NULL,
codigo varchar(10) NOT NULL,
domicilio varchar(50) NOT NULL,
email varchar(30) NOT NULL,
nacimiento date NOT NULL,
PRIMARY KEY (id)
);
 
INSERT INTO alumnos (nombre, codigo, domicilio, email, nacimiento) VALUES('Fulanito Perez', 'FP12345678', 'Av. Fulanita #123', 'fulanito@perez.com', '1983-03-01');
INSERT INTO alumnos (nombre, codigo, domicilio, email, nacimiento) VALUES('Homero Simpson', 'HS12345678', 'Av. Siempre Viva #123', 'homer@aol.com', '1954-01-02');
INSERT INTO alumnos (nombre, codigo, domicilio, email, nacimiento) VALUES('Don Benito', 'DJ12345678', 'Don Benito Street #123', 'elbeni@benilandia.com', '1944-10-30');

Puedes ver este ejemplo funcionando aqui.

Conclusión

Puedes hacer tu aplicación web mucho mas interactiva con el usuario con tan solo unas líneas mas de código, a pesar de que Ajax ya tiene algunos años desde que salio, todavia muchos desarrolladores lo desconocen o aún piensan que es muy complicado, es tiempo de cambiar eso!

4 Comentarios

Creando graficas con Flash y PHP

20/04/2007

PHP/SWF es una herramienta, casi tan anciana como su servidor, que te facilita la creación de graficas en flash que son creadas por medio de datos que contruyes con PHP.

Esta es una pequeña (muy pequeña.. borrador.. no preparada, etc) introducción al uso de PHP/SWF que hize respondiendo a una pregunta en los foros de CiberPC.

1er paso: Crea el archivo que proveera los datos a la grafica, llamemosle datos.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
include 'charts.php';
 
/*
* Aqui van los datos con los que construimos el grafico
* el primer arreglo indica los rangos
* los siguientes arreglos indican los datos y sus valores
* el primer valor de los datos, indica el nombre de la columna
*/
$chart [ 'chart_data' ] = array ( array ( "", "2004", "2006", "2006", "2007" ),
array ( "Ordenadores", 5, 10, 30, 63 ),
array ( "Lavadoras", 100, 20, 65, 55 ),
array ( "Refrigeradores", 56, 21, 5, 90 )
);
 
/* al terminar de construir tus arreglos, imprimelos */
SendChartData ( $chart );

2do paso: Crea el archivo que muestra los datos en pantalla, llamelecomoquieras.php

1
2
3
4
5
6
7
include "charts.php";
 
/*
* aqui le dices que inserte un objeto de flash y que obtenga los datos del archivo datos.php
* los ultimos numeros indican ancho y altura del objeto
*/
echo InsertChart ( "charts.swf", "charts_library", "datos.php", 500, 150 );

Resultado: Un feo (por el momento), pero rapido gráfico de Flash que te permite hacer soluciones rapidas y ahorrarte tiempo.

PHPSWF

PHP/SWF nos provee de una serie de atributos muy ricos, podemos cambiar practicamente cualquier cosa de la apariencia de la gráfica, el limite solo es tu imaginación (o tu flojera).

14 Comentarios

Instalar un servidor DNS con TinyDNS (djbdns)

25/08/2006

Hace tiempo escribi una serie de howto’s para la empresa en donde hospedo mis sitios, los voy a ir traduciendo y extendiendo poco a poco en mi blog por si les interesa.

Esta instalación la hize en Gentoo Linux, pero fácilmente la puedes adaptar para tu distribución de linux favorita.

1. Introducción

Un servidor DNS o Servidor de Nombre de Dominios (Domain Name Server) es utilizado para asociar un nombre (dominio) a una dirección IP, el objetivo de esto es que personas como tu y yo no tengamos que recordar cosas del tipo 64.233.187.99, sino que podemos recordar el simple google.com y listo. Dicho esto, los nombres de dominio fueron pensados para hacernos la vida mas fácil a nosotros, a una computadora le da igual.

En este momento existen 2 principales competidores para servidores DNS en el mundo del código libre, BIND y djbdns (también conocido como TinyDNS), siendo este último mas famoso por su sencilla y rapida configuración, asi como por ser mas ligero en memoria. BIND es mas usado todavia, pero ya se esta dejando ver su edad, ojala pronto le den una pulida. En lo personal uso TinyDNS, si bien no tiene demasiada carga, nunca me da problemas.

2. Instalación

Primero que nada, si aún no lo tienes, hay que instalar svscan que sirve como seguridad extra, por si algún dia se cae el TinyDNS que lo vuelva a levantar aútomaticamente.

emerge supervise-scripts

Ahora agregamos svscan al nivel de boteo de default, para que inicie cada vez que el servidor lo haga e iniciamos el servicio (puedes usar la herramienta eselect tambien si asi lo prefieres)

rc-update add svscan default
/etc/init.d/svscan start

ahora podemos hacer la instalación de TinyDNS

emerge djbdns

¿dificil? ¿a poco no es portage una maravilla? :)

3. Configuración

Lo primero que tenemos que hacer es que TinyDNS se ligue a una dirección IP que tengamos en nuestro servidor, con los usuarios tinydns y dnslog que fueron creados durante la instalación, recuerda reemplazar 1.2.3.4 con tu dirección IP!

tinydns-conf Gtinydns Gdnslog /etc/tinydns 1.2.3.4

despues creamos un soft link para que svscan se encargue de cuidar nuestro servidor

ln -s /etc/tinydns /service/tinydns

djbdns tiene una característica de cacheado, para hacer las cosas mas rápidas en un futuro, como mi servidor no es de gran demanda, no lo utilizo, pero vale la pena checarlo si tienes problemas de velocidad.

ahora es tiempo de crear nuestro primer registro, asi que lo relacionamos con nuestra IP y ejecutamos make para asegurar que se cumplan los cambios

cd /service/tinydns/root
./add-ns example.com 1.2.3.4
make

básicamente ya esta funcionando tu dominio, pero seguramente tendras que pulirlo mucho mas para apuntar a servicios como el email, tus direcciones del servidor dns o hacer subdominios, esto lo logras modificando el archivo /service/tinydns/root/data, como ejemplo puedes tomar esta configuración basica

Zexample.com:example.com.:example.com.:2005100111:28800:7200:604800:3600:3600
#servidor de dominio
&example.com::ns1.example.com.:3600
&example.com::ns2.example.com.:3600
#dominio completo
=example.com:1.2.3.4:3600
#record MX (mail)
example.com:1.2.3.4:a::60
#adicionales
+mail.example.com:1.2.3.4:3600
+ns1.example.com:1.2.3.4:3600
+ns2.example.com:1.2.3.4:3600
+www.example.com:1.2.3.4:3600

siempre recuerda ejecutar make despues de hacer cambios.

Eso es todo lo que se necesita para correr un servidor de dominios, ya tienes la base, extiendelo a tu gusto ya no dependes de los servicios de alguien mas!

Para referencia, dnsreport es un buen servicio que te dira que configuraste bien o mal, no olvides usarlo.

6 Comentarios

OSx86 en una Dell Inspiron 6000

25/07/2006

He tenido algunos problemas para hacer la instalación en mi laptop, pero poco a poco la he echado a andar, esto no pretende ser una guía, pero voy a hacer un resumen de los pasos que hize para no perderle la pista. Disculpen la calidad de las fotografías las tome con mi Nokia 6600 porque no tenia camara a la mano.

Mi Inspiron es una de las que trae video integrado con Intel Extreme Graphics II, por esa razón me ha dado problemas, si tuviera una ATI como la mayoria todo seria diferente ó como ya lo mencione, la tarjeta inalambrica que trae de fábrica no funciona con MacOS X todavia, por lo que me decidi a comprar en eBay una Truemobile 1450, que esta comprobada que funciona y funciona muy bien n_nPude encontrar bastante informacion y ayuda en el sitio oficial del osx86, ahi encuentras guias, wikis y mucha información muy útil, mas que nada estos dos temas me ayudaron bastante, foro sobre la inspiron 6000, sobre el chip de video 915

Lo primero que hize fue conseguir la instalación para MacOS X pero parchada, ya que la versión original contiene un seguro (bastante debíl, por cierto, por algo a de ser), la puedes bajar de los muchos lugares donde se consiguen torrents, como por ejemplo, The Pirate Bay, el release que me baje fue el 10.4.6, parcheado por JaS

Despues de quemar el ISO en un DVD me tope con el primer problema, debido a mi tarjeta de video, al arrancar con el dvd de instalación llega a una parte despues de la pantalla inicial de la manzana, en que mi maquina se queda atorada con una pantalla azul, muy a lo windows, 5 minutos de investigación me enseñaron que podria proseguir la instalación si conectaba un monitor externo a mi salida de video, lo hize y grata sorpresa, si continuo la instalación.

conectando a un monitor externo

A la hora de particionar, hay una herramienta para esto en la sección de Utilerias, debes de tomar en cuenta que la particion donde vas a instalar tu MacOS debe de ser una partición primaria, sino te va a ser mas dificil el bootear, despues de tener bien la partición, es importante que al seleccionar los paquetes a instalar, selecciones los parches de acuerdo a tu procesador, pon atención especial al ‘common’, el no colocarlo siendo mi procesador SSE2 me provoco tener que instalar de nuevo.

Ahi mismo te dice que debes de instalar para cada procesador, solo debes de saber si tu procesador es SSE2 o SSE3, para usuarios de linux, esto se sabe haciendo un simple ‘cat /proc/cpuinfo’ viendo la sección de flags, para los usuarios de windows existen programas que te dan esa info, googleen y encontraran. Generalmente los pentium M(centrino) son SSE2 y los Pentium 4 son SSE3.

eligiendo particiones

El proceso me tomo como 1 hora en mi laptop, pero de seguro es mas rapido en una PC con mejor procesador, y toma alrededor de los 6GB en total.

Terminada la instalación tuve que añadir unas lineas extras a mi grub, para que MacOS booteara sin afectar mi instalación de Ubuntu ni la de Windows, eso es muy sencillo agregando una nueva entrada como esta, mi partición fue la tercera del disco, tu adaptala como sea tu caso, en grub las particiones se nombran desde el 0.

title MacOS X
root (hd0,2)
chainloader +1

La partición donde instalaste el MacOS debe de ser de booteo, cambiala con cfdisk en linux o fdisk en msdos, sino es asi, booteara en windows a la hora de seleccionar el MacOS (no me preguntes porque)

Justo cuando estaba pensando en lo facil que habia sido la instalación, cuando me estaba saboreando probar mi nuevo SO, Zaz! pantallazo azul! ya me parecia olia mucho a Microsoft todo esto, pero eso saca uno por usar plataformas que no estan hechas para ese SO.

Nuevamente fue culpa de mi tarjeta de video integrada, por alguna razón sigue dando bien el video, solo que por la interface incorrecta, trata de dar el video como en la instalación por la salida de video, a la fecha de escribir este post todavia no hay una solución por medio de software, si quieres bootear correctamente tienes que hacerlo con un monitor externo.

Si no quieres estar cargando tu monitor a todos lados, en mi caso creo que el cargar un CRT de 19″ le quitaria todo lo “portatíl” al asunto, hay otra solución si bien algo sucia, funciona. Solo debes de colocar 2 pequeños cables para puentear tu salida de video en los pines 1-6 y 2-12, esto hara creer a tu laptop que tiene una salida hacia un monitor, no garantizo que esto sea del todo seguro, pero por lo menos a mi no me ha dado problemas. Puedes tomar de ejemplo este dibujo que hizo uno de los foreros de osx86

dirty fix

cables en la salida del monitor

Ya con esto puedo bootear bien en mi nuevo, flamante y económico MacOS X, ahora el único problema que tengo es que el sistema se alenta despues de un par de minutos de funcionar o al tener varias aplicaciones abiertas, no se si esto se solucione hasta que haya soporte para mi driver o hasta que compre una nueva memoria RAM, por lo pronto me voy a comprar 1 ó 2 GB de RAM via eBay de nuevo y les cuento que pasó, por lo pronto de regreso al trabajo.

al fin booteando

mi escritorio

== Actualización #1 ==

Al instalar los drivers de sonido (ve esta guía), o mas bien repararlo, porque ya los trae, me soluciono el problema de la ralentización, ahora todo va muy bien, muchas veces tengo que conectar primero la maquina antes de prenderla porque sino arranca con el procesador a menos velocidad, pero eso ya es culpa del speedstep de intel

== Actualización #2 ==
Dicho y hecho, me llego mi tarjeta inalámbrica de 20dlls, truemobile 1450, y la detecto sin tener que hacer modificaciones o instalar nada, igual en windows, solo falta ubuntu, pero creo que lo voy a quitar para poner Gentoo, ya tengo demasiado SO para mortales instalado n_n

La tarjeta compatible
Cambiando Wireless

== Actualización #3 ==

Otra cosa que arregle fue el modulo de administración de energía, ya que no se estaba mostrando las cargas de la pila automáticamente, lo cual tiene sentido, porque mi laptop es ACPI y apple hace todo para las nuevas dual core, como sea un chavo de osx86, escribio un driver para agregar soporte para ACPI.

Lo único que tienes que hacer es colocar el .bundle en el directorio /System/Library/SystemConfiguration sobreescribiendo el anterior y listo. Esta comprobado que funciona con 10.4.6 y 10.4.7

Parche para Powermanagement

Powermanagement

== Actualización #4 ==

Al parecer cuando hize la instalación no seleccione el parche para habilitar Quartz Extreme y Core Image (son caracteristicas que hacen que tu tarjeta de video haga mas cosas “bonitas”), eso lo solucione con este parche, ojo, solo sirve para tarjetas de video integrado con chipset del GMA900

Soporte para GMA900

funciona tanto para MacOS X 10.4.6 como para 10.4.7, talvez para futuras versiones tambien lo haga

gma900

== Actualización #5 ==

No había probado mi OSX desde que instale una memoria adicional de 1GB a mi inspiron (para un total de 1.5GB) y la verdad es que ahora va excelente, no tiene problemas para correr programas pesados fluidamente como Eclipse o el mismo Office.

Estuve a punto de borrar esta partición, pero con esto y otras cosas (como el reciente lanzamiento de MacFUSE y mi licencia pagada y sin usar de textmate) me han dado ganas de probar la actualización a 10.4.8 y seguir usandolo de vez en cuando junto con Ubuntu, ya veremos cuando tenga tiempo libre.

46 Comentarios