Comencemos el año programando

Es sorprendente la acogida que ha tenido el buen Mar.io y a decir verdad es el primer artículo que publico que genera más de 10 mil vistas, esto pone la valla algo alta para los siguientes y espero no defraudarlos con este :) Muchas gracias por encontrar mis escritos lo suficientemente interesantes como para compartirlos dicho sea de paso :)

Programación

Este es un tema de moda, todo el mundo quiere programar, o al menos todo el mundo piensa que es una habilidad cada vez más necesaria, y a decir verdad a mi me gustaría escribir todo un libro sobre programación, GNU/Linux, seguridad, y tal vez en algún momento lo pueda hacer, apenas aprenda cómo escribir libros libres y en formato agradable :P .

La tecnología avanza rápidamente

Este es uno de los motivos por los que no he escrito el libro todavía :P puesto que quiero hacer algo que pueda superar la barrera del tiempo en un campo en el que las cosas no suelen durar más de unos días de forma vigente. Es por esto que en este artículo quiero contarles un poco de los conceptos más que las implementaciones, de esta manera podremos volver a leer estas líneas en un tiempo y seguirán siendo vigentes.

Los principios se mantienen más tiempo

A pesar de que existen muchos lenguajes de programación hoy por hoy, muchos de los conpceptos se remontan a los mismos orígenes. Con esto quiero decir que muchas de las cosas que hoy se aprenden, han sido válidas por mucho tiempo, y probablemente lo seguirán siendo, esto debido a que la programación es hecha por personas y mientras sigan siendo ellos los que desarrollen, algunos conceptos se mantendrán.

Conociendo las bases

Ya existen muchos cursos, algunos gratuitos y otros no, que exponen gran parte de la sintaxis de muchos de los lenguajes de programación más populares de hoy en día. Pero no vamos a hacer esto aquí :) yo quiero contarles un poco de lo que todo pogramador debería pensar antes de empezar a programar para poder hacer un trabajo decente.

Entrar en la mente del programador es ciertamente algo necesario, ya en un artículo un poco antiguo tratamos el tema. Ahora vamos a entrar un poco en los conceptos que nos permiten escribir el código.

Variables y funciones

Las variables son espacios de memoria, pensemos en los buzones que tienen los grandes edificios, están diseñados para almacenar cierto tipo de objetos, los hay grandes y pequeños, pueden estar solos o en grupo. Una variable es un valor que tu sabes que se usará a lo largo del tiempo, aunque exactamente no conoces su valor en el principio, si lo conoces y sabes que no va a variar, estamos frente a una constante.

Las funciones por otra parte, son conjuntos de instrucciones. Una instrucción es lo más básico que puede hacer un procesador, la razón de ser de las funciones es permitir al programador agrupar conjuntos de ordenes para poder repetirlas a lo largo de un programa. veamos un ejemplo sencillo y a la vez lleno de detalles.

Diseño propio. Christopher Díaz Riveros

Este es un pequeño programa escrito en C, tenemos la función main, la variable saludo, y la función printf que proviene de la biblioteca stdio.h. Vamos a modificar un poco el ejemplo y luego compilarlo para ver qué sucede.

Diseño propio. Christopher Díaz Riveros

Hemos agregado una pequeña función llamada saludar la cual toma como argumento una variable llamada saludo y la imprime. Esto no cambia mucho el resultado final del programa pero nos permite mostrar un gran y útil principio de la programación, la abstracción. Veamos el resultado:

Diseño propio. Christopher Díaz Riveros

Un simple programa, que está lleno de conocimiento y trabajo.

Bibliotecas

El motivo por el cual creé la función saludar fue simplemente para mostrar uno de los principios más grandes del desarrollo de software, que ya hemos nombrado: la abstracción. Así como hemos definido saludarprintf() ha sido definido en algún lugar de nuestro sistema operativo (la biblioteca standard de C de GNU), este lugar se conoce comúnmente como biblioteca. Las bibliotecas son conjuntos de funciones que nos permiten agregar funcionalidad a nuestros programas sin tener que volver a inventar la rueda. En este caso, gracias a printf no tenemos que preocuparnos de toda la lógica necesaria para poder mostrar en una terminal el mensaje que deseamos.

Las bibliotecas están presentes en casi todos los lenguajes de programación actuales, puesto que al poder contar con secciones de código para elegir e implementar es más sencillo que crear cada función desde cero.

Abstracción

