Raspberry Pi Shell Streaming!

TTYCast
Shell Streaming!



Una infinidad de veces queremos enseñarle a un amigo algo, o nos preguntan como realizar algo, estamos dando una clase, etc... Y no precisamos más que la terminal para ello. 

Retransmitir toda la pantalla con todos sus gráficos resulta algo terriblemente pesado y lento en estas situaciones. Lo mejor para estos casos es montar en nuestra queridísima raspberry un TTYCast.

Instalamos NodeJs, git y npm, aunque este último suele venir con la instalación de NodeJs.


apt-get install git nodejs npm

Limpiamos el caché de npm

npm cache clean -f


Registramos el sitio desde donde vamos a descargar los paquetes y le decimos que no es necesario ssl estricto.

npm config set registry http://registry.npmjs.org/
npm config set strict-ssl false


Instalamos un controlador de versiones de NodeJs a traés de npm

npm -g install n

Y le decimos que queremos la versión 0.10.21

n 0.10.21

Por último en la versión 0.10.21 instalamos los paquetes necesarios ttyrec ttycast, express y en general instalamos headless-terminal y connect


/usr/local/n/versions/0.10.21/bin/npm install -g express
npm install headless-terminal
/usr/local/n/versions/0.10.21/bin/npm install -g ttyrec
/usr/local/n/versions/0.10.21/bin/npm install -g ttycast
npm install -g connect



Específicamos el puerto por el que vamos a transmitir, generalmente el 80.

export PORT=80

Si ponemos un puerto por debajo del 1024 tenemos que asegurarnos de que nuestro usuario tenga permisos para usar ese puerto. Si ponemos cualquier otro puerto al conectarnos desde el navegador web tendremos que especificar el puerto después de la dirección.
Ejemplo : curiosoinformatico.com/ttycast:3333
3333 sería el puerto.

A mi a la hora de hacerlo funcionar me dió unos errores que después de probar cosas y analizar el error llegué a como solucionarlo.

Faltaba crear los enlaces simbólicos que por defecto no crea

Crearlos es tan sencillo como hacer:

ln -s /usr/local/n/versions/0.10.21/bin/ttyreccast /usr/bin/ttyreccast
ln -s /usr/local/n/versions/0.10.21/bin/ttycast /usr/bin/ttycast
ln -s /usr/local/n/versions/0.10.21/bin/ttyplay /usr/bin/ttyplay

Ahora en una terminal escribimos

ttyreccast archivooptativo.tty

Donde archivooptativo es una característica optativa que si lo escribimos nos creará un archivo con todo lo que hagamos que después podremos reproducir con ttyplay.

En otra terminal escribimos 

ttyrec /tmp/ttycast


Tardará unos segundos y a continuación parecerá que no ha pasado nada. Tendremos nuestra terminal pero a partir de ese momento todo lo que escribamos en ella será retransmitido vía web.

Si abrimos puertos desde fuera podremos verlo en nuestra ip externa y sino desde la red local podremos verlo desde nuestra ip interna.




Nota:
Es muy recomendable poner una Ip fija. Si no sabes como aquí te dejo un enlace.
http://blog.curiosoinformatico.com/2014/12/un-servidor-en-debian-dia-2.html


Nota 2:
Si nodejs no está en el repositorio en un determinado momento lo podemos instalar de la siguiente manera:

apt-get install python g++ wget libssl-dev  
mkdir /tmp/nodejs 
cd /tmp/nodejs  
wget http://nodejs.org/dist/node-latest.tar.gz  
tar xzvf node-latest.tar.gz  
cd node-v*  
./configure  
make  
make test  
make install

Un servidor en Debian: Día 2 -- Configurando la interfaz de red

Muy buenas! Hoy vamos a empezar a darle caña al asunto. ¿Lo principal en un servidor es tener una ip fija no? Pues eso es lo que toca hacer hoy.

Nos logueamos como root con su


Vamos a ver la dirección ip que tenemos por defecto con el comando ifconfig -a, nuestra dirección será la dirección especificada a continuación de ifconfig.


Antes de hacer nada realizamos una copia de seguridad en nuestra carpeta personal del archivo /etc/network/interfaces.  

Posteriormente lo abrimos con nano y editamos su configuración, por defecto veremos lo siguiente:







Fichero /etc/network/interfaces


Especificamos la interfaz después de iface
Si es ipv4 escribimos inet, si es ipv6 sería inet6
Por defecto está dhcp, lo cambiamos por static para tener una ip estática en lugar de una asignada por un servidor DHCP.

Especificamos la dirección ip con address
La máscara de subred con netmask
La dirección de red con network
La dirección de broadcast con broadcast
Y finalmente la puerta de enlace si la tuviéramos con gateway

iface eth0 inet static
address 192.168.1.33
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1



Guardamos con ctrl+x y la tecla y

Deshabilitamos el adaptador de red y lo volvemos a habilitar con
ifdown eth0 
ifup eth0
Y miramos que se ha cambiado la dirección ip
ifconfig -a





A continuación para hacer una práctica crearemos dos scrips uno llamado activarRed.sh y otro llamado pararRed.sh

En el Script activarRed.sh pondremos

#!/bin/bash

echo "Activando la red"
/etc/init.d/networking start

En el Script pararRed.sh pondremos lo siguiente

#!/bin/bash

echo "Parando la red"
/etc/init.d/networking stop

Todos los servicios en GNU/Linux están contenidos en /etc/init.d
En el primer Script llamamos a networking y le decimos que se active
Y en el segundo llamamos a networking y le decimos que se pare.

