Montar carpeta de owncloud en Linux Mint

Este artículo esta basado en este post de wikihow http://es.wikihow.com/montar-autom%C3%A1ticamente-una-unidad-box.com-al-arrancar-Debian-(o-Ubuntu) Pero yo lo estoy adaptando al procedimiento que seguí en Linux Mint para poder montar mi unidad de ownlcoud. Me pareció mas práctico que usar el cliente de sincronización de owncloud, ya que en ocasiones falla. Los pasos son los siguientes: Las instrucciones que deban ejecutarse como administrador, deberán llevar “sudo”

1. Instalar davfs2, el cual nos va a permitir montar sistemas de archivos WebDav, abrimos una Terminal, y escribimos:

sudo apt-get install davfs2

2. Agregar tu usuario al grupo de davfs2:

sudo adduser <usuario> davfs2

3. Crear una carpeta donde se montará la unidad de owncloud: Como ejemplo la carpeta se llamará “owncloud” y la crearemos en el /home/usuario:

mkdir /home/usuario/owncloud

4. Añadir el punto de montaje al archivo /etc/fstab, debemos editar el archivo fsta a través de nano:

sudo nano /etc/fstab

Al final del archivo agregar una linea como la siguiente, subsituyeno el valor de “servidor” por el nombre del servidor donde esté instalado “OwnCloud”, en este ejemplo suponemos que “OwnCloud” esta instalado bajo la carpeta “owncloud” dentro del servidor.

http://www.servidor.com/owncloud/remote.php/webdav /home/usuario/owncloud davfs rw,user,noauto   0   0

Entre cada valor, debemos usar un tabulador.

5. Cambiar permisos al archivo /usr/sbin/mount.davfs: sudo chmod u+s /usr/sbin/mount.davfs

6. Montar por primera vez nuestra unidad owncloud, en este paso, si la información del paso 4 es correcta, nos pedirá usuario y contraseña de acceso a OwnCloud.

mount /home/usuario/owncloud ó mount ~/owncloud

Ambas instrucciones hacen lo mismo, solo que ~ es el atajo para /home/usuario. Al montar por primera vez nuestra unidad owncloud, se crean en nuestro home unos archivos de configuración que usaremos mas adelante, para configurar los parámetros de usuario y contraseña y poder montar de forma automática nuestra unidad cada vez que iniciemos sesión.

7. Desmontar la unidad, para modificar la configuración:

umount /home/usuario/owncloud

ó

umount ~/owncloud

8. Cambiar parámetros de configuración para que al montar la unidad no pida el nombre de usuario y contraseña de acceso a “OwnCloud” Debemos primero editar el archivo /home/usuario/.davfs2/davfs2.conf.

nano /home/usuario/.davfs2/davfs2.conf

Al final del archivo, debemos agregar una linea con el valor:

use_locks 0

También necesitamos modificar el archivo /home/usuario/.davfs2/secrets.

nano /home/usuario/.davfs2/secrets

Agregando al final del archivo la linea:

http://www.servidor.com/owncloud/remote.php/webdav <usuario> <contraseña>

Y por último en este paso, cambiar los permisos al archivo secrets:

chmod 666 /home/usuario/.davfs2/secrets

9. Volver a montar la unidad, para comprobar que ya no pida usuario y contraseña.

mount /home/usuario/owncloud ó mount ~/owncloud

10. Por último, agregar a las aplicaciones de inicio el montaje de nuestra unidad: Ir a Menú -> Preferencias -> Aplicaciones al Inicio, Presionar el botón “Añadir” y llenar los campos como se muestra en la siguiente imagen.

AgregarInicio

Espero que sirva esta pequeña guía. Saludos

Anuncios

PHP y archivos de texto de más de 50 Mb

Hola, escribo este Post, porque recientemente me enfrente a un problema al tratar de trabajar con archivos de texto de mas de 50 mb a través de una aplicación Web desarrollada en PHP.

