Sobre los permisos en symfony y cuál es mi solución

Hola amiguetes!!

Hoy os traigo mi solución al problema de los permisos en Symfony. Todos los desarrolladores que hemos trabajado con este maravilloso framework conoceremos al dedillo que symfony no sabe gestionar muy bien sus propios permisos cuando se encuentra desplegado en el servidor y creo que todos nos hemos tirado bastante de los pelos cuando empezábamos en el mundo de este framework y no sabíamos porque pasaba. Tengo que aclarar que sobre lo que estoy hablando y cómo yo lo soluciono es bajo un Elementary OS, distribución que mama de Ubuntu, con esto quiero decir que no sé que tal se portarán los permisos en otros sistemas operativos (Windows ejem ejem….)

El origen del problema de los permisos en symfony

Todo esto comienza con dos directorios muy importantes para el framework. Estos directorios son app/cache y app/logs. Estas son las carpetas responsables tanto de guardar los logs de lo que va pasando en el framework, como de guardar una copia del proyecto en cache para así reducir tiempos de carga. Estos dos directorios se suelen subdividir en otros tres directorios diferentes, a saber, /dev , /prod y /test que es la estructura lógica para las tres etapas en el ciclo de vida de un proyecto symfony.

Pues bien, el problema del que hablo viene cuando desplegamos el proyecto, me da igual si es en /dev o /prod, en nuestro servidor. Al acceder a nuestra primera vista, symfony nos arroja un error de que no puede escribir bajo las carpetas de app/cache y app/log y eso esta causado por el usuario que ejecuta el proyecto en /var/www.

Directorios del infierno
Directorios del infierno

Cuando tenemos el proyecto en nuestra carpeta de usuario o en cualquier otro directorio que cuelgue de nuestro $HOME no hay problema porque se ejecutará a través de nuestro usuario que pertenece a un grupo de usuarios que tiene los permisos de lectura y escritura para $HOME y subdirectorios, pero lo que pasa bajo el directorio /var/www es que nuestro usuario actual intenta acceder a zonas en las que no tiene permisos ya que el directorio /var/www unicamente esta gestionado por el usuario www-data y entonces es cuando el proyecto peta y nos avisa que no puede escribir bajo el directorio cache y log.

En la documentación oficial te explican muy bien como solucionar el problemas de los permisos en symfony que pasa por borrar lo que hay en estos directorios en nuestro servidor y volver a darle permisos de escritura al usuario mediante el siguientes comando.

$ sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

Pero según mi experiencia, se tiene que estar ejecutando este comando de cuando en cuando porque en cada despliegue limpio al servidor que se hace, el sistema decide olvidarse de quien tiene permiso y quien no, así que yo utilizo una técnica totalmente diferente para olvidarme de los permisos y centrarme en seguir programando.

Cómo soluciono yo los errores de permisos en symfony

Ojo, que no digo que mi técnica sea la definitiva ni la mejor de todas, de hecho puede que hasta vaya en contra de las buenas practicas del saber hacer informático pero repito que como a mi me funciona y me siento muy a gusto y cómodo con ella pues sigo adelante y creo que así es cómo debería ser. La cosa es que jamás monto un proyecto symfony, por muy pequeño que sea, sin hacer uso de phing.

Para el que no conozca phing, es una herramienta automatizadora de tareas que se escribe en XML. Con phing puedes hacer cualquier cosa ya que permite ejecutar comandos del sistema y así olvidarte de tareas como mover directorios, borrar ficheros o hacer transferencias entre servidores FTP por ejemplo. El primer artículo que escribí en el blog hablaba de phing y os dejaba la configuración que utilizaba yo por aquel entonces para desplegar un proyecto symfony con tan solo darle a un botón. Os recomiendo que le echéis un vistazo antes para ver de lo que es capaz esta herramienta y la de cosas que podeis hacer teniendo un poquito de imaginación.