A continuación probaremos los scripts que acabamos de realizar.



Hecho esto hoy habremos aprendido a configurar las interfaces de red y habremos entendido la localización del servicio networking y su forma de encenderlo y apagarlo. Habremos hecho una práctica creando dos scripts. Uno que lo encienda y otro que lo apague. Y habremos aprendido a deshabilitar y habilitar una interfaz de red con ifup y ifdown.

Con esto ya hemos acabado por hoy.

Un fuerte abrazo!

Un servidor en Debian: Día 1 -- Recordatorio

Comenzamos!




Al encender nuestro fabuloso Debian habiendo instalado todo sin entorno gráfico porque somos más chulos que nadie veremos la pantalla que podemos ver en a la introducción de esta entrada. Nos logueamos con nuestro usuario y tatatachán! Ya tenemos nuestro maravilloso Debian recién sacado del horno.

Para no hacer esto demasiado básico y largo no me pondré a explicar como instalar Debian sin entorno gráfico. Pero tranquilos, es super-intuitivo y hay tutoriales por la red.



Esta serie de entradas si bien serán muy básicas al principio servirán de referencia como apuntes de lo que demos en clase y ¿por qué no? Compartir lo que uno da no solo sirve de repaso sino además como ayuda para aquellos que quieran tener un acceso sencillo a la información. 

Para movernos entre carpetas utilizamos la instrucción cd más la ruta a la que queramos ir, que puede ser absoluta y relativa. Si escribimos cd ~ nos llevará directamente a nuestra carpeta personal. Si ponemos cd / nos llevará al directorio raíz del que cuelga todo el equipo. Para saber la ubicación en la que nos encontramos tenemos la instrucción pwd.


A continuación crearemos un script para recordar como se creaban estos. Para una mayor organización lo crearemos en nuestra carpeta personal en una carpeta llamada scripts. Para crear la carpeta mkdir scripts. Entramos en la carpeta con cd scripts

Y lo editaremos con el editor nano, así que escribiremos nano primerScript.sh que será el nombre de nuestro script.


La primera línea es conocida como shebang y está compuesta por los carácteres #! y la ruta que ejecutará nuestro script. Para el ejemplo usaré bash que se encuentra en /bin/bash.

Finalmente escribimos debajo una instrucción a ejecutar como echo "hola mundo!" para mostrar por la pantalla hola mundo!.


Utilizamos chmod 755 primerScript.sh para cambiarle los permisos y así poder ejecutarlo con nuestro usuario. Una vez realizada esta acción podríamos ejecutarlo con la sentencia ./primerScript.sh en caso de que nuestro Script tenga ese nombre.

No explicaré como se utiliza  chmod dado que no pretendo dar una serie de tutoriales sobre GNU/Linux sino sobre servidores en Debian para empresas. Aconsejo buscar todas las cosas que no queden claras fuera de este blog ya que la documentación es cada utilidad es muy extensa.


Ahora probaremos a copiar nuestro archivo primerScript en otra carpeta a la que llamaremos destino. Para volver a la carpeta anterior vamos a su ruta con cd .. y creamos otra carpeta que llamaremos destino.  Finalmente copiaremos el archivo utilizando la sentencia cp scripts/primerScript.sh destino/


Después realizaremos un borrado del archivo que hemos copiado en el destino con la sentencia rm destino/primerScript.sh
Podemos ir dándole a tabulador para utilizar el autocompletado de la terminal según escribamos.


A continuación recordaremos el uso de las tuberías o pipelines mostrando gradualmente el contenido de la carpeta /etc
Las tuberías se encargan de enviar la salida de un programa a otro. De esta forma podemos invocar al programa ls para listar el directorio de /etc y verlo gradualmente con el programa less. 

ls /etc | less



Para terminar con el recordatorio del día 1 veremos como enviar la salida de un programa como el listado de un directorio con ls, o otro, a un archivo. De esta manera podremos consultar la información. 

Si en lugar de usar una tubería usamos el símbolo mayor > la salida en lugar de mostrarse por la pantalla se enviará a un archivo en modo escritura. Esto quiere decir que si el archivo ya existía borrará los datos y los pondrá de nuevo. Para hacer esto en modo añadir al archivo pondríamos el operador >> en lugar de >.

Esto es muy útil a la hora de crear logs.

Con esto terminamos la entrada del día 1 y como siempre

un fuerte abrazo!

Top 5 lenguajes para empezar a programar


Por esa carilla de... pero pero pero... ¿por dónde empiezo?




Ante todo es una valoración personal como siempre basándome en mis experiencias y experiencias de compañeros. A mi humilde opinión creo que el top 5 lenguajes para empezar a programar son:




C
El superhéroe


Cuando empezamos a programar buscamos un lenguaje para algo en especial y aunque se puede hacer casi de todo con casi cualquier lenguaje... no siempre es el más óptimo para ello. C lo tiene todo, no tiene la dificultad de assembler, tiene velocidad de superhéroe y puede hacer de todo. Nos da las bases para empezar y nos hace comprender el funcionamiento de los programas a bajo nivel.

Su único problema tal vez, sea la dificultad y la enorme cantidad de código necesaria para hacer cualquier cosa. Arduino es una programador de microchips con el que podremos programar microcontroladores si nos gusta la electrónica desde C de arduino.


C++
C digievoluciona!

C++ carece de la ultra velocidad de C, no obstante, sigue siendo rapidísimo e introduce un nuevo concepto: la programación orientada a objetos. Con este nuevo concepto podremos reutilizar muchísimo código y realizar programas más "reales" al crear instancias de objetos. 

