El Legado

Lectura: Colosenses 3:8-17

Vestíos, […], santos y amados, de entrañable misericordia, de benignidad, de humildad, de mansedumbre, de paciencia. —Colosenses 3:12

Un día, mi esposa me llamó al trabajo y dijo: «Algo pasa en la casa de al lado. Está lleno de autos». Como conocía la ocupación de mi vecino, temí lo peor, lo cual se confirmó de inmediato. Mientras cumplía su deber, Trevor Slot, que era policía, había sido asesinado al tratar de detener a dos ladrones que escapaban de un banco. Nuestra comunidad quedó atónita.

Trevor no tuvo tiempo de prepararse para morir; sin embargo, estaba listo. Su fe en Cristo era firme y su reputación de hombre sobresaliente estaba intacta. En su funeral, al que asistieron cientos de policías, su colega, el detective Brandyn Heugel declaró: «Era un oficial dedicado a su trabajo, pero primero y principal, fue un marido que amaba a su esposa Kim y que adoraba a sus hijas Kaitlyn y Abbie». En verdad, el tema central de los elogios a Trevor fue su gran personalidad, y su amor y preocupación por su familia.

Su vida ejemplificó las palabras de Colosenses 3:12-13: «Vestíos, pues, como escogidos de Dios, santos y amados, de entrañable misericordia, de benignidad, de humildad, de mansedumbre, de paciencia; soportándoos unos a otros, y perdonándoos unos a otros…». Estas características dejan un legado inspirador.

No sabemos cuándo Dios nos llamará a nuestro hogar celestial, pero sí estamos seguros de esto: cada día es una oportunidad para dejar un testimonio digno de nuestra fe.

Cada día agregamos a nuestro legado… algo bueno o algo malo.

Dave Branon

Fuente: Nuestro Pan Diario

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.

Dar gracias

Lectura: 1 Tesalonicenses 5:16-19

Dad gracias en todo, porque esta es la voluntad de Dios para con vosotros en Cristo Jesús. – 1 Tesalonicenses 5:18

Durante el invierno, en Lansing, Michigan, no tenemos muchos días soleados, pero el año pasado, Dios nos bendijo con una de esas jornadas hermosas. Sin embargo, parecía que casi todos estaban dándole gracias al Señor, excepto yo. Cuando salí de la oficina, un hombre dijo: «Qué día hermoso tenemos. ¡Es un regalo de Dios!». Ante lo cual respondí: «Sí, pero vamos a tener nieve para el fin de semana». ¡Qué ingrato!

En sus cartas, el apóstol Pablo ayudaba a sus lectores a desarrollar la teología del agradecimiento. Habló de la gratitud más que cualquier otro escritor del Nuevo Testamento. De las 23 veces que usó el término, aprendemos algunas lecciones sobre la acción de gracias.

El agradecimiento siempre iba dirigido a Dios y nunca a la gente. Las personas eran regalos divinos, y Pablo daba gracias al Señor por el crecimiento, el amor y la fe de ellas (1 Corintios 1:4; 1 Tesalonicenses 1:2).

La acción de gracias se ofrece con respecto a todas las cosas por medio de Jesucristo (Colosenses 3:15, 17). Pablo estaba convencido de que los seguidores de Cristo podían agradecer por todo porque Dios es soberano y porque obra para beneficio de los creyentes (1 Tesalonicenses 5:18).

Que el Señor nos ayude a tomar conciencia de todas las dádivas divinas que nos rodean y a ser agradecidos. Ante esas cosas, es natural decir: «Gracias, Señor».

La gratitud es una respuesta natural a la gracia de Dios.

Marvin Williams

Fuente: Nuestro Pan Diario

¿Pánico o plegarias?

Lectura: 2 Crónicas 14:1-11

… Ayúdanos, oh Señor Dios nuestro, porque en ti nos apoyamos, y en tu nombre venimos contra este ejército… — 2 Crónicas 14:11

Una mujer de 85 años, sola en un convento, quedó atrapada en un ascensor cuatro noches y tres días. Gracias a Dios, tenía una jarra de agua, unos trozos de apio y unas gotas para la tos. Tras intentar sin éxito abrir la puerta para conseguir señal para el teléfono móvil, decidió encomendarse a Dios en oración. «Era… o pánico o plegarias», dijo luego por televisión. Desesperada, confió en el Señor y esperó hasta que la rescataron.

El rey Asa también enfrentó la alternativa del pánico o las plegarias (2 Crónicas 14). Lo atacó un ejército etíope de un millón de hombres. Sin embargo, al enfrentarse a esa enorme fuerza, no se apoyó en estrategias militares ni huyó atemorizado, sino que oró a Dios de inmediato. En una plegaria enérgica y humilde, confesó su plena dependencia en el Señor, le pidió ayuda y apeló a que, en su nombre, lo protegiera: «Ayúdanos, oh Señor Dios nuestro, porque en ti nos apoyamos, y en tu nombre venimos contra este ejército» (v. 11). El Señor contestó la oración de Asa, y este obtuvo la victoria sobre el ejército enemigo.

Cuando enfrentemos situaciones difíciles, recursos limitados, un ejército de problemas o resultados aparentemente negativos, no entremos en pánico, sino elevemos plegarias a Dios, el cual pelea por su pueblo y le da la victoria.