Así pues, con phing he conseguido automatizar la tarea de borrar los subdirectorios de app/cache y app/logs y darles permisos 777 en cada despliegue. ¿Que no será la mejor solución? Puede. ¿Que es más fácil darle permisos al usuario y olvidarnos? Posiblemente. ¿Que estos directorios únicamente deberían tener permisos 777 en desarrollo? Pues si.

¿Entonces porque lo hago así? Pues no sé xD es mi manera de trabajar y os la quería enseñar. Pero tal vez es mejor que vosotros acudáis a la documentación oficial y seguir los senderos de la rectitud de lo que nos dice symfony. Y con este chorrazo, os dejo con mi solución.

<target name="dar_permisos_chmod">
<echo msg="Borrando directorios en /var/www/proyecto"/>
<exec command="rm -rf /var/www/proyecto/app/cache/ /var/www/proyecto/app/logs/"/>
<echo msg="Dando permisos chmod de escritura a /var/www/proyecto/app/cache y /var/www/proyecto/app/log"/>
<exec command="chmod -R 777 /var/www/proyecto/app/cache /var/www/proyecto/app/logs"/>
</target>

¡Hasta que volvamos a olernos!

Cómo instalar Android Studio en Linux

¡Hey!
¿Cómo están? Aquí estoy yo otra vez con un artículo sencillito y de utilidad. El programa del que voy a hablar hoy ya tiene unos meses de antigüedad pero no había tenido necesidad de utilizarlo hasta ahora.
Por temas relacionados con un proyecto, me ha tocado instalar Android Studio en Linux, mas concretamente en Elementary OS, la distro que yo utilizo y como bien sabéis esta basada en Ubuntu. Es algo bastante sencillito pero no esta de más que lo repasemos y lo dejemos en el limbo del Internet como una guía rápida.

¿Qué es Android Studio?

Android Studio es el IDE especializado para desarrollos de Android que presentó Google en su conferencia I/O 2013. ¿Y qué se puede hacer con este IDE? Bueno, como su nombre sugiere, programar aplicaciones para Android. Android Studio esta basado en InterlliJ IDEA de JetBrains. Los que me conocéis sabéis que siento predilección por todos los IDEs desarrollados por JetBrains, ya sea para java o php. Mucha gente opina que Eclipse es el mejor IDE en el mercado pero eso es porque no han probado un IDEA, ya que estos programas de desarrollo están a años luz de Eclipse.

Con Android Studio se pueden ver en directo los cambios que estamos haciendo en el diseño de la aplicación y además viene con diferentes resoluciones para que podamos testear como queda la aplicación en cada dispositivo, vamos un responsinator para Android, ¡genial!

Instalar Android Studio en Linux

Lo primero que tendremos que hacer será descargarnos el IDE y el JDK para poder desarrollar. El programa lo podemos descargar desde la página oficial de Developers de Android.

Para el JDK tiraremos de consola y vamos a instalar la versión la versión libre de Java.

sudo apt-get install openjdk-7-jdk openjdk-7-jre

Para estar seguros que se ha instalado bien podemos comprobarlo con el siguiente comando.

java -version

Cuando hayamos terminado este proceso, nos tocará descomprimir el archivo que nos hemos descargado, en este caso un .tar. Esto lo tenemos que hacer bajo el directorio /opt así que de nuevas tiraremos de consola.

sudo tar xzvf android-studio-bundle-130.737825-linux.tgz -C /opt

Por último y no es que sea indispensable sino más bien recomendado, vamos a crear un lanzados para Android Studio. Con esto conseguimos poder anclar el programa en el dock de Elementary o que aparezca en el Unity Dash de Ubuntu. Esto es muy fácil, tan solo se trata de copiar y pegar lo que aparece a continuación.

Abrimos la consola y tecleamos lo siguiente.

sudo gedit /usr/share/applications/android-studio.desktop

Cuando se nos abra el programa escribimos las siguientes líneas:

[Desktop Entry]
Version=1.0
Type=Application
Name=Android Studio
Icon=/opt/android-studio/bin/idea.png
Exec=&quot;/opt/android-studio/bin/studio.sh&quot; %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupWMClass=android-studio

Si no quieres tirar tanto de código ni estar escribiendo, hay una segunda opción y es crear el lanzador directamente desde el mismo programa. Esta opción la tenemos en la ventana principal, la que te da las opciones para crear un proyecto, pues en Configure > Create Desktop Entry.

Con esta opción se estará creando lo mismo que hemos hecho más arriba de manera manual.

 Configurar Android Studio

La primera configuración obligatoria pasa por establecer las variables de entorno y creando la ya tan famosa JAVA_HOME. Esto lo hacemos editando el fichero /etc/environment y añadiendo la siguiente línea.

JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-i386

Como vamos a desplegar nuestros desarrollos sobre Android, parece lógico que necesitemos el kit de desarrollo para Android. Es bastante frecuente que cuando te dispones a descargar el SDK de Android, también conocido como ADT (Android Development Toolkit) te lo ofrezcan con un Eclipse ya configurado para desarrollar, pero como en este ejemplo utilizamos el propio IDE de Android tan solo bajaremos el kit de desarrollo, para ello lo descargamos desde aquí y lo descomprimimos en la carpeta que queramos.

Tenemos que volver a repetir el proceso de establecer las variables de entorno, pero en este caso necesitamos añadir los directorios tools y platform_tools a la variable $PATH. Esto lo volvemos a hacer desde el fichero /etc/environment/

Vale, ya estamos casi. Algunas utilidades del SDK nos van a correr bajo 32 bits. Si nuestro sistema operativo es de 64 bits vamos a necesitar instalar la siguiente librería.

sudo apt-get install ia32-libs

La última instalación que necesitaremos será ANT. No me quiero explayar mucho en esto, pero tan solo diré que ANT, es el phing para Java.

sudo apt-get install ant
Indicando a Android Studio dónde esta el ADT
Indicando a Android Studio dónde esta el ADT

Por útlimo le tenemos que decir a Android Studio donde se encuentra el kit de desarrollo para Android. Esto lo hacemos abriendo sus opciones de configuración desde la pantalla inicial, Configure > Project Defaults > Project Structure y en la primera caja de texto introducimos la ruta de donde hemos dejado el ADT de Android.

Y eso es todo, ya tenemos la instalación y configuración básica de Android Studio en nuestro sistema operativo. Esta claro que aún se puede poner muchas más cosas pero para comenzar no esta nada mal.

¡Hasta que volvamos a olernos!

Phing, automatizar tareas, instalación y ejemplo de despliegue en local

La primera vez que conocí un automatizador de tareas fue con Ant para Java, desde el primer momento me quede maravillado del poder de esta herramienta, desde poder crear y borrar carpetas o ficheros hasta desplegar todo un proyecto entero mediante ssh y tan solo haciendo click. La verdad es que es muy útil para olvidarte de tener que hacer ciertas tareas repetitivas.
Despues de unos años trabajando con Java y con Ant, volví al mundo de PHP. Tenía que empezar un proyecto con Symfony y obviamente queria poder tener la posibilidad de hacer todo lo que hacia con Ant, así que me puse a investigar y descubrí que existe una herramienta para automatizar tareas en PHP y aquí es donde entra Phing, que no es otra cosa que un port de Ant.
Tal y como aparece en su documentación oficial:

PHing Is Not GNU make; it’s a PHP project build system or build tool based on ​Apache Ant. You can do anything with it that you could do with a traditional build system like GNU make, and its use of simple XML build files and extensible PHP “task” classes make it an easy-to-use and highly flexible build framework.

Con Phing, al igual que con Ant, se define un fichero XML en el que se especifican las diferentes tareas que queremos automatizar, como he dicho, estas tareas pueden ir desde la creación de directorios, dar permisos, despliegues de proyectos o la ejecución de test unitarios.

Sigue leyendo