Su problema radica en la enorme dificultad de aprendizaje sino contamos con un buen manual, Debido a que muchísima gente mezcla C y C++ y funciona, porque C++ fue creado para que el código de C siguiera funcionando pero le añadiéramos entre otras cosas el concepto de objetos.
Esto es un grave error ya que el código compilado con el compilador de c++ pero escrito en c, será más lento que el código compilado con su correspondiente compilador.

En internet la gente suele mezclar mucho ambos lenguajes. 




C#
El lenguaje de Unity3D

Tal vez podríamos comparar C# a Java, yo diría que C# es más sencillo de entender. Java y yo no nos llevamos muy bien pero ya es cuestión de gustos. Unity3D el famoso motor gráfico nos permite crear Scripts para nuestros videojuegos en C#. Esto significa que podemos aprender C# creando videojuegos. Pero sería recomendable tener una base previa.
Puntos en contra: Tal vez la enorme reducción de velocidad comparado a C++ y C. Corre sobre .NET pero el compilador ha sido liberado y ahora también podemos compilar en GNU/Linux. También tenemos su alternativa 100% libre que es: monodevelop.




Python
Fácil rápido y bonito


Puestos a elegir una opción sencilla para empezar me puse a dudar entre Python o Ruby, Después de meditarlo llegué a la conclusión de que Python era infinitamente más fácil por la razón de que en Ruby ya debemos entender la POO antes de comenzar. 

Python es además un lenguaje multiplataforma, interpretado y con baterías incluidas. Esto significa que no es necesario compilarlo para correrlo. (Ni es necesario ni puede hacerse) Como mucho sacar un bytecode para agilizar la ejecución. Funciona en cualquier sitio donde tengas instalado Python. Tiene una comunidad enorme y tiene una gran cantidad de librerías ya incluidas. De ahí el dicho de baterías incluidas. Además su comunidad apoya enormemente el software libre.




HTML5
3 lenguajes en uno

HTML5 no es un lenguaje propiamente dicho, es un conjunto de tecnologías donde por un lado tenemos html, por otro Javascript y por otro CSS3.

La ventaja de esto es que veremos nuestros progresos de forma gráfica desde un navegador y es algo que nos da un aliciente bastante grande para progresar. Además muchos hemos querido muchas veces crear una página web y es un mercado increíble. 

Ahora si quieres dedicarte al desarrollo web esto es básico. Aparte deberías aprender php, python y algunos de sus frameworks como django o flask, o ruby y su famoso framework rails. O cualquier otro lenguaje para hacer nuestras páginas web interactivas.
Después de aprender Javascript empezar con Ruby no te costará ya que ya te habrán introducido el tema de la programación orientada a objetos. 





Creo que con esto termino el top 5 lenguajes para empezar a programar. Como siempre basándome en mis propias experiencias y concluyo diciendo que a día de hoy no se trata tanto de qué lenguaje uses. Sino de tu calidad como programador y de tu forma de ser. Cada lenguaje tiene una filosofía un por qué detrás. La mejor forma de entender y coger gusto a un lenguaje es entender el  por qué de que las cosas se hagan de una determinada manera y no de otra.

Si quieres comentar algún otro lenguaje que recomiendes estás invitado a hacerlo en los comentarios.
Pronto iré subiendo una serie de entradas sobre servidores en Debian que aunque partiré de una base los primeros días serán conceptos muy básicos como recordatorio. Es una temática que tocaremos en clase y me gustaría compartir con todos lo que demos ya que creo que es algo bastante interesante de conocer.

Un fuerte abrazo!

Desfragmentar == SSD ROTO

Las bue..ya no tan buenas prácticas


¿Qué ven mis ojos? Al fin el cuello de botella que suponían los discos duros HDD se comienza a solucionar con los discos SSD que aún, siendo caros, comienzan a hacerse ligeramente asequibles para los bolsillos cotidianos.

Todo buen informático sabe que de vez en cuando en Windows debería des-fragmentar los datos, crear restauraciones de las particiones en discos duros externos con clonezilla, por ejemplo. Ir creando puntos de restauración, realizar copias de seguridad de los datos, tener la mayoría de los datos almacenados en soportes externos en red y etcétera etcétera... 

Ahora, todo hay que decirlo, como realicemos la primera buena práctica con un disco SSD ya nos podemos ir despidiendo del disco SSD. Ya que desfragmentar realiza muchísimo movimiento de datos y este tipo de discos acortan su vida rápidamente con esta operación. 

¿A nadie le gusta que el recién comprado juguetito que hace que nuestro pc valla como un torpedo se estropee rápidamente no? 

Como siempre me baso en experiencias, un viejo amigo, informático,  llevaba 3SSD rotos y me dijo que esto de los SSD eran una desgracia, Mucho dinero para luego dos días de duración, cuando analicé las acciones que el tío iba haciendo ¡me faltaron collejas para darle!

Lo primero que hacía era desfragmentar el equipo, y cada x tiempo lo volvía a hacer.  

Recordad: Desfragmentador de disco == SSD roto.

No hace falta des-fragmentar nada, tan solo hay que pensar en como funcionan los discos SSD. 

¡Con ellos la fragmentación está pasada de moda!

Ojalá pronto pueda yo también permitirme el lujo de tener uno de ellos. Hasta entonces tendré que seguir a la reducida velocidad (a comparación) de mi disco HDD.

Un fuerte abrazo y hasta la próxima!

