Domotiza tu casa – 2a temporada

Después de mucho tiempo inactivo, vuelvo a la carga con las domotizaciones domésticas. En este tiempo que ha pasado, ha habido una gran popularización de Arduinos y Raspberries, hay muchísima más información y accesorios, por lo que el alcance de lo que podemos hacer es mucho mayor.

Entre las novedades de temas a tratar tocaré varios ámbitos que agruparan diversos temas mencionados anteriormente en este blog.

  • Domotización de jardín
    • Riego automático
    • Dosificadores automáticos de fertilizantes y otros productos
  • Control y generación de energía
    • Control de consumo eléctrico
    • ¿Instalación fotovoltaica? (depende de lo que pase con el impuesto al sol…)
  • Maxificación del uso de recursos
    • Recolección de aguas pluviales
    • Generación eléctrica
    • Compost
    • Podas

¿Alguna sugerencia? Algo más que pueda ser interesante?

¡Hasta pronto!

Workflows Git – Muy resumido – Parte 3: Gitflow Workflow

Este modelo de flujo de trabajo está orientado a gestionar proyectos más grandes que los anteriores. No añade características al anterior flujo de trabajo, en cambio añade roles a las ramas.

En vez de una simple rama maestra, se usan dos ramas para almacenar la historia del proyecto. La rama maestra almacena las versiones oficiales donde se etiquetan los commits con los números de versión, y la rama de desarrollo sirve de integración de las ramas de características.

Ramas de release: Una vez que la rama de desarrollo tiene suficientes características para una release, se hace un fork de la rama de desarollo, en la que ya no se podrán añadir mas características (solo solventar errores). De esta rama finalmente saldrá la nueva versión que subiremos a master branch etiquetada con el número de versión.

Ramas de mantenimiento: si se detecta un error en el entorno de producción (master), de hace una rama de mantenimiento directamente del master. Una vez completado el arreglo, se hace un merge con master y con desarrollo. Master ha de ser etiquetado con un nuevo número de versión.

Ejemplo crear rama de desarrollo:

git branch develop

git push -u origin develop

Ejemplo clonar rama de desarrollo:
git clone ssh://usuario@host/path/to/repo.git

git checkout -b develop origin/develop

Iniciando nuevas características:
git checkout -b nombre-característica develop

después de hacer cambios en el código:
git status

git add <ficheros>

git commit

Después de terminar la característica:
git pull origin develop

git checkout develop

git merge nombre-caracteristica

git push

git branch -d nombre-caracteristica

Preparando la release:
git checkout -b release-0.1 develop

Después de editar, terminando la release:
git checkout master

git merge release-0.1

git push

git checkout develop

git merge release-0.1

git push

git branch -d release-0.1

Etiquetar la release:
git tag -a 0.1 -m "Release inicial" master

git push --tags

Cuando se detecta un bug y se arregla en master:
git checkout -b bug-#001 master

#Arreglar el bug

git checkout master

git merge issue-#001

git push

Aplicar el parche en la rama de desarrollo “develop”:
git checkout develop

git merge issue-#001

git push

git branch -d issue-#001

 

Workflows Git – Muy resumido – Parte 2: Feature Branch Workflow

Cada característica que añadamos se hace a través de ramas dedicadas en vez de añadirlo a la “master branch” o rama maestra. Esto permite a multiples desarrolladores trabajar sin molestarse unos a otros.

Una vez terminada la rama se debe hacer push hacia la rama principal “master branch”. Una de las ventajas es que se pueden hacer pull requests para que otros desarrolladores revisen los cambios antes de que pasen a formar parte del código principal.

Para crear una nueva rama:

git checkout -b nombre-de-la-rama master

Para subir código a la rama de la característica:
git push -u origin nombre-de-la-rama

Una vez terminada la característica, para hacer una petición de subida a la master branch:
git push

