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

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.

          jueves, 27 de enero de 2011

          Migrar datos desde un archivo txt o csv a PostgreSql con el comando Copy

          Muchas veces tenemos la necesidad de cargar datos a una tabla de nuestra base de datos en postrgesql desde un archivo ya sea de texto o un csv, para que esto no sea un dolor de cabeza y sea rapido ya que algunas herramientas lo logran pero tardan demasiado, podemos apoyarnos del comando Copy, que es un comando nativo de PostgreSql que podemos utilizar desde una terminal pgsql.

          La sintaxis la podemos encontrar rapidamente con \h desde la terminal y su uso es muy sencillo, como todo comando basicamente es origen - destino veamos el patròn:

          test=# copy (column1,column2,column3...) from '/ruta/nombre_archivo.csv' DELIMITERS ',' CSV;

          Practicamente esto seria todo lo necesario para migrar los datos de una forma sencilla y rapida, expliquemos un poco de que se trata:

          La primer parte es mi terminal psql: test=# (la cual accedo desde un shel con el comando psql -U usuario -d BaseDeDatos)

          Posteriormente viene el comando copy: se compone de varias partes que en la ayuda del comando vienen (
          \h copy desde la terminal psql) despues de la palabra copy colocamos las columnas de nuestra base de datos en donde caeran los datos del archivo el orden que useamos sera como se insertaran las columnas de nuestro archivo, mas adelante un ejemplo, podemos tambien omitir poner los nombres de las columnas esto indica que todo el archivo se cargara tal cual viene sobre las columnas que tengamos en la base de datos, osease ira cargando columna del archivo columna de la tabla y asi sucesivamente, despues viene la palabra from y posteriormente la ruta del archivo usamos la palabra Delimiters para indicar como esta delimitado nuestro archivo puede ser tabuladores ('\t'), comas, punto y coma o lo que sea que tengamos el archivo, indicamos el formato y listo esto hará magia en cargar miles o millones de datos en segundos o quiza minutos.

          Ahora vemos un ejemplo funcional:

          test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV;

          Y en segundos o minutos(depende el tamaño de tu archivo) tendremos los datos de nuestro archivo dentro de nuestra base de datos. Cabe mencionar que los datos que ingresemos de esta forma se colocan al final de la tabla es decir si tenemos registros previos en esta tabla, no son afectados y mas bien son anexados al final de la tabla.

          Quitar Encabezados

          Tambien es importante mencionar que algunos archivos tienen encabezados, por ejemplo no solo vienen los datos sino tambien los encabezados como name, surname, address etc... podemos usar la opcion header para que los ignore quedando de la siguiente manera:

          test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV header;

          Con esto al hacer la migracion los encabezados de nuestro archivo seran ignorados.

          Por último no olviden que los comandos como select, delete... etc.. incluso copy en psql finalizan con ";" a mi siempre se me olvida ponerlo.

          Remplazar un texto de un arhivo en linux con el comando sed

          Cuando tenemos archivos de texto, csv y otros que son demasiado pesados, es un martirio intentar abrirlos con un editor, llamese excel, spreed sheet de open offices u otro similar ya que con los miles o millones de registros tardariamos mucho en solo abrirlos ahora ni imaginar en remplazar una palabra, para evitar todo esto buscando en internet y con ayuda de "Beto" me tope con el comando "sed" que es una maravilla.

          Vamos al grano:

          Para evitar abrir el archivo y tener que editar a mano, desde consola podemos utilizar el comando de la siguiente forma:

          alex@alex-dev:/tmp$ sed -e 's/palabra_a_buscar/palabra_remplazo/g' archivo_origen.csv > archivo_final.csv

          DE esta forma vemos un ejemplo concreto en el cual cambiaremos la palabra NULL por TEST, cabe señalar que: "alex@alex-dev:/tmp$" es mi terminal NO ES PARTE DEL COMANDO!!!

          ahora si veamos el ejemplo:

          alex@alex-dev:/tmp$ sed -e 's/NULL/TEST/g' archivo_origen.csv > archivo_final.csv

          y de esta forma abremos remplazado todas esas plabras de ese pesado archivo, para concer mas acerca de la sintaxys hay que ver el man del comando y leer un poco acerca de expresiones regulares.

          lunes, 6 de septiembre de 2010

          Cargar datos desde fixtures con rails.

          Para cargar datos que se encuentran en la carpeta, /test/fixtures de nuestros proyecto rails, podemos usar el comando rake que nos permite el manejo de esta tarea.

          la sintaxis es la siguiente.

          Para cargar todos los fixtures usamos el siguiente comando desde la raiz del proyecto:

          rake db:fixtures:load 

          Si solo queremos cargar algun fixture en particular usamos el siguiente comando:

          rake db:fixtures:load FIXTURES=users,stores

          Los fixtures pueden estar en formato yml (yaml) o en formato CSV(separado por comas).

          Export CSV from psql

          Si alguna vez necesitamos obtener el resultado de una consulta SQL usando la terminal psql de postgres, en un formato csv, podemos realizar lo siguiente.

          Una vez en la terminal tecleamos \o ruta, ejemplo

          psql=# \o /tmp/archivo.csv

          Lo anterior indica que el resultado lo hara por medio de un output (\o) y lo colocara en el archivo indicado ( /tmp/archivo.csv).

          De esta froma tenemos un archivo csv que podremos editar con cualquier software de hoja de calculo.

          Al abrirlo es importante indicarle que el separador no será la coma sino el signo pipe "|", para que respete la separacion de los registros y podamos manejarlo mas facilmente.

          viernes, 6 de marzo de 2009

          Internacionalizacion I18n en Ruby on Rails

          I18n antes que nada significa Internacionalizacion, es por eso que inicia con la letra I despues el numero 18 que indica el numero de caracteres y al final la n que es el último caracter de la palabra "Internationalization".

          Ruby on Rails originalmente trae soporte para fechas y palabras en ingles.

          En un proyecto que estube realizando (un sistema de asistencias), que teniamos que asignar hora de entrada, salida etc... tenia que utilizar oviamente fechas y horas, el problema surgia que en el mostrar (show o index), las fechas siempre me aparecian en formato de E.U.A, es decir Año Mes y Dia, y peor aun, si queria la hora en formato largo me ponia: "February 17, 2009".

          La solucion consistio en leer un poco acerca de I18n y aqui la solucion.

          1. Lo primero que tuve que hacer fue descargar el archivo de internacionalizacion que necesitaba, en este caso el de español, de la siguiente direccion: "http://github.com/svenfuchs/rails-i18n/tree/e5878d3c661e0b9ad364951c96f1f4f39960a2f1/rails/locale"

          2. Despues de descargarlo hay que ubicarlo en la carpeta locales del Framework que se localiza en config/locales/ dentro de esta carpeta seguramente estara el archivo en.yml que es el que trae por default, no importa si tienes ambos, puedes bajar el del pais que requieras.

          3. Ahora bien tenemos que hacer que incluya rails este archivo en nuestro proyecto, esto lo hacemos en el archivo environment.rb que se encuentra en: config/environment.rb en este archivo tenemos que poner lo siguiente:

          config.i18n.default_locale = :es

          Es asi como indicamos que tome los formatos y traducciones que vienen en ese archivo, trata de ponerlo cerca de donde esta una linea similar pero comentada, solo por órden.

          4. Ahora tenemos todo listo, en nuestra vista o donde vamos a mostrar el campo tipo fecha tenemos que hacerlo de la siguiente manera:

          <%=l @assistance.date %>

          Notese que inicia con una l que es la que le indica que "localize" ese atributo, puede incluir tambien el tradicional h que es para que escape automáticamente caracteres raros, sería de la siguiente manera:

          <%=h l @assistance.date %>

          Ambos mostrarian algo asi:

          2009-02-09

          Esta fecha parece no ser la correcta, o mas bien no como queremos que la muestre, pues nos gustaría mas que fuera como comunmente la usamos día, mes y año, para eso solo hay que introducirse un poco en el archivo es.yml que agregamos en la carpeta config/localize/es.yml y dentro encontraremos toda la estructura del formateo de fechas y algunas traducciones, para este caso en particular, vayamos a la parte donde dice :date y vamos a ver algo similar a:

          date:
          formats:
          # Use the strftime parameters for formats.
          # When no format has been given, it uses default.
          # You can provide other formats here if you like!
          default: "%Y-%m-%d"
          short: "%d de %b"
          long: "%d de %B de %Y"


          pues bien com ahi dice esta parte podemos agragar nuevos formatos de fechas, como vemos toma el default cuando no le indicamos cual queremos que tome, mas adelante veremo como hacer eso, por ahora cambiaremos el que toma por default, como nos dice tambien utiliza el formateo de fechas de Ruby (strftime), entonces tendremos que seguir esa sintaxis para agregar o midificar los formatos (si quieres saber mas a cerca de este formateo puedes ir a la documentacion de Ruby).

          Bien, sigamos, cambiaremos la siguiente linea de este archivo:

          default: "%Y-%m-%d"

          Que es el que toma por default, como vemos priemro colocara el año %Y
          posteriormente un guion -
          despues el mes %m
          seguido otro guion -
          por ultimo el dia %d

          todo entre comillas.

          Es por esto que la fecha que nos muestra es del tipo 2009-02-09, cambiando el default de la siguiente forma:

          default: "%d-%m-%Y"

          al cambiar el orden ahora nuestras fechas seran 09-02-2009 :D :D :D

          Siguiendo con esto, nos peguntaremos, no ps esta chido pero si quiero un formato personal o un formato del tipo: 17 de Febrero de 2009

          bien para esto tendremos que acceder a los formatos que se encuentran debajo, en esta seccion

          date:
          formats:
          # Use the strftime parameters for formats.
          # When no format has been given, it uses default.
          # You can provide other formats here if you like!
          default: "%d-%m-%Y"
          short: "%d de %b"
          long: "%d de %B de %Y"

          como vemos tenemos el formato long y short pero, ¿como acceder a este u otro que formemos?, es sencillo, en nuestra vista como habiamos visto toma el que es por default, pero si le colocamos :format => :long ó :format => :short
          de la siguiente forma:

          <%=l @assistance.date, :format => :long %>

          Nos mostraria una fecha de este tipo: 17 de Febrero de 2009

          Si queremos agregar un formato nuevo podemos agregarlo en el mismo archivo de la siguiente forma:


          date:
          formats:
          # Use the strftime parameters for formats.
          # When no format has been given, it uses default.
          # You can provide other formats here if you like!
          default: "%d-%m-%Y"
          short: "%d de %b"
          long: "%d de %B de %Y"
          mi_fecha: "México DF a %d de %B de %Y"

          ahora de esta forma podemos llamarlo en nuestra vista de la siguiente manera:

          <%=l @assistance.date, :format => :mi_fecha %>

          Y esto nos mostraria algo asi:

          México DF a 17 de Febrero de 2009


          Pues bien asi es como Rails nos facilita la vida para el formateo de fechas por medio de internationalization.

          Saludos.
          :D :D :D

          martes, 29 de abril de 2008

          En las relaciones uno a muchos, se pasa la PK del lado de uno al de muchos.

          Por ejemplo supongamos tenemos las tablas:

          Premio
          TipoPremio


          con los siguientes atributos

          Premio

          *id
          *name
          *fecha
          TipoPremio
          *id
          *name


          Ahora la lógica es la siguiente, un premio tiene unicamente un tipo de de premio, pero un tipo de premio puede ser usado para varios premios en particular, es decir un premio especifico es de un tipo, otro de otro tipo o del mismo y asi, quedando la relacion de uno a mucho de la forma un Tipo Premio puedes ser para muchos Premios y un Premio solo tiene un tipo de premio, es decir uno a muchos de TipoPremio a Premio.

          Las tablas quedarian de la siguiente forma:Premio

          *id
          *name
          *fecha
          *TipoPremio_id
          TipoPremio
          *id
          *name

          martes, 15 de enero de 2008

          Permitir conexiones remotas en PostgreSql 8.2

          Por motivos de seguridad, la configuración por defecto no admite conexiones externas. Para habilitarlas tenemos que editar el fichero /etc/postgresql/8.2/main/postgresql.conf.

          $ sudo gedit /etc/postgresql/8.2/main/postgresql.conf

          Ahora buscamos las siguientes líneas que se encuentran comentadas:

          #listen_addresses = 'localhost'

          Y la substituimos por la siguiente línea:

          listen_addresses = '*'

          Posteriormente buscamos la siguiente línea y le quitamos la marca de comentario:

          #password_encryption = on

          Y nos debe quedar lo siguiente:

          password_encryption = on

          Guardamos los cambios y reiniciamos el demonio para que los cambios surjan efecto:

          $ sudo /etc/init.d/postgresql-8.2 restart



          fuente: http://pintucoperu.wordpress.com/category/linux-ubuntu-administracion/page/3/

          martes, 3 de julio de 2007

          BASES DE DATOS


          ORACLE

          Esta considerado como una de las soluciones número uno para la administracion de de datos. Oracle y toda su gama de productos y herramientas están dirigidos tanto a pequeñas y medianas empresas (con un único sevidor fisico) como también a grandes corporaciones con sistemas mainframes. La última version de su base de datos, (hasta hoy) Oracle Database 10g, es la primera base de datos relacional que incorpora la nueva tecnología Grid Computing, la cual permite utilizar un conjnto de computadoras com un recurso unificado; con esto queremos decir que tanto la memoria como la capacidad de procesamiento de cada uno de los equipos se articulan y se pueden manejar como un todo.

          Es importante mencionar que Oracle posee un conjunto de soluciones, como Fusion Middleware, Enterprise Manager y e-Business Suite, todas destiandas a empreas, que nos muestran que las utilidades que ofrece Oracle van más alla de la creación y el manejo de simples bases de datos.

          Si bien los costos de los productos y herramientas ofrecidos por esta empresa son mayores, en comparación, que los de la competencia, el gran numero de clientes que actualmentes tiene resgistrados nos pone de manifiesto que es una de las herramientas más utilizadas a nivel mundial.

          viernes, 24 de noviembre de 2006

          ACCEDER AL SISTEMA COMO ROOT Y COMO RESOLVER PROBLEMAS DE ARRANQUE EN LINUX.

          ¿Cuando en nuestro sistema operativo linux existe algun problema de inicio que podemos hacer?

          Veamos, cuando tenemos algun problema de arranque con windows, ya sea que el sistema operativo falle o que por algun motivo no nos deje accesar a nuestra sesion, incluso que ni siquiera podamos cargar el sistema operativo windows, en fin varios y varios problemas que podamos tener para iniciar windows, en este caso ¿que podemos hacer para poder entrar a nuestros datos y tratar de respaldarlo o incluso reparar el sistema?, bueno, para ello necesitamos un disco de inicio, con el cual podemos accesar a nuestro sistema atraves de una consola o en modo ms-dos, asimismo podemos ver las particiones e incluso nuestros archivos, los cuales, podemos respaldar para despues formatear o restaurar el sistema.

          ¿Que pasa en el caso de linux?

          Al igual que en el SO de microsoft, en linux necesitamos un disco de inicio, el cual debe contener como minimo y para que nos pueda servir para accesar a un sistema linux que envie algun error, lo siguiente:



          • Algun gestor de arranque ya sea lilo o grub, incluso otro.
          • Una imagen del kernel de linux, generalmete llamado vmlinuz.

          Con estos datos cargados en nuestro disco podemos accesar para despues reparar nuestro linux.

          Para crear un disco de inicio existen varias maneras, la manera mas tradicional o a mano de hacer el disco es con el comando dd, ejemplo de como podriamos crear un disco de inicio por medio de comandos o a mano es el siguiente:

          dd if= /boot/vmlinuz of= /dev/fd0 bs=8192

          donde dd es el comando if= /boot/vmlinuz es la parte donde se indica de donde se tomará el kernel de linux para nuestro disco de inicio, la parte del of indica hacia donde se llevará o clonara, en este caso fd0 indica un floppy y la última parte indica el tamaño de bloques en bytes.

          La anterior instrucción sirve para clonar discos o archivos y es muy eficiente ya que aparte de copiar (que se podria hacer con el comando cp), tambien hace que el dispositivo hacia el cual se esta copiando sea arrancable (booteable).

          Otra forma de crear un disco de inicio pueden ser:

          • Con el cd-rom de instalación, en la opcion de rescue (rescate)
          • Con un cd live (es decir un S.O linux que arranque desde un CD como Knoppix)

          ERRORES PROBABLES AL ARRANCAR EL SISTEMA.

          Al iniciar un sistema operativo linux podemos encontrarnos con dos errores en general:

          1. Debido a algun problema con el disco duro de manera fisica.
          2. Errores en las particiones del disco.

          En el primer caso lo ideal seria respaldar la informacion del disco si es posible y remplazarlo debido a que su problema es de hardware (fisico).

          Para el segundo caso, podemos hacer llevar acabo alguas acciones con el afan de salvar nuestro sistema, para poder hacer esto tenemos que conocer algunos comandos, estos son:

          • df es la analogia a disk free o espacio libre.
          • mount -av muestra las particiones que se encuentran montadas en ese momento.
          • fdisk -l /dev/hda que en este caso mostrará las particiones de todos los dispositivos hda es decir los discos duros IDE.

          Ahora bien ya que tenemos detectada nuestra particion o hemos analizado lo que tenemos en cuanto a configuracion y caracteristicas lógicas de discos, utilizaremos el comando fsck

          jueves, 23 de noviembre de 2006

          BIENVENIDA.

          HOLA:
          Este es mi primer texto en este blog, el cual, tiene como propósito servir de respaldo a los conocimentos adquiridos con la expericencia en ciertos problemas que te topas al desarrollar, decidí crear este blog para contar con un respaldo de los conocimientos básicos e importantes adquiridos, ademas de contar con un espacio para organizar y recordar ligas asi como almacenar material de interés para el área.
          Atte.
          Alex.