Hostingaldescubierto.com ha muerto

En septiempbre de 2007 creamos hostingaldescubierto.com un sitio donde poder colgar nuestras recetas para solucionar problemas relacionados con hosting y software de gestión de hosting: Plesk, que luego pasó a llamarse Parallels y ahora es conocido como Odin.
Son muchos años en los que fuimos dejando chuletas, parches, noticias, así como artículos de opinión de compañías del mundo del hosting.
Hostingaldescubierto, no fué muy relevante, pero seguíamos publicando información por puro placer divulgativo. Hoy ya es un site muerto, como tantos otros, la falta de tiempo, el cambio de trabajo, etc… ha concluído en el cierre de hostingaldescubierto, ya no tenía sentido mantener un site en que no se publicaba desde hacía tiempo y que apenas tenía visitas.
Para no perder muchas de las ‘recetas’ he importado los artículos a mi blog, para que al menos estén vivas en algún sitio.
Espero que sea útil para alguien, al igual que cuando comenzamos.

referencia git

Staging area git

Unlike the other systems, Git has something called the “staging area” or “index”. This is an intermediate area where commits can be formatted and reviewed before completing the commit.

One thing that sets Git apart from other tools is that it’s possible to quickly stage some of your files and commit them without committing all of the other modified files in your working directory or having to list them on the command line during the commit.

This allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as needed.

## agregar ficheros al staging
git add file

## agregar ficheros al staging
git commit -m"title" -m"description"

## agregar cambios al ultimo commit
git commit --amend -m"title" -m"description"

## deshacer commit, hash es el hash del commit al que quieres volver
git reset hash

# origins
# agregando un origen remoto, con convención ‘origin’ y ‘upstream’
git remote add origin http://rutaproject/project

# ver configuracion remota del origin
git remote show origin

#pull tirar, se trae cambios, push empuja sube cambios
#antes de hacer un push, hacer un pull
#para actualizar el contenido de mi rama
git pull origin master
o
git merge origin master
# con rebase intenta reordenar los commits de forma que no se pierda la historia
git merge --rebase origin master

#ahora ya podemos intercambiar codigo con otras ramas, voy a subir mi rama feature/new-feature
git push origin feature/new-feature

# stash, el cajón
# guardamos lo que hay en el staging pendiente de commitear en un cajón
git stats

# guardar notas para un stash
git stats save "explanation about this stash"

# ver los stash que hay
git stats list

# ver quét tiene un stash, ver stash #3
git stats show stash@{3}

## por defecto el reset, es –soft, te deja los cambios realizados en working directoy
git reset hash

## El modo –hard, elimia todo
git reset --hard hash

## deshacer el ultimo cambio, genera un commit nuevo con nombre “Revert: nombre del commit anterior”, una nueva entrada en la historia, aplicando los cambios necesarios para dejar el contenido tal y como estaba antes
git revert
## si no queremos que se genere un commit, podemos usar –no-commit y nos dejará los cambios en el staging
git revert --no-commit
## este commando requiere finarlo, y generará un nuevo commit
git revert --continue

## también se puede hace referencia a HEAD, y HEAD~1, HEAD~2 para indicar los pasos previos a HEAD

git reset HEAD
git reset HEAD~1
# Recuerda que si haces un reset HEAD, el HEAD se moverá al siguiente elemento, y los desplazamientos de ~1 o ~2 serán en base a ese estado
git reset HEAD~2

# comparar ficheros de diferentes ramas, compara somebranch con la rama actual
git diff somebranch path/to/your/file

# configurar herramienta para hacer diffing
git config diff.tool xxdiff

## rama actual
git branch

## crear rama desde la rama actual, todo tiene un origen
git checkout -b'feature/nombre'

## borrar rama
git -D branch

## renombrar rama
git -m branch newbranchname

# fusionar ramas
# debes posicionarte en la rama que va a recibir los cambios, con merge te traes los cambios a la rama actual
git merge feature/somethiing-new
# mezcla de ramas puede ser con fast forward que lo que hace es directamente cambiar el puntero HEAD a la rama que nos estamos trayendo, siempre que sea posible

“The –no-ff flag prevents git merge from executing a “fast-forward” if it detects that your current HEAD is an ancestor of the commit you’re trying to merge. A fast-forward is when, instead of constructing a merge commit, git just moves your branch pointer to point at the incoming commit. This commonly occurs when doing a git pull without any local changes.

However, occasionally you want to prevent this behavior from happening, typically because you want to maintain a specific branch topology (e.g. you’re merging in a topic branch and you want to ensure it looks that way when reading history). In order to do that, you can pass the –no-ff flag and git merge will always construct a merge instead of fast-forwarding.”

http://stackoverflow.com/questions/9069061/what-is-the-difference-between-git-merge-and-git-merge-no-ff/9069127#9069127

# etiquetas, tag
# nombra a un commit con un nombre para humanos
# para etiquetado ver http://semver.org/
# tagea el ultimo commit como v.1.0.1
git tag v1.0.1
# tagea un commit concreto
git tag v1.0.2 433fc3

# listar todos los tags
git tag

# eliminar tag
git tag -d tagname

## etiquetas anotadas
# etiquetas con mayor contenido de información agregado
# exigue que le indiques texto como si fuera un commit
git tag -a tagname

# puedes ver info del tag con git show, descripción y diffing
git show tagname

# otras ramas
## ver un fichero de la rama somebranch
git show somebranch path/to/your/file

# traerte un fichero de otra rama
git checkout somebranch path/to/your/file

# buscar a que branch pertenece un hash
git branch --contains ce1637f
# tambien se puede hacer con el reflog
git reflog show --all | grep ce1637f

