martes, 25 de marzo de 2014

Cambiar automaticamente rvm y gemset al abrir tu proyecto.

Para indicarle a un proyecto que debe utilizar un gemset y ruby version en particular, se debe hacer lo siguiente:

Es posible crear un archivo con el nombre .rvmrc con el contenido de tu gemset y ruby version:


rvm use ruby-2.0.0-p247@miGemset
 
Sin embargo esto no funciona correctamente al utilizar  rbenv o chruby
 
La forma de fijar la version y gemset es posible creando dos archivos:
 
El primero es: 
 
.ruby-version 
 
En el cual se coloca la version de ruby que se utilizara.
 
 1.9.3
 
De igual forma de crea un archivo con el nombre 
 
 .ruby-gemset
 
En el cual se pone el nombre del gemset a utilizar
 
 ej.
 
mi_gemset 
 
rvm ree-1.8.7-2010.02@rails3_project
rvm ree-1.8.7-2010.02@rails3_project
rvm ree-1.8.7-2010.02@rails3_project

miércoles, 9 de octubre de 2013

Configurar Apache2 para utilizar el directorio home de usuario y evitar "dir access forbidden"

Recientemente tuve la necesidad de programar un poco en PHP, y como algunos sabrán, el servidor Web favorito para habilitar PHP es Apache.

Sin embargo por lo general en linux, el directorio en el cual Apache lee los sitios para poderlos mostrar en el navegador, es /var/www un directorio con ciertas restricciones y casi siempre no accesible al usuario que no sea root o al dueño de apache.

Esto es un problema, pues si estas utilizando un sistema de gestión de versiones, es complicado al realizar push, pulls o cualquier cambio utilizar el comando sudo o en su defecto ser usuario root (super usuario), también puedes optar por otra solución, la cual yo utilicé y me harto, esto era tener tu proyecto en tu carpeta donde normalmente los tienes y copiar a /var/www los archivos que quieres mostrar, lo cual es una joda total.

Derivado de esta situación me di a la tarea de buscar como habilitar o configurar un directorio de mi home para que Apache pudiera mostrar en el navegador.

Existe mucha info como hacer esto, es decir, como habilitar el directorio web de los usuarios en linux, sin embargo, después de seguir varios tutoriales, obtenía un horrible ""dir access forbidden".

Bueno ahora la solución:

Mi sistema es xUbuntu, lo cual no debería variar mucho en cualquier distro basada en Debian.

Lo primero es revisar si tenemos habilitado en apache la capacidad de utilizar los directorios de usuario, para esto debemos revisar esto en los directorios mods-available y mods-enabled, el primero nos dice que módulos tenemos disponibles y en el segundo cuales están habilitados.

Demos un:

ls -l /etc/apache2/mods-available

Ahora ubiquemos los módulos que comienzan con userdir.... estos módulos deberían estar habilitados, osea debería aparecer al listar el directorio mods-enabled, para eso revisamos con un ls.

ls -l /etc/apache2/mods-enabled

En caso de que no estén podemos crear un enlace simbólico de la siguiente forma:

sudo ln -s /etc/apache2/mods-available/userdir* /etc/apache2/mods-enabled/

Una vez configurado esto practicamente esta habilitado el módulo para que apache pueda leer los sitios de nuestro directorio de usuario particularmente de la carpeta: public_html de nuestro home.

Ahora falta reiniciar apache para que los cambios surtan efecto.

sudo /etc/init.d/apache2 restart

Ahora es necesario que si no tenemos en el home de nuestro usuario la carpeta public_html la creemos ya que en esta carpeta se va a leer los sitios web del usuario.

La url para leer estos sitios desde el navegador seria: 

http://localhost/~usuario/

en mi caso

http://localhost/~alex/

Ahora si esto les causa algun error con apache sobre permisos, o un forbidden o un "Permission denied: access to", es porque este directorio y nuestro home deben tener ciertos permisos. Basta con darle un chmod a la carpeta y al home de la siguiente forma:

chmod 711 /home/usuario
chmod 711 /home/usuario/public_html

en mi caso

chmod 711 /home/alex
chmod 711 /home/alex/public_html

Si aún con estos cambios se mantiene el problema de permisos, es necesario darle permisos a la carpeta home, de la siguiente forma:

sudo chmod 711 /home

Con esto deberia de funcionar los archivos .html que tengamos en la carpeta public_html, al ingresar a la página: http://localhost/~alex/   claro alex debe ser el nombre de tu usuario.

Para que puedas ejecutar los archivos o proyectos PHP es necesario habilitar apache para esos directorios, esto es muy sencillo, solo debemos ir al archivo:

sudo nano /etc/apache2/mods-enabled/php5.conf

puedes usar vi, vim, sublime o el editor que más te agrade

y comentar lo que aparece en la sección de PHP, de la siguiente forma:


Ahora solo basta con reiniciar Apache y listo, 

sudo /etc/init.d/apache2 restart

ya podemos trabajar desde nuestra carpeta public_html de nuestro home, y hacer commits, ver cambios etc.. sin necesidad de utilizar sudo o ir a /var/www no es como el webrick de rails pero es más cómodo desarrollar así.