Instalando Windows desde Ubuntu

Prácticas poco usuales para gente poco práctica,
o necesidades especiales.


Tatatacháan! Damas y caballeros, se acabaron los dolores de cabeza, espero, frente a los continuos dolores de cabeza intentando instalar Windows 7 en el ordenador de un amigo que no tenía lector de CD decidí coger la imagen del CD que había comprado y conseguir una imagen iso de él. Después pensé que la pondría con unetbootin en un usb y solucionado! :D

Pero por desgracia no fue así, y lo probé también con yumi pero nada, que no había forma. Sonaba demasiado bonito para ser cierto, estuve indagando y descubrí una utilidad llamada winusb con la que sí se puede conseguir este propósito tan particular. Así que manos a la obra.


Para instalar winusb primero deberemos descargarlo de su repositorio ya que por defecto actualmente no viene. 

Si tenemos 32 bits:
wget https://launchpad.net/~colingille/+archive/freshlight/+files/winusb_1.0.11+saucy1_i386.deb 

Si tenemos 64 bits:
wget https://launchpad.net/~colingille/+archive/freshlight/+files/winusb_1.0.11+saucy1_amd64.deb   

Finalmente lo instalamos:

sudo dpkg -i winusb_1.0.11+saucy1*

Y corregimos los errores de dependencias:

sudo apt-get -f install

Con esto teóricamente deberíamos haber acabado y lo encontraríamos como una aplicación más. Tiene un modo gráfico muy intuitivo así que nada, ya es probar y sobre todo tener suerte! :)


DATO AÑADIDO: Si os da un error buscar su fichero de configuración que seguramente estará en /usr/bin/winusb y abrirlo con gedit:
sudo gedit  /usr/bin/winusb

o otro editor de texto...

y cambiáis la línea que ponga algo de grub-install (línea 140 o 141 si no recuerdo mal) por:

grub-install --target=i386-pc --boot-directory="$partitionMountPath/boot" "$device"


Un fuerte abrazo!

Correr LOL y otros juegos en VirtualBox

Level up my friend


 


Aunque no es mi tema y no suelo jugar a juegos de ordenador, prefiero crearlos un amigo me llevaba dando la lata durante meses con que era "imposible" correr juegos en VirtualBox. Y por lo tanto nunca se cambiaría a Linux si nunca podría volver a jugar a sus juegos. Le expliqué que habían otras alternativas como PlayonLinux para jugar a juegos de windows en distribuciones GNU/Linux.

Pero el se negaba a probar cosas "raras" (según el), que no le fueran a dar la fiabilidad del propio sistema operativo. Así que me puse a probar y elegí un juego Free To Play de los que usaba él. Y efectivamente después de instalar el juego "League of legends" en este caso y registrarme para jugar... No me cargaba la partida.

Mirando las opciones de configuración me encontré con que habían dos opciones desactivadas que usan los videojuegos. Aceleración 2D y aceleración 3D. Las activé.

A la hora de instalar las guest additions que se instalan desde Dispositivos >> Instertar CD de las Guest aditions y yendo a equipo y ejecutandolo si no se ejecuta solo.

Había una opción que mi amigo pasó por alto, y yo en las primeras pruebas y es la opción de habilitar la aceleración 3D (beta) al marcarla nos pone otro diálogo diciendo que es mejor dejar la básica y bla bla bla... le decimos que no.



Y nos instalará las Guest Additions con la aceleración 3D necesaria para correr los videojuegos.

NOTA: Siempre que podáis poned la máquina virtual a pantalla completa.

Resultado: Después de instalar el videojuego lo probé y funcionó a la perfección. Quitando una disminución evidente en el rendimiento, el juego iba a 30 FPS pero se podía jugar perfectamente.



Esto además a los gamers  y otra gente que juegue a videojuegos les viene de lujo. Ya que pueden exportar la máquina e importarla en cualquier otro ordenador sin necesidad de volver a instalar el juego por completo.


Se que esta entrada se sale un poco de lo que suelo hablar normalmente pero oye! en la diversidad está el gusto! :D Además me lo venía pidiendo un amigo desde hace ya y no me he podido negar y ya puestos lo comparto con todos.


Un fuerte abrazo!

Clave publica, clave privada, criptografía híbrida

Shh... calla, Obama nos escucha...
 


Kerkhof decía que la fortaleza de un cifrado no debería estar en el algoritmo, sino en la clave.

En esta entrada hablaremos de un tema que puede dar algunos dolores de cabeza a la hora de entenderlo. Así que he decidido hacer una entrada para dar una introducción y dejar claros los conceptos teóricos de lo que es un cifrado simétrico, uno asimétrico y uno híbrido.

Cuando ciframos un documento lo podemos cifrar con diversos algoritmos, pero lo que importa es la clave que nos dará el patrón a seguir para cifrarlo o descifrarlo.

Una clave simétrica es aquella que se utiliza tanto para cifrar una información como para descifrarla. 

Si nosotros cifráramos el fichero_1 con un cifrado simétrico de clave: password 
Para descifrarlo tendríamos que escribir: password

Cifrado simétrico: misma clave para cifrar y descifrar el fichero.
Un idioma podría ser un ejemplo de clave simétrica donde para que se ejerza la comunicación ambas personas deberán conocer el idioma, o en este caso la clave.
El cifrado simétrico tiene una gran desventaja y está en que aunque la información sea enviada de forma segura, la clave no lo es. Y aquí nace su opuesto.