Cuando se han aceptado los cambios, para publicar la nueva característica:
git checkout master
git pull
git pull origin nombre-caracteristica
git push

 

Workflows Git – Muy resumido – Parte 1: Centralized Workflow

En esta entrada voy a mencionar los workflows de trabajo básicos de Git para equipos de de desarrollo pequeños y medianos.

Destacamos cuatro tipos:

  • Centralized Workflow
  • Feature Branch Workflow
  • Gitflow Workflow
  • Forking Workflow

Centralized Workflow

Usa un repositorio centralizado con un único punto de entrada para los cambios del proyecto y todos los cambios van en la rama principal (llamada “master”).

El desarrollador clona el repositorio central, hace los cambios y commits en su copia local, y finalmente hacen los push de su master local hacia el repositorio central.

Si hay un conflicto, el repositorio central es inmutable, así que Git rechazará el push. Es el desarrollador el que tendrá antes de subir su versión, actualizar con los commits del repositorio central y resolver los conflictos localmente.

Ejemplo de uso:

Inicialización de repositorio central:

ssh usuario@host git init --bare /path/to/repo.git

Desarrollador clona repositorio central:
git clone ssh://usuario@host/path/to/repo.git

Diagrama del trabajo una vez descargado el código

diagrama centralizedworkflow git

El camino de la autosuficiencia – Errores comunes

Antes de empezar a plantar, nos documentaremos bien, sabremos el tipo de tierra que va bien para cada planta, en qué época plantar cada una, cual necesita más sol, cual menos… todo lo podemos encontrar por internet.

Este año ha sido de prueba, nunca había plantado un huerto, y me he documentado gracias a lo que iba encontrando por internet y lo que me decía la gente. Cada uno te dirá una cosa, a veces contradictorias. Dado que no me considero ni mucho menos experto, desde este blog te recomendamos que hagas lo que te haga mas feliz. Todo y así, después de haber leído diversos tutoriales y haber escuchado los consejos de la gente, he cometido diversos errores que no había visto documentados.

El primero de todos, ¿Cuanto produce cada planta? Hay plantas que producen una barbaridad como el calabacín, y plantas que producen muy poco como las fresas (almenos en mi caso).

De lo que he plantado, os daré unas cantidades según mi experiencia.

5 Plantas de calabacines es mucho para dos/tres personas. ¡¡Hasta el perro ha comido calabacines!!

5 Tomateras Cherry dan para que cada dia puedas cogerte 5 – 20 tomatitos

10 Tomateras de ensalada te dan para hartarte de gazpachos y ensaladas

5 Tomateras de tomates para untar son bastantes, pero los tomates en racimo de estas se pueden conservar

5 matas de berenjenas dan muuuuuuchas berenjenas, tenemos el congelador lleno de berenjenas.

5 matas de pimientos no me han dado para mucho, echo de menos unos pocos mas

20 matas de patata me han dado para una buena temporada comiendo patatas (20-30kg?) y eso que he cometido un buen error con ellas.

