Secure Shell (SSH) is a cryptographic network protocol for operating network services securely over an unsecured network. The best known example application is for remote login to computer systems by users. ssh @ Wikipedia
ssh
Eso, la aplicación más conocida es para conectarte de manera segura con otras computadoras. Esto puede ser desde la terminal o con otros programas que usan ssh con algún tipo de interfaz gráfica.
Hay dos programas:
cliente
servidor
El cliente se conecta al servidor. Es decir, se necesita una computadora que tiene algún servidor ssh corriendo - en mi caso, he usado openSSH pero hay más. Seguramente que se puede tener el cliente en la misma computadora que tiene el servidor pero aún estoy aprendiendo así que hagamos esto fácil y paso a paso.
Para los siguientes ejemplos tengo un servidor corriendo en [email protected]
ssh -L
Sirve para hacer un tunel en un puerto local hacia algun otro lugar via el servidor definido.
Al entrar yo (en cualquier browser) a http://localhost:9000 lo que voy a ver es lo que regresa el localhost de la computadora corriendo el openSSH (server de ssh) en el puerto 8888.
También podría apuntar a cualquier otro lugar del mundo (eg www.google.com:80) pero no logré un ejemplo que funcionara (me mandaban paginas 404 supongo que por error de configuración local a la petición via localhost).
ssh -R
Sirve para hacer un tunel a un puerto remoto de un puerto local, es decir, lo que se tenga en mi computadora (que por ahora es el cliente ssh) se va a ver en la computadora remota (la que tiene el server ssh y en el puerto definido).
Esta opción está rebuena para desarrollo en dos casos específicos (ambos casos necesitan que la computadora con el server ssh sea accesible via web):
acceso a desarrollo local desde otra computadora (como un cliente) - así se le puede mostrar a terceros lo que se está trabajando sin que estén en el mismo lugar físico.
accesso a desarrollo local desde mobile - así puedo probar cambios y nuevos features directamente en los dispositivos
ssh -D
La última por hoy, y una muy divertida: sirve para usar la computadora con el server ssh como proxy para las peticiones locales - hay que hacer una configuración más local, hay que decirle al OS o al browser o a curl (ver ejemplo abajo) que use socks5 proxy para los requests.
Esto está muy divertido ya que ahora tenemos una VPN (por ahora de emergencia, y siguiendo las recomendaciones que me han hecho, si quieres una VPN lo mejor que puedes hacer es pagar por una VPN).
Todo lo que ves a tu alrededor fue contruido por hombres.
Hace unos días me puse a hacer cálculos y resulta que en estas fechas este blog/web cumple 10 años de mi primer post. Quería hacer algo simbólico y encontrar el primer post y hacer algún tipo de restrospectiva o por lo menos referencia, pero no logré encontrarlo - lo más atrás que llegué fue a un post que había escrito de blood diamond, que podría ser el primero pero creo que escribí algo antes, en fin.
Y lo que sí me dieron ganas es de recuperar muchos de los posts que fui escribiendo y que en cambios de web dejé en el pasado… todo esto gracias a Wayback Machine de Archive.org: http://web.archive.org/.
Así que por los siguientes días voy a republicar/recuperar viejos contenidos (y con mucho gusto leerlos), me regresan a lo que estaba viviendo cuando los escribí y me recuerda que desde siempre tuve este tema en el blog de “Seguir aprendiendo” (antes era “Aprende por ti mismo”) - y también me hizo notar que antes tenía mucha participación, así que voy a ver como recuperar comentarios con este nuevo sistema y luego fomentar la conversación.
Saludos, Gorka
P.D. - de las cosas que ya estuve republicando está la serie de experimentos que había escrito, qué buenas ideas! jajaja
Managing software becomes central to the success of any businesses
Y que mejor que probar las diferentes herramientas posibles. En este caso me puse a jugar con dos herramientas para blogs/websites estáticos (Hugo y Jekyll),
¿Qué son los generadores de websites estáticos?
Un poco de contexto: las páginas web son basicamente html (y js y css pero para hacerlo fácil, no digamos nada de eso). Y los navegadores saben que el contenido que viene en html se enseña de diferentes maneras (tablas, parrafos, links, menus, etc.). Entonces si uno agarra un editor de texto y escribe html y guarda el archivo y lo abre con google chrome entonces se ve una página web - así lo más sencillo de lo sencillo. Genial y estático, es decir que para cambiar el contenido de esa página habría que abrir el archivo y modificarlo y luego guardarlo de vuelta y abrirlo con chrome.
Pero y cómo hago (o como se hacía antes de los spas y ajax) para que las páginas tuvieran contenidos dinámicos - momento cerebrito, contenido dinámico?
¿Qué son los contenidos dinamicos?
Si entras a una página web que tenga sistema de registro y te loggeas y en algún lugar en la página te dan la bienvenida por tu nombre (ej “Bienvenido Gorka”) bueno, ese nombre va a ser diferente para cada persona (que no tenga el mismo nombre no?), es decir, de manera dinámica se cambia el nombre de la persona que hace login.
Retomando, entonces para hacer eso, se usan lenguajes que funcionan en los servidores (de todos los sabores y colores que uno se pueda imaginar, y aqui es donde pueden llegar a sonar nombres como PHP, Node, Python, Java, Go, Ruby, Perl, etc.) que hacen eso mismo, cambian los contenidos de las páginas cada vez, y eso es, en sí, escribir el archivo html y mandarlo al navegador. Y pues aqui es donde se inicieron muchos sitemas de gestión de contenidos dinámicos (otros nombres como Wordpress, Joomla, Drupal, etc.).
Pero ese dinamismo viene con un costo, es decir, el tiempo que el servidor se toma para saber qué contenidos escribir (y hasta de dónde sacar los contenidos en sí). Así que para evitar caer en esos “costos” algunas personas decidieron desarrollar programas de gestión de contenidos que generan páginas estáticas. Esto viene con otros costos, pero como este blog post es super introductorio, eso lo explicaré en otra ocasión.
En fin, así que probando los sistemas, dejo mi opinión: prefiero Hugo - con todo y que este mismo blog usa Jekyll.
Voy a seguir usando ambos, y eventualmente haré posts de como instalar y usar cada uno.
Las ventajas de ambos: mis dos blogs (este y AquiGorka.net) van mucho más rápidos, y al estar ambos hosteados como contenidos estáticos también es mucho más barato.
Se me hizo medio largo el post de introducción, así que acá lo dejo por ahora.
La tecnología. La tecnología ha de ser invisible para los usuarios. No tienes por qué entregar una lata de refresco con un drone si puedes entregarla en mano previamente, porque lo que importa es que el usuario tiene sed, no que tú tengas un drone. Daniel Granatta
No sé si estoy de acuerdo. Tampoco creo que estoy en desacuerdo.
Lo que pienso en ambos casos es así (está mezclado):
Creo que ese tipo de propuestas harían que no hubiera innovación por el gusto de hacer innovación. Para qué se necesita el drone si se puede entregar el refresco en mano, si la necesidad es la sed del usuario - pero y la necesidad de saciar la sed en un lugar al que se puede acceder mucho más rápido vía drone?
En la ciudad entregar refrescos con drone es un claro overkill, pero en zonas austeras donde no hay acceso a tiendas en cada esquina, ahí tiene sentido.
Entonces, entregar refrescos en drones tiene sentido sólo cuando existe la necesidad? Ahí es donde digo que no estoy de acuerdo, el hecho que se puedan entregrar refrescos con drones abre las puertas a repensar muchos otros lugares/necesidades donde se puede aplicar ese overkill de tecnología - lugares donde no es un overkill y donde el status quo no hacía/dejaba ver que había una necesidad, un problema a mejorar; y el uso de drones en otro lado por efímero que parezca puede ser un disparador de innovación en otro.
Un par de ideas para empezar el post. Ahora a las nuevas herramientas:
Vim
tmux
shell (en realidad zsh)
Go (y por ahí encontré Crystal tmb pero no lo usé aún)
Docker/Vagrant
Vim
Es lo más divertido. Es un editor de texto al estilo línea de comando, dónde escribir es sólo un modo y en realidad, todo lo que haces lo haces por comandos - para todos ya es común usar CTRL+V y CTRL+C para copiar y pegar, bueno Vim es así para todo, hay comandos y combinaciones de teclas para cada cosa (y las que no existen se pueden crear).
Tiene un learning curve alto, pero te acostumbras y poco a poco lo usas para todo. Y lo divertido es que tiene plugins y una comunidad gigante haciendo mejoras constantemente. Hoy por hoy, mi editor of choice.
tmux
Trabajando con Vim ahora de repente me la vivía acomodando ventanas por todos lados y tuve que buscar un tile manager para hacer eso de manera rápida. Luego aprendí que con Vim puedo tener varios archivos abiertos y trabajar entre ellos, así sólo necesito 1 ventana abierta al máximo y hacía el splitting desde Vim. Kapow!, llegó tmux (y es gracioso, uso tmux en iTerm que puede ser un overkill pero hay lugares donde no tengo iTerm así que de esta manera es todo una sola forma). En fin, tmux: una solo programa tamaño máximo y ahí mismo múltiples sesiones, es algo como múltiples escritorios dentro de un solo programa.
Muy cómodo y fácil de usar, y también todo configurable - apenas estoy aprendiendo qué y cómo para ver como lo defino a mi gusto personal.
Zsh
Al estar usando Vim y tmux (y menos Sublime, Atom y Visual Studio) me encontré cada vez más trabajando con línea de comando, si bien ya instalaba y jugaba un poco con Zsh ahora empecé a configurar a mi gusto todo (desde alias, binarios propios, plugins e instalaciones automaticas). Y por supuesto Oh My Zsh - una comunidad de agregados super chulos para Zsh.
Los temas son muy cómodos y variados, y la idea es que con un dotfiles te puedes llevar esas configuraciones a todos lados facilmente (https://github.com/AquiGorka/dotfiles)
Go
Aprendí a programar en C y luego C++. Nunca más los volví a ver, nunca los usé y no creo usarlos (nunca digas nunca). Pero de repente me crucé con un lenguaje que te ofrece la potencia, fuerza y velocidad de C pero con una sintaxis y con interfaces más sencillas de usar: Golang.
No jugué aún con los channels pero parece que para hacer sistemas que corren en paralelo ya viene optmimziado - genial!
Lo que si hice ya, y sigo haciendo es usar Go para mis servers de api (https://github.com/AquiGorka/kickoff/game) y viniendo de Node, la verdad es que es muy fácil hacer esto.
Luego encontré Crystal, que sería el Go para los que vienen de Ruby (yo vengo de Node) y plantea la misma idea: La fuerza y poder de C pero con la sintaxis sencilla y limpia de Ruby - no niego que me da curiosidad, pero por ahora no lo voy a probar, solo lo mantengo en el radar.
Docker/Vagrant
Los casos de uso por los cuales ya estoy usando este tipo de programas (si es que los puedo llamar así, en realidad son virtualizaciones de software):
Ambiente de desarrollo uniforme
Simulación de ambientes de build
Simulación de ambientes de producción (este en realidad aún no lo uso pero ya sé que si lo voy a hacer)
Para el primero: no me hace falta instalar las herramientas y programas para desarrollar si ya vienen en una imagen - para que instalar node, ruby, go, php, mysql, mongo, etc, etc. si puedo tenerlo listo en un ambiente virtualizado donde simplemente monto/comparto los archivos de mi máquina y los trabajo con mi editor de costumbre y listo.
Tampoco es overkill isntalar esos otros programas de desarrollo en mi máquina, lo acepto PERO que pasa cuando tienes versiones que chocan entre lo que quieres y lo que tienes - ejemplo las mac vienen con ruby y gem pero no puedes usarlo para desarrollos propios y no lo vayas a modificar porque si lo jodes, kapow! te llevas el sistema. Cómo se resuelve esto? Con version managers, que PAJA - un version manager de ruby, otro de node, otro de npm, nel. Ambientes virtualizados con las versiones que necesito y punto.
Para el segundo: estuve aprendiendo a hacer un continuos delivery desde bitbucket a google cloud engine (futuro post y código en github). Y pues qué más fácil que bajar la imagen de la máquina de bitbucket que hace el test y build y delivery, correrlo local y cuando todo funcionaba mandar el script a bitbucket y confirmar que todo seguía ceteris paribus.
Para el tercero: cuando lo haga lo cuento.
Así que bueno, ahí está un resumen rápido (pero no corto) de las herramientas que vengo aprendiendo y usando ultimamente - me faltaron otras: jekyll, hugo y github pages pero esas las contaré en otro post.
La calidad de los equipos se puede medir por la calidad de sus conversaciones.
La frase de la imagen la encontré hace poco y me encantó. Me ayudó a entender algo que estaba ahí pero que no podía realmente ponerle palabras.
De forma sencilla veo como aplica a todos los niveles: desde startups hasta grandes empresas. En mi experiencia en empresas de diferentes tamaños esto lo he visto constantemente.
La empresa pequeña que tiene que pivotear y cambiar constantemente (a veces para satisfacer a los clientes, a veces el capricho del liderazgo y otras el capricho de los miembros del equipo) que al final no encuentra su modelo de negocio, tiene que desarrollar sistemas _flexibles _que no están para quedarse.
Las empresas medianas que encontraron el “sweet spot” (grupos de desarrollo con 5-6 devs, 1 project manager, 1 product owner y 1 diseñador/ux), son (en mi opinión) las que pueden encontrar más fácilmente las mejores estructuras dado que no dependen de estructuras burocráticas.
Y las empresas grandes, que tratan constantemente de convertirse en empresas agiles (y que pueden lograrlo porque al final del día apuntan a equipos tipo/tamaño sweet spot).
Y tiene sentido, al final del día, los sistemas que se diseñan son canales de comunicación y esos sistemas de comunicación son los mismos que usan las empresas para comunicarse internamente - open source y github se acaban de ganar una nueva capa.
Quiero decir, a través de herramientas de versión de control descentralizdas (git), repositorios públicos (github) y procesos de responsabilidad/ownership con code reviews hacen una muy buena estructura de comunicación asíncrona (que funciona y es ágil) y que se ve repetida en los sistemas/software que producen.
La cita la encontré cuando me cruce con esta maravilla: www.mosaic9.org que me llevó a esta presentación: https://www.youtube.com/watch?v=E0s3EGCefB0 - por ahora no voy a hablar de micro servicios en frontend, es un tema que merece un post en sí solo, pero es algo que vale la pena mucho.
"Returns zero on success, or FALSE on error." php::sleep (ahhh buenoooooo)
Y seguimos con el 2017 y nuevas aventuras - en realidad este post debía ser de Febrero así que me voy a apurar para hacer dos este mes.
Ahora viviendo en Barcelona! Con un nuevo proyecto trabajando para eDreams - ya iré contando qué tal.
Y por otro lado, con muchas ideas, conociendo nuevas personas muy divertidas y muy inteligentes, y, por supuesto siempre platicando y aprendiendo mucho.
Ya tengo proyecto personal para trabajar este año (aún no tiene nombre). Pero va a tener las siguientes características:
VR
MMO
RPG
Futbol (hell yeah! alguien se acuerda de super campeones?)
Real time
Y pido ayuda a la gente que lee este blog (hay quién lo hace?), se acuerdan de un juego de mesa de futbol donde los jugadores estaban fijos y tenían aros de metal alrededor de la cintura/parte baja y que la pelota al ser de metal se les acercaba y quedaba pegada. Luego la persona tenía que presionar el muñeco (se podían girar para dar dirección) para que “pateara” la pelota - algo así como Soccero.
Bueno, si alguien se acuerda me encantaría que me dejaran el nombre del juego en los comentarios (y un like?? medio youtuber eso no? jajaja).
Computer engineering is a discipline that integrates several fields of electrical engineering and computer science required to develop computer hardware and software. Computer Engineering @ Wikipedia
Estrenando título (hell yeah!) y contando que espero poder seguir hackeando y aprendiendo muchas cosas - además de tratar de volver a escribir más seguido.
He estado jugando con un iPod touch viejo que tengo. Mi idea es convertirlo en un _server mobile_, es decir, lo llevo conmigo abre una red wifi a la cual cualquiera se puede conectar y les mando los contenidos que yo quiera - desde publicidad, hasta juegos, servicios y otros. Ya tenía hasta un wordpress instalado pero preferí intentar con node (Javascript) y tengo una versión vieja instalada - ahora tengo que ver si le funciona socket.io (estaría muy divertido).
¿Dónde se podría usar? Escenarios o eventos de mala conectividad o conectividad limitada (aeropuertos? autobuses? adentro del avion? estadios de futbol? etc.).
También estoy jugando con un headset de mindwave! Charán! ¿Qué es eso? Un headset para brain control computing - otra vez, ¿qué? pues un dispositivo que lee las señales que genera la mente, espero poder lograr algo divertido por ahí también.