Imaginemos el sistema de correo, nosotros no necesitamos conocer toda la logística necesaria para poder enviar o recibir una carta, lo mismo sucede con la programación, abstraer es esencial para generar código duradero y elegante. Este proceso permite utilizar nombres generales para definir procesos generales.  En otras palabras, si creamos la función enviarCarta() sabemos de manera general que dicha función se encargará de enviar una carta, pero no necesariamente qué pasos se requieren para hacerlo. Y este es otro punto por el cual la abstracción es tan buena, puesto que nos permite encapsular segmentos de procesos.

Encapsulamiento

Nuestra función saludar es un claro ejemplo de encapsulamiento, nos permite tener un bloque cerrado con instrucciones específicas que podemos usar una o mil veces dentro de un programa. Esto hace que el código sea más fácil de leer y que sea más fácil de depurar puesto que si algún error surge, sabemos exactamente cuáles son los límites de nuestra función, y conocemos cada instrucción en un espacio reducido. Esto nos lleva a un principio de la programación bastante común en UNIX

Haz una cosa, hazla muy bien

Una buena función es aquella que solamente hace una cosa, pero la hace muy bien. Pensemos en esto por unos instantes… enviarCarta() probablemente haría muchas cosas, lo que no puede ser bueno si queremos depurar el proceso, mientras saludar() solo hace una. A lo largo del tiempo, si surgen problemas la segunda será más fácil de reparar que la primera. Una opción para evitar este problema sería generar distintos niveles de abstracción para enviarCarta(), esto quiere decir que dentro de la función existirían otras como verificarSobre() y tal vez dentro de esta una como verificarRemitente(). En definitiva esta última función (verificarRemitente()) es mucho más específica que solo enviarCarta() y de esta manera podemos encapsular partes del código para que hagan lo que es necesario y solo una cosa a la vez.

Practicar

Para aprender el arte de la programación es necesario practicar, y puesto que yo ahora he dado un vistazo muy general al tema, es necesario que practiquen con diversos lenguajes, o diversos problemas. Primero intentando generar funciones específicas, luego aumentando la complejidad. Como siempre, si surgen dudas, o sugerencias o comentarios, me ayudan mucho a saber qué aspectos reforzar. Muchas gracias y que este 2018 esté lleno de éxitos y proyectos asombrosos. Saludos

Cómo compartir archivos en una red Linux

Este va para nuestro compañero Claudio, quien desea aprender a configurar una red Linux sin usar Samba. En un comentario poco amigable, Claudio solicita la creación de un GUI para poder realizar un trabajo que miles (sino son millones) de personas ya han realizado antes y lo seguirán realizando… como gran parte de este trabajo es por consola, y no le gusta mucho, prefiere la creación de un GUI para poder utilizar de manera sencilla (a lo Windows como él mismo dice) su red interna. Primero vamos a discurrir un poco sobre esto antes de la solución.

El modo empresarial vs el FOSS

Bueno, vamos por lo sencillo desde el principio… Esto es algo que siempre se reclama a los proyectos FOSS (Free and Open Source Software), la fatal de calidad en el trabajo. Siempre he escuchado, pero tal juego es mejor comprarlo de la empresa tal porque es mejor, tal programa es mejor que su versión libre, tal sistema es mejor que otro libre. Vamos a ver por qué es esto:

La empresa tal vive de su software

Si yo soy una empresa y mi trabajo es vender software, eso quiere decir que tengo que vender algo extremadamente bueno para que la gente lo compre, y por tanto tengo que pagar a mis desarrolladores para conseguirlo, y este es el punto de partida de este asunto, el software libre y en algunos casos el open source es desarrollado por buena voluntad. A la gente no le están pagando por desarrollar algo para el resto. Así que si tú me dices que tal software sistema o lo que sea es mejor que su versión libre, pues yo te digo, probablemente, pero existe un gran problema en eso:

Está hecho para hacerte dependiente

Esto es como una droga, mientras más software privativo usas, menor es tu capacidad de pensar y resolver cosas de manera autónoma. Solo pensemos en esto un segundo, ¿saben dónde se gana más,?¿en la venta o en el mantenimiento? Pues la respuesta a esto es sencilla, no importa cuán caro sea un programa o sistema, siempre será mayor la ganancia en mantenimiento que la ganancia en venta, porque al momento de los problemas, no importa la cantidad de dinero que deba invertirse para resolverlo porque simplemente no se puede cambiar la infraestructura a esas alturas.

La necesidad es la madre de la creación