Fuentes y enlaces de ayuda:

https://bbs.archlinux.org/viewtopic.php?id=100801
HAbilitar php -> http://ubuntuforums.org/showthread.php?t=1521010
http://ubuntuforums.org/showthread.php?t=1577717
http://huevas.wordpress.com/2007/07/03/habilitar-directorios-de-usuario-en-apache2-userdir/

martes, 24 de septiembre de 2013

Apache, Passenger y multiples versiones de Ruby y Rails con reverse proxyProxyPass

Derivado de una configuración sobre Ubuntu Server, en el cual tengo corriendo diversas aplicaciones con Ruby, las cuales estan en diferentes versiones me tope con el problema de como configurar Apache y passenger.

Buscando en google encontre la siguiente liga, la cual es muy útil: "Phusion Passenger & running multiple Ruby versions" siguiendo la configuración que ahí menciona me tope con un problema.

Apache 403 Forbidden

Para ser breve ire al punto.

Todo se encontraba configurado tal cual menciona el articulo, de la siguiente forma tenia mi configuración de Apache.

"< virtualhost >"
    DocumentRoot /home/alex/proyectos/miapplicacion/public
    PassengerEnabled off
    ProxyPass / http://0.0.0.0:3050/
    ProxyPassReverse / http://0.0.0.0:3050/
"< /virtualhost >"


Sin embargo me decia que no tenia permisos.

Ya se encontraba corriendo passenger stand alone (en el articulo lo menciona) en el puerto 3050.