Espero que esta experiencia pueda ser útil para la comunidad que siga este post. No pretendo enseñar nada, ya que es evidente que allá afuera hay expertos en PHP, pero quizás haya otros que no lo sean tanto y esto pueda ser de mucha utilidad.

El objetivo

El objetivo de este proceso parte de la aplicación era buscar un valor alfanumérico en un archivo de texto de 746,885 lineas. El archivo de texto tenia una tamaño en de 54 Mb. Este archivo tiene una estructura de campos separados por “pipes”, en total 5 campos por renglón.

Las diferentes alternativas de solución

La primera opción que paso por mi mente, fue convertir ese archivo en una tabla de una base de datos en MySQL, que me permitiera hacer las consultas de forma mas cómoda. Un punto importante en esto es que ese archivo se actualiza cada día lo cual implicaba un proceso diario de eliminar los registros de la tabla y volver a insertar todos los registros del archivo.

En el primer intento y después de unos cálculos me di cuenta que ese proceso podía tardar aproximadamente 12 horas. Por lo que inmediatamente descarte esa posibilidad, no me pareció tan práctico.

De ahí pasamos a la segunda alternativa de solución, buscar directamente en el archivo el valor dado.

Esta solución parecía fácil de implementar. Explicare de que forma lo hice funcionar en primera instancia.

Existen dos formas de trabajar con archivos en PHP, y usaremos alguna de ellas dependiendo del requerimiento.

La primera forma en que hice uso del archivo fue, a través de la función file() la cual lee por completo un archivo y construye un arreglo con una linea por elemento del archivo.

Ejemplo

$file = file("ruta/del/archivo.txt");

con esta sencilla instrucción convertimos a la variable $file en un arreglo que contiene cada una de las lineas del archivo.

Existen dos argumentos opcionales que permiten especificar que ignore, lineas nuevas y/o lineas vacías, quedando la sintaxis de la siguiente manera.

