Montar #servidor web #ARM barato para #intranet

Recientemente he tenido que montar un pequeño servidor para una aplicación web que tenía que estar en una intranet. He aprovechado que tenía un TonidoPlug para montarlo ahí, aunque hoy por hoy hay multitud  de mini ordenadores ARM en los que puedes instalar linux.

Mini-Ordenadores ARM:

Desde Raspberry Pi (25$+), pasando por el famoso MK802 (54$), FXI Cotton Candy (TBA), Panda Board (161$), Hackberry (60$), BeagleBoard (150$), CuBox (140$), Gumstick Overo (150$), TonidoPlug2 (120$), OpenRD (150$), Pogoplug Pro (?), BeagleBone (89$), IGEPv2 (188€), Mele A100 (95$), Nitrogen6X (300$), ODROID-X (129$), TrimSlice (213$+)… Los rangos de precios van de 50€ a 300€ y la media está en 100€.

Leer más...

Instalar PEAR y PHPUNIT en PHP 5.4 sobre Windows

En versiones anteriores de PHP, en las distribuciones binarias para windows, venía un archivo .bat “go-pear.bat” que permitía instalar pear. Ahora (en PHP 5.4) ese comando ya no está disponible y he perdido un buen rato configurándolo todo.

1- Bajar e instalar PEAR
Nos descargamos el archivo http://pear.php.net/go-pear.phar y lo guardamos en la carpeta de PHP. Y luego desde la consola como administrador ejecutamos el comando php go-pear.phar. Si no lo ejecutamos como administrador no podrá escribir el archivo \WINDOWS\pear.ini y fallará la instalación.

2- Instalar PHPUnit
He intentado seguir las indicaciones oficinales de PHPUnit y no he logrado instalarlo por falta de la extensión “pcntl” que además no está disponible en Windows. Pero ejecutando estos comandos deberíamos poder instalar la versión 3.6 sin problemas:

pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear update-channels
pear install phpunit/PHPUnit

Espero que las indicaciones sirvan a alguien o a mí en un futuro cuando ya no las recuerde :)

Leer más...

Patrón de máquina de estados reutilizable en .NET #dotnet

Es bastante común en programación, querer cambiar el valor de una variable temporalmente. Algo tipo:

int variable;

int oldValue = variable;
variable = newValue;
{
   ...
}
variable = oldValue;

Y aún así, este código no es del todo correcto. La forma correcta sería:

int variable;

int oldValue = variable;
variable = newValue;
try
{
    ...
}
finally
{
    variable = oldValue;
}

Tras enfrentarme a este problema muchas veces, acabé montando una forma sencilla mediante callbacks muy cómodo con funciones anónimas.

El código anterior lo puedo convertir en (que es mucho mejor porque variable y newVariable aparecen una única vez y no hay que crear variables temporales manualmente y el código es más limpio):

Scopable.RefScope(ref variable, newValue, () =>
{
    ...
});

He aquí la implementación genérica de RefScope para que cualquiera pueda utilizarlo en su código:

static public void RefScope<TType>(ref TType Variable, TType VariableNewValue, Action Action)
{
 var VariableOldValue = Variable;
 Variable = VariableNewValue;
 try
 {
  Action();
 }
 finally
 {
  Variable = VariableOldValue;
 }
}

Leer más...

VirtuaWin : Cómo mantener muchas ventanas abiertas y no morir en el intento #productividad

VirtuaWin es una herramienta gratuita que te permite tener escritorios virtuales en Windows.

¿Para qué escritorios virtuales?

Cuando tienes muchas ventanas abiertas o cuando estás desarrollando con un único monitor, sueles tener que cambiar rápidamente entre ventanas o dividir la pantalla en dos. Cuando estás desarrollando páginas web y usando un IDE, el IDE suele tener paneles y la página web bastante contenido, con lo que dividir la pantalla en dos y colocar una ventana a cada lado (cosa que permite hacer muy rápidamente Windows 7) se suele quedar corto.

VirtuaWin nos permite cambiar de escritorio pulsando unos hotkeys de manera muy rápida y así poder trabajar a pantalla completa sin morir en el intento y con la limpieza de tener pocas cosas abiertas (cosa importante para estar centrado en tu trabajo).

Leer más...

Node.Net: Servicios, sistema virtual de archivos asíncrono y soporte LESS #nodenet #async #dotnet

Estos días he seguido trabajando en Node.Net. He corregido muchos bugs, haciendo el sistema más estable y le he metido soporte de servicios NT al sistema. Simplemente cualquier programa compilado con Node.Net podrá funcionar como un servicio sin hacer nada especial. Lo único que hay que rodear el código principal del Core.Loop. Y he metido un sistema virtual de archivos asíncrono que se podrá usar en cualquier sitio donde esté Node.Net y también he metido soporte para LESS CSS.

Sistema Virtual de Archivos Asíncrono con File Watching:

He añadido un sistema virtual de archivos asíncrono que permitirá hacer un uso transparente de cualquier implementación del sistema de archivos. Desde un sistema local de archivos, pasando por un archivo zip, una iso, un sftp o ftp… Se podrán servir y leer archivos y directorios desde cualquier sistema de archivos.
Además los sistemas de archivos permiten file watching, que permite saber cuando se ha modificado un archivo. Ideal para evitar polling de cara a saber si un archivo se ha modificado. Así que en cada petición se sirve el archivo cacheado sin hacer ningún acceso a disco y en cuanto se modifica el archivo se borra de la caché. Es óptimo y funciona muy bien tanto en desarrollo como en producción. El sistema virtual de archivos también centraliza en un sitio el tema de rutas relativas, y si se usa no habrá posibilidad de bugs en relación a salirse de una carpeta.

Mejoras:</span>

He añadido soporte para cabeceras ETag, Last-Modified y otras y pronto añadiré soporte para compresión con caché de archivos comprimidos para estáticos.

LESS CSS:</span>

He metido soporte para LESS CSS haciendo uso de la librería DOTLESS. El soporte permite trabajar de forma transparente con archivos .less. Simplemente registrando el módulo LESS y cuando pides un archivo CSS, se mirará si hay un archivo .less con el mismo nombre y si lo hay lo procesará y cacheará el resultado. Si se modifica el archivo .less el File Watching se entera y borra la caché de forma transparente. Además la caché asíncrona que monté hace que si hay dos peticiones concurrentes y se está generando un archivo, la segunda petición se espere a que la primera termine. Con lo que esto también es óptimo.

Leer más...

Suscribirse via RSS