Ahora hablemos del cifrado asimétrico. 
Si cifrado simétrico significa que se usa la misma clave para cifrar y descifrar el fichero y el prefijo "a" en español significa negación de... ¿qué puede ser el cifrado asimétrico?

Cifrado asimétrico: distinta clave para cifrar y descifrar un fichero.

En el cifrado asimétrico disponemos de dos claves, una pública y una privada. La clave privada sólo la deberemos de conocer nosotros y se usa para descifrar los mensajes o ficheros que se cifren con una clave pública. 

Nuestra clave pública la puede ver cualquiera sin ningún riesgo para nuestra seguridad, pero los datos que se cifren con ella solo se podrán descifrar usando nuestra clave privada.


Por las barbas de Neptuno, ¡qué complicado es esto!

En realidad en concepto es muy sencillo. Si Sonia quiere comunicarse de forma segura con Carlos sin que el nuestros amigos del FBI espíen sus conversaciones subiditas de tono, Sonia le dará a Carlos su clave pública y Carlos a Sonia su clave Pública.

Cuando Carlos envíe un mensaje a Sonia lo cifrará con la clave pública de Sonia. (Ya hemos dicho que esta clave se puede dar sin miedo)
Este mensaje no podrá ser descifrado por ninguna clave de nadie, ni si quiera la de Carlos, excepto, por la clave privada de Sonia que solo tiene Sonia.

Cuando el mensaje le llegue a Sonia, ella usará su clave privada que solo conoce ella, para descifrarlo.
La clave pública de Sonia lo que hace es cifrar los mensajes de forma que sólo se puedan descifrar con la clave privada de Sonia.

Cuando Sonia responda a Carlos, ella cifrará el mensaje con la clave pública de Carlos y le enviará la respuesta a Carlos quién con su clave privada descifrará el mensaje.

¿Mejor ahora?

Podríamos hacer un símil con una piedra cayendo a un río. La información podría ser la salpicadura del río. En la clave pública podríamos tener la piedra y sabríamos como tendríamos que hacer a la piedra para que al tirarla salpicara el mensaje. 
En la clave privada tendremos al río, la corriente del río, el viento que hace, la forma en la que tiramos la piedra y con qué fuerza, el ángulo de la montaña, los peces... etc...
De nada nos sirve tener la clave pública si desconocemos el resto de los factores. Por eso cualquier otra persona que tenga la clave pública no puede descifrar un mensaje a no ser que conozca la privada.

El único problema del cifrado asimétrico tal vez, es que ocupa muchísimo y de aquí nace el cifrado híbrido.

El cifrado híbrido consiste en aprovechar el reducido espacio que ocupa el cifrado simétrico a comparación del asimétrico para cifrar un archivo de forma simétrica.

Entonces si ciframos el archivo de forma simétrica... ¿por qué híbrido?

La respuesta viene en la distribución de la clave, aunque cifremos el archivo de forma simétrica la clave la ciframos de forma asimétrica. De esta forma el receptor descifrará la clave con su clave privada y obtendrá la clave para descifrar el archivo que hemos cifrado de forma simétrica.

El cifrado híbrido es el todoterreno de los cifrados ya que aprovecha las ventajas de ambos.

Aunque creo que ha quedado muy claro, cualquier duda, comentario.


Un fuerte abrazo!

Joomla y otras malas prácticas


Programadores y Programadoras del mundo.

 
No me seáis vagos, ¡leches!


Antes de comenzar con el contenido de la entrada, me gustaría realizar una aclaración. Esta entrada no va para nada en contra de Joomla u otros CMS.

Al revés, son plataformas estupendas para que gente sin conocimientos de programación o con poco tiempo y que deseen realizar una web sin complicarse la vida consigan sus propósitos. 

Pero dato: la mayoría de la gente, que yo conozca al menos (siempre hablo basándome en experiencias propias) se centran en mantener las página añadiendo funcionalidades en lugar de buscar que vulnerabilidades han aparecido en plugins y actualizando la página y los plugins para evitarlas.

Aunque los CMS tengan una amplia personalización de muchísimos elementos nunca vamos a poder tener todas las funcionalidades que podríamos tener escribiendo el código nosotros mismos. Ni la seguridad de como se hace todo a no ser que repasemos el código línea por línea (que no creo que una persona que use un CMS lo repase línea por línea cuando lo que intenta es ahorrar tiempo)


Esta tarde me llamaron pidiéndome que realizara una página web en WordPress. Nunca he usado WordPress por lo que tuve que rechazar la oferta. Me pedían algo sencillo, que incluyera un plugin que realizara algo similar al google calendar pero que se viera menos cutre para ver conciertos. 

Esas fueron las palabras de esta persona. Yo no estoy de acuerdo en lo de cutre, todo hay que decirlo a mi Google Calendar me encanta como herramienta organizativa y cuando he tenido la oportunidad lo he usado.

Aquí tenemos un problema curioso, y es un cliente que quiere que le incluyamos un plugin muy especifico que desconocemos si existe algo ya creado con una licencia que nos permita usarlo de forma comercial. Ahora tenemos la opción de buscar el plugin y mirar el código para asegurarnos que funciona correctamente y no tiene bugs o crear el plugin. Por eso para pequeños proyectos o proyectos escolares o personales los CMS son perfectos.

Pero a niveles mayores mi recomendación personal es que si eres desarrollador si quieres usa tu tiempo en mejorar un CMS para el bien de la comunidad.