3 matas de pepino me han sido insuficientes el año que viene pondré unos 5 (también he de decir que no los he puesto muy bien…

2 matas de melones, no me han salido muy bien, ya que no ha salido nada aprovechable de momento

5 matas de calabazas, algo no he hecho bien que no salen muchas calabazas…

Otro error importante: no cavar lo suficiente.

Muchas patatas se me han quedado pequeñas porque no tenían sitio por donde crecer. He visto como han crecido y desarrollado las patatas SOLO en la parte donde había labrado la tierra. En la tierra compacta no se ha desarrollado ni una sola patata. Por lo que cuanto más cave creo que más patatas obtendré.

El tercer error, no podar lo suficiente. Al principio te da lástima cortar esas plantas que has cuidado con tanto mimo, luego piensas que la naturaleza debe ser sabia y que por algo le da tantas ramas, pero luego te das cuenta de que es mejor podar bien para que lo que salga tenga más fuerza, y sobretodo, orientar la planta hacia donde tú quieres, ya que sinó verás que los pasillos llegan a ser impracticables, y no puedes pasar (a no ser que lo destroces un poco)

Y el último, protección para las granizadas. Cayó una granizada que me destrozó gran parte de la cosecha, así que miraré de ponerle algo para evitar estas pérdidas.

Espero que estos consejos os sirvan de algo 🙂

El camino de la autosuficiencia – Planificación del huerto I

Ahora que me acabo de comer una bolsa de patatas fritas entera yo solo, me siento lo suficientemente mal (¡Ja!) como para planificar un huerto para tener la máxima cantidad y variedad de comida sana.

Por una parte miraré qué se puede plantar en cada época del año y de esta manera maximizar la producción ¿Será posible producir comida para todo el año?

En un principio, según lo indagado por internet, con 100 metros cuadrados debería tener más que de sobras. En mi caso dispongo de un huerto de 8m x 13m  ( 104 metros cuadrados) por lo tanto creo que podré hacer un buen huerto.

huerto plano

En un principio, tengo pensado hacer 4 bancales, para que me coincidan con las rotaciones de cultivos, y dos bancales más en los que no tengo tanta luz.

Estos dos bancales con menos luz, los utilizaré para plantar lechugas, zanahorias, espinacas, canónigos, habas, cebollas, puerros, ajos, rabanos, fresas, apio, perejil, albahaca, menta….

Para el resto tengo pensado plantar:

Especie Siembras Recogidas
Tomates Enero-Abril Mayo-Octubre
Berenjenas Enero-Abril Junio-Octubre
Garbanzos Enero-Marzo Junio-Agosto
Berenjenas Enero-Abril Junio-Octubre
Melones Enero-Mayo Junio-Octubre
Pimientos Enero-Mayo Junio-Noviembre
Sandias Enero-Mayo Junio-Septiembre
     
Alubias Febrero-Junio Septiembre-Enero
Calabacines Febrero-Mayo Junio-Octubre
Espárragos Febrero-Mayo Marzo-Junio
 Puerro Marzo – Junio  Octubre – Marzo 
Albahaca Marzo-Mayo Mayo-Octubre
Calabazas Marzo-Junio Julio-Noviembre
Maiz palomimtas Marzo-Julio Junio-Octubre
Patata Marzo-Junio Junio-Septiembre
Pepino Marzo-Junio Junio-Agosto
 Zanahoria Marzo  Junio 
Fresones Abril-Agosto Junio-Julio
     
Fresas del bosque Julio-Agosto Abril-Mayo
     
Habas Agosto-Febrero Enero-Agosto
     
Apio Septiembre-Junio Enero-Octubre
Borrajas Septiembre-Abril Noviembre- Agosto
     
Ajos Octubre, Enero Febrero-Septiembre
Lentejas Octubre-Marzo Marzo-Octubre
 Lechugas Diciembre – Marzo  Junio – Agosto 
Cebollas tardías Diciembre-Febrero Julio-Octubre

 ¿Qué os parece? ¿Me dejo algo? ¿Alguna sugerencia?

El camino de la autosuficiencia – Introducción

Después de mucho tiempo sin escribir, por falta de tiempo en ocasiones, y otras simplemente porque no tengo sobre qué escribir, vuelvo a escribir aquí en el blog. Me gustó la experiencia de escribir sobre arduino por el apoyo de la gente y la interactuación con los lectores. Era la primera vez que escribía y me sorprendió mucho, dije “¡Ostras! ¡la gente me lee!” y eso creo que es lo que más motiva. Sinó fijaros en las entradas de programación, 0 comentarios, y en consecuencia 0 publicaciones adicionales.

Empiezo este tema, “El camino de la autosuficiencia”. En primer lugar, quiero hacer saber que NO me voy a centrar en hacer tutoriales de como poner un montón de placas solares para independizarme de la luz. Quizás lo haga, pero no es el objetivo principal del tema. El objetivo, es el camino. Exacto, la vida es el tiempo que pasa entre que naces y mueres, es el camino del que se ha de disfrutar, y por lo tanto la autosuficiencia no va a ser el objetivo, sino el camino hacia el que caminaré simplemente para entretenerme, pasarlo bien, o sentirme bien con las cosas que consiga.

Esto es disfrutar de la vida

Esto es disfrutar de la vida

Este tema no tratará únicamente de las cosas que podemos construir, o en qué nos podemos gastar el dinero, sino en realizar el análisis de si vale la pena o no realizar una inversión, y el retorno de la misma.

Muchas veces es simplemente de cambiar el chip, o simplemente centrar las prioridades. Pongo un ejemplo, de algo que me ha llamado mucho la atención.

Recientemente me he mudado, he dejado el piso donde vivía para comprarme una casa y un comentario que me ha hecho mas de una persona es acerca de “lo bien que me deben ir las cosas”.

No señores, no me ha tocado la loteria, ni he hecho magia os explico:

1º Cada 2×3 veo por Facebook gente que se va a la otra punta del mundo de vacaciones, ya sea Thailandia, EEUU, Sur America, Japón,… Pues yo no he visitado todos esos sitios, me he quedado mas cerca, que también hay muchos sitios preciosos (Valle de Ordesa y su cola de caballo, Rupit, Rio Borosa en Cazorla, Sant Aniol, L’Escala, Tossa de Mar, la Alahambra…)

2º No tengo coche nuevo, sino de segunda mano

3º Salir a cenar/comer. No vereis muchas cenas fashion en mi muro de Facebook(aunque la verdad es que tampoco cuelgo mucha cosa en facebook). Coged un día la calculadora, y fríamente sumad la cantidad de dinero que se va en cenar/comer fuera y como seais de los que os gusta salir… alucinad. Rápidamente te van a sumar 300-400 euros al mes por pareja. Lo he cambiado por bajar al bar a tomar una cerveza con los amigos.

4º Mi anterior piso era económico. Habiendo terminado una carrera hacia poco, en plena crisis y con un sueldo normal, ¿cogerme un piso en el centro?¿o un piso nuevo?¿o enorme? en resumen, un piso que suponga un 40-50% de los ingresos de la pareja? Pues va a ser que no. Ya lo hice en el primer piso al que me fui de alquiler, y a los pocos meses ya estaba deseando que terminara el contrato. Al principio tienes el subidón, y dices, “Que piso más chulo tengo” pero luego ese subidón baja, y de lo que te acuerdas es de lo que pagas cada mes 🙂

Con todo esto, remarcar, que no es una crítica a los que se van de viaje, me encanta viajar y conocer gente y sitios nuevos, me encantan los coches nuevos y si son caros mejor, me encanta salir a cenar y me encantan los pisos grandes, sólo que fruto de quitarme esas cosas durante unos años, he ahorrado.

Invernadero, más de 300 semillas plantadas, 0 plantas supervivientes

Invernadero, más de 300 semillas plantadas, 0 plantas supervivientes

Volviendo al tema del blog, y del camino a la autosuficiencia. Este año he plantado mi primer huerto. Lo he plantado tarde, he labrado mal la tierra, lo he planificado mal de espacio (ahora cuesta entrar a coger los tomates), no he hecho bien las podas, he plantado poca variedad, el invernadero se me voló y acabó en la parcela del vecino, etc… pero me está sirviendo para aprender mucho. Aprender las pegas que pueden salir, y como mejorando para la próxima vez. Todo y eso me han salido más calabacines y tomates de los que somos capaces de comernos. Y berenjenas… aparte de rellenas tengo que mirar que más se puede cocinar con ellas.

El hortelano

El hortelano

Muchos sabréis de lo que hablo, pero para los que no, no os imagináis la satisfacción que da comerte las cosas de tu propio huerto. Después de haber cavado con mis manos(y un escabillo) el huerto, de plantar yo mismo las plantitas, de sufrir con la plaga de los pulgones, de ver unas plantas marchitandose(mi memoria que a veces se me olvida regar…) y otras ahogandose (exceso de cariño hacia mis plantas cuando quieres que crezcan muy sanas), de casi llorar con la granizada, de verlas todos los dias como crecen, de que Bela (la perrilla) se coma los calabacines, calabazas, y le apasione cavar y buscar patatas, etc… y llega el dia en que te comes el primer calabacin… y descubres que tiene sabor! Si señores, lo que compramos en los supermercados no tiene apenas sabor. Un tomate no tiene absolutamente nada que ver, el que puedes comprar en el super, con el que coges de la tomatera. Y los cherries (que me trajo mi hermano al cual le doy las gracias desde aquí) son las gominolas del huerto, el tentenpié del hortelano, lo muerdes…y mmm… no señores, no tiene nada que ver. Los 50 primeros en comentar os llevaré un tomatito cherry para que lo entendais.

Y volviendo al punto económico anterior, creo que me ha dado más satisfacción comerme el tomate que comprarme la tele 🙂

Respecto a otros temas de la autosuficiencia, obviamente, diría que el más comentado por internet, la energía. También iré escribiendo algo.

¿Se puede ser independiente energéticamente? Por supuesto que sí, se puede ser 100% autosuficiente. ¿es rentable? pues ya no lo sé, habrá que calcularlo. Desde luego si te informas a traves de una web de venta de placas solares, te hacen 4 números y es rápidamente rentable, pero vamos, que yo los números que hecho… no me salen tan claros.

En el transporte también, creo que debo ser un bicho raro o estar alejado de la realidad, pero tampoco lo veo claro, con los coches eléctricos no me salen los números, y al que me diga que el transporte ideal es la bicicleta… que me traiga un par de sacos de cemento o abono a casa, y si sube la cuesta con el calor que está haciendo y la carga (¡¡han empezado a cantar las chicharras a las 6 de la mañana!!!!), tendrá una mención de honor en este blog.

Lo dicho, iré poniendo cosas y espero que os entretengan un rato.

Hasta la próxima!

Atila y Bela

Atila y Bela

Programación orientada a objetos

No hay una rápida y oficial definición con la que pueda describir la programación orientada a objetos, pero lo intentaré explicar con las palabras más sencillas posibles, básicamente consiste en tratar las funciones y los datos como si fueran objetos.

Por ejemplo, si tenemos una aplicación que gestiona personas, tendríamos dentro de este objeto variables como “altura”, “peso”, “fecha de nacimiento”, “nombre”, etc…. y métodos como “hacer ejercicio”, “trabajar”, etc…

Y por otra parte tenemos la clase, que es el molde, donde se define el objeto de persona (con sus atributos y métodos) y a partir de aquí se crean (instancian) personas.

Ejemplo de una clase:

 PHP | 
 
 copy code |
?

  1. <?php
  2. class persona {
  3. public $nombre;
  4. public $altura;
  5. public $domicilio;
  6. public function trabajar(){
  7. echo "trabajando...";
  8. }
  9. ?>

Para crear un objeto de tipo persona sería con el siguiente código:

 PHP | 
 
 copy code |
?

  1. $persona = new persona;

Y para acceder a sus propiedades así:

 PHP | 
 
 copy code |
?

  1. <?php
  2. //obtener la altura
  3. $altura = $persona->altura;
  4. //establecer nombre
  5. $persona->nombre = âPedroâ;
  6. ?>

A partir de aquí tenemos la herencia (extensión de clases), que es una parte muy importante de la programación orientada a objetos. Imaginemos que a la persona queremos hacer un subtipo llamado “informático”, que es una clase de persona con una serie de características extra. Esta extensión de la clase “Persona” se implementaría así:

 PHP | 
 
 copy code |
?

  1. <?php
  2. //importante incluir la clase principal o padre en la extensión
  3. include('persona.php')
  4. //declaración de la clase hijo
  5. class informatico extends persona{
  6. private $ordenadores_reparados;
  7. public function arreglarOrdenador(){
  8. $this->ordenadores_reparados++;
  9. echo "ordenador reparado";
  10. }
  11. }

Puede que hayais observado que hay funciones y o variables, que las declaro con public, otras con private, y también está el protected.
Las funciones public, pueden ser utilizadas desde fuera del objeto. Es decir, si el objeto persona tiene un dato como public, cualquiera seria capaz de modificarlo.

Si en cambio lo pusieramos como private, sólo se podría acceder a él desde el mismo objeto, y si es de tipo protected, sería como el privado, pero podrían acceder sus hijos o extensiones

Cómo certificarte para Symfony2

Con la intención de obtener la certificación de Symfony2 pondré aquí una guía o resumen super resumido de referencia para facilitar la obtención de contenidos que se requieren para la certificación.

Podeis buscar el lugar más cercano donde realizar el examen aquí:

https://www2.pearsonvue.com/testtaker/registration/SelectTestCenterProximity/SENSIOLABS/391739

A continuación el temario, que también podéis ver en la propia página de Symfony (http://sensiolabs.com/en/symfony/certification.html).

Más adelante iré creando entradas resumidas con el material.

  • PHP
    • Object Oriented Programming
    • Namespaces
    • Interfaces
    • Anonymous functions and closures
    • Abstract classes
  • HTTP
    • Client / Server interaction
    • HTTP request
    • HTTP response
    • Status codes
  • Symfony2 Architecture
    • Standard edition of Symfony2
    • Composants
    • Bundles
    • Bridges
    • Configuration
    • Code organisation
    • Request handling
  • Standardisation
    • Naming conventions
    • Coding standards
    • Integration of third-party libraries
    • Composer packages handling
    • Development best practices
    • Overload the framework
  • The bundles
    • Naming conventions
    • Code organisation
    • The controllers
    • The views
    • The ressources
  • The controllers
    • Naming conventions
    • Get the request
    • Generate the response
    • The cookies
    • The session
    • Session flashbag
    • Redirects
    • Internal redirects
    • Generate 404 pages
  • The Routing
    • Configuration (YAML / XML / PHP & annotations)
    • Restrict URL parameters
    • Set default values to URL parameters
    • Generate URL parameters
    • Trigger redirections
  • Templating with Twig
    • Auto escape
    • Template inheritance
    • Global functions
    • Filters
    • Template includes
    • Control statements (loops and conditions)
    • Urls generation
    • Call a controller from a view
    • Translations
  • Forms
    • Create forms
    • Handling forms
    • Form types
    • Render forms with Twig
    • Forms security (CSRF)
  • Validation
    • Validate a PHP object
    • Native validation rules
    • Validation scopes
    • Validation groups
  • Dependency Injection
    • The Service container
    • Global configuration parameters
    • Symfony2 services
    • Register new services
    • Tags
    • Semantic configuration
  • Security
    • Authentication
    • Authorization
    • Configuration
    • Providers
    • Firewalls
    • Users
    • Encoders
    • Roles
    • Access Control Rules
  • HTTP Cache
    • Cache types (browser, proxies and reverse proxies)
    • Expiration (Expires, Cache-control)
    • Validation (ETag, Last-Modified)
    • Client cache
    • Server cache
    • Edge Side Includes
  • The command line
    • Symfony2 commands
    • Custom commands
    • Configuration
    • Options and arguments
    • Read the entry and write the output
  • Automated tests
    • Unit tests with PHPUnit
    • Functional tests
    • The Client object
    • The Crawler object
    • The Profile object
    • Access framework objects
    • Configure the client
    • Introspect the request and response
  • Miscellaneous
    • Error handling
    • Debug the code