Pues no, no la hay, antes solo existía el debate de Windows vs Linux, luego se sumo Intel vs AMD, ahora ya tenemos un poco de todo Java vs .NET, PHP vs Ruby… –¿dónde quedo ensamblador contra C?-.
Ahora evolucionamos al mundo framework, en JavaScript un festival, React vs Angular vs Aurelia vs Boostrap vs …. pero tampoco pasa nada porque en el fondo unos se pueden mezclar con otros, si al final hasta se quieren llevar bien.
Por otro lado tenemos los lenguajes de nueva hornada en general surgidos de la nueva ola funcional, desde Scala a F# a Clojure, para todos aquellos que os habéis preguntado si hay vida más allá del imperativo, pues si, la hay.
NoSQL viene a romper el inmovilista mercado de las bases de datos, más de un dba debería preocuparse, por mi perfecto, por fin alguien se molesta en hacer bases de datos para desarrolladores y si yo quiero guardar un objeto lo guardo y no tengo que partirlo en trozos para luego volver a juntarlos.
Breve recorrido por el mundo arquitectura, desde los grandes clásicos de 3 capas a N capas, pasando por DDD, EDA, aspectos… como no permitiendo combinaciones entre ellos no vaya a ser que alguien se quede atrás y decir que si solo haces 3 capas es de pobres y DDD es de innovadores que matan moscas a cañonazos cuando realmente deberías estar haciendo SOA que sirve para todo, lo de ahora y lo que vendrá.
Como no podía ser de otra manera tocan las metodologías, TDD, BDD, por supuesto TDD es lo que te hará tener una aplicación con menos errores que una hoja en blanco y BDD hará que quieres irte de cañas con los funcionales de tus proyectos, cuando llegues a las copas estarás hablando de ATDD.
Parece muchas veces que haya que tomar partido, no existe esa necesidad, los extremos en informática no funcionan, ni desde el lado propietario cerrando puertas al campo ni desde el código libre teniendo tal diversidad de distribuciones y software repetido que la fuerza se dispersa.
La virtud está en el término medio, es bueno que haya código libre pero tiene que haber una base a la que agarrarse, con Linux se han intentado crear consorcios con más pena que gloria, en desarrollo a .NET se le supuso una teórica capacidad multiplataforma (sin contar Core) que nunca llego y al final Java siempre termina ejecutándose en entornos Unix.
Las pruebas unitarias son útiles y necesarias pero no un pilar que te condicione un desarrollo como en TDD, BDD no te va dar fiabilidad integral a tu aplicación pero cada uno en su lado (¿Back y Front?, ¿microservicios y SPA?, ¿entorno técnico y funcional?) suponen una buena combinación.
DDD te puede dar escalabilidad y la transversalidad se la puedes dejar a AOP, si has perdido la pista de tú código EDA te puede poner en la senda y si el frontal es ligero un n-capas estilo MVC te responderá bien.
No entrare en el oscuro mundo de la arquitectura corporativa o como coger tu aplicación partirla en trozos y lanzar cada uno por separado a través de buses de conectividad proporcionando todo tipo de servicios, al menos se puede decir que en este ámbito existe más combinación.
Los frameworks estan de moda en líneas generales, son útiles siempre y cuando el framework no tape el lenguaje, –se jQuery pero no se que es JavaScript-, siempre he creído que un framework es bueno cuando inviertes más tiempo en leerlo que en escribir código.
Politizar la informática haciendo bandera de «¿ves como te decía que la tecnología Pokemon iba a triunfar?» quizás no sea la opción, habría que optar más por formas de arreglar problemas que por intentar encontrar el santo grial que nos permita no tener que volver a leer un manual de informática, yo por lo menos sabía lo que me esperaba cuando me metí en esto (bueno, quizás no tanto).
Tech
Atajos de edición Visual Studio 2013
Visual Studio tiene infinidad de atajos de edición, muchas veces no se usan precisamente por la cantidad que tienen, así que a veces lo recomendable es empezar por usar unos pocos, en este caso he cogido esta selección sacada de Ninja-Tips, recomendable dedicar unos minutos a probarlos:
Alt + Flecha arriba / Flecha abajo: Posicionado sobre una línea de código la mueve hacia arriba o hacia abajo, si se selecciona un conjunto de líneas las moverá juntas.
Ctrl + U / Ctrl + Shit + U: Pone en minúsculas / mayúsculas el texto seleccionado.
Ctrl + K + C / Ctrl + K +U: Comenta o descomenta una línea de código, si se selecciona un conjunto de líneas las comentará juntas.
Ctrl + E + F: Formateo insensible al contexto, el texto seleccionado se formatea independientemente del resto del código.
Ctrl + E + D: Formatea todo el documento teniendo en cuenta el contexto.
Mayus + Alt: Permite selección en vertical, una vez hecho esto, se pueden editar varias líneas a la vez, también se puede hacer con Alt + botón izquierdo del ratón.
Ctrl + K + S: Surrounding, permite elegir una estructura de código que se aplicará a todas as filas seleccionadas (try-catch, try-finally, if,…)
Snippets de código: Hay varios snippets, por ejemplo “prop” + Doble tabulador, crea el código de una propiedad, “propfull” crea una propiedad completa,…
Ctrl + K + X: Permite acceder a los shortcuts personalizables.
Ctrl + K + M: Crea un método automáticamente sino existe con la firma adecuada extraída el contexto de llamada.
Ctrl + . : Saca el menú de opciones para resolver referencias no resueltas y otras opciones.
Instalando MongoDB
Las bases de datos NoSQL están cogiendo cada vez más popularidad, MongoDB posiblemente sea la que más atención acapare ahora mismo, mucha gente se centra en su capacidad de almacenar y procesar gran cantidad de información pero de cara al desarrollo su interés radica en su cómodo acoplamiento con el código.
En desarrollo se llama impedancia a esa separación que existe entre las bases de datos y el código, las BBDDs tradicionales funcionan con tablas mientras que el código si es POO funciona a través de clases, esta impedancia se ha intentado resolver con varias soluciones (Active Record, ORM,..) aunque en el desarrollo resulta evidente que siguen surgiendo diferencias entre un sistema y otro.
En el caso de MongoDB (y posiblemente otras) esta diferencia queda mitigada, el simple hecho de que tus objetos se puedan guardar “tal cual”, si además a esto le sumamos un mantenimiento fácil que simplifica la parte de IT es normal que haya calado entre la comunidad de desarrolladores
En este caso voy a dar unas breves notas de cómo se instala y un poco de configuración básica sobre MongoDB, hay que tener en cuenta que MongoDB se puede programar usando un lenguaje javascript lo cual facilita mucho las cosas, al final veremos un ejemplo.
Una vez descargada la aplicación está se instalará por defecto en C:\Program Files\MongoDB, por defecto la ruta de los datos se almacena en \data\db.
La aplicación se lanza con el ejecutable mongod, una vez abierta se puede cerrar con Ctrl+C.
Es posible indicar un archivo de configuración, por ejemplo:
#where data files will reside
dbpath=G:\MongoDB\Data
#where the log file will be stored
logpath=G:\MongoDB\Log\mongo-server.log
#how verbose the server will be logging
verbose=vvvvv
Esto indica que los datos se guardarán en la ruta G:\MongoDB\Data, el log se guardará en la ruta G:\MongoDB\Log\mongo-server.log el nivel de detalle se especifica en verbose.
Para poder instalar como un servicio se ejecutaría la siguiente línea apuntando al archivo de configuración.
mongod –f “c:\Program Files\MongoDB\Server\3.0\bin\mongod.conf” –install
Para poder lanzar la línea de comandos del cliente hay que usar el ejecutable mongo.
Algunos comandos básicos son:
| show dbs | Muestra las bases de datos que existen |
| db | Muestra la base de datos actual |
| Use nombre_de_base_de_datos | Cambia a la base de datos indicada |
| help | Muestra la ayuda |
| db.getMongo() | Devuelve los datos de la conexión |
Se pueden lanzar comandos administrativos sin invocar la Shell de comandos, por ejemplo para poder lanzar comandos de administración:
mongo server1/admin –eval “db.runCommand({logRotate:1})”
En este caso la opción eval evaluará el comando entre comillas y lo ejecutará sin entrar en Shell (en el ejemplo se rota el archivo de log para archivarlo).
Si son muchos comandos entonces se puede lanzar un archivo que contenga todos los comandos:
mongo server1 myDailyChores.js
Existe la opción de ejecutar una secuencia de comandos y después ingresar en la Shell para seguir introduciendo órdenes, en este caso introduciendo –shell al final:
mongo server1 myDailyChores.js –shell
Podemos introducir la cadena de conexión y la base de datos directamente donde ejecutar el comando.
mongo localhost/admin –eval “db.runCommand({logRotate:1})”
La salida de este comando no es muy descriptiva, si queremos ver la información que emite la consola podemos hacer:
mongo localhost/admin –eval “printjson(db.runCommand({logRotate:1}))”
Unos accesos rápido y útiles en la shell desde teclado:
Ctrl+K Borra desde el cursor hasta el final de línea
Ctrl+L Limpiar pantalla
Se puede usar un editor externo para la edición de javascript asociado a MongoDB, para ello se establece la variable de entorno EDITOR.
C:\>set EDITOR = “notepad++.exe”
Después desde el Shell de mongo haríamos:
mongo> myFunction = function(x) {}
mongo> edit myFunction
Para cargar desde la Shell un archivo primero usaríamos pwd() para saber la ruta actual y después para cargar el archivo safer.js que contiene el código haríamos load(‘safer.js’).
Se puede ejecutar un fichero siempre que se entra en la shell de mongo para esto se crea un fichero con nombre mongorc.js y se coloca dentro de la ruta de usuario c:\users\{username}\.mongorc.js
Si se quiere evitar la carga de este fichero inicial se puede usar el parámetro –norc
Finalmente un script útil para evitar borrar base de datos o apagar el servidor:
var _no_ = function() { print(“Nope!”);}
db.prototype.dropDatabase = _no_;
db.dropDatabase = db.prototype.dropDatabase;
db.prototype.shutdownServer = _no_;
db.shutdownServer = db.prototype.shutdownServer;
Otra forma sería:
db.prototype.dropDatabase = function() {
print(“No”);
}
db.dropDatabase=db.prototype.dropDatabase;
Servidor LAMP en Raspberry Pi 2
Cada vez aparecen más microdispositivos que ofrecen un buen rendimiento a bajo coste, uno de estos es raspberry pi (con papel estelar en la serie Mr. Robot), tiene múltiples posibilidades por ejemplo servir como VPN, servidor DHCP, DNS,… o servidor multimedia (con Torrent).
En este caso vamos a instalar un servidor LAMP de desarrollo usando la distribución Raspbian, Raspbian es muy fácil de instalar usando el sistema NOOBS tal y como se comenta en la propia página web, de hecho si solo queremos un servidor es muy recomendable instalar la versión lite que nos quitará el apartado gráfico.
Después de instalar tendremos un menú donde podremos modificar algunos valores, si queremos volver a invocarlo siempre podremos hacerlo a través de raspi-config (si hemos usado usado la versión lite tendremos que instalar este paquete vía sudo apt-get install rpi-update).
Una vez arrancado el sistema es recomendable actualizarlo, tanto el firmware del mismo a través de rpi-update (requiere reiniciar) como los paquetes a través de apt-get update && apt-get-upgrade.
Ya que vamos a instalar un servidor suele ser recomendable tener una dirección IP estática, para eso editaremos el archivo /etc/network/interfaces y en lugar de usar una dirección dinámica (DHCP) indicaremos los datos de nuestra interfaz, existe un artículo describiendo el proceso y nos quedará para la interfaz eth0 algo como:
iface eth0 inet static
address 192.168.1.3
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
Otra opción sería dejarlo en dinámico (con DHCP) y establecer en los servidores DHCP y DNS el nombre de manera estática, esto simplifica la gestión de red de las raspberry pero obliga a tener un servidor DHCP y DNS instalado.
Tras esto hay que tirar y levantar la interfaz vía ifdown eth0 && service networking restart && ifup eth0, tambien es recomendable hacerlo por consola por si la interfaz no se levanta, si sale un error como ifdown: interface eth0 not configured, una opción es lanzar este comando y reiniciar la raspberry.
sudo ip addr flush dev eth0
Opcionalmente podemos querer cambiar el nombre de la raspberry esto lo haremos modificando el fichero /etc/hostname, si se cambia el nombre por defecto para el correcto descubrimiento de la propia raspberry hay que modificar también el fichero /etc/hosts.
Tras esto instalamos el entorno con: apt-get install apache2 php5 mysql-server en el caso de mysqlserver nos solicitará una contraseña de root para poder acceder al servidor, no es obligatorio pero si muy recomendable.
Suele ser útil crear un host virtual en apache en el cual indicaremos que las páginas PHP que ejecuta están almacenados en una unidad de red externa, de esta forma podremos editarlos desde otra máquina a la vez que se pueden acceder desde Apache, para esto podremos usar el host virtual por defecto que viene en la instalación, es más útil trabajar con virtuales porque así podemos aislar proyectos entre sí con sus propios nombres.
Solo hay que tener en cuenta que dentro del host virtual hay que añadir ServerName servidor donde servidor será el nombre que le hayamos dado al servidor virtual, aquí hay un trabajo con el DNS ya que por un lado en el propio archivo hosts del servidor tenemos que darlo de alta y de cara al exterior también tendremos que darlo de alta en el archivo hosts de cada máquina que quiera acceder a no ser que dispongamos de un servidor DNS a tal efecto.
Para mapear las carpetas de apache a una unidad de red solo tenemos que montar la unidad (mount -a) de red externa añadiéndolo a /etc/fstab tal que (en una línea):
//unidad/carpeta/cliente/proyecto /var/www/proyecto/ cifsuid=1000,gid=1000,username=user,password=pass,iocharset=utf8,auto 0 0
donde username y password son credenciales válidas de red, también se puede especificar un fichero externo de credenciales, para más información consultar man.
Una vez hecho esto ya podemos desarrollar, también podemos clonar un repositorio Git en la carpeta, por ejemplo Bitbucket que permite repositorios privados y también es compatible con Azure, aunque GitHub también es otra posibilidad.