lunes, 6 de octubre de 2014

Programar con crontab la ejecucion de 2 comandos de forma consecutiva, no concurrente, en Linux

Recientemente he estado trabajando con mi Raspberry pi que por cierto esta muy interesante para hacer cosillas, he estado haciendo un proyecto que próximamente actualizare en mi github y para el cual estoy utilizando una computadora del tamaño de una tarjeta de crédito es decir una Raspberry pi.

Actualmente corriendo Raspbian(version de linux derivada de Debian) tuve la necesidad de ejecutar dos tareas una seguida de la otra y programarlas a cierta hora.

Tenia la opción de crear una schedule (fecha y hora) para ejecutar cada una, sin embargo no quería jugar con el tiempo en que terminara una para que iniciara la otra, sino más bien quería que cuando terminara una iniciara la otra.

Primero lo que queria era cerrar el navegador epiphany (que actualmente fue incluido en la versión de Raspbian) y posteriormente apagar el equipo.

Ejecutando el comando:

crontab -e

se tiene acceso a las tareas programadas, este caso ingrese utilizando sudo pues el comando shutdown es ejecutado por un usuario con privilegios.

sudo crontab -e

Basicamente para lograr que un comando se ejecute terminado el anterior se debe incluir && después de cada comando en la cadena del crontab, para entender mejor les enseño como lo realice yo:

# m h  dom mon dow   command
58 17 * * * /usr/bin/pkill -x epiphany-browse && /sbin/shutdown -h now 

Como se puede apreciar en la linea anterior ejecuto el comando pkill (dar man pkill en consola para saber más de el) y cierro el proceso que corre epiphany-browse una vez que termina de cerrar(matar) el proceso continua con el apagado del equipo.

Como ven es muy sencillo realizar este tipo de ejecución consecutiva de comandos en crontab.

miércoles, 28 de mayo de 2014

Ordenar articulos en Joomla 2.5 cuando parecen estar deshabilitados

Recientemente heredé un web que se encuentra en joomla, cabe aclarar que no soy un experto en el tema de joomla pero mis experiencia como developer me permite entender un poco el CMS ademas de que me he tenido que poner a leer y documentarme.

Solo me gustaria decir que me parece un tanto complicada la forma en que se gestiona Joomla, sin embargo cuando le vas entendiendo se va haciendo menos pesado.

Vayamos al punto...

El problema: 

Me  solicitaron acomodar el órden en que una categoria listaba los articulos, (si parece que no importa y que es algo trivial pero bueno) al intentar lo más lógico como solo cambiar el órden de los articulos de esa categoría me tope con que estaba deshabilitados, o eso parecia, algo así:




Si parece sencillo para los expertos del joomla pero bueno tuve que leer en varios lados y, o no hacia la pregunta correcta a google, o de plano nadie habia tenido ese problema, pero bueno aquí la solución super sencilla.

Solución:

Picandole en el encabezado se habilita la posibilidad de ordenamiento (no se si así se diga) y ya puedes hacer lo que quieras.




Una vez realizada esta acción se habilita la opción de ordenamiento (sort) y a un lado aparece un disco, solo basta cambiar los números y dar en gaurdar (disco que aparece a un lado, que por cierto muchos ya ni los conocieron jeje).


Nota:

Es importante que para que se respete el órden deben ir al administrador de menus elegir el menú en el cual la esta la categoría de la cual quieren órdenar y elegir ese nodo, una vez en esa pantalla, en el lado derecho elegir: "Lista de opciones de diseño" y elegir en la opción orden de artículos: Orden gestor de articulos.




Y eso es todo.

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

martes, 24 de septiembre de 2013

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

          Estados en las peticiones Ajax, XMLHttpRequest Class.

          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.

          jueves, 4 de agosto de 2011

          Git push a otro servidor distinto del que se clono.

          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.


          Ligas:
          http://kernel.org/pub/software/scm/git/docs/git-push.html
          http://kernel.org/pub/software/scm/git/docs/git-push.html#URLS

          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.