Una forma poco amigable de solicitar una GUI no es motivo suficiente para hacerla, y al mismo tiempo, disculpa si te duele Claudio, pero tengo cosas mucho más importantes que hacer y proyectos en los que participar como para invertir mi tiempo en resolver tu falta de autonomía y tu pasividad mental. Pero como lo has pedido, pues te vamos a explicar por qué no existen los GUI todavía para algo que en Windows es tan sencillo.

Cuando compartes carpetas en windows creas huecos de seguridad

Aquí más de uno me dirá que me equivoco y etc etc… pero la verdad es que cuando utilizas nmap para reconocer un equipo windows, probablemente si este se encuentra en una red de “confianza”, estará corriendo un servicio en algún puerto para poder compartir archivos. Esto no solo es peligroso, sino que es tan poco sabido que muchos de los ataques exitosos surgen a causa de que se estaba compartiendo el accesso por medio de la red. ¿Pero por qué surge esto? Pues porque la filosofía  de Windows te enseña a decir SI sin saber exactamente qué está sucediendo. (¿Recuerdan lo de dependencia?) Una manera muy sencilla de solucionar esto sería cuidando bien el equipo, pero como la filosofía de Windows no es esa, aquí es donde el mantenimiento entra en juego, y hace que tengas que necesitar de alguien que haga las cosas por ti.

No es necesario

Si la necesidad es la madre de la creación, sin necesidad, pues no hay nada. Esto es algo sumamente sencillo de entender, si la gente que lo usa (normalmente administradores de sistemas, o gente usando servidores) no lo necesita, pues no lo va a crear. En casos muy especiales (normalmente en software libre) los creadores se ponen un poco en los pies de los menos experimentados y deciden ayudar creando un GUI (Git tiene un GUI para los que desean probarlo), pero nuevamente, esto es por pura buena voluntad de los creadores, puesto que la cantidad de trabajo real es tan grande, y los desarrolladores tan pocos, que esos trabajos quedan relegados al tiempo libre de algún desarrollador de buen corazón. ( Recordemos que nadie le paga por hacerlo, y aún así tiene familia, trabajo y responsabilidades)

Intimidar nunca será la solución

Esto tómenlo de consejo y comentario para todos aquellos que lo lean, recuerdo mucho un video que vi una vez de una entrevista de Obama (alguien que considero un gran ejemplo de persona) , donde un hombre enojado empieza a criticarlo e insultarlo y el no hizo absolutamente nada. No hizo nada, no porque no pudiese, es decir, era el hombre más poderoso del planeta en ese momento, sino porque sabía que no debía rebajarse a ese nivel. Esa no es ni será una solución en esta vida, entrar en discusión nunca traerá nada bueno, hay gente que puede creer que sí, pero a mí al menos no me va a mover la intimidación y comentarios de un X. Solo lo dejaba como comentario suelto antes de empezar el tutorial.

NFS

Network File System es un protocolo a nivel de aplicación que permite contar con información centralizadasincronizada en una red, funciona tanto para sistemas Linux como Windows y otros (esto debido a estar diseñado a nivel de aplicación). Como hablamos de manera centralizada, quiere decir que nos encontramos frente a una solución de modelo Cliente/Servidor. Esto ya lo hemos tocado superficialmente en otro momento, pero nada más recalcar un pequeño detalle.

¿Por qué es importante tener centralizada la información?

Alguno que otro dirá, “pero yo tengo información importante en cada tipo de máquina que tengo, la laptop de trabajo, el equipo de casa, etc etc”. El problema es el siguiente, si se siguiese un modelo de backup eficiente, uno notaría que crear y mantener backups de muchos puntos es compicado, mucho más sencillo (para todos los que usamos scripts y demás) es crear un único punto donde la información llegue y de ahí empezar a resguardar la data.

No estoy inventando la pólvora

Para quien por un segundo crea que he descubierto esto a modo de prueba y error, pues nada más lejano de la verdad, solo uso un poco de lo que Google me ofrece y veamos lo que encontré en la primera búsqueda (Asumiré que están en Ubuntu aquellos que lo usen, y supongo que para Fedora el cambio debe ser mínimo)

Google

Diseño propio. Christopher Díaz Riveros

Siempre sigan lo que dice Oficial. Esto es tal vez uno de los primeros pasos a seguir, y lo pongo por si alguno cree que yo sabía algo de NFS antes de escribir este post.

TL;DR

Diseño propio. Christopher Díaz Riveros