Las plegarias son el puente entre el pánico y la paz.

Marvin Williams

Fuente: Nuestro Pan Diario

Imitar lo bueno

Lectura: 3 Juan

Amado, no imites lo malo, sino lo bueno. El que hace lo bueno es de Dios; pero el que hace lo malo, no ha visto a Dios. —3 Juan 11

La mayoría de la gente coincidiría en que la vida es una mezcla dolorosa de cosas buenas y malas. Esto se aplica al matrimonio, las amistades, la familia, el trabajo y la iglesia. Sin embargo, nos sorprendemos y decepcionamos cuando el egoísmo entra en escena dentro de la comunión de quienes procuran adorar y servir a Cristo juntos.

Cuando el apóstol Juan le escribió a su amigo Gayo, elogió la fidelidad y la generosa hospitalidad de los miembros de su iglesia (3 Juan 3-8). Aun así, en la misma congregación estaba Diótrefes, «al cual le [gustaba] tener el primer lugar» y había creado un clima hostil.

Juan prometió ocuparse personalmente de él cuando visitara la iglesia. Mientras tanto, exhortó a cada integrante de la congregación, diciendo: «Amado, no imites lo malo, sino lo bueno. El que hace lo bueno es de Dios; pero el que hace lo malo, no ha visto a Dios» (v. 11). Las palabras de Juan se hacen eco de la instrucción de Pablo a los creyentes en Roma: «No seas vencido de lo malo, sino vence con el bien el mal» (Romanos 12:21).

En un acalorado conflicto, quizá nos sintamos tentados a «devolver fuego por fuego». Sin embargo, Juan nos insta a dejar lo malo y seguir lo bueno. Este es el sendero que honra a nuestro Salvador.

Como la luz vence la oscuridad, la bondad triunfa sobre el mal.

David C. McCasland

Fuente: Nuestro Pan Diario

Por qué trabajamos

Lectura: Efesios 6:5-9

No sirviendo al ojo, como los que quieren agradar a los hombres, sino como siervos de Cristo, de corazón. Efesios 6:6

A finales de la década de 1660, Sir Christopher Wren fue contratado para rediseñar la Catedral de San Pablo, en Londres. Según la leyenda, un día visitó el sitio donde se construía este gran edificio, y los obreros no lo reconocieron. Caminó por el lugar preguntándoles a varios hombres sobre lo que estaban haciendo. Un trabajador respondió: «Estoy cortando una piedra». Otro obrero contestó: «Estoy ganando cinco libras y dos peniques por día». Un tercero, sin embargo, tenía una perspectiva diferente: «Estoy ayudando a Christopher Wren a construir una catedral magnífica para la gloria de Dios». ¡Qué contraste en la motivación y la actitud de aquel hombre!

Lo que motiva nuestras acciones es sumamente importante; en particular, cuando se trata de nuestra vida laboral y profesional. Por eso, Pablo desafió a los efesios a trabajar «no sirviendo al ojo, como los que quieren agradar a los hombres, sino como siervos de Cristo, de corazón haciendo la voluntad de Dios; sirviendo de buena voluntad, como al Señor y no a los hombres» (Efesios 6:6-7).

Si trabajamos para simplemente ganar un sueldo o satisfacer a un supervisor, estaremos lejos de perseguir la motivación más elevada: hacer las cosas lo mejor posible como una demostración de nuestra devoción a Dios. Entonces, ¿por qué trabajamos? Tal como le dijo aquel obrero a Wren, lo hacemos «para la gloria de Dios».

Independientemente de quién te pague el sueldo, estás trabajando para Dios.

Bill Crowder

Fuente: Nuestro Pan Diario

Servir bien y con alegría

Lectura: Salmo 100

Servid al Señor con alegría… —Salmo 100:2

Hoy, hace nueve años, un querido amigo salió a correr durante la hora del almuerzo, y nunca volvió. Kurt De Haan, que era el editor general de Nuestro Pan Diario, murió de un ataque al corazón ese soleado jueves. Algunos de los que trabajábamos con él, conservamos todavía cosas suyas de valor sentimental en nuestras oficinas.

Por ejemplo, en una pared de mi cubículo, tengo colgado el último memorándum que recibí de Kurt. Me recuerda su esmero como editor, siempre esforzándose por representar bien y fielmente la Palabra de Dios. Otra colaboradora muestra la última bola de papel que él lanzó en dirección de ella, que le recuerda el entusiasmo que él tenía por disfrutar de la vida.

Cada vez que hablamos de Kurt y de cómo lo echamos de menos, comentamos que su vida era la combinación de una búsqueda de la excelencia con una personalidad divertida. Trabajaba duro y le encantaba la vida. Se esforzaba por enseñar la Palabra de Dios con integridad mientras vivía su vida con gozo.

Pensar en Kurt y en su ejemplo es estimulante y desafiante. Nos recuerda que otros están observándonos, y que pueden decir si estamos sirviendo «al Señor con alegría» (Salmo 100:2) y si nuestro amor a Él se manifiesta en buenas obras (Efesios 2:10). Servir bien. Servir con alegría. ¿Describen estas cualidades nuestro trabajo para el Salvador?

Para que el gozo permanezca, coloca siempre primero a Cristo.

Dave Branon

Fuente: Nuestro Pan Diario