Pero desarrolla tus propios proyectos, no solo por saber que hace cada cosa a la perfección, sino por saber que modificar en caso de necesidad y no andarte con líos de licencias. Hay una cantidad de frameworks increíbles, solo hay que mirar en github por ejemplo. Solo hay que elegir el que más se adapte a nosotros.

Hay hasta frameworks para C, (cosa que no recomiendo), pero sin lugar a dudas la eficiencia en velocidad de ejecución es increíble.

A lo dicho anteriormente también hay que sumarle el consumo de recursos. Instalar por ejemplo un joomla para una aplicación que podría correr Flask sin añadidos es un auténtico desperdicio de recursos por parte del servidor.

Somos desarrolladores, y como desarrolladores somos creadores de contenido.

Conclusión personal: Si eres una persona que se inicia en la informática y no desea complicarse la vida o no le gusta el desarrollo web y solo quiere centrarse en otras cosas. Usar un CMS es una opción estupenda.

Pero si te pide una empresa un proyecto, se supone que estás vendiendo tu trabajo y tu trabajo tiene unos estándares de calidad. ¿Vas a garantizarle a la empresa que todos los plugins que incluyas funcionen a la perfección siempre?

No seas vago y crea tu propio código. Ya no solo por saber como funciona, sino porque estarás vendiendo tu trabajo y no el trabajo de otros. Y porque la producción será mayor y el peso menor, por no contar la increible capacidad de personalización y es que hay clientes muy tiquismiquis con detalles inverosímiles.

Como ya he dicho al principio, esta entrada no pretende ser una entrada disuasoria al uso de los CMS ni mucho menos, tienen su sitio como hemos explicado y son muy importantes ya que gracias a estos muchas personas pueden tener su web sin necesidad de amplios conocimientos de programación. 

Gracias a estos internet puede crecer a velocidades vertiginosas con millones de ideas de personas super-variopintas.

Pero como desarrolladores (a mi humilde opinión), salvo en algunos casos, usar un CMS es un desperdicio de nuestro talento y a la larga nos puede costar más tiempo del que nos ahorra.


Un fuerte abrazo!


Versión 1.3 de IconMod: cambiar iconos desde una url


"Y es que un proyecto no es un proyecto si no se mejora día a día"


 

Cogemos nuestra caja mágica y le metemos diez mil programas súper-útiles pero que no nos dejan de convencer su diseño o sus iconos.  Sabemos que para cambiar los iconos tendríamos que ir a una línea de un archivo situado en un sitio y cambiarla con cuidado de no tocar nada más, abrirlo como superusuario etc.

Para cosas como esas está IconMod y un poquito de Gimp en caso de que queramos diseñar nuestros propios iconos. 

Aunque ya lo dije en una entrada anterior diré una pequeña introducción:

IconMod es un programa OpenSource que empecé a desarrollar solo y rápidamente recibí ayuda de manera indirecta de Fanta de elbinario.net Quién vio el código y decidió hacerle unas modificaciones para que se prestase al Scripting.
Modificando un poco la idea de Fanta y adaptándola a un modelo de varios módulos conseguimos crear la versión 1.2 de IconMod. En esta versión conseguimos dos modos de uso. A través del modo interactivo donde el programa te va preguntando los parámetros. O el modo de Scripting o OneLiner donde con una sola línea podíamos modificar un icono y de esta manera crear Scripts que cambiaran muchísimos iconos de un tirón en los ordenadores en los que los pusiéramos.

Ahora... ¿pero la versión 1.3 para qué? 
Y es que en esta versión quería liberar de espacio los Scripts que hiciéramos con el método de Scripting. Y llevar una carpeta con un montón de imágenes no era viable. Además de que si queríamos pasar nuestro Script a otra persona tendría que descargarse todas las imágenes y además... A no ser que lo guardase en /tmp/ hasta que llamase a IconMod seguramente las imágenes quedarían duplicadas en el ordenador.
Con esta pretensión y con la idea de ahorrarnos la vida le añadí una nueva funcionalidad para poder descargar los iconos en tiempo real solo indicando la url. Y así nació IconMod 1.3

En el método de Scripting se incluye una nueva opción -u y --url. Ambas hacen lo mismo. Aquí tenemos un ejemplo para cambiar la imagen de Firefox por el icono de Debian.

sudo iconmod -s firefox -u https://www.debian.org/Pics/openlogo-50.png

El resultado es el siguiente


 Un dato importante es que siempre debemos llamar a IconMod con permisos administrativos ya que si no nos dará un error. 

Este error se debe a que el funcionamiento interno del programa en esta funcionalidad es el siguiente (en el modo OneLiner):

Coge la Url de la imagen. Saca el nombre de la imagen y lo muestra en pantalla. Añade .desktop a la aplicación que hemos elegido. Va a /usr/share/applications/ y busca el archivo de su aplicación. Si no lo encuentra avisa de que la aplicación no existe o has escrito mal el nombre.

Después coge el nombre de la aplicación y le pone la extensión del icono especificado en la Url y guarda la imagen especificada en /opt/iconmod/photos/ con el nombre de la aplicación más la extensión de la imagen. Todo para un mayor orden.

Esta acción ya requiere privilegios administrativos.

Y finalmente modifica el archivo de la aplicación para cambiarle el valor que apunta a la imagen del Icono de esta sin tocar los demás valores.

En el modo interactivo o guiado aparece una nueva pregunta donde pregunta si la imagen es local[l] o está en la network[n].

Tanto si ya lo tenemos instalado como si no el proceso de instalación/actualización es el mismo.

