Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.
June 23, 2008 a las 5:43 pm por Edwin Plauchu · Archivado en Programacion, Linux
Autor: Ing.Edwin Plauchu
mail to: j4nusx@gmail.com
Instalando Postgresql
Antes de instalar “postgresql 8.2″ , verifiquemos que este, no este ya instalado, si esto no fuese asi utilice descargue las fuentes de postgresql de la ftp de postgres:
pianodaemon@pianodaemon:~> tar -xvjf ./postgresql-8.2.5.tar.bz2
Aplicaremos las opciones de compilacion que aqui se muestran:
./configure --prefix=/home/postgresql/ --without-zlib && make && make install
Explicacion de los parametros anteriormente citados:
–prefix=/home/postgresql/ <---- Instalara postgresql en el home del usuario del sistema "postgresql"
–without-zlib <---- Desactiva el uso de compresion en nuestras tablas, sacrificando espacio, pero ganando velocidad de lectura en archivo de disco.
El usuario postgresql
Postgresql solo podra ser ejecutado por el usuario postgresql, mismo que debera de pertenecer al grupo postgresql.
Asi que procederemos a la creacion del mismo y de su grupo, posteriormente asignaremos el directorio /home/postgresql, solo al usuario y grupo postgresql:
Vamos a crear un directorio data (directorio de archivos en disco que almancenan las tablas de nuestras bases de datos), esto lo haremos logeados como el usuario postgresql:
pianodaemon@pianodaemon:~> su - postgresql
postgresql@pianodaemon:~> pwd
/home/postgresql/
postgresql@pianodaemon:~> mkdir ./DATA
Inicializando el directorio data:
postgresql@pianodaemon:~> ./bin/initdb -D ./DATA/
The files belonging to this database system will be owned by user "postgresql".
This user must also own the server process.
The database cluster will be initialized with locale es_ES.UTF-8.
The default database encoding has accordingly been set to UTF8.
fixing permissions on existing directory ./DATA ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 32MB/204800
creating configuration files ... ok
creating template1 database in ./DATA/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.
Success. You can now start the database server using:
./bin/postgres -D ./DATA
or
./bin/pg_ctl -D ./DATA -l logfile start
Si obtuviste la pantalla anterior, el directorio data fue inicializado con exito.
Shell Script requerido para el arranque y parada de Postgresql
El siguiente shell script, esta realizado en bash, para llevar a cabo su ejecucion:
#!/bin/sh
# Start/stop/restart postgresql.
#
# To start PostgreSQL automatically at boot, be sure this script is executable:
# chmod 755 /etc/rc.d/rc.postgres
# --> Before you can run PostgreSQL, you must have a database. Use initd.
#
# Note that step one is becoming the 'postgres' user. It's important to do this
# before making any changes to the database, or postgres won't be able to write
# to it later
# Set up variables
PGROOT=/home/postgresql
PGDATA=/home/postgresql/DATA
PGUSER=postgresql
PGLOG="$PGDATA/postgres.log"
PGDAEMON="$PGROOT/bin/postmaster"
PGCTL="$PGROOT/bin/pg_ctl"
if echo 'c' | grep -s c >/dev/null 2>%1; then
ECHO_N="echo -n"
ECHO_C=""
else
ECHO_N="echo"
ECHO_C='c'
fi
set -e
# Start postgresql:
postgresql_start() {
$ECHO_N "Starting PostgreSQL: "$ECHO_C
su - $PGUSER -c "$PGDAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
echo "ok"
}
# Stop postgresql:
postgresql_stop() {
$ECHO_N "Stopping PostgreSQL: "$ECHO_C
su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast" >>$PGLOG
2>&1
echo "ok"
}
# Restart postgreSQL:
postgresql_restart() {
$ECHO_N "Restarting PostgreSQL: "$ECHO_C
su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast" >>$PGLOG
2>&1
echo "ok"
su - $PGUSER -c "$PGDAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
echo "ok"
}
case "$1" in
'start')
postgresql_start
;;
'stop')
postgresql_stop
;;
'restart')
postgresql_restart
;;
*)
echo "Usage $0 {start|stop|restart}" 1>&2
exit 1
;;
esac
exit 0
Optimizando PostgreSQL
El reto de nuestra afinación va a consistir en optimizar el uso de memoria para postgres, minimizando en lo posible el número de intercambios con la swap (pagein). El mejor ajuste de los parámetros de configuración será aquél que obtenga la máxima disponibilidad en memoria para la BD, sin perjudicar al resto de elementos, que también deben permanecer en memoria.
SHARED_BUFFERS
El número de shared_buffers es el parámetro que más afecta al rendimiento de PostgreSQL. Este valor, de tipo entero, indica el número de bloques de memoria o buffers de 8KB (8192 bytes) que postgres reservará, como zona de trabajo, en el momento del arranque para procesar las consultas. De forma predeterminada (en postgresql.conf), su valor es de 1000. Un número claramente insuficiente para conseguir un rendimiento mínimamente aceptable.
Estos buffers se ubican dentro de los denominados segmentos de memoria compartida. Es importante saber que el espacio ocupado por el número de buffers que pretendamos asignar, nunca podrá exceder al tamaño máximo que tengan los segmentos de memoria. En caso contrario, postgres se negará a arrancar avisando con un error que no puede reservar el espacio solicitado.
Una buena recomendación (lee el artículo de B. Momjian[1]) es la de empezar asignando un 10% del total de la memoria RAM para shared_buffers y a partir de ahí, ir aumentando o disminuyendo dicho porcentaje en función del rendimiento y la paginación.
Comenzamos:
El 10% de 1 GB: (1048576 KB/10) = 104857 KB
shared_buffers: (104857 KB/8 KB) = 13107
Asignamos este valor a la variable shared_buffers (postgresql.conf)
En Linux, de forma predeterminada, el tamaño de un segmento de memoria compartida es de 32MB. Podemos comprobarlo haciendo (el resultado es en nº de bytes):
Asi que asignaremos al kernel de linux un nuevo tamaño de segmento por default(agregue esta linea en /etc/sysctl.conf).
kernel.shmmax=107372544
Para comprobar el rendimiento, aplica EXPLAIN[2] a tus consultas. Para ver la paginación del servidor, puedes usar herramientas como vmstat o ipcs (consulta sus páginas man).
[editar] WORK_MEM
Este parámetro configura el espacio de memoria que postgres utiliza para realizar ordenaciones de tablas o de resultados parciales de consultas, sobre todo en cláusulas ORDER BY, CREATE INDEX o MERGE JOIN.
Este valor es más dificil de configurar porque depende, por un lado, de lo grande que sean las tablas o resultados que hay que ordenar, y por otro, del número de peticiones simultáneas para esa misma consulta (para cada una se empleará la misma cantidad de memoria).
Una buen comienzo es asignar entre un 2% y un 4% del total de la memoria si prevemos pocos accesos simultáneos a grandes sesiones de ordenación y mucho menor, si esperamos muchos accesos simultáneos a sesiones de ordenación pequeñas. Como antes, lo mejor es ir probando distintos valores y ver en qué pueden afectar a la paginación adversa. El valor hay que expresarlo en KB.
En nuestro ejemplo, hemos optado por usar un 4% de la memoria:
El 4% de 1 GB: 41943 KB (1048576 KB*4)/100
work_men = 41943
June 23, 2008 a las 1:41 pm por Edwin Plauchu · Archivado en Programacion, Linux
Lo primero sera ajustar los siguiente parametros en el kernel… para esto, bastara con modificar el fichero /etc/sysctl.conf.
Y agregar la siguientes lineas.
Una vez creado este usuario nos logeamos como el y procedemos a settear ( otro maldito verbo que no existe ) las variables de entorno que ha de requerir nuestra instalacion de Oracle y la ejecucacion de la base de datos en si. Asi que debemos adicinar estos valores en el archivo .bash_profile del usuario oracle.
Centos 5 no es una versión certificada, para que Oracle piense que se está instalando en un Oracle Linux Enterprise hacemos lo siguiente:
echo "Enterprise Linux Enterprise Linux AS release 4 (October Update 4)" > /etc/redhat-release
Ejecutamos la instalación ejecutando ./runInstaller y ahí es como una instalación normal.
Una vez finalizada la instalación dejaremos el archivo /etc/redhat-release como estaba con:
June 16, 2008 a las 1:50 pm por Edwin Plauchu · Archivado en Programacion, Linux
Instalando Java en el directorio HOME de un usuario
En ocaciones se ha desarrollado una app … que corre con cierta version de tomcat y cierta version de java..
Entonces… si tenemos un servidor que corra diferentes aplicaciones tomcat con diferentes versiones de java…
Entonces para que instalar un java global(me refieron a un version java que sea general para todos los usuarios)… por que no instalar un java para cada usuario que corra una aplicacion que requiere una version de tomcat y java especifica…
Aqui en este articulo blogero pedalero… les mostrare el como instalarce una version de java y tomcat recientes para un usarlo solo en el entorno que respecta al usuario llamado j4nusx …
Nota:he usado slackware… ya que es una distro muy sencilla y la corro en xen sin problemas… ademas… ademas de que slackware te permite adquirir un conocimiento total sobre el software que operas o compilas sobre el….
Bueno empecemos…
Lo primero sera agregar las siguientes variables al fichero $HOME/.bash_profile, en este fichero reside todo lo que respecta a la declaracion de variables del entorno que se cargaran cuando el usuario inicie una sesion.
export JAVA_HOME=/home/j4nusx/jdk1.6.0_10
export JRE_HOME=${JAVA_HOME}/jre
export PATH=$PATH:${JAVA_HOME}/bin
# La variable de tomcat la agregamos aqui para evitarnos el tener que agregarla despues..
export TOMCAT_HOME=${HOME}/apache-tomcat-6.0.16
Ahora me descarglo las version de jdk y apache tomcat que usare
j4nusx@mayte:~$ ls
apache-tomcat-6.0.16.tar.gz jdk-6u10-beta-linux-i586.bin* jdk1.6.0_10/
Procedo a instala jdk
j4nusx@mayte:~$ ./jdk-6u10-beta-linux-i586.bin
Si todo salio bien… podras ver algo como esto… si te has logeado una vez mas con el usuario j4nusx
j4nusx@mayte:~$ java -version
java version "1.6.0_10-beta"
Java(TM) SE Runtime Environment (build 1.6.0_10-beta-b25)
Java HotSpot(TM) Client VM (build 11.0-b12, mixed mode, sharing)
Bien.. bueno ya esta instalado y sin contratiempos…. ahora procedemos a instalar tomcat ( eres tu don gato ? )
Instalar la Versión Binaria de Tomcat
j4nusx@mayte:~$ tar -xvzf apache-tomcat-6.0.16.tar.gz
Arrancando Tomcat
j4nusx@mayte:~$ $TOMCAT_HOME/bin/startup.sh
Si arrancaste tomcat podras ver lo siguiente:
j4nusx@mayte:~/apache-tomcat-6.0.16/bin$ ./startup.sh
Using CATALINA_BASE: /home/j4nusx/apache-tomcat-6.0.16
Using CATALINA_HOME: /home/j4nusx/apache-tomcat-6.0.16
Using CATALINA_TMPDIR: /home/j4nusx/apache-tomcat-6.0.16/temp
Using JRE_HOME: /home/j4nusx/jdk1.6.0_10/jre
Funciones Hash
Las funciones hash son faciles de computar pero dificil de aplicarles ingenieria en reversa.
Aque me refiero con esto?, lo explicare con un ejemplo sencillito sobre sistemas linux:
$ echo "Esto se encriptara mediante una funcion hash" | md5sum
f538fb4f2360fcbb3af0f31cdd479829
$ echo "Esto se encripta mediante una funcion hash" | md5sum
fa5f1a88d876d3974a501b3a9c140e2a
Observemos que la cadena introducida via pipe a el comando md5sum nos ha generado un valor hexadecimal, este valor dificilmente podria llegar a ser igual a otro, que quiero decir con esto? Que no hay dos cadenas que computen el mismo valor. Matematicamente podrias llegar a la siguiente deduccion:
Uso comun
Un uso muy comun de esto, lo puedes ver cuando te has bajado una distribucion linux. En los servidores ftp donde se pone a disposicion la descarga de las imagenes de los DVDs que componen a una distribucion linux, tambien se te ofrecen los valores hash md5 que corresponden a cada imagen, una vez que has descargado una de las imagenes… Habras de comparar que estas imagenes te den el valor md5 indicado por los fabricantes de dicha distribucion linux.
Si el valor fa5f1a88d876d3974a501b3a9c140a2d es el que indica el fabricante de la distribucion linux, entonces la imagen que hemos de quemar en un dvd virguen, es la correcta… pero si el valor no es el indicado por el fabricante… lo mas probable sera, que te estes bajando un fichero imagen corrupto, o en el peor de los casos… una copia alterada por alguien que ha vulnerado el servidor ftp.. y te ha colocado un backdoor sobre la distribucion que aun no te has instalado.
Cifrados Simetricos
Un Cifrado Simetrico es una transformacion, que fue llevada a cabo por un llave secreta, Esta llave traduce su entrada conocida como texto plano, a un salida conocida como texto cifrado, de esta manera excluimos el criptoanalisis(accion contraria a la criptografia..) , solo aquella entidades que posean la llave secreta podran recobrar el texto plano que esta oculto sobre el texto cifrado.
Los Cifrados Simetricos tienen una larga historia, y han mutado en variantes de los mismos bastante interesantes.. una de estas variantes es el triple-DES… muy usado por routers de prestigio hoy en dia.
Cifradores Asimetricos
Un cifrador asimetrico es semejante a un cifrador simetrico, pero el asimetrico ejerce su poder en el uso de un par de llaves.. y no solo una llave como lo hace el simetrico.
El par de llaves a las cuales hago referencia son las siguientes:
• Llaves Publicas -- Usadas para encriptar el texto plano
• Llaves Privadas -- Usadas para desencriptar el texto cifrado
Las llaves son generadas de una manera sencilla, lo cual permite deducir cual es la llave privada y cual es la publica. Aplicarle ingenieria en reversa a estas llaves, es algo sumamente dificil.
Esta fabulosa propiedad permite a la gente el intercambiar sus llaves publicas sobre canales o comunidades y mantener conductos de comunicacion completamente privados.
Los mas notables sistemas de cifrado asimetrico inclullen funciones Diffie-Hellman y RSA (como openssl). Los sistemas de encriptacion asimetrica son usados comunmente para intercambiar llaves de sistemas simetricos.
June 14, 2008 a las 9:58 am por Edwin Plauchu · Archivado en Programacion, Linux
Mucha gente se centra en procesos de ingeniería de requerimientos para conseguir mejores requerimientos con la esperanza de que esto prevenga la necesidad de cambiar el diseño más tarde. Pero incluso esta dirección no lleva a ninguna cura. Muchos cambios de requerimientos imprevistos ocurren debido a cambios del negocio. Aquellos no pueden ser prevenidos, incluso con un cuidadoso proceso de ingeniería de requerimientos.
Entonces todo esto hace que el diseño planificado parezca imposible. Seguramente estos son desafíos grandes. Pero no me inclino a decir que el diseño planificado es peor que el diseño evolutivo comúnmente practicado de la forma “codificar y arreglar “. De verdad prefiero el diseño planificado al ” codificar y arreglar “. Sin embargo soy consciente de los problemas del diseño planificado y busco una nueva dirección.
A razon de esto la propuesta de Rails me parece algo muy cercano a la utopica idea de un diseño que permita prevenir cualquier cambio en el futuro de un App web. Hago incapie en la palabra aplicacion web.En ningun momento lo recomiendo como una solucion general a toda la solucion tecnologica que se proponga a grandes necesidades.
Rails me parece perfecto. Para ser el participante ideal… en todas aquellas aplicaciones que deberian fungir como mecanismo de captura de los datos del dia a dia de los negocios que asi lo requieren…
Las aplicaciones en Java tienen la capacidad de formar parte de una solucion y a su vez ser todas partes de la misma.
Aunque rails nos permite crear aplicaciones web de una manera muy rapida este no cubrira todos las posibles encomiendas de una solucion.
March 28, 2008 a las 10:33 am por Edwin Plauchu · Archivado en Programacion, Linux
Lo primero sera instalar subversion, esto lo haremos mediante el instalador de paquetes apt-get
# sudo su -
# apt-get install subversion
Ya que tenemos instalado subversion, pasaremos a leer un poco de teoria:
Subversion sirve para gestionar un repositorio de archivos y sus distintas versiones. Un repositorio no es nada más que un sitio donde guardar ficheros. No nos importa cómo se guardan, sino cómo se accede a estos ficheros. Normalmente se usa una base de datos.
Pero la idea es que un repositorio es como un directorio, al que le puedes pedir los ficheros que tenía hace un mes, o hace 2 días. Es capaz de recuperar el estado de los mismos a partir de la base de datos.
Así, como usuario, lo importante es poder recuperar distintas versiones ( en especial las últimas ) y poder actualizar el repositorio con una versión nueva.
Realmente alguna de estas cosas se puede hacer con metainformación. Es decir, información sobre la propia información que está guardando el repositorio. Así, que aparte de los ficheros, el repositorio debe guardar cuando llegaron hasta él, por cuántas versiones distintas ha pasado, y este tipo de información que le permita cumplir su objetivo.
A diferencia de CVS, Subversion hace las revisiones globales del repositorio.
Esto quiere decir, que un cambio en un fichero no introduce un salto de versión únicamente en este fichero, sino en todo el repositorio ( que avanza una _revisión_ )
Vamos a realizar una serie de ejercicios a modo de ejemplo sobre el uso básico de SVN. Luego iremos incrementando el orden de dificultad hasta montar un servidor sencillo de SVN.
Lo primero que hay que hacer es crear nuestro repositorio. A tal efecto, podemos ir preparando el sistema para hacerlo de la forma correcta.
Ahora la necesidad que me surge es subir mi software a mi repositorio recien creado….. para esto mi software se llama softwarepatito, mi software patito inclulle un fichero de texto Readme.txt es todo.
Entonces la forma como lo subiria al repositorio seria la siguiente:
# cd /home/pianodaemon/softwarepatito/ && ls
Readme.txt
El comando import de svn, lo que hace es copiar todo el árbol de directorios actual desde el que nos encontramos, como primera versión del repositorio.
Con la opción -m, le hemos dado el mensaje de Log directamente. Si no usamos la opción -m, entonces se abrirá el editor por defecto del sistema y tendremos la oportunidad de escribir ahí. Si no se escribe nada, entonces subversion da la opción de abortar.
El subdirectorio /home/pianodaemon/softwarepatito/ (el directorio inicial de nuestro software) ahora ya no es una copia de trabajo que provenga del repositorio… por lo que podriamos decir que ya no esta al dia. De hecho, no sirve para nada más. Así, que podemos borrarla sin temor:
# rm -rf /home/pianodaemon/softwarepatito/
Vamos ahora a obtener nuestra Copia Local. Esto es de gran importancia, porque es el directorio de trabajo, desde donde se supone vamos a ir subiendo los cambios hacia el repositorio. Para ello se usa el comando checkout de svn.
# cd /home/pianodaemon/
# svn checkout file:///home/pianodaemon/svnroot/ProyectoPato
$ ls -l
total 4
drwxr-xr-x 3 pianodaemon users 4096 2004-05-12 16:44 ProyectoPato
Por cierto, también puedes querer copiarlo con otro nombre.
Bueno… hasta este punto creo que he sido muy claro… Bueno. Empecemos a ver un poco mas de como usar subversion en base a las necesidades que surgen durante el desarrollo. Hablando un poco mas en castellano… digamos que a nuestro desarrollo le necesitamos agregar un segundo fichero de texto…. entonces lo hacemos por que no hay de otra,… pero este cambio requiere subirce al servidor de subversion, esto se tiene que hacer para que otros usuarios puedan disponer tambien de este fichero de texto en sus respectivas copias de ProyectoPato que han bajado ellos a sus ordenadores para desarrollar la parte que les toca del software( ya que hablamos de un grupo de frekees desarrollando en grupo ).
Aqui muestro como genero el segundo fichero de texto Readme2.txt (este podria ser un fichero de c, python, o algun otro lenguaje de programacion ):
$ cd /home/pianodaemon/ProyectoPato/
$ echo "Segundo fichero de pruebas" > Readme2.txt
$ svn add Readme2.txt
A Readme2.txt
$ svn commit -m"Nuevo fichero agregado"
Adding Readme2.txt
Transmitting file data .
Committed revision 2.
Como se puede observar, una vez dentro de una copia local, NO es necesario indicarle la ruta al repositorio, pues ya la conoce. svn add realmente no añade el fichero al repositorio, simplemente lo marca para añadir. El que ejecuta la operación finalmente es el comando svn commit. Advierta que ahora estamos en la revisión 2 del código.
Vamos a modificar un fichero de estos. Le añadadiremos una línea.
$ cd /home/pianodaemon/ProyectoPato/
$ echo "Esto es otra linea" >> Readme.txt
Vamos a probar otra cosa interesante…. con este comando, svn diff podemos ver las diferencias entre el repositorio y
nuestra copia local.
$ echo "Otra Nueva Linea" >> Readme.txt
svn diff
Index: Readme.txt
===================================================================
--- Readme.txt (revision 3)
+++ Readme.txt (working copy)
@@ -1,2 +1,3 @@
Mi primer fichero en SVN
Nueva Linea
+Otra Nueva Linea
March 27, 2008 a las 10:32 am por Edwin Plauchu · Archivado en Programacion, Linux
A lo mejor te estas preguntando que es Cake Php, es un framework para Php de la misma manera que Rails es para Ruby, basicamente es una utilidad diseñada para facilitar el desarrollo de proyectos en Php.
Ahora la siguiente pregunta que puede que te estes haciendo sea ¿Debo utilizarlo?
Pues debes utilizarlo si te gusta Ruby On Rails, si sabes de Php pero no tienes tiempo para aprender otro lenguaje, si estas cansado de programar siempre las mismas cosas, si compartes hosting, si quieres hacer más en menos tiempo, si quieres usar templates, si quieres utilizar urls limpias y no pasar las variables con las típicas urls index.php?id=21
Para instalar el fabuloso cake sobre ubuntu gutsy basta con hacer lo siguiente:
Cuando hemos instalado cake mediante la herramienta de paquetes synaptic… este nos ha dejado el paquete cakephp sobre el directiorio que se muestra arriba… es importante que memorices la ruta del mismo.
Ahora procedemos a sacar una copia de cake, la cual usaremos para nuestro desarrollo muy particular:
Ya que no es seguro para la integridad de tu sistema linux el trabajar en modo root, adaptaremos nuestra copia particular de root para trabajarla con nuestro usuario de sesion comun, en el caso mio mi usuario de session comun es pianodaemon:
Esta imagen te muestra el resultado del acceso a la carpeta cake para uno usuario de sesion comun y corriente… Ademas agregue la carpeta cake, a los accesos directos de Mi Navegador de archivos Nautilus.
He creado anteriormente a este tutorial una base de datos de nombre MORALES, y le he dado los permisos para ser accedida desde localhost por el usuario ‘pianodaemon‘ con password ‘123qwe‘ ( todo esto sobre la shell de mysql ), esta base de datos tambien posee una tabla con nombre ‘users‘:
create schema MORALES;
Grant all on MORALES.* to pianodaemon@localhost identified by '123qwe';
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`login_name` varchar(10) default NULL,
`first_name` varchar(30) default NULL,
`second_name` varchar(30) default NULL,
`password` varchar(255) default NULL,
`state` char(1) default NULL,
`email` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Ahora procedemos a retocar el fichero /var/www/cake/app/config/database.php
Estable el siguiente directorio raiz en apache2…. esto lo puedes hacer modificando el fichero /etc/apache2/sites-available
DocumentRoot /var/www/cake/app/webroot
Sobre el mismo fichero tambien modifica el valor del tag Directory /var/www/ a Directory /var/www/cake/app/webroot
Listo ahora prueba lo que has hecho…(recuerda que modificaste ficheros de apache… por lo que te recomiento reiniciarlo):
Puedes checarlo invocando desde cualquier navegador la url http://localhost/