# historial de cambios, muestra la historia verdadera de lo que ha pasado
git reflog

# ver las referencias de ramas remotas, en este caso busco un tag en concreto
git ls-remote origin --tags v1.5.0
a56956fc089c84482f0f457d1fa299142f8d6e42 refs/heads/release/v1.5.0

# ver ramas remotas con informacion extendida
git remote show origin

# http://stackoverflow.com/a/9074343
# git lg para mostrar un arbol con color de ramas y etiquetas
# ~./gitconfig

[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
[core]
excludesfile = /home/jorge/.gitignore_global

Prompt para bash para mostrar el branch actual

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ '

#git find file alias script
git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

#git grep through branches with no pagger
for branch in `git for-each-ref –format=”%(refname)” refs/heads`; do echo “[+] $branch :” ; GIT_PAGER=cat git grep ‘OfferType’ $branch; done

git hooks
https://github.com/brigade/overcommit#installation

# git avanzada
http://learngitbranching.js.org/?demo

quitar link preview de wordpress

Pues ahora wordpress te hace un bonito preview de los links que interpreta en el texto de tu post, queda muy bonito, pero a mí no me convence y para desactivarlo hay que instalar un pluguin 🙁 https://wordpress.org/plugins/disable-embeds/

historias de usuario, tareas, tdd, bdd, clean architecture

En estas últimas semanas me he dado cuenta lo importante que son las historias de usuario, definirlas bien para poder segmentar el trabajo. Esto me ha llevado a indagar más sobre cómo escribir, desgranar tareas y como comenzar con tests y finalmente con el código. He encontrado mucho material que me parece demasiado interesante como para perderlo, asi que lo pongo aquí :





http://codurance.com/2015/05/12/does-tdd-lead-to-good-design
http://coding-is-like-cooking.info/2013/04/outside-in-development-with-double-loop-tdd
http://blog.alexsimo.com/clean-architecture-traduccion
https://www.sitepoint.com/clean-code-architecture-and-test-driven-development-in-php
http://lisacrispin.com/2011/11/08/using-the-agile-testing-quadrants
https://testhuddle.com/resource/a-new-agile-testing-ecosystem
https://techblog.badoo.com/blog/2016/05/11/crazy-agile-api

vagrant no sync folder

En instalaciones ‘frescas’ con Debian me está ocurriendo que cuando creo un proyecto de Vagrant con una Debian 8 por defecto la carpeta /vagrant no se sincroniza correctamente.

vagrant init debian/jessie64

La verdad que es un chasco estar trabajando en una instalación y de repente ver que has perdido el contenido al reiniciar la máquina vagrant por que no te aseguraste que estaba sincronizando correctamente…

Vagrant usa 4 tipos disintos para sincronizar directorios, por defecto deja al propio vagrant que decida que quiere hacer y si no es capaz de usar el driver propio de Vagrant, usa rsync. En el caso de la instalación fresca de Debian, he encontrado que el problema está en un fichero de mi proyecto

./vagrant/machines/default/virtualbox/synced_folders
{"rsync":{"/vagrant":{"type":"rsync","guestpath":"/vagrant","hostpath":"/home/jorge/projects/vagrant/data","disabled":false,"owner":"vagrant","group":"vagrant"}}}

Como vemos aquí está forzando a usar rsync cuando yo no quiero, prefiero que use el propio driver de Debian. Así que directamente eliminando este fichero y reinciniando la máquina vagrant debería comenzar a sincronizar correctamente. Peeeeero no funciona, el fichero se vuelve a crear, así que tendremos que ir a la configuración principal, a ver que encontramos, vamos a ver que hay por ahí…

Si echamos un vistazo a ~/.vagrant vemos lo siguiente:

.
./data
./data/lock.dotlock.lock
./data/machine-index
./data/machine-index/index.lock
./data/machine-index/index
./data/fp-leases
./boxes
./boxes/debian-VAGRANTSLASH-jessie64
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/box.ovf
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/metadata.json
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/Vagrantfile
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/debian-jessie-disk1.vmdk
./boxes/debian-VAGRANTSLASH-jessie64/metadata_url
./tmp
./rgloader
./rgloader/loader.rb
./setup_version
./insecure_private_key
./gems
./gems/ruby
./gems/ruby/2.1.0

Y si curioseamos el fichero Vagarnt de jessie64 vemos esto :

# The contents below were provided by the Packer Vagrant post-processor

Vagrant.configure("2") do |config|
  config.vm.base_mac = "0800271EC67E"
end


# The contents below (if any) are custom contents provided by the
# Packer template during image build.
Vagrant.configure("2") do |config|
  config.vm.synced_folder \
    ".",
    "/vagrant",
    type: "rsync"
end

Vemos aquí que hay un preset para definir el tipo de sincronización a rsync, no tengo muy claro si es una configuración por defecto o se fuenza a que la imagen se configure así , por lo que tendríamos dos caminos o bien lo cambiamos en ./vagrant/machines/default/virtualbox/synced_folders de nuestro proyecto o cambiarlo  en ~/.vagrant/boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/Vagrantfile, que es lo que voy a probar, me cargo esta linea, reiniciamos

Vale ahora hay otro problema …. ( todo esto con una versión fresca de Debian )

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
mount: unknown filesystem type 'vboxsf'

Esto parece ser que es por que me faltan las ‘guest-utils‘ así que las instalo

$ sudo apt-get install virtualbox-guest-dkms
[sudo] password for jorge: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  lockfile-progs
Use 'apt-get autoremove' to remove it.
The following extra packages will be installed:
  libnotify-bin virtualbox-guest-utils virtualbox-guest-x11
The following NEW packages will be installed:
  libnotify-bin virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,939 kB of archives.
After this operation, 12.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://ftp.es.debian.org/debian/ jessie/main libnotify-bin amd64 0.7.6-2 [22.7 kB]
Get:2 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-utils amd64 4.3.36-dfsg-1+deb8u1 [387 kB]
Get:3 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-dkms all 4.3.36-dfsg-1+deb8u1 [498 kB]
Get:4 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-x11 amd64 4.3.36-dfsg-1+deb8u1 [1,030 kB]
Fetched 1,939 kB in 2s (756 kB/s)               
Selecting previously unselected package libnotify-bin.
(Reading database ... 170777 files and directories currently installed.)
Preparing to unpack .../libnotify-bin_0.7.6-2_amd64.deb ...
Unpacking libnotify-bin (0.7.6-2) ...
Selecting previously unselected package virtualbox-guest-utils.
Preparing to unpack .../virtualbox-guest-utils_4.3.36-dfsg-1+deb8u1_amd64.deb ...
Unpacking virtualbox-guest-utils (4.3.36-dfsg-1+deb8u1) ...
Selecting previously unselected package virtualbox-guest-dkms.
Preparing to unpack .../virtualbox-guest-dkms_4.3.36-dfsg-1+deb8u1_all.deb ...
Unpacking virtualbox-guest-dkms (4.3.36-dfsg-1+deb8u1) ...
Selecting previously unselected package virtualbox-guest-x11.
Preparing to unpack .../virtualbox-guest-x11_4.3.36-dfsg-1+deb8u1_amd64.deb ...
Unpacking virtualbox-guest-x11 (4.3.36-dfsg-1+deb8u1) ...
Processing triggers for man-db (2.7.0.2-5) ...
Processing triggers for systemd (215-17+deb8u4) ...
Setting up libnotify-bin (0.7.6-2) ...
Setting up virtualbox-guest-utils (4.3.36-dfsg-1+deb8u1) ...
Setting up virtualbox-guest-dkms (4.3.36-dfsg-1+deb8u1) ...
Loading new virtualbox-guest-4.3.36 DKMS files...
First Installation: checking all kernels...
Building only for 4.5.0
Building initial module for 4.5.0
Error! Bad return status for module build on kernel: 4.5.0 (x86_64)
Consult /var/lib/dkms/virtualbox-guest/4.3.36/build/make.log for more information.
Setting up virtualbox-guest-x11 (4.3.36-dfsg-1+deb8u1) ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Processing triggers for systemd (215-17+deb8u4) ...
Processing triggers for libc-bin (2.19-18+deb8u4) ...

 

Pero ahora tenemos otro problema… no compilan las guest-utils con mi kernel 4.5 … vamos a echar un vistazo

  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/vfsmod.o
  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/dirops.o
  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o
/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.c: In function ‘sf_get_link’:
/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.c:79:5: error: implicit declaration of function ‘VbglR0SfReadLink’ [-Werror=implicit-function-declaration]
     rc = VbglR0SfReadLink(&client_handle, &sf_g->map, sf_i->path, PATH_MAX, path);
     ^
cc1: some warnings being treated as errors
scripts/Makefile.build:258: recipe for target '/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o' failed
make[2]: *** [/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o] Error 1
scripts/Makefile.build:407: recipe for target '/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf' failed
make[1]: *** [/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf] Error 2
Makefile:1391: recipe for target '_module_/var/lib/dkms/virtualbox-guest/4.3.36/build' failed
make: *** [_module_/var/lib/dkms/virtualbox-guest/4.3.36/build] Error 2
make: Leaving directory '/usr/src/linux-headers-4.5.0'

Googleando un poco veo que es un bug reportado y tengo dos opciones o pasar de esta forma de sincronizar carpetas o bien bajarme una versión actual y parcheada de VirtualBox … me lo voy a pensar 😀

vagrant ansible sys.stdout.enconding is None

Estoy desplegando una máquina con vagrant y ansible en la que use vars_promt, mi intención es hacer una serie de preguntas previas al despliegue de una máquina y llevaba un buen rato pegándome con un error, concretamente este :

Traceback (most recent call last):
  File "/usr/bin/ansible-playbook", line 309, in 
    sys.exit(main(sys.argv[1:]))
  File "/usr/bin/ansible-playbook", line 249, in main
    pb.run()
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/__init__.py", line 305, in run
    play = Play(self, play_ds, play_basedir, vault_password=self.vault_password)
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/play.py", line 65, in __init__
    self.vars             = self._get_vars()
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/play.py", line 672, in _get_vars
    vname, private, prompt, encrypt, confirm, salt_size, salt, default
  File "/usr/lib/python2.7/dist-packages/ansible/callbacks.py", line 662, in on_vars_prompt
    result = prompt(msg, private)
  File "/usr/lib/python2.7/dist-packages/ansible/callbacks.py", line 648, in prompt
    msg = prompt.encode(sys.stdout.encoding)
TypeError: encode() argument 1 must be string, not None
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Leer el traceback de python al principio es un poco ruidoso, pero hay que leer detenidamente la traza y veremos claramente el problema. Yo al principio no lo he hecho y eso me ha llevado a dedicarle más tiempo 😀

Existe un problema documentado en ansible que genera este error cuando no es capaz de generar la codificación de salida, no se si es exactamente un bug de python2.x o es de ansible, por que en algunos casos recomiendan directamente migrar a python3 aunque ansible está desarrollado con python2.7.

Si queréis entreneros veréis que efectivamente sys.stdout.enconding devuelve None y de ahí la execepción que genera ansible.

Ahora bien,¿ como lo solucionamos ? forzando un tipo de codificacion con la variable de entorno PYTHONIOENCODING

export PYTHONIOENCODING='utf-8'

De esta manera ya podemos lanzar el provisionamiento de la máquina

vagrant provision

Esto está bien, pero no es práctico, ya que lo que queremos es olvidarnos de tener que hacer cosas manualmente, por eso automatizamos. Pues bien, hay una forma de agregar esto, y dejar nuestro Vagrantfile más o menos así:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "debian/jessie64"

  #Force sys.stdout.encoding to utf8
  ENV['PYTHONIOENCODING'] = "utf-8"

  config.vm.provision "ansible" do |ansible|
      ansible.verbose = "v"
      ansible.playbook = "ansible/playbook.yml"
  end

end

Evidentemente esto es un fichero muy sencillo, lo importante es declarar la variable de entorno

 

  ENV['PYTHONIOENCODING'] = "utf-8"

Este fallo está documentado en una issue de github https://github.com/ansible/ansible/issues/8644 aunque su resolución está prevista en una versión ‘mayor’ con lo que supongo que estará corregido en la rama 1.8.x mientras que en Debian stable estamos en la versión 1.7.2 a diciembre de 2015. Otra alternativa sería crear un virtual environment de python e instalar la versión que queramos, no lo he probado pero seguro que es posible.

 

 

h4ckademy: Nueve semanas para mejorar como programador y como persona

H4ckademy es una experiencia de nueve semanas en las que se mejoran las habilidades como desarrollador. Es una experiencia autoguiada, esto quiere decir que tú mismo te marcas tus objetivos, tus metas, el ritmo y el camino, siempre acompañado de Israel Gutierrez @gootyfer que se encarga de guiar, orientar y proveer del conocimiento que se demanda, y Monitca Quitana @moquintana en la parte de softkills.

Para mí ha supuesto un antes y un después en cuanto a mi visión como desarrollador, mi carrera profesional y mi vida personal. He tenido la suerte de compartir dos meses con gente maravillosa ( #creepy_coconuts ) y conocer a gente increible, tanto mentores ( Sergio, Enrique, Alex, Rubén, Javi…) como gente de otras ediciones, gente del Campus Madrid, meetups, etc…

Muchas gracias a Israel y a Mónica por arriesgarse y dar vida a h4ckademy, nuevos caminos que son el futuro.

Aquí os dejo un pequeño diario de lo que han sido mis nueve semanas, algunas cosas se me han pasado por alto y otras son notas personales sólo comprensibles para mí, pero creo que da idea, de qué es lo que han sido estos dos meses.

semana 1

primer dia

  • presentación
  • dinámicas de grupo sin hablar: colocarse en fila según gustos
  • speeddating personal
  • preparar pitch personal
  • presentación de proyectos
  • presentación personal

segundo dia

  • elegir proyecto: piston
  • conociendo slack
  • calendario compartido ( siempre estuvo ahí y nunca lo usé, imprescindible )
  • autodocumentarse para proyecto
  • conocer charles proxy
  • videos de scrapping bancario de Javier Cuevas @javier_dev https://vimeo.com/120834134

tercer dia:

  • entrevista con Jose de traity
  • seguir investigando en el proyecto
  • boceto js de peticiones a youtube
  • zap owasp como alternativa a charles

cuarto dia:

  • autobusqueda de info
  • qué es ember.js con @serabe
  • scrapping bancario
  • scraping con node

quinto dia :

  • revision de código

 

semana 2

dia1:

  • cambio de grupo a Autoconstrucción
  • revisión de trabajo
  • planificación de objetivos de la semana
  • instalacion de entorno virutal de python
  • mi primera pagina con flask
  • solucionar problemas con csrf
  • almacenar contenido en cookies
  • integrar con bootstrap
  • commits siempre en ingles

dia 2:

  • plantillas con jinja

dia 3 :

  • visita de Salva de la Puente ( @salvadelapuente ) para orientarnos sobre el proyecto
  • soft skills con Mónica. visión de los trabajos del futuro y eneagrama

dia 4:

  • como plantearse reunión de ux de un proyectos
  • reunión con el cliente ( Sergio )
  • editar registros con alchemy
  • vim a tope, comenzando mi vimrc desde cero ( https://github.com/jsenin/vimrc )

dia 5

  • mejorar flujos con git y pull request
  • crear ramas para hacer el pull request
  • jenkis para verificar la integridad
  • usar git amend para unir cambios a un commit
  • charla seo de Carlos

semana 3

dia1

  • revisión de proyectos, objetivos semanales
  • esquema de modelo de datos
  • escribir historias de usuario
  • http://jmbeas.es/category/User-Story-Kata/
  • http://www.genbetadev.com/metodologias-de-programacion/historias-de-usuario-una-forma-natural-de-analisis-funcional
  • http://www.javiergarzas.com/2012/05/descomponer-historias-de-usuario-en-tareas-2.html
  • http://icane.github.io/desarrollo-agil-sw/
  • introducción a microenconomia con Jesús

dia 2:

  • testing con unittest en modelo de datos (python)
  • testear solo el negocio: modelo
  • como funcionan los self.assertRaises( Excepcion, callback )
  • no es lo mismo poner en callback my_function que my_function(), ya que la segunda se ejecuta, pero la primera es solo el nombre del callback a ejecutar y eso nos ha dado dolores de cabeza
  • si tienes un if en un test, huele a caca, y si tienes dos más
  • tener un assert con cadenas de texto no está bien pero es un mal mejorable
  • vagrant como gestor de instalaciones y despliegues. wow
  • imagenes de debian en vagrant :
    • https://atlas.hashicorp.com/debian/boxes/jessie64 las imagenes están aqui
    • puedes lanzar un nuevo vagran con debian 8 :
      • vagrant init debian/jessie64
      • vagrant up
    • ha sido necesario configurar la red para poder acceder a la maquina
      • config.vm.network :private_network, ip: “192.168.33.10”
    • vagrant provision para provisionar con ansible o con el provisionador configurado. Ansible galaxy mola
  • ansible es fácil solo hay que ver las funcionalidades de cada paquete y dedicarle un ratito

 

dia 3 :

  • Mi charla de servidores que petan ( http://slides.com/jsenin/deck)
  • charla de openshift
  • charla js. cosas raras que hace js con Santiago
  • kata factorial, aprender a montar un proyecto con nvenv desde 0 y primeros tests con java

dia 4 :

  • reforma, missing toda la mañana
  • charla de intefaces en la comida con Alex Guerrero
  • maquetar con vim… también se puede usar el ratón pero eso no se dice 😀
  • reunión con Inviable
  • panel de doker, mola pero es ahora cuando están saliendo cosas que solucionan grandes problemas.

dia 5:

  • compeljidad ciclomática. número de caminos posibles https://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica
  • los test, lo primero es un test que funcione todo en set de datos validos
  • Charla James de tipografías
  • tipografia: Header serifa y san serif de texto, hay un contraste elegante
  • tipografia: buenas fuentes y libres: roboto y monserrat. Bajarse monserrat por que de google no están completas, falta ultraligth
  • crear contraste con peso de la fuente, siempre menos peso para tipografia más grande, así crea un balance de peso similar, más adecuado.
  • mejores fuentes roboto, y monserrat
  • htmlcolorcodes.com
  • Charla Isra de git y testing
  • git workspaces:
  • git workspace -> mi directorio
  • git init -> todo lo que he puesto con git add que va a formar parte del commit
  • git local repositoroy -> lo comiteado
  • git status -> diferencia entre workspace <-> index <-> local
  • git upstream -> flujo principal, ‘oficial’
  • git pull -> git fetch + git merge
  • git flow: rama master y rama develop
  • testing automaticos. codigo que comprueba que el codigo de produccion hace lo que tiene que hacer.
  • test, siempre el caso positivo primero.
  • test unitarios: con una unidad de trabajo compruebas una unica asumpcion. una funcion puede tener muchos tests.
  • test integracion: integran partes de sistema de extro a extremo
  • test de aceptacion: tests entendibles por el cliente, BDD
  • partes del test:
    • preparar el entorno
    • actuacion -> ejecutar l oque sea
    • asercion -> comprobar el resultado
  • testunitarios deben ser automatizados, no necesitan intervención.
  • deben ser repetibles, se debe de poder obtener los mismos resultados para los mismos casos.
  • faciles de implementar
  • se mantenien para uso futuro: documentacoin
  • rápidos: no tocan sistemas externos
  • FIRST : FAst, Isolate, Repetable, Self verifiyng Timely
  • Dobles de Prueba: Ver charla de xavi
  • Ciclo de test BDD ( aceptacion ) -> se divide en muchos TDD (unitarios ). El de aceptacion acretida de forma entendible que lo que se ha pedido funciona.
  • TDD : Primero los tests y luego el codigo
  • comenzar por el paso más simple
  • hacer pasos pequeños
  • cuando hay olores ‘duplicacion’, etc… refactoriza
  • definir un test unitario en el código: Dado… preparado, Cuando… actuacion, entonces… asercion

Semana 4

dia 1

fiesta

dia 2

  • expresiones regulares en python son asi r’^[69]\d{8}’  con r + ‘regex’
  • git rebase para reajustar la base de tu branch, no me queda muy claro  https://git-scm.com/book/es/v1/Ramificaciones-en-Git-Reorganizando-el-trabajo-realizado
  • https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
  • con wtf form.pupulate_obj(model) -> rellena el modelo con los datos del formulario
  • jinja apesta bastante

dia 3

  • NOSQL sobre Postgres http://www.postgresql.org/docs/9.1/static/hstore.html
  • leer sobre git rebase y ff fastfoward, reescribir la historia con git
  • visita a la obra de la Escuela Superior de Diseño + Inviable, conocimos a Santiago Cirugeda
  • cosas de la casa todo el día

dia 4

  • borrar una rama remota : git push origin –delete
  • pincho de networking de campus
  • visita a Idealista, los creadores de mundos
  • Idealista, la importacia de compartir conocimiento en la plantilla
  • Idealista, no tener ni idea de lo que hablan tus compañeros también es bueno, mentoring cruzado
  • Idealista, tienen vmware y oracle java, se mueven hacia hadoop,microservicios, etc…
  • hay que tener vida después de programar

dia 5

  • restrospectiva y code review
  • usar node, requiere usar la idea programacion functional, asincrona, etc… cambio de chip
  • mongodb en produccion son 3 servidores 🙁
  • travis esta bien para proyectos opensource 😀
  • alternativa es gitlab y gitlabs-ci https://about.gitlab.com/gitlab-ci/
  • reunión de MVP de autoconsturcción

 

dia 6: codretreat

  • Conocimos a la gente de OSOCO ( osoco.es )
  • test de genéricos a concretos
  • código de concreto a genérico
  • https://en.wikipedia.org/wiki/Transformation_Priority_Premise transformation premise
  • centrarse en las reglas de negocio para escribir tests, no escribir a lo loco
  • minimo cambio posible para que funcione
  • test -> verde -> refactor -> test rojo
  • Debates filosóficos acerca del craftmanship

Semana 5

dia 1:

  • como solucionar problemas con git

dia 2

  • seguir arreglando cosas con git
  • test dobles con Xavi Gost
  • mocks y spys son el mal, si hay que usar un mock… hay algo chungo
  • usar mac es de loosers by Xavi

dia 3

  • kata mars rovers, patron command
  • git reset no ha funcionado bien para eliminar fichero :W, como borrarlo de la historia, localizar y borrar
  • https://github.com/dylang/grunt-notify para enlazar con jasmine
  • speed vs velocity . Speed es numeral velocity no .
  • copiar y pegar , pasar tests y borrar lineas de codigo
  • switch -> smell -> refactor stateobject o functionmap ( direccionario de indices -> funcion )
  • la implementacion de la parte publica de un objeto tiene que leerse como pseudocodigo
  • el objetivo de la kata es ejercitar, no completar el problema
  • https://www.youtube.com/watch?v=saNHzjHwbsc
  • http://juandavidvega.es/2015/04/14/calistenia-de-objetos-object-calisthenics/ calistenia

dia 4

  • devdocs. Documentacion selectiva online y descargable http://devdocs.io/
  • documentacion de ruby http://ruby-doc.org/core-2.2.0/Array.html
  • aprende rails en pocos pasos http://curriculum.railsbridge.org/intro-to-rails/ruby_language
  • borrar fichero de git con :w -> git rm ‘\:w’
  • lista todos los ficheros de tu repo y branches
  • for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
      echo $branch :; git ls-tree -r --name-only $branch | grep 'w'
    donesheb
  • presentacion personal. Hablar a la gente en estructura de cuento con Materia Prima
  • identificar una idea fuerte principal (propuesta de valor). p ej. Hackademy es la mejor escuela de desarrolladores de madrid
  • git merge con dry : git merge –no-commit –no-ff master
  • ordenar la idea : cosas buenas que tiene, logros ,
  • hablar de objetivos, logros, futuro
  • resumen: qué es, el sentir y los objetivos
  • como organizar tu speech: Idea del yo profesional. se basa en idea principal -> ideas secundaria -> ideas de apoyo -> volver a la idea principal( llamada a la accion ) que espero que tu hagas
  • Idea -> desarollo -> conclusion -> con llamada a la acción
  • importante saber qué quieres decir con tu mensaje. Hay que informar de algo siempre en positivo

dia 5

  • bash reference https://www.gnu.org/software/bash/manual/bash.html#Redirections
  • programando en bash http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

 

SEMANA 6

dia 1

  • rebase para modificar cosas que han sucedido en un commit ya pasado aunque esté pusehado
2017  git rebase -i 20ad008
2018  git status
2020  vim server_app/autoconstruccion/web/views.py 
2021  ./test.sh 
2022  git status
2023  git add  server_app/autoconstruccion/web/views.py 
2024  git status
2025  git commit --amend 
2026  git rebase --continue
2027  git status
2028  git push origin calendar_popup --force

 

dia 2

  • nada destacable que contar
  • problemas con flask para validar un campo único
  • dinámicas de git para gestionar el proyecto

dia 3

  • Javi Aguirre con DDD ( https://github.com/javaguirre/h4ckademy-workshop )
  • http://javaguirre.github.io/h4ckademy-workshop/presentation/
  • Arquitectura EDA -> Event Driven Architecture
  • Tiempo real, debe consumirse lo más rápido real
  • Evento no debe depender de nada exterior -> objetos desacoplados
  • Arquitectura SOA -> Service Oriented Architecture
  • Encapsula funcionalidad
  • ansible-galaxy install -r requirements.txt
  • si quieres migrar de sistema de base de datos, pej mete varios listeners de mensajes postres y mysql y luego puedes tirar uno de estos y seguirá funcionando uno de los dos
  • go es un truño
  • nameko para microservicios , implementa colas y rpc por debajo de forma cómoda
  • todo tiende a microservicios
  • meter eventos en le controller
  • meter una capa adicional que absorva la capa de orm y de persistencia, y que además gestione los errores
  • http://vim.wikia.com/wiki/VimTip191
  • http://nvie.com/posts/how-i-boosted-my-vim/

dia 4

  • demo day
  • apretar el culo para que todo quede bonito

 

Semana 7

dia 1

  • petao post-codemotion
  • configurando rhc para desplegar aplicacion python en openshift. Hay que usar el env y hacer un restart de la app para que pille los cambios de la variable de entorno. No vale con configurar los action_hooks ni solo hacer el rhc env, sino que hay que hacer un rhc app-restart -n appname

dia 2

  • liado con el despliegue de madrid decide
  • ansible : templates para plantillas, files para scripts y vars para variables
  • copy en ansible copia ficheros de host a remote
  • charla de @serabe: lo que la cafeina le hizo a js, hablando de destructuring, y arrow functions
  • Jesús me ha enseñado las innecesidad de los puntos y comas en js, solo es necesario cuando la linea comienza en () o []
  • Con Agustín le doy los últimos toques a los scripts de postresql

dia 3

  • Terminado el projecto de madrid decide vagrant
  • http://vimawesome.com/
  • copiar al portapapeles del sistema : vmap “+y
  • flywire. @Rubocoptero, flujos de trabajo en su curro, muy interesante
  • javascript project de abonotransportes , probando jasmine con node, intentando hacer abstracción correctamente con Carlos, Jesus y Said, los tres enseñándome a programar con node.js

dia 4

  • nodejs y express
  • consejos de Alex Guerrero para programar con node
  • app pequeña no dividir hasta que no haga falta, todo en un repo
  • nvm para gestionar versiones de node
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
    nvm install 4.4.2
    nvm use 4.2.2

     

  • eslint : linter para js
  • user editorconfig en el ide
  • planificar la noche electoral con emoti y twitter
  • lo de los platanos ! con maki maki
  • apuntada presentacion de mongo de Isra http://www.slideshare.net/gootyfer/full-metal-mongo
  • Mientras tanto en la CAS … https://github.com/penguinjournals/ansible-101

dia 5

  • callbacks y más callbacks
  • standard como linter y formater de js
  • preparando la app de emoti para el debate
  • Preprando tests con jasmine, setup() de jasmmine con llamadas asyncronas y done()
  • el fs.readFile no funciona bien y hay que usar fs.reaFileSync

Semana 8

dia 1

  • Preparar proyecto para produccion,
  • mongo necesita indices para ejecutarse rápido
  • { [MongoError: too much data for sort() with no index.  add an index or specify a smaller limit]
  • use debate
    db.images.createIndex( { date: 1 } )

     

  • reparar bases de datos en mongo
    db.repairDatabase()

     

  • borrar collección de datos
    db.images.remove()
  • mongo se queda sin espacio y peta. Entender como gestiona mongo el espacio http://blog.mongolab.com/2014/01/how-big-is-your-mongodb/
  • proyecto emoticritico, un éxistazo y muy divertido

Dia 2

  • fiesta

Dia 3

  • Objetivos para fin de proyecto
  • Patrón repository con Said
  • Preparar máquina Vagrant con anaconda para taller de MachineLearning con Alvaro
  • preparar TarjetaTransportePublico Api de cero, con nvm, npm, y express
  • express generator te crea un proyecto api de cero en segundos.
  • crear modelos con mongo https://scotch.io/tutorials/using-mongoosejs-in-node-js-and-mongodb-applications
  • intentar arreglar los problemas de sync con virtualbox de alvaro y carlos se ha solucionado con esto https://github.com/mitchellh/vagrant/issues/3341
  • reordenando código js para el proyecto de Transportes de Madrid, separar proyecto express en controllers, models y hacer correctamente los exports.
  • buscando documentacion de como hacer test de rutas en js http://thejsguy.com/2015/01/12/jasmine-vs-mocha-chai-and-sinon.html
  • Mocha y supertest parece una buena opcion https://github.com/visionmedia/supertest , pero mocha es incompleto y depende de otras librerías/módulos para hacer BDD, jasmine lo trae casi todo y hay un jasmine-ajax para capturar peticiones ajax.

Dia 4

  • Aprendiendo sobre el patron repository y datamapper, abstraer la capa de acceso a datos , referencias
    • https://blog.8thlight.com/mike-ebert/2013/03/23/the-repository-pattern.html
    • http://mikeebert.tumblr.com/post/28530463266/the-repository-pattern-hooking-up-a-database
    • http://geekswithblogs.net/gyoung/archive/2006/05/03/77171.aspx
    • https://github.com/iainjmitchell/mongorepositiory
    • http://www.bradoncode.com/blog/2013/08/repository-vs-domain-model-vs-data.html
  • Visita a medialab Prado para el codingday de la app de consul
  • SoftSkils, emoticritico
  • H4cking Madrid ( Carlos :* )

Dia 5

  • revisar objetivos de proyecto, cosas sencillas y concretas
  • introducción a machine learning con David Vico

 

Semana 9

dia 1

  • mailnotifier para autoconstruccion

dia 2

  • mailnotifier para autoconstruccion
  • marca personal con Mónica:
    • estrategia: identificar el foco de la información y los demás medios para amplificar el mensaje
    • enlaces a todas las redes sociales desde la pagina principal ( nucleo )
    • Elegir ejes de contenidos, para publicar en los medios
    • ejercicio, centro de contenido de perfil profesional y lineas de contenido
    • titular profesional, importante. distintas denomianciones de la profesión actual. Usar palabras clave del serctor, utiliza todo el espacio. no usar palabradas demasiadas genericas.
    • extracto profesional, primera persona: Expresa quien eresy lo que quiers, utiliza las palabras del titular, sé tu mismo, utiliza todo el espacio disponible, mejor en primera persona. no dejar el espacio vacío. Debe responder a quien soy y qué quiero en este momento.

dia 3

  • revisión de proyecto
  • revisar pull requests
  • # listado de ficheros de un branch
    git ls-tree -r $branch_name
    

     

  • principios SOLID Y RASCA ( RCC ASS) http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
  • alembic como gestor de migraciones de modelo de datos
  • login-manager para flask

dia 4

  • cerrando pull requests
  • Como solucionar los conflictos de tu pull request cuando hay codigo aprobado que genera conflictos con el tuyo
  • # Si hay conflictos en tu pull request  
    # This branch has conflicts that must be resolved
    git pull --rebase upstream master
    #hacer un git add de las modificciones, sin commit
    git rebase --continue
    git push origin send_mail --force

     

dia 5

  • Cerrando bugs y subiendo mejoras hasta antes de la demo
  • demo final de cierre de h4ckademy
  • fiesta karaoke ! 😀

la he liado parda con el git: como borrar cosas que ya he comiteado

¿ Quien no ha hecho un commit de una cosa que no quería ? seguramente todos hemos comiteado algo que luego nos hemos dado cuenta que no tenía que ir y no lo hemos metido en .gitignore. A veces da un poco igual, depende de lo estrictos que seamos en nuestro equipo o nosotros mismos o bien por que estemos publicando el repositorio de forma pública. Con eliminar el fichero, volver a comitear y pushear… aquí no ha pasado nada :D… pero y si quiero borrar algo que no quiero… ¿ qué hago ?

En mi caso he metido un directorio con una compilacion de node via nodeenv[1] que son unos 200MB que no pintan nada en el repo y que además pesa, el objetivo es eliminar ese contenido de una forma limpia. Para ilustrarlo y que no se me olvide voy a documentar un ejemplo ilustrativo 😉

 

# creamos un repositorio nuevo de git llamado foo
git init project
cd project

# primer commit
echo "Hola mundo" > readme.txt
git add .
git commit -m"add readme file"

# segundo commit, aquí es donde nos colamos metiendo contenido
mkdir pictures
echo "vacaciones" > pictures/readme.txt
git add .
git commit -m"add new feature"

# hacemos como que no nos hemos dado cuenta y seguimos comiteando
echo "Nuevas caracteristicas" > CHANGES
git add . 
git commit -m"add changefile"

En este punto la hemos liado por que se nos ha colado el directorio de vacaciones en el proyecto y hacemos un facepalm, por que hemos metido la carpeta de pictures con cosas de las vacaciones en el proyecto y eso no lo queremos 😀

¿Ahora como solucionamos esta situación?

Lo que necesitamos es conservar el último cambio pero eliminar el directorio pictures del proyecto de forma que no quede almacenado en git. Para ello y siguiendo la documentación de git checkout[2] vamos a hacer lo siguiente:

  • volver al paso 2 dejando los cambios de 3 en el stage area
  • Crear una rama con los cambios de stage
  • mover el head del master al paso 1
  • mergear el master con la nueva rama

Explicamos los pasos:

Necesitamos trabajar con los ficheros de forma que no modifiquemos la rama master y nos creamos una rama para reparar que se llamará ‘fix-mess-up’ y la dejamos en el punto anterior a cuando la hemos liado, es decir hace dos commits.

# creamos una rama en la que trabajar la reparacion
git checkout -b fix-mess-up
# volvemos dos commits atrás y dejamos los cambios en el stage, de forma que podemos manejarlos, quitar, añadir, etc...
git reset --soft HEAD~2
# vemos lo que hay en el stash, pendiente de comitear
git status
# quitamos del stash la carpeta de pictures
git reset HEAD pictures/
# ahora tenemos el directorio pictures que tenemos que eliminarlo o meterlo en .gitignore
rm -fr pictures
# aplicamos los cambios en nuestra rama, esto debería ser el contenido correcto
git commit -m"fixed mess up"

Ahora que ya tenemos una rama buena, vamos a eliminar el contenido no deseado de master y echunfarle nuestra rama con la reparación.

# cambiamos a la rama master
git checkout master
# volvemos dos commits atrás y nos cargamos lo que haya con el hard!
git reset --hard HEAD~2
# mezclamos lo que tenemos en la rama fix-mess-up en el master
git merge fix-mess-up

Y en este momento ya lo tenemos reparado, solo falta borrar la rama de fix-mess-up que ya no la necesitamos.

#borrar la rama de la reparación que ya no es necesaria
git branch -d fix-mess-up

 

Nota:

Para que no se me olvide, en el momento en que se hacen checkouts o resets, se entra en modo deatached, con lo que el puntero de HEAD no está en el último commit y cada modificación que se haga a partir de ahí se mete en un branch virtual. Para no perder estos cambios hay que hacer o bien un branch o un tag tal y como se indica en la documentación de git checkout[2]

It is important to realize that at this point nothing refers to commit f. Eventually commit f (and by extension commit e) will be deleted by the routine Git garbage collection process, unless we create a reference before that happens. If we have not yet moved away from commit f, any of these will create a reference to it:

$ git checkout -b foo   (1)
$ git branch foo        (2)
$ git tag foo           (3)

 

[1] http://ekalinin.github.io/nodeenv/

[2] https://git-scm.com/docs/git-checkout#_detached_head

gnome no levanta después de login con ligthdm

Hoy hemos solucionado un problema que aunque es poco común es recurrente. Hay ocasiones en que al intentar acceder a nuestro equipo usando el login manager como en este caso ligthdm no es posible. Tras introducir la contraseña válida vemos como un flash de cambio de pantalla entre el login manager y lo que debería ser nuestro escritorio y nos devuelve al login manager.

En mi caso, esto me ha ocurrido un par de veces o tres a lo largo del tiempo y lo peor es empezar a buscar logs. El problema es que hay algo que no permite levantar nuestro entorno ya que la password es correcta, así que debe ser algo que ejecuta el servidor X con nuestro usuario o bien algo de gnome , en este caso.

Dejo aquí un checklist de cosas para testear:

  • arrancar en consola tty ( control + alt + f1 ) acceder con tu usuario
  • revisar el contenido del fichero .xsession-errors
  • parar nuestro login manager, por ejemplo ( /etc/init.d/lightdm stop ) y arrancar las X con startx. Comprobar si arranca y si hay errores
  • Revisar que el fichero  ~/.Xauthority tengo como propietario a tu usuario. Puede ocurrir que este fichero tenga como propietario a root y este sería el motivo por el que no arranca tu sesión. Elimínalo e intenta acceder a tu escritorio de nuevo.
  • revisar ficheros de log de sistema del servidor X /var/log/Xorg.0.log
  • revisar ficheros de log de login manager /var/log/lightdm/lightdm.log /var/log/lightdm/lightdm.log

 

En este caso el problema era el fichero .Xauthority que pertenecía a root, borrándolo y levantando las X de nuevo ha funcionado sin problemas.

 

 

Recomendaciones que te cambian la vida

Hay recomendaciones que te cambian la vida o más bien te la orientan. Además hay casualidades que hacen que las personas que te dan estas recomendaciones te las encuentres. En mi caso ha sido en el IRC en #php-es, así que gracias a David_Hernandez y a nesimo.

Estos enlaces para mí son fundamentales en este momento:

Además de estos libros

 

Cada vez que das a la comunidad, la comunidad te devuelve el doble 😀