# si no tenemos instalado Python3 
sudo apt-get install python3
# si no tenemos instalado git
sudo apt-get install git
# descargamos el programa
cd /tmp/
git clone https://github.com/curiosoinformatico/iconmod
cd iconmod
# instalamos/actualizamos el programa
sudo ./setup.sh
# Si nos da errores de que no puede sobrescribir algo o crear un directorio
# porque ya existe no nos preocupamos. Significa que ya lo teníamos instalado 
# antes y solo ha actualizado las cosas que han cambiado y no ha tocado las 
# anteriores.


Fijaros en el Icono de Firefox en la barra superior...
En el icono de la aplicación también cambia. 


Es importante que en la Url especifiquemos la ruta de la imagen completa, si no nos lanzará un error. 
http://curiosoinformatico/4454/dss por ejemplo, daría un error. 

https://www.debian.org/Pics/openlogo-50.png por ejemplo, sería una Url bien especificada.
Honestamente espero que os sirva para algo, estáis invitados por supuesto a ayudar a añadirle funcionalidades y mejorarlo y como siempre...
 

Un fuerte abrazo!

Problemas al empezar como desarrollador


"Más de a uno ha pasado por lo mismo"


En esta entrada he decidido comentar algunos de los problemas por los que hemos pasado sino todos, muchos, a la hora de empezar a programar. Para que de esta forma las nuevas generaciones de desarrolladores (entre las que me incluyo) puedan tener una ayuda sobre lo que no hacer.

He decidido resumir todo esto en 7 tips o 7 problemas que le suelen suceder a la mayoría de la gente cuando empieza. Digo esto sin generalizar claro, basándome en propias experiencias y en experiencias de compañeros.

Problema 1: Quiero hacer "un videojuego, un virus, dominar el mundo..."
Aunque suena a chiste para muchos. Muchos de los que estamos en este increíble mundo empezamos por querer "hacer un videojuego" y buscamos en google "cómo hacer un videojuego".  Lo primero es el motivo por el que empezamos. Aunque queramos aprender a programar para realizar un videojuego, ya sabéis el dicho. Hay que aprender a caminar antes de correr. Y si centramos nuestros esfuerzos en crear un videojuego en lugar de profundizar en algún lenguaje de programación. No vamos a ir a ningún lado, porque lo primero requiere que lo segundo se haga primero.


 Problema 2: "Voy a hacer un videojuego en batch, he visto en youtube cómo hacer un virus en batch, seré un hacker."

1.¿Really? Antes de ponernos a aprender un lenguaje debemos saber para que sirve o para que se suele utilizar. Hay que indagar un poco antes de ponernos a aprender algo y elegir el lenguaje adecuado para nuestro proyecto. 
2. ...sin palabras. Y es que cuando eres pequeño (como en mi caso cuando empecé tenía 12/13 años) y buscas en youtube cosas de informática, o en google. Muchas veces no sabes como buscar y te salen cosas tipo "como crear un virus blanco en batch", que no es más que un acceso directo con un shutdown. De virus nada. Hay mucha desinformación por la red y debemos contrastar todo antes de darlo por válido.
3. Queremos aprender a programar y programar es algo bonito, bello y puro donde la creatividad es el motor de todas las cosas que creamos. Intentar crear cosas con fines maliciosos no nos va a llevar a ningún sitio.
4. ...me ahorro el comentario. Antes de proclamarte como algo deberías buscar en varios sitios el significado de esa palabra.



Problema 3: ¿Con qué lenguaje empezar?

Eso ya es cosa de cada uno, yo empecé haciendo pequeños Scripts en batch y rápidamente me pasé a C, con lo que estuve poco tiempo porque conocí C++ y lo preferí enormemente. Después me hice amigo de Python y desde entonces hemos sido inseparables aunque ahora le estoy dando la oportunidad de entrar en mi vida a Ruby.

Lenguajes hay muchos, se recomienda empezar por C. Aunque yo personalmente hubiera preferido empezar por Python. Dado que el nivel de C es más para gente que ya tiene ciertos niveles de conocimientos superiores a los que se dan en la ESO. Lo que importa es coger las bases. Cuando coges las bases en un lenguaje migrar a otro te será relativamente fácil.

Problema 4: ¡Qué mi código no lo vea nadie!
Cuando empezamos en este mundo muchas veces somos reacios a compartir nuestras creaciones. Pero debemos pensar... si nosotros sabemos esto es porque alguien nos lo ha enseñado. Alguien se ha tomado la molestia de escribir un libro o explicar una documentación o... crear un lenguaje de programación. Que tire la primera piedra quien no haya preguntado nada nunca en ningún foro.
Debemos ser fieles a la filosofía OpenSource. Nuestro código puede ser todo lo sagrado que queramos y sentirnos desnudos al principio dejando que cualquiera haga lo que quiera con algo que es... como nuestro hijo jajajaj... Pero toda modificación que haga una persona en lo que originalmente hicimos nosotros solos es a mejor. Y no solo van a ayudarnos a ver nuevas cosas para incluir, sino a detectar errores y lo mas importante. Todo esto ayudará a personas que como nosotros, quieren escribir software por hacer de este un mundo mejor.
El software privativo es como la comida del McDonalds, puede estar muy rico pero no sabemos que nos comemos.