Encontre la solución moviendo varias cosas:
    1. Verificar si esta correctamente configurado el modulo proxy de apache. 
    El cual en ubuntu se encuentra en: 
      /etc/apache2/mods-available/proxy.conf
        Comente mi anterior configuración y habilite los permisos para el proxy. 
        Quedando de la siguiente manera:


          Con esto deje habilitado mi proxy para todo, 
          puedes restringirlo si así lo consideras.


          2. Después de esto lo unico que resta es activar dicho módulo 
          en caso que no este activo, con la siguiente instrucción (ubuntu):

          sudo a2enmod proxy_http

          3. Reiniciamos Apache 

          sudo /etc/init.d/apache2 restart

          Y Listo!!! Una vez realizado esto, arranco mi app en la version 
          1.9.2 de Ruby y Rails 3.2.14 de Rails.


          Ligas de ayuda: 
          http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/
          http://rimuhosting.com/knowledgebase/applications/ruby-on-rails
          http://serverfault.com/questions/242650/setting-up-a-basic-mod-proxy-virtual-host




          miércoles, 21 de noviembre de 2012


          En las peticiones XMLHttpRequest, tenemos varios status cuando el servidor responde, estos son los siguientes:

          readyState The readyState code changes value from 0 to 4 during a request cycle:

          0: not initialized.
          1: connection established.
          2: request received.
          3: processing.
          4: finished and response is ready.

          status
          200: "OK"
          404: Page not found.

          onreadystatechange: callback method assigned via this attribute
          responseText: holds the response data as a string of characters.
          responseXml: holds the response data as XML data.

          Basicamente tenemos los estados 0 no inicializado, 1 conexión establecida, 2 petición recibida,  3 procesando y 4 finalizado y respuesta completa.

          miércoles, 5 de octubre de 2011

          Para que funcione tu .gitignore

          Si creaste tu .gitignore en Git y lo subiste y no te funciona, realiza lo siguiente:


          Just got the answer from the IRC channel.

          Running command:

          git rm -r --cached . 

          This removes everything from the index, then just run:

          git add . 

          Commit it:

          git commit -m ".gitignore is now working"



          Tomado de: http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring

          jueves, 4 de agosto de 2011

          Git push a otro servidor distinto del que se clonó.

          Hace un par de días logré configurar un servidor con ip pública para poder utilizarlo como puerta de enlace, tipo router de compañía proveedora de Internet.

          Todo iba bien hasta que tuve la necesidad de hacer un push des mi máquina conectada a ese "router" en mi proyecto que estoy desarrollando el cual lo tengo versionado con git.

          Al tratar de hacer el push de mis cambios a la rama del servidor donde tengo corriendo gitosis, un servidor de git, simplemente no lo encontraba, y esque este servidor no se encuentra en el rango de mis ips, sino que a través de una VPN lograba verlo, pero, al cambiar mis configuraciones de red, había perdido la vista de ese servidor en su ip privada (la que esta en la vpn) solo logro verlo a través de la ip pública de forma transparente.

          Entonces buscando un poco en Internet y en el man de git me encontré que con git push puedo utilizar varias opciones una de ellas es la que me ayudo a no estar cambiando mi configuración de red cada que quería empujar mis cambios al servidor.

          La opción de git push que utilicé se llama --repo y la forma en lo lo utilicé la explico a continuación.

          Anteriormente cuando hacia un commit a mi rama en particular tecleaba esto:

          git push origin devel

          o en su caso

          git push origin master

          Esto al estar ya configurado con mi servidor buscaba la ip privada del servidor y empujaba mis cambios, ahora al tener una conexión NAT no logro ver este servidor ya que mi servicio lo tengo configurado para que git salga por la ip pública cosa que no quiero cambiar porque tengo repositorios en la nube que quiero ver de forma transparente.

          Bueno con la opción --repo= del comando git podemos definir a que repositorio queremos empujar los cambios, es decir incluyendo la ip o la ruta, ya que puede ser sobre el protocolo ssh, git, http, ftp... etc..

          Entonces ahora cuando quiero empujar mis cambios pero hacia la ip publica de mi servidor gitosis basta con utilizar la opción --repo de la siguiente forma:

          git push --repo=gitosis@IP_PUBLICA:proyecto.git

          un ejemplo

          git push --repo=gitosis@132.248.20.125:proyecto.git

          Así es, eliminando el origin y el nombre de la rama y cambiando eso por la opción --repo= y la ruta de nuestro proyecto.

          Dependiendo la rama en la que estemos se empujaran los cambios hacia esa rama.

          Y bueno asi me ahorre estar buscando como meterle excepciones al ip-tables del servidor git o lo peor estar cambiando mi conexión cada que quiero realizar un push.

          jueves, 17 de marzo de 2011

          INSERTAR DATOS DESDE UN SELECT CON POSTGRESQL

          Me tope con un problema en una base de datos postgresql, el cual era insertar datos en una tabla pero dichos datos provienen de una consulta de otra tabla.

          Esto se podría haber hecho con un script de ruby o en la consola, pero encontré probando y buscando, una solución desde la terminal pgsql.

          La sintaxis es la siguiente:

          INSERT INTO table (field1,field2,field3) SELECT id,other_value FROM table WHERE conditions...

          Expliquemos un poco esto:

          La primera parte es el típico INSERT de SQL, la sintaxis general cambia un poco pero en escencia es lo mismo.

          INSERT INTO table -> table es el nombre de la tabla en la cual queremos insertar los datos resultado de una consulta.

          despues del nombre de la tabla se colocan los campos en que deseamos caigan los datos producto de la consulta, por ej. si en la tabla destino tenemos tres campos, id, nombre, apellido, y queremos solo insertar nombre tendriamos una estructura similiar a: INSERT INTO tabla (nombre)... vease que el nombre del campo va entre parentesis y se pueden colocar varios campos seguidos por comas, por ej. (nombre,apellido,edad...etc..)... hasta aqui no hay nada nuevo en un INSERT normal de SQL.

          Despues de esto viene lo interesante, omitimos la clausa VALUES que normalmente usamos para insertar un registro e inmediatamente colocamos nuestra consulta, osease, el SELECT..

          Esta parte es importante analizar, ya que si colocamos un SELECT * FROM tabla; obtendremos todos los valores de esa tabla por lo que en la parte donde colocamos el nombre de los campos que deseamos llenar osea el

          INSERT INTO table (field1,field2,field3)

          debe conincidir con el numero de campos que estamos obteniendo del select, no es lo mismo el numero de campos que el numero de registros, osease el numero de cmapos es el numero de columnas que esperamos recibir no de filas o registros.

          Practicamente con esto estariamos insertando todos los registros que devuelva la consulta en los campos que seleccionamos en el INSERT.

          Que mas podemos hacer...??

          En la parte del SELECT podemos colocar condiciones normales con la clausula WHERE como solemos usarla por ej. SELECT * FROM patients WHERE id = 10;

          Otra cosa que podemos hacer dentro de la clausula SELECT es indicarle los campos que desamos inserte, por ejemplo, solo desamos insertar algunos campos del resultado de una consulta de la sig FORMA.

          INSERT into clientes (nombre,apellido) SELECT nombre,apellido FROM provedores WHERE country_id = 30:

          Aqui estamos insertando solo los valores de dos columnas (nombre y apellido) pero a su vez estamos insertando todos los nombres y apellidos que tengan country_id = 30.

          Algo más...??

          En caso que deseemos insertar tanto valores resultado de una consulta como algun valor fijo que querramos, podemos colocarlo despues del a seleccion de campos, de le sig forma

          INSERT into clientes (nombre,apellido,status) SELECT nombre,apellido,"comprado" FROM provedores WHERE country_id = 30:

          aqui el valor "comprado" no es un valor que se obtiene del select, es mas bien un valor arbitrario que se estara insertando indicriminadamente con el valor que yo decida colocar, otra forma de hacerlo para que se vea mas claro es la siguiente:


          INSERT into clientes (nombre,apellido,status) SELECT (nombre,apellido),"comprado" FROM provedores WHERE country_id = 30:

          La palabra en comillas "comprado" fuera del parentesis es una constante, osease un valor que no se obtiene de la consulta y que mas bien nosotros queremos que se inserte en conjunto con lo que obtenemos pero en otro campo.


          Aqui un ejemplo de como se usa en general todo esto:


          INSERT INTO rols (dependency_id,job_id) SELECT (id),68 from dependencies where category_id = 3;


          Y de esta forma facilmente actualizamos o insertamos datos producto de una consulta.