Too long; don’t read. Cada vez que vean este acrónimo, pueden estar 100% seguros que es la manera “floja” de resolver un problema, muchos me reclamarán que cómo saberlo si está en inglés, bueno, pues ahora lo saben para que no pueda haber opción a reclamos después ;) Yo uso bastante el urban dicciontary para entender muchos de estos conceptos.

Official Documentation (¡¡En español!!)

Diseño propio. Christopher Díaz Riveros

Algún alma de buen corazón se dio el trabajo de traducir por nosotros esta simple pero completa página con todo lo necesario para poder instalar un servidor NFS en nuestra red.

Vamos a ver de manera rápida los pasos a seguir. Les dejo el link para los curiosos que no puedan usar por X motivos Google para llegar al mismo lugar.

Instalar el servidor y el cliente

Ahora vamos a instalar por consola lo necesario en ambos lugares para utilizar los archivos compartidos. En el servidor instalamos nfs-kernel-server y en el cliente nfs-common

Diseño propio. Christopher Díaz Riveros
Diseño propio. Christopher Díaz Riveros

Configurar el servidor

NFS funciona mediante un archivo de configuración ubicado en /etc/exports. Dicho archivo indica a NFS qué archivos compartir y cómo llamarlos, además de contar con muy buenos ejemplos de cómo usarlo por default, usaremos nuevamente la consola para editarlo gracias al siempre confiable vim (los que no estén cómodos con vim pueden usar nano)

Diseño propio. Christopher Díaz Riveros

Para este simple ejemplo yo estoy diciendo a exports que quiero compartir mi carpeta workspace (el * indica que quiero compartir todo el contenido y sin dejar espacio escribo los permisos y opciones que más me acomoden, en este caso rw para escritura y lectura)

Reiniciar el servidor

Si hemos configurado bien, necesitamos reiniar el servidor (o iniciarlo si es que no está activo), no es necesario cada vez que hay un cambio, pero aprovecho la oportunidad para dejarlo claro, si no deseas reiniciar todo, un simple exportfs -ra resuelve todo.

Diseño propio. Christopher Díaz Riveros

La primer línea systemctl start nfs-kernel-server activa el servidor, la segunda solo es para verificar que todo está bien (si no está verde, no está bien).

Conectar al servidor

Ahora vamos a conectar nuestro otro equipo, para eso usaremos nuevamente la consola, y el comando mount.

Diseño propio. Christopher Díaz Riveros

Aquí vale la pena recalcar que los IP se asignan a su gusto, no sé si usarán DHCP o manual, pero una vez tengan el IP pueden usarlo, agregen :/ruta/de/tu/carpeta y un lugar donde puedas montar la conexión, en mi caso creé una carpeta llamada compartido.

Abre tu explorador

Diseño propio. Christopher Díaz Riveros

Aquí están tanto en versión consola como en versión GUI. Y les muestro un poco de cómo llevo mi trabajo en el instituto, siempre uso máquinas virtuales para trabajar la información de los cursos, (por eso van a ver un OSX instalado) y uno por cada lenguaje, así puedo tener ambientes de desarrollo controlados y no llenar mi Gentoo de programas innecesarios. ¿Por qué ubuntu? pues me gusta más que Fedora y es más rápido para crear máquinas de prueba que puedo borrar también de manera rápida. Como ya dije :) cada cual sigue su filosofía y el dejar todo listo para usar sin pensar mucho es algo que facilita mucho ubuntu a sus usuarios :) (además que mi certificación de administrador de sistemas la hice en ubuntu, así que era una buena forma de recordar apt-get y apt)

 Reflexiones finales

Ya he escrito mucho esta vez, pero como podrás ver Claudio, son solamente 4 pasos ( espero que puedas hacer el de Google tú solo para no contarlo), y adivina qué… no es necesario un GUI para cinco comandos. Disculpa si no puedo cumplir tu deseo de hacerte el mundo GNU/Linux más Windows, y evitar que pienses un poco y aprendas a googlear cosas. Y si quieres tener cambios permanentes en tu red y equipos mediante /etc/fstab, pues tendrás que buscarlo tú mismo.

Para todos los demás, disculpen por favor si he sido rudo con este post, y aunque lo he escrito un poco mal humorado (debo admitir que a nadie le gusta que pongan en duda su trabajo y esfuerzo, y menos que lo tilden de fanfarronería)… espero que de verdad esto pueda ayudar a más de uno en sus trabajos de conexión. Muchas gracias por llegar hasta aquí a pesar de mis torpezas y errores, Saludos :)