Problema 5: "Ya sé programar"
Nunca, y repito nunca, terminamos de aprender cosas y los lenguajes de programación evolucionan día a día. Yo soy el primero que reconoce que no tiene ni la más remota idea de casi nada. Por eso día a día intento aprender cosas nuevas y día a día descubro que hasta el final de mis días. Seguiré sin tener ni la más remota idea de casi nada porque el software va evolucionando a velocidades vertiginosas.
Somos desarrolladores, creadores de contenido. Debemos tratar de innovar y superarnos cada día por lo que decir "ya se programar" no tiene sentido. Deberíamos decir más bien "he aprendido a hacer esto de esta manera que no sabía antes".


Problema 6: He aprendido un lenguaje, ahora solo me queda profundizar en él.
No es necesario conocer todos los lenguajes de programación, ni mucho menos. Pero si es importante conocer varios porque cada uno te introduce una nueva filosofía y una nueva perspectiva del mundo. Además de una nueva comunidad.
Y evidentemente...  no podemos realizar un videojuego o crear una página web (que no se viera neolítica) conociendo única y exclusivamente HTML.

Problema 7: "Comoditis aguda"

Si tienes una duda primero intenta resolverla por ti mismo. Mira y remira tu código, analiza el error que te da en caso de darte un error. Busca en google, mira la documentación oficial del lenguaje de programación que estés usando. De la librería que estés usando y si después de mil quebraderos de cabeza no lo consigues solucionar.
Pregunta. Si no te saben responder a la primera sigue buscando y si no lo encuentras vuelve a preguntar en otro foro. Si a pesar de esto parece no haber documentación acerca de tu error o duda sigue husmeando y cuando encuentres la respuesta publícala. Así podrás ayudar a otros programadores en tu situación.
Además, te sentirás mucho mejor por haber sabido resolver la duda por ti mismo en lugar de que te la resuelvan otras personas. Estamos aquí para ayudar pero no para perder el tiempo. Y que te digan como hacer una cosa no vale nada sino la aprendes para una próxima vez.
La mejor forma de aprender algo es descubrirlo. Te debes de sentir cómodo resolviendo tus propias dudas.

En definitiva, si quieres dedicarte al mundo del desarrollo bien sea por una meta, la gratificante sensación de auto-realización, por ayudar a otras personas o por cualquier otro motivo. No olvides que este es un mundo lleno de creatividad y que los desarrolladores nos parecemos más a chicos y chicas con ganas de innovar y diseñar un mundo nuevo desde los engranajes, que a monos tocando botones delante de una pantalla.


Espero que esta entrada pueda ayudar a otros que estén empezando a programar y a jóvenes programadores que ya tengan algo de base.

Un fuerte abrazo!

IconMod: Cambiar Iconos Linux 4 Newbies


No hace falta ser unos genios para hacer genialidades




¿Qué hay de diferente en mi barra de navegación? Aparte del fondo chulísimo por cierto que viene por defecto entre los fondos de ubuntu y pertenece a su respectivo autor. En primer lugar como icono de Firefox tenemos una fotografía mía y como icono de rhythmbox tenemos una imagen de unos cascos beats.
Queda mas cool así. No por la imagen, sino por hacerlo a nuestro estilo, de personalizarlo al máximo y no necesitamos tener conocimientos exhaustivos de linux para hacerlo.

Esta noche he creado un Script en Python que he liberado en GitHub bajo una licencia GPL3. Este Script funciona sobre Python3 así que para hacerlo funcionar tenemos que tenerlo instalado.

Para instalarlo:
sudo apt-get install python3
o
sudo yum -y install python3
o
buscamos en google como instalarlo en nuestra distribución.

Cuando ya tengamos instalado python3 necesitaremos git para descargar de una forma cómoda el script.
Si no tenemos instalado git (cosa muy rara...) lo instalamos escribiendo:

sudo apt-get install git
o
sudo yum -y install git
o...
buscamos como instalarlo en nuestra distribución.

Ahora abrimos una terminal, nos movemos a la carpeta que queramos y escribimos en la terminal:

git clone https://github.com/CuriosoInformatico/iconmod.git

nos movemos a la carpeta que nos ha creado

cd iconmod

y ejecutamos el instalador:

sudo ./setup.sh

Con esto ya habremos instalado IconMod en nuestro ordenador.
¿Fácil verdad?


Si no puedes verlo en aplicaciones prueba a reiniciar el entorno gráfico y volverlo a mirar. Perfecto, ahora para ejecutarlo podemos ejecutarlo desde la terminal escribiendo: iconmod, o, ejecutarlo desde el menú de aplicaciones haciendo click en él.

Nos pedirá la contraseña de superusuario evidentemente, pues la necesita para poder modificar los archivos de las aplicaciones.

Y una vez escrita no hay más que seguir las instrucciones en inglés.
Primero escribiremos el nombre de la app a cambiar el icono.

Ejemplo: iconmod

Nos arrojará una serie de resultados con los ficheros que contengan esa palabra. Por seguridad en lugar de coger el primero que pille te pide que escribas el nombre del fichero completo.

Nos fijamos y elegimos la que deseemos, en este caso sería iconmod.desktop,
en el caso de firefox: firefox.desktop y así sucesivamente.

Comprobará que el fichero existe y en caso afirmativo nos preguntará por la nueva imagen de icono. Aquí tenemos que poner la ruta absoluta. Es decir, si la imagen está en nuestra carpeta personal la ruta sería:

/home/tuusuario/nuestraimagen.png

Comprobará que la imagen existe y de ser así nos cambiará los archivos y nos dirá que presionemos enter para finalizar. Presionamos enter y terminal el programa.

La próxima vez que reiniciemos el entorno gráfico la aplicación que hemos elegido tendrá el nuevo icono que hemos seleccionado.

¿Fácil verdad?