<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>development on /var/blog/jasamitier</title><link>https://eckelon.net/es/categories/development/</link><description>/var/blog/jasamitier (development)</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 18 Feb 2017 15:40:24 +0600</lastBuildDate><atom:link href="https://eckelon.net/es/categories/development/index.xml" rel="self" type="application/rss+xml"/><item><title>Capturando URLs mediante expresiones regulares fáciles</title><link>https://eckelon.net/es/blog/2017-02-18-capturando-patrones-url-con-expresiones-regulares/</link><pubDate>Sat, 18 Feb 2017 15:40:24 +0600</pubDate><guid>https://eckelon.net/es/blog/2017-02-18-capturando-patrones-url-con-expresiones-regulares/</guid><description>&lt;p>Esta semana, hemos migrado un proyecto bastante grande a &lt;em>https&lt;/em>. Es un proyecto implantado en varios países, de modo que tenemos que gestionar bastantes traducciones. En esta entrada me gustaría contar la forma que se me ocurrió para modificar todas las URLs contenidas en los textos de las traducciones para cambiarles el &lt;em>http&lt;/em> por el &lt;em>https&lt;/em>. Normalmente, con redirigir las peticiones &lt;em>http&lt;/em> a &lt;em>https&lt;/em> bastaría, pero como en muchas páginas y comunicaciones para los usuarios se pintan estas urls con el protocolo, necesitábamos cambiarlo ahí también.&lt;/p>
&lt;p>Esta es la forma que yo ideé, pero no significa que sea la mejor. Mis conocimientos sobre expresiones regulares son todavía muy limitados y seguramente esto se pueda hacer en un sólo paso y de una forma mejor. Si estás leyendo esto y se te ocurre, no dudes en comentármelo.&lt;/p>
&lt;p>Primero tenemos que capturar únicamente las URLs que nos interesan, de modo que tendremos que contrastar el texto de la traducción contra la siguiente expresión:&lt;/p>
&lt;p>&lt;code>(http://)(www\.)?(proyecto1\.|proyecto2\.).\S+&lt;/code>&lt;/p>
&lt;p>El significado de cada grupo es:&lt;/p>
&lt;ul>
&lt;li>&lt;code>(http://)&lt;/code>: que empiece por &amp;lsquo;http://&amp;rsquo;&lt;/li>
&lt;li>&lt;code>(www\.)?&lt;/code>: a continuación puede seguir o no por &amp;lsquo;www.&amp;rsquo;. El &lt;code>?&lt;/code> hace que el grupo a su izquierda sea opcional.&lt;/li>
&lt;li>&lt;code>(proyecto1\.|proyecto2\.)&lt;/code>: el nombre de dominio, independientemente de su extensión debe ser &amp;lsquo;proyecto1&amp;rsquo; o &amp;lsquo;proyecto2&amp;rsquo;&lt;/li>
&lt;li>&lt;code>.\S+&lt;/code>: Se dejará de capturar la coincidencia en cuanto haya un espacio&lt;/li>
&lt;/ul>
&lt;p>De modo que, de la siguiente lista, nos capturará únicamente lo que está en negrita:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="http://www.proyecto1.com">http://www.proyecto1.com&lt;/a>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://www.proyecto2.pt/prueba">http://www.proyecto2.pt/prueba&lt;/a>&lt;/strong> esto es una prueba&lt;/li>
&lt;li>&lt;a href="http://www.proyecto3.hk">http://www.proyecto3.hk&lt;/a>&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://proyecto1.fr/hola">http://proyecto1.fr/hola&lt;/a>&lt;/strong> que tal&lt;/li>
&lt;li>&lt;a href="http://www.proyecto3.im">http://www.proyecto3.im&lt;/a>&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://proyecto2.it/">http://proyecto2.it/&lt;/a>&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Ya tendríamos todas las URLs completas que coinciden con nuestro patrón, pero aquí me encontré un problema: no todos los sites tenían que tener https. Esa información la tengo para cada site en base de datos y cacheada en disco. Entonces lo siguiente que tuve que hacer fue buscar por URL en la base de datos para ver si cambiaba a https esa url o no. Para esto comparé las URLs resultantes de la expresión regular anterior, con esta:&lt;/p>
&lt;p>&lt;code>(http://)(www\.)?(proyecto1\.|proyecto2\.).*(?=\/)&lt;/code>&lt;/p>
&lt;p>&lt;code>.*(?=\/)&lt;/code>: hace que siga desde el grupo anterior hasta el final pero se pare justo antes de la &amp;lsquo;/&amp;rsquo;. Para usar esto nos tendremos que asegurar que todas nuestras coincidencias anteriores terminen así.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="http://www.proyecto1.com">http://www.proyecto1.com&lt;/a>&lt;/strong>/&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://www.proyecto2.pt">http://www.proyecto2.pt&lt;/a>&lt;/strong>/prueba esto es una prueba&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://proyecto1.fr">http://proyecto1.fr&lt;/a>&lt;/strong>/hola que tal&lt;/li>
&lt;li>&lt;strong>&lt;a href="http://proyecto2.it">http://proyecto2.it&lt;/a>&lt;/strong>/&lt;/li>
&lt;/ul>
&lt;p>Estos ya son los resultados que yo necesitaba para cambiar dinámicamente el texto de las traducciones y que se pinten con el protocolo correcto en el html.&lt;/p>
&lt;p>Más que un &lt;em>how to&lt;/em>, mi intención con esta entrada es hacer ver que las expresiones regulares no son tan complicadas. Hace un par de meses no tenía ni idea, pero haciendo probatinas en el buscador de mi editor, fui aprendiendo bastantes cosas.&lt;/p></description></item><item><title>Algunos trucos git en la terminal</title><link>https://eckelon.net/es/blog/2017-01-25-algunos-trucos-git-terminal/</link><pubDate>Wed, 25 Jan 2017 15:40:24 +0600</pubDate><guid>https://eckelon.net/es/blog/2017-01-25-algunos-trucos-git-terminal/</guid><description>&lt;p>El otro día enseñé a &lt;a href="http://jorgeatgu.com">Jorge&lt;/a> un par de funciones de mi &lt;a href="https://github.com/eckelon/dotfiles/blob/master/zshrc">&lt;code>.zshrc&lt;/code>&lt;/a> que me facilitan la vida gestionando repositorios git desde la terminal y le gustaron bastante. He pensado que igual también resultan interesantes por aquí.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cómo generar un &lt;code>.gitignore&lt;/code> automáticamente&lt;/strong>&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>function gi() {
curl -L -s https://www.gitignore.io/api/$@ &amp;gt;&amp;gt; .gitignore;
}
&lt;/code>&lt;/pre>&lt;p>de esta forma se puede ejecutar &lt;code>gi vagrant java intelliJ&lt;/code> para descargar el .gitignore resultado de esa búsqueda en &lt;a href="http://gitignore.io">Gitignore.io&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cómo listar todos los repositorios (con sus respectivas ramas actuales) presentes en un directorio&lt;/strong>&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>
function gls() {
for d in *; do
if [[ -d &amp;quot;$d&amp;quot; &amp;amp;&amp;amp; -e &amp;quot;$d/.git&amp;quot; ]]; then
echo &amp;quot;$d -&amp;gt; $(cd &amp;quot;$d&amp;quot; &amp;amp;&amp;amp; git_prompt_info | sed 's/%//g;s/{//g;s/}//g')&amp;quot;
fi
done
}
&lt;/code>&lt;/pre>&lt;p>En uno de los proyectos en los que me encuentro tenemos que trabajar con varios módulos, cada uno de los cuales está en un repositorio git distonto. Muchas veces necesitaba poder saber de un vistazo en qué rama estaba cada uno de estos módulos. Se ve así:&lt;/p>
&lt;pre>&lt;code>~/.vim/plugged
▶ gls
YouCompleteMe -&amp;gt; master ✔
csapprox -&amp;gt; master ✔
ctrlp.vim -&amp;gt; master ✔
ferret -&amp;gt; master ✔
goyo.vim -&amp;gt; master ✔
jshint.vim -&amp;gt; master ✗
nerdcommenter -&amp;gt; master ✔
nerdtree -&amp;gt; master ✔
plaintasks.vim -&amp;gt; master ✗
tagbar -&amp;gt; master ✔
vim-airline -&amp;gt; master ✔
vim-airline-themes -&amp;gt; master ✔
vim-colorschemes -&amp;gt; master ✔
vim-fugitive -&amp;gt; master ✔
vim-gitgutter -&amp;gt; master ✔
vim-hybrid-material -&amp;gt; master ✔
vim-javascript -&amp;gt; master ✔
vim-jsx -&amp;gt; master ✔
vim-sensible -&amp;gt; master ✔
vim-strip-trailing-whitespaces -&amp;gt; master ✔
&lt;/code>&lt;/pre>&lt;p>Requisito: la función &lt;code>git_prompt_info&lt;/code> del &lt;a href="https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh">plugin git&lt;/a> de ohmyzsh&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cómo hacer &lt;code>git pull&lt;/code> a sus ramas actuales en todos los repositorios dentro de un directorio&lt;/strong>&lt;/li>
&lt;/ul>
&lt;pre>&lt;code>function gupd() {
current_directory=$PWD
for d in *; do
if [[ -d &amp;quot;$d&amp;quot; &amp;amp;&amp;amp; -e &amp;quot;$d/.git&amp;quot; ]]; then
cd $d
echo &amp;quot;$d -&amp;gt; $(git_prompt_info | sed 's/%//g;s/{//g;s/}//g')&amp;quot;
git fetch
git pull origin $(git_current_branch)
cd $current_directory
fi
done
}
&lt;/code>&lt;/pre>&lt;p>Por lo mismo que he contado en el punto anterior, a veces necesito bajarme los cambios de unos cuantos repositorios, para lo cual esta función me resulta muy cómoda. Además de listar los repositorios, también los actualiza. Evidentemente para poder hacer esto no puedo tener cambios sin commitear en ninguno de los repositorios.&lt;/p>
&lt;p>Requisito: las funciones &lt;code>git_current_branch&lt;/code> y &lt;code>git_prompt_info&lt;/code> del &lt;a href="https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/git.plugin.zsh">plugin git&lt;/a> de ohmyzsh&lt;/p>
&lt;p>Estoy seguro de que puede hacerse mejor, por lo que cualquier comentario o idea será bien recibida :)&lt;/p></description></item><item><title>Cómo uso la terminal</title><link>https://eckelon.net/es/blog/como-uso-la-terminal/</link><pubDate>Sat, 21 Jan 2017 23:00:00 +0000</pubDate><guid>https://eckelon.net/es/blog/como-uso-la-terminal/</guid><description>&lt;p>En el trabajo, las dos aplicaciones en las que más centro mi atención son la terminal, donde hago cosas, y el navegador, donde las pruebo. No me gusta usas demasiadas aplicaciones porque eso me supone tener que aprender configuraciones y formas de trabajar que realmente no aportan demasiado. Además, como en el trabajo uso Mac OS y en casa Ubuntu, es un lío tener que usar distintas aplicaciones para lo mismo solo porque no estén en un sistema operativo u otro. En esta entrada me gustaría describir cómo y por qué uso la terminal.&lt;/p>
&lt;p>Primero decir que las dos máquinas donde trabajo son:&lt;/p>
&lt;ul>
&lt;li>Mountain Nickel 13&amp;quot;, corriendo Ubuntu 16.04 &amp;ldquo;Xenial Xerus&amp;rdquo;, mi portátil personal.&lt;/li>
&lt;li>MacBook Pro 13&amp;quot; Retina (2015) corriendo Mac OS 10.11 &amp;ldquo;El Capitán&amp;rdquo;, mi portátil &lt;em>corporativo&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Ambas máquinas disponen de terminales &lt;em>*nix&lt;/em>, que desde mi punto de vista es la terminal ideal para un desarrollador. A partir de aquí, intento que el funcionamiento de ambas terminales (y todo el software que corro en ellas) sea lo más similar posible. Además de las herramientas que proporcionan &lt;em>out of the box&lt;/em>, yo también incluyo:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.zsh.org">Zsh&lt;/a>: shell alternativa a bash que tiene algunos detalles muy útiles para los que usamos mucho la terminal. En la presentación &lt;a href="http://es.slideshare.net/jaguardesignstudio/why-zsh-is-cooler-than-your-shell-16194692">Why Zsh is Cooler than your Shell&lt;/a> se pueden ver alguna de estas ventajas.&lt;/li>
&lt;li>&lt;a href="http://ohmyz.sh">Oh My ZSH&lt;/a>: conjunto de configuraciones y plugins construidas alrededor de zsh. Es algo pesada, pero aporta configuraciones muy convenientes con solo un par de clicks.&lt;/li>
&lt;li>&lt;a href="http://vim.org">Vim&lt;/a>: Editor de texto &lt;em>extremadamente&lt;/em> configurable y eficiente. Lo uso para &lt;del>todo&lt;/del> casi todo (vale, para proyectos Java empleo &lt;a href="https://www.jetbrains.com/idea">IntelliJ IDEA&lt;/a>).&lt;/li>
&lt;li>&lt;a href="https://tmux.github.io">Tmux&lt;/a>: Multiplexador de la terminal que además permite crear sesiones accesibles por ssh. Es ideal para hacer &lt;em>pair programming&lt;/em>.&lt;/li>
&lt;li>&lt;a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher&lt;/a>: Una herramienta para buscar texto alternativa a &lt;em>grep&lt;/em>. Es &lt;a href="http://geoff.greer.fm/ag/speed/">muy muy muy&lt;/a> rápida y sencilla de utilizar. La empleo para buscar y reemplazar código de forma masiva. Un &lt;em>must&lt;/em> clarísimo.&lt;/li>
&lt;li>&lt;a href="https://git-scm.com">Git&lt;/a>: El sistema de control de versiones distribuído que uso para todos los proyectos, tanto profesionales como personales. Además de eficiente, también tiene un &lt;em>cli&lt;/em> que permite hacer todo en la terminal fácilmente. Dejo por aquí la &lt;a href="https://github.com/eckelon/dotfiles/blob/master/gitconfig">configuración que uso normalmente&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Estas son las herramientas que yo añado, pero uso muchas otras que me provee el sistema, algunas de ellas:&lt;/p>
&lt;ul>
&lt;li>&lt;code>tail&lt;/code>&lt;/li>
&lt;li>&lt;code>find&lt;/code>&lt;/li>
&lt;li>&lt;code>grep&lt;/code>&lt;/li>
&lt;li>&lt;code>sed&lt;/code>&lt;/li>
&lt;li>&lt;code>curl&lt;/code>&lt;/li>
&lt;li>&lt;code>ssh&lt;/code>&lt;/li>
&lt;li>&lt;code>top&lt;/code>&lt;/li>
&lt;li>&lt;code>ps&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Creo que no me dejo nada.&lt;/p>
&lt;p>&lt;a href="http://nestorsalceda.com">Nestor&lt;/a> suele decir que él no usa un IDE, porque unix es su IDE. Un entorno de desarrollo integrado es una aplicación que agrupa un montón de herramientas (de búsqueda, refactoring, edicion de texto, linters&amp;hellip;) que usar conjuntamente para desarrollar software. Unix provee muchas herramientas que si se saben usar a la vez, hacen que no necesites un IDE concreto. Por ejemplo, así es como reemplazo texto masivamente, sin usar el &lt;em>reemplazar&lt;/em> de ningún IDE.&lt;/p>
&lt;pre>&lt;code>ag miVar ~/Development/miProyecto/ -l | xargs sed -i 's/miVar/miNuevaVar/g'
&lt;/code>&lt;/pre>
&lt;p>Con &lt;code>ag -l&lt;/code> listo todos los ficheros donde encuentro la ocurrencia buscada. Con &lt;code>xargs&lt;/code>, le paso este listado a &lt;code>sed&lt;/code>, el editor de texto en memoria de unix, al que también le paso la orden de reemplazar la ocurrencia por la nueva palabra a todo el fichero. Lo que gano con esto es:&lt;/p>
&lt;ul>
&lt;li>Trabajar en una sola herramienta, la terminal.&lt;/li>
&lt;li>Mantener una &lt;a href="https://github.com/eckelon/dotfiles">configuración sencilla de mantener&lt;/a>.&lt;/li>
&lt;li>Tener una forma de trabajo portable en cualquier momento a otra máquina.&lt;/li>
&lt;/ul></description></item><item><title>Docker en proyectos Java (I). Cómo desplegar una aplicación Java en tomcat usando Docker</title><link>https://eckelon.net/es/blog/docker-en-proyectos-java-i.como-desplegar-una-aplicacion-java-en-tomcat-usando-docker/</link><pubDate>Sat, 14 Jan 2017 23:00:00 +0000</pubDate><guid>https://eckelon.net/es/blog/docker-en-proyectos-java-i.como-desplegar-una-aplicacion-java-en-tomcat-usando-docker/</guid><description>&lt;p>De todas las cosas que aprendí en 2016, la que más ha cambiado mi día a día ha sido Docker y, sobretodo, la capacidad orquestación con Docker Compose. La orquestación de máquinas es algo que ya me llamó la atención durante mi paso por [Senpai Devs](&lt;a href="http://senpaidevs.com">http://senpaidevs.com&lt;/a>), cuando [Néstor](&lt;a href="http://nestorsalceda.com">http://nestorsalceda.com&lt;/a>) nos enseñaba las &lt;em>virguerías&lt;/em> que era capaz de hacer para montar diferentes entornos. Esta pretende ser la primera de las entradas sobre cómo monté mi entorno de desarrollo (Java EE + Elastic + Apache + tomcat + SQL Server) completamente sobre Docker. Empezaremos por tomcat.&lt;/p>
&lt;p>[Apache tomcat](&lt;a href="http://tomcat.apache.org">http://tomcat.apache.org&lt;/a>) es el contenedor de &lt;em>servlets&lt;/em> mas común a la hora de desplegar aplicaciones Java. Es ligero, no demasiado complejo de configurar y está delante de una comunidad enorme de desarrolladores. Además es software libre, lo cual también es importante.&lt;/p>
&lt;p>Antes de empezar la fiesta, hay que tener claro que no estamos levantando máquinas, sino aplicaciones. Si necesitamos levantar 3 aplicaciones java, entonces levantaremos tres tomcats, cada uno en su propio contenedor, con su propia configuración etc. Si una aplicación falla, paramos &lt;strong>esa&lt;/strong> aplicación, dejando las demás funcionando. Es por esto que vamos a usar Docker Compose. Para una sola aplicación no sería necesario, ya que con un `docker run` podríamos tenerla levantada con un comando, pero la idea de esta serie de entradas es mostrar cómo levanto todo mi entorno de desarrollo, para lo cual si es necesaria la orquestación.&lt;/p>
&lt;p>Esto es lo que vamos a hacer:&lt;/p>
&lt;p>- Crear un fichero de orquestación (`docker-compose.yml`) en el que estableceremos las aplicaciones que vamos a levantar (en este caso solo una llamada &lt;strong>portal&lt;/strong>) y también cómo se construye esa aplicación (en este caso haremos que la construya con el fichero `Dockerfile` dentro del directorio `tomcat`).&lt;/p>
&lt;p>- Asociar los puertos del contenedor con los de nuestra máquina. El puerto 8080, el de aplicación, lo asociaremos al 3000, y el puerto 8000, el que usaremos para poder debuggar la ejecución del tomcat, lo asociaremos al 4000.&lt;/p>
&lt;p>- Establecer variables de entorno de nuestra aplicación: Le diremos que use 2Gb de ram.&lt;/p>
&lt;p>Además, configuraremos el tomcat para que:&lt;/p>
&lt;p>- Utilice la imagen [tomcat:7.0.73-jre7-alpine](&lt;a href="https://github.com/docker-library/tomcat/blob/1651e929e7d4c9785b602cb93cdd2503573c3834/7/jre7-alpine/Dockerfile">https://github.com/docker-library/tomcat/blob/1651e929e7d4c9785b602cb93cdd2503573c3834/7/jre7-alpine/Dockerfile&lt;/a>)&lt;/p>
&lt;p>- Abra puerto de debug en el 8000&lt;/p>
&lt;p>- Lea la configuración de la carpeta `conf` dentro del directorio `tomcat`&lt;/p>
&lt;p>Necesitamos un fichero `docker-compose.yml` que contenga lo siguiente:&lt;/p>
&lt;p>```&lt;/p>
&lt;p>version: &amp;lsquo;2&amp;rsquo;&lt;/p>
&lt;p>services:&lt;/p>
&lt;p>portal:&lt;/p>
&lt;pre>&lt;code>build: tomcat/.
volumes:
- ./tomcat/conf:/usr/local/tomcat/conf
- ./webapps_portal:/usr/local/tomcat/webapps
environment:
- 'JAVA_OPTS=-Xmx2g'
ports:
- 4000:8000
- 3000:8080
&lt;/code>&lt;/pre>
&lt;p>```&lt;/p>
&lt;p>Además necesitaremos un directorio `tomcat` con el siguiente fichero:&lt;/p>
&lt;p>- `Dockerfile`:&lt;/p>
&lt;p>```&lt;/p>
&lt;p>FROM tomcat:7.0.73-jre7-alpine&lt;/p>
&lt;p>ENV JPDA_ADDRESS=8000&lt;/p>
&lt;p>ENV JPDA_TRANSPORT=dt_socket&lt;/p>
&lt;p>VOLUME [&amp;quot;/usr/local/tomcat/conf&amp;quot;]&lt;/p>
&lt;p>VOLUME [&amp;quot;/usr/local/tomcat/webapps&amp;quot;]&lt;/p>
&lt;p>EXPOSE 8009&lt;/p>
&lt;p>EXPOSE 8000&lt;/p>
&lt;p>CMD [&amp;ldquo;catalina.sh&amp;rdquo;, &amp;ldquo;jpda&amp;rdquo;, &amp;ldquo;run&amp;rdquo;]&lt;/p>
&lt;p>```&lt;/p>
&lt;p>y el directorio `conf` del tomcat, donde podremos modificar la configuración del tomcat (context, logging&amp;hellip;). Además, en el directorio principal necesitaremos también el directorio `webapps_portal`, donde dejaremos el war que desplegará el tomcat.&lt;/p>
&lt;p>La estructura queda así:&lt;/p>
&lt;p>```&lt;/p>
&lt;p>.&lt;/p>
&lt;p>├── docker_compose.yml&lt;/p>
&lt;p>├── tomcat&lt;/p>
&lt;p>│ ├── Dockerfile&lt;/p>
&lt;p>│ └── conf&lt;/p>
&lt;p>└── webapps_portal&lt;/p>
&lt;p>```&lt;/p>
&lt;p>Ahora solo nos queda levantarlo con `docker-compose up &amp;ndash;build -d` (El `&amp;ndash;build` solo lo necesitaremos la primera vez que lo levantemos, o cuando hagamos cambios en la configuración).&lt;/p>
&lt;p>En la siguiente entrada veremos cómo meterle un apache por delante para poder decidir qué peticiones del apache van al tomcat y cuáles no.&lt;/p></description></item></channel></rss>