$file = file("ruta/del/archivo.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

Ok, después había que buscar el valor, en cada una de las lineas hasta encontrarlo y obtener los campos de esa linea.

Para lograr esto hice uso de la estructura de control foreach.

foreach ($file as $numlinea => $linea):

Esta validación es para no usar la primer linea del archivo que contiene solo el nombre de los campos.

if ($numlinea > 0):

Con esta linea convertimos cada campo en un elemento de un arreglo que se guarda en la variable $campos la función, explode nos permite partir en elementos de un arreglo una linea tomando como separador el símbolo que indicamos en el primer parámetro de la función

$campos = explode("|", $linea);

En la siguiente linea hacemos la validación del primer campo de la linea, preguntando si este es igual al valor que buscamos, que esta alojado en la variable de entorno $argv en la posición uno. La variable $argv almacena los valores que son enviados a un script en PHP, es útil cuando el script será ejecutado desde la linea de comandos y no a través de una solicitud HTTP.

Adicionalmente validamos que el último campo de la linea se valor “A”, que para este caso sería un valor de “Aprobado” y al cumplirse ambas condiciones nos aseguramos que el valor buscado se encuentra en el archivo y que mantiene un estado de “Aprobado”

if ($campos[0] == $argv[1] && $campos[4] == "A"):

En la variable $output guardamos cada uno de los campos separados por una coma y en formato de una cadena de texto. Esto es así específicamente para el uso que se le dará mas adelante.

$output = "$campos[0],$campos[1],$campos[2],$campos[3],Aprobado";

Con el comando break; rompemos el foreach para no seguir buscando en el resto de las lineas del archivo.

break;

Y finalmente damos salida a la variable $output

echo $output;

Hasta aquí todo bien y sin muchas cosas nuevas. Pero el problema fue cuando a través de la aplicación intentaba correr esta función.

Invariablemente el navegador mandaba un error 500, y nunca logre identificar que provocaba este error. Al ejecutar el script desde consola, inmediatamente encontraba el valor y devolvía los datos, además lo hacia verdaderamente rápido.

Busque en algunos foros y encontré toda variedad de sugerencias, comentarios como que “PHP no esta diseñado para manejar grandes archivos” sugerencias a usar Python, Pearl, etc.

Sin embargo encontré una forma de obtener el resultado deseado.

Otra alternativa que busque fue, cambiar el método de leer todo el archivo a leerlo linea por linea, quizás eso evitaría el error 500 del navegador. Pero no fue así. Sin embargo explico en que consistió el cambio.

Básicamente abrí el archivo para lectura con:

$file = fopen("ruta/al/archivo.txt","r");

Y lo leí linea por linea con la función fgets:

$linea = fgets($file);

Esto me hizo pensar que podría evitar un overflow en la memoria, al tratarse de un archivo tan grande. Pero al momento de probarlo en el navegador se producía el mismo error 500.

En este punto ya estaba realmente desesperado. Pero pensé que si ambas opciones resultaban desde la consola, algo había que cambiar en la configuración del servidor, en este caso Apache2 o en la configuración de PHP a través del php.ini

Me perdí un rato en eso y no concluí nada.

La solución

Entonces pensé que tendría que ejecutar desde un script PHP, el script de búsqueda, como si fuera ejecutado desde la consola.

Y encontré que PHP cuenta no con una sino con varias funciones para este efecto. No haré mas grande este post tratando de explicar cada una, vamos al grano.

La función que me permitió obtener la solución fue:

shell_exec();

Esta función ejecuta comandos a través de un shell y devuelve en formato de cadena, el resultado de dicho comando.

Y lo utilicé de la siguiente manera.

En la siguiente linea lo que hacemos es asignar a la variable $output el resultado de shell_exec. El primer parámetro que  vemos es el comando a ejecutar, en este caso mandamos llamar al comando php con el argumento -f que sirve para ejecutar un script de PHP indicando el archivo de script, que en el ejemplo es el archivo “scriptbusqueda.php” que se encuentra en la ruta “/var/www/proveedores/php” y por ultimo una variable $cual, que en realidad aloja el valor que deseamos encontrar en el archivo de texto de mas de 50 Mb

$output = shell_exec("php -f /var/www/proveedores/php/scriptbusqueda.php $cual");

Una ves que es devuelto el resultado del script a través de la función shell_exec lo guardamos como arreglo en la variable $campos como se muestra a continuación. Si recuerdan lineas antes vimos que la búsqueda en el archivo nos devolvía una cadena con los campos de la linea, separados por comas. Ahora en esta parte de la aplicación tomamos esa cadena y la convertimos en un arreglo.

$campos = explode(",", $output);

Y la mejor parte fue que al probar la aplicación en su entorno de Navegador, todo funcionó, el error 500 desapareció y obtuve mi resultado sin problemas.

Ventajas

  1. Me ahorre 12 horas al día para mantener actualizada una tabla.
  2. Reduje el proceso a actualizar un archivo cada día desde un servidor FTP a través de wget en un servidor Linux, archivo de texto de mas de 50 Mb, pero que tarda no mas de 5 minutos en ser descargado
  3. Y la oportunidad de poder compartir con Uds esta experiencia.

Espero que en realidad sea útil y sientan la confianza de hacer preguntas y/o comentarios, sería muy bueno si alguno de Uds conoce una mejor manera de hacerlo.

Hasta la próxima.

Sin recompensa

Lectura: Mateo 6:1-4, 19-21

…tu Padre que ve en lo secreto te recompensará en público. —Mateo 6:18

La mayoría de nosotros espera que los amigos y los colegas nos recompensen: una palmada en el hombro, una medalla de héroe, un aplauso, un elogio sincero. Pero, según Jesús, las recompensas más importantes llegan después de la muerte. Es posible que las acciones más significativas de todas se hagan en secreto y que Dios sea el único que las vea. En pocas palabras, el mensaje del reino es este: Vive para Dios y no para los demás.

Jesús explicó que estamos acumulando una especie de cuenta de ahorros, guardando «tesoros en el cielo» (Mateo 6:20) y no en la tierra; tesoros tan extraordinarios que compensarán todo sufrimiento. El Antiguo Testamento ha dejado unos pocos indicios sobre la vida después de la muerte, pero Jesús habló claramente de un lugar donde «los justos resplandecerán como el sol en el reino de su Padre» (Mateo 13:43).

En su búsqueda de un reino, los judíos de la época de Jesús habían estado tratando de encontrar señales de la aprobación divina en esta vida; en especial, mediante la prosperidad y el poder político. Al principio de su discurso, el Señor cambió el enfoque hacia la vida venidera (cap. 6). Descartó el éxito en este mundo visible y alertó a invertir en la vida futura. Después de todo, el óxido, un ladrón o un pequeño insecto pueden destruir todo lo que acumulamos (v. 20).

La recompensa en la eternidad no depende del reconocimiento terrenal.

Philip Yancey

Fuente: Nuestro Pan Diario

 

html dinámico?

Hola, en esta ocasión quiero compartir con los que lean este Blog, mi experiencia de haber logrado hacer un archivo .html dinamico.

Yo tenía la idea de que solo podía haber archivos dinámicos .php .asp .jsp pero gracias a @cvander y @freddier y todos los twitts de #mejorandhtml5 me introduje en el uso de JQuery, Javascript, html5 y algo de PHP.

Ya había desarrollado aplicaciones en PHP y XAJAX, sin embargo un reto era lograr lo mismo eliminando el uso de la extensión .php

Y bueno quizás esto no es nada nuevo, pero les comparto la forma en que lo hice.

El proyecto era, hacer una hoja de calculo de impuestos aduanales, que permitiera guardar cada hoja en una base de datos para consultas posteriores.

El reto era dejar de usar un programa desarrollado en VB6 (solo windows, claro) y llevarlo a un ambiente multiplataforma; la solucion, la web.

Todo comenzó con el modelado en html5, usando las nuevas etiquetas <header>, <nav>, <section>, <footer>.

Después vino la manita de gato, o el ponerlo bonito. Usando css3 y construyendo un archivo con las recomendaciones de @freddier de ordenar primero las etiquetas, después los id’s y por ultimo las clases, ademas de que cada una de estas secciones ordenadas alfabéticamente para una lectura mucho mas facil

Lo interesante fue como lograr meter, sacar y mostrar datos de una base en MySQL sin movernos del mismo archivo .html

Ahhh la solución fue la función $.get() de JQuery, que es una acortamiento de la funcion $.ajax() según leí.

Esta funcion $.get() es maravillosa, permite llamar a un archivo, en mi caso, .php con las distintas funciones de conexión a la base de datos, leer registros y construir las variables que serian devueltas a la funcion $.get().

Puedes a traves de esta función $.get() envías variables en formato JSON a el archivo .php, lo que te permite usarlas dentro del código php a través de $_GET. En mi caso a través de una variable llamada “fase” podía saber que función dentro del código php ejecutar.

Otra característica de la función $.get() de JQuery, puedes recibir del script php un objeto JSON, para enviarlo desde php usas la función json_enconde() que recibe un arreglo y lo devuelve a la función $.get().

Lo mas interesante es que dentro del código php puedes usar un solo echo.

Ahora tratare de explicar todo lo antes mencionado con algo de código.

 

Primero

Imaginemos que tenemos una serie de etiquetas input en la cual traeremos los valores de una tabla en MySQL, usare en ejemplo de los datos de un cliente.

En nuestro archivo .html tendríamos en algún lugar algo así:

<input type=”text” id=”clave” />

<input type=”text” id=”nombre” />

<input type= “text” id= “movil” />

<input type =”text” id=”email” />

<button type=”button” id=”buscar”>Buscar</button>

Ahora pegamos en el botón a través de JQuery el evento click, todo esto en un archivo .js

$(document).ready(

$(“#buscar”).click(buscarcliente);

//buscarcliente es el nombre de la función que hará la búsqueda

);

ahora dentro del mismo archivo .js escribimos la función buscar.

function  buscar(){

var opciones = {

clave: $(“#clave”).val()

};

//estamos construyendo un objeto JSON llamado opciones con un elemento llamado clave al cual le estamos asignando el valor del input con el id “clave” de nuestro html

//ahora hacemos uso de la funcion $.get()

$.get(

“funciones.php”,

opciones,

function(inyeccion){

$(“#nombre”).val(inyeccion.nombre);

$(“#movil”).val(inyeccion.movil);

$(“#email”).val(inyeccion.email);

},

“json”

);

}

ok.. hasta aquí vamos bien, creo. Explico que hicimos:

En la función $.get(), estamos usando como primero parámetro el url de donde esta el archivo .php que vamos a usar para conectarse a la base de datos y traer los campos nombre, movil, email de un cliente a través de la clave que enviamos con el segundo parámetro que es el objeto JSON llamado “opciones”.

El tercer parámetro es la función que recibirá lo que devuelve el archivo php y el cuarto parametro es el tipo de respuesta que aceptara la funcion $.get(), que en este caso es un objeto JSON

La función que esta como 3er parametro, lo que hace es recibir el objeto llamado “inyeccion” y aplicar los elementos de este objeto en cada uno de los input’s correspondientes dentro del html

Bien, ahora vamos con el archivo .php que en nuestro ejemplo se llama “funciones.php”

En el archivo funciones podemos tener tan solo lo relacionado a este pequeño proceso, o bien una serie de funciones que vayamos a utilizar. En el ejemplo lo haremos todo en un solo pedazo de código.

<?php

//primero conectamos la base de datos

$conn = mysql_connect(“localhost”,”usuario”,”password”);

//seleccionamos la base que vamos a usar, en este ejemplo nuestra base se llama “empresa”

mysql_select_db(“empresa”);

//construimos el query

$query = “SELECT nombre, movil, email FROM cliente WHERE clave = ” . $_GET[“clave”];

//estamos usando la variable “clave” que nos envió el $.get a través del objeto JSON “opciones”, pudimos haber recibido mas de una variable y todas son guardadas en el $_GET de php

//hacemos la consulta

$result = mysql_query($query) or die (mysql_error());

//leemos el registro

$registro = mysql_fetch_assoc($result);

//y ahora construimos el objeto JSON que devolveremos

$inyeccion = json_encode(

array(

“nombre”=>$registro[nombre],

“movil”=>$registro[movil],

“email”=>$registro[email]

)

);

// y por ultimo lo mandamos con un echo de regreso al $.get()

echo $inyeccion;

?>

Bueno pues así es como de una forma sencilla podemos tener un archivo .html que funcione como si fuera un archivo .php

Obviamente habrá muchas cosas mas que validar dentro del .php y el .js pero pero solo quiero mostrar la forma esencial de como trabaja este ejemplo.

Ventajas que le encontré…

Puedo organizar mejor mis funciones, y mi código en general.

1 archivo .html con el modelado, con etiquetas lo mas limpias posibles. Recomendación de @freddier!!

1 archivo .css con toda la cosmética que quieras darle a tu proyecto

1 archivo .js con todo lo relacionado a el funcionamiento de tu pagina

1 archivo .php con todo lo relacionado a datos dinamicos

Y claro el impresionante jquery.js que facilita enormemente comprender el uso de javascript

Esta es mi anécdota y disculpen la indentación del código, los detalles adicionales que pudiera ser necesarios en un proyecto ya mas en forma.

Espero que este ejemplo sea al menos útil para alguien

Por ultimo, visita este link: http://goo.gl/QK8uh (Jn 3:16)

Saludos y dejen sus comentarios….

Bye

Despues de tanto probar…

Hola, en esta ocasión quiero compartir la experiencia de haber tenido que elegir un clienteJabber realmente funcional.

El entorno es…

Estoy corriendo un servidor Jabber Openfire, mismo que cuenta con uncliente llamado Spark. 

Este es el ideal si van a utilizar en especial un servicio con el que cuenta el servidor llamado Fastpath, que lespermite tener un chat de soporte On-Line.

Sin embargo, Spark como simple cliente de Jabber tiene algunos problemas serios. 

En primer lugar es Java.. y sabemos que ese punto le puede doler a cualquier sistema operativo y mas si es Windows.

Otra de las características complicadas de Spark es que de pronto desaparece, (windows) y no hay forma de encontrarlo mas que en el clásico Task Manager y tronar elproceso y en ocasiones ni así es posible reiniciar Spark.

Visualmente le doy un 10, pero en usabilidad es pesado, le doy un 7. 

Pero bueno Spark no era el tema central de este Post, el tema central es que decidí cambiarlo.

Pero bueno, si fuera solo para mi el cambio, no pasaría nada, de hecho yo uso Kopete en Kubuntu 11.10.

El tema es que el cambio es para los mas de 70 usuarios que usan este servicio en la red corporativa de la empresa para la cual trabajo. 

Y el 99.9% son usuarios Windows.}

Y aquí empieza lo bueno…Si no me equivoco y no exagero, debí haber probado el 90% de los que podrían llamarse clientes decentes de Jabber.

Haré una lista de cada unode los que probé, dejando hasta el último el que finalmente fue elelegido para sustituir a Spark

  1. Pidgin. Bueno, pero todo lo que sea desarrollado para algo que no es windows, en windows no va a funcionar como debe.
  2. Jabbin. Bueno pero sin traducciones a español. Interfase lenta, y en Windows 2k, es un martirio.
  3. Miranda. Bueno de lo menos agradable que haya probado.
  4. Exodus. Apariencia mas retro no puede ver.
  5. qutIM. Bueno únicamente en si versión para Linux. En Windows no funciona el protocolo Jabber, osea que no sirve para lo que buscábamos.
  6. Swift. No pudo ni abrirse en Windows con eso les digo todo.
  7. Pandion. De lo mejor que he visto, pero le esta pasando lo mismo que a Spark, muy visual pero cada vez menos usable.
  8. Y finalmente…. el elegido. Psi, si así de sencillo. Psi, pareciera una abreviatura de “Pues Si”. Es ligero, corre excelente desde Windows 2K. Interfase en español, tiene una herramienta que de lograr que funcione en español, le daría los 2 puntos que le faltan para sacarse el 10. Pero es lo suficiente funcional y practico para lo que se quiere. Un mensajero instantáneo que no se trabe, que no desaparezca, que soporte los distintos modos de encriptación que maneja Jabber. Orden del la lista de contactos por Grupo-contacto en forma Alfabética y la cereza en el pastel, es que puedes cambiar los iconos de la lista de contactos por alguno de un set de 5 o 6 opciones.
Y bueno, después de tantoprobar... finalmente lo encontré. 
Y ahora a producción y en unas semanas mas les cuento que tal va...
Saludos.

Blogilo

Hola a todos los que lean mi Blog.

En esta ocasion les compartire que estoy probando un programa para el escritorio KDE, que tengo corriendo en Kubuntu 11.10.
El cual nos permite acceder a los sitios de blogeo mas populares como WordPress, Blogger 1.0 y Google Data para publicar nuevos Posts desde la comodidad de tu escritorio.
En realidad, este Post esta sirviendo como prueba de esta herramienta.
Por favor comenten. 
bastó un “sudo apt-get install blogilo” para tenerlo disponible en mi maquina.
Por cierto los comentarios en torno a la version 11.10 de Ubuntu, los tengo reservados para otro Post.
Hasta la próxima.
Saludos