sábado, 24 de enero de 2015

Arma3: Cómo añadir insignias a las unidades.

- Introducción

En Arma 3 es posible añadir insignias a los modelos de unidades. Esta técnica funciona con todos los modelos que trae el juego, y la mayoría de addons.

El juego tiene algunas insignias predefinidas, pero es muy sencillo definir una propia y añadirla a una misión. El resultado final (con una imagen de prueba), es este:




- Creando la imagen.

Puedes partir de cualquier imagen .png o .jpg Es aconsejable que mida 128x128 pixels, y puede contener transparencias.

Ahora vamos a usar la herramienta "texture viewer". Abre "Arma 3 Tools", y en el menú que aparece selecciona "Texview". Carga tu imagen .png y conviértela en un fichero con extensión .paa usando la opción "guardar como".

Debes copiar el archivo .paa en la carpeta de tu misión, junto a los ficheros description.ext y mission.sqm

- Definiendo una insignia.

En el fichero description.ext añade el siguiente texto:

class CfgUnitInsignia
{
    class 12bdi
    {
        displayName = "12 Brigada de Infanteria";
        author = "12bdi";
        texture = "12bdi.paa";  // Pon aqui el nombre del fichero .paa
        textureVehicle = "";
    };
};


En el ejemplo de arriba "12bdi" es el nombre que recibirá la insignia más adelante. Puede cambiarse poniendo "class otraSquad" (por ejemplo) en lugar de "class 12bdi".

- Definiendo múltiples insignias

Puedes definir múltiples insignias dentro de una misma misión. Por ejemplo, una para el sanitario, otra para los pilotos, otra para la infantería...

Debes definir una clase diferente para cada fichero .paa

class CfgUnitInsignia
{
   class 12bdiAlfa
   {
      displayName = "12 Brigada de Infanteria Alfa";
      author = "12bdi";
      texture = "12bdiAlfa.paa";
      textureVehicle = "";
   };
   class 12bdiBeta
   {
      displayName = "12 Brigada de Infanteria Beta";
      author = "12bdi";
      texture = "12bdiBeta.paa";
      textureVehicle = "";
   };

};
- Asociando la insignia a la unidad

Si la misión es para un solo jugador, añade este código en la inicialización a la unidad:

[this,"12bdi"] call BIS_fnc_setUnitInsignia;


Como puedes ver, el nombre de la insignia es el que le asignamos en el fichero description.ext. Podríamos cambiarlo por 12bdiAlfa o 12bdiBeta para visualizar las insignias asociadas a esos nombres.

Si la misión es para multijugador, el código a añadir es el siguiente:

[[this, "12bdi"], "BIS_fnc_setUnitInsignia", nil, true, true] call BIS_fnc_MP;

martes, 8 de octubre de 2013

Cómo usar SQLite con C#

- Introducción

Como la mayoría sabréis, SQLite es un sistema de gestión de bases de datos relaciones, que tiene la particularidad de que no necesita ningún tipo de instalación ni configuración en el sistema donde se ejecuta. Está todo contenido en una pequeña librería.

Es ideal si necesitas que tu programa maneje una pequeña base de datos, pero no quieres (o no puedes) andar instalando o configurando los equipos donde se va a ejecutar.

En este artículo explicaré en cuatro pasos cómo usar SQLite en un programa C#, usando Visual Studio 2010.

- Instalación.

No necesitas instalar nada en la máquina de desarrollo. Sólo tienes que ir a esta página:

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Hay dos tipos de paquetes: fuentes y binarios precompilados. Necesitas descargar el paquete binario adecuado para el sistema donde tu programa va a correr (no donde estás desarrollando). Por ejemplo, si tu programa usará .Net 4.0 en una plataforma Win 32, deberías descargar sqlite-netFx40-binary-bundle-Win32-2010-1.0.88.0

Dentro del fichero verás que vienen varios ejecutables y DLLs. Sólo vas a necesitar la librería System.Data.SQLite.dll, y System.Data.SQLite.Linq.dll si además usas Linq.

Lo más sencillo es crear una carpeta llamada "Externals" o "Librerías" dentro de tu proyecto, y copiar ahí la(s) DLL(s) que necesites. Después, añade una referencia en tu proyecto a la DLL.

En la siguiente imagen puedes ver cómo queda tu proyecto, con el fichero y la referencia al fichero resaltados en amarillo:



- Uso

Ya puedes usar SQLite desde tu programa. Tras añadir la instrucción "using":

using System.Data.SQLite;

... puedes usar las clases de toda la vida. Empezaríamos con:

SQLiteConnection con = new SQLiteConnection("Data Source=prueba.db");
con.Open();

para abrir o crear (si no existe) una base de datos. Para crear una tabla:

SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = con;

cmd.CommandText = "create table if not exists productos (referencia text, descripcion text, precio real)";
cmd.ExecuteNonQuery();

para introducir datos:

cmd.CommandText = "insert into productos (referencia, descripcion, precio) values ('ref1', 'descripción 1', 10.0) ";
cmd.ExecuteNonQuery();

cmd.CommandText = "insert into productos (referencia, descripcion, precio) values ('ref2', 'descripción 2', 20.0) ";
cmd.ExecuteNonQuery();

Para leer datos ....

 cmd.CommandText = "select * from productos";
SQLiteDataReader dr = cmd.ExecuteReader();

StringBuilder sb = new StringBuilder();
while (dr.Read())
{
        sb.AppendLine(dr[0].ToString() + " " + dr[1].ToString() + " " + dr[2].ToString());
}

 MessageBox.Show(sb.ToString(), "yuju", MessageBoxButton.OK, MessageBoxImage.Information);

En fin, estoy convencido de que coges la idea :) Si quieres, aquí tienes el manual de referencia de la variante de SQL que usa SQLite.


viernes, 26 de julio de 2013

Kerbal Space Program: diseñando cohetes.

- Introducción.

El objetivo de este artículo es explicar algunos principios básicos en la construcción de cohetes en el juego Kerbal Space Program.

Si estás leyendo esto, probablemente ya has estado trasteando con el juego. Habrás conseguido poner algún satélite en órbita (o no), a base de ensayo y error. Quizás hasta hayas llegado a la primera luna. Sin embargo, es difícil llegar mucho más lejos diseñando cohetes "a ojo".

En este artículo explicaré algunos conceptos básicos que te permitirán (por ejemplo) , saber si tienes bastante combustible para ir y volver a un planeta.

No voy a entrar en fórmulas ni cálculos matemáticos porque, primero, yo no soy físico, y segundo, probablemente a ti no te interesen demasiado. Sí pondré enlaces a las páginas de Wikipedia que profundizan en el desarrollo matemático de lo que explico.

En el momento de escribir ésto (versión 0.21) , el juego está en desarrollo y todavía no da información que creo que es crítica a la hora de diseñar un cohete. Para ver alguno de los parámetros de los que hablo en este artículo deberás instalar un mod como  Mechjeb

- Delta V

¿Qué es el Delta V? 

La Wikipedia define el delta-v como una medida escalar del "esfuerzo" necesario para llevar a cabo una maniobra orbital. Se expresa en metros por segundo.

¿Por qué es importante? 

Porque esa medida se comporta como el "combustible" de tu nave: tienes una cierta cantidad de delta-v al principio, y lo vas gastando conforme haces maniobras. Pero es mucho mejor hablar de delta-v que de combustible porque el delta-v ya incluye el peso de tu nave y eficiencia de tus motores.

Por ejemplo, ¿cuánto combustible necesitas para poner un satélite en una órbita estable a 100 km de Kerbin? Pues dependiendo del peso de tu satélite y de si usas motores nucleares, de combustible líquido o turbina, la respuesta puede variar entre unos cientos de litros, a decenas de miles.

Replanteamos la pregunta. ¿Cuánto delta-v necesitas para poner un satélite en una órbita estable a 100 km de Kerbin? Pues 4500 m/s , independientemente de si estás lanzando el satélite más pequeño jamás creado, o la Catedral de Santiago.

Obviamente, si tu nave es más grande, necesitarás más litros de combustible para conseguir los 4500 m/s de delta-v Además, cuanto más eficientes sean tus motores, más delta-v conseguirás para la misma cantidad de combustible. Pero una vez en la rampa, sabes que tienes que gastar 4500 m/s para ponerte en órbita.

Bien, ¿dónde quieres ir? Sea cual sea tu destino, deberías echarle un vistazo a un plano de delta-v. Puedes encontrar uno en la wiki del juego :



Imagina que quieres construir un cohete capaz de alunizar en Minmus. Para realizar las maniobras necesarias, deberás gastar la siguiente cantidad de delta-v :

. 4500 m/s para alcanzar una órbita estable.
. 920 m/s para hacer la transferencia.
. 80 para ponerte en una órbita a bajo nivel
. 240 m/s para conseguir aterrizar.

En total, tu cohete deberá gastar un mínimo de 5740 m/s desde que enciendes los motores para despegar, hasta que te poses en Minmus. Si además quieres volver, tendrás que sumar los delta-v de vuelta (excepto los 4500 de Kerbin, porque usarás la atmósfera para frenar).

¿Qué influye en el Delta V?

Los principales parámetros que influyen en tu delta v son:
  • La masa "en seco" (sin combustible)  de tu cohete.
  • La cantidad de combustible que llevas.
  • La eficiencia de tus motores.
El cálculo exacto del delta-v está fuera del alcance de este tutorial. Usa el mod Mechjeb para obtener un análisis por etapas del delta-v de tu cohete. A continuación tienes un  ejemplo:




Las dos primeras líneas muestran el delta-v de la etapa actual y de toda la nave.La eficiencia de los motores suele variar mucho si estás en atmósfera o en el vacío, así que se suelen dar dos valores de delta-v: atmosférico y en el vacío.

Después tienes un desglose del delta-v por etapas. En la etapa actual (número 2) me quedan 7248 m/s, suficiente para llegar  a casi cualquier planeta del sistema solar. La etapa 1 es una etapa de transición, así que no tiene delta-v La última etapa, la 0, es un lander pesado, diseñado para aterrizar (¡y luego volver!) de lunas o planetas con una gravedad media o baja.

El otro valor que se muestra, el TWR, lo describo en el apartado siguiente.

¿Cómo varía el delta-v?

Cada vez que enciendes tus motores para realizar una maniobra, gastas delta-V.

Cada vez que te desprendes de masa (por ejemplo, eliminando un depósito de combustible vacío), ganas delta-v.

Cada vez que cargas combustible (abasteciendo el cohete en órbita, por ejemplo), ganas delta-v.

A igualdad de masa "seca" y combustible, cuanto más eficientes sean tus motores, más delta-v tendrás disponible.

- TWR

¿Qué es el TWR?

"Thrust to weight ratio" Es la relación que hay entre el peso total de tu nave y la cantidad de impulso que son capaces de generar tus motores.

¿Por qué es importante el TWR?

Para despegar desde la superficie de Kerbin con un ingenio sin sustentación aerodinámica (es decir, cualquier cohete) necesitas un TWR superior a 1.0 

Si tu TWR es menor, los motores no podrán generar suficiente empuje para levantar el cohete, y te quedarás en la zona de despegue hasta que consumas suficiente combustible (o explotes).

¿Qué influye en el TWR?
  • El peso de tu nave.
  • El impulso de tus motores.
¿Cómo varía el TWR?

Una vez has conseguido despegar de la superficie, el TWR se reducirá porque 1) tu cohete consumirá combustible, así que reducirá su masa y por tanto su peso 2) el campo gravitatorio del planeta se debilita según te alejas, por lo que el peso se reduce.

En superficie, tu TWR es crítico, porque indica si tu cohete será capaz de levantarse del suelo, o no. En el espacio no tienes que preocuparte del TWR. Si tu TWR es bajo es porque tus motores no generan mucho impulso. Cuando vayas a hacer una maniobra, tendrás que tenerlos encendidos más tiempo, lo que no es un problema.

- Entonces, ¿cómo diseño un cohete?

Hay tres reglas básicas:
  • Cada gramo de combustible que añades aumenta tu delta-v, y reduce tu TWR.
  • Cada motor que añades reduce tu delta-v y aumenta tu TWR.
  • Cada gramo que no es combustible ni  motor reduce tu delta-v y tu TWR.
Necesitas un TWR mayor de uno para despegar de Kerbin, es aconsejable un mínimo de 1.5 o 2. 

Necesitas suficiente delta-v para llevar a cabo todas las maniobras necesarias para cumplir el objetivo de tu misión. Ten en cuenta que los mapas dan el delta-v necesario si realizas las maniobras de la forma más eficiente. Créeme, es mucho pedir para un novato, así que vete siempre con una cantidad extra de delta-v.

Como puedes ver, los dos parámetros fundamentales dependen directa o indirectamente de la masa de tu nave. Es muy importante librarse de todo aquello que no necesites, especialmente depósitos de combustible vacíos y motores que no vayas a usar más. 

Por eso los cohetes se construyen en fases. La primera fase suele ser la encargada de sacar la nave de la tierra, para lo que se necesitan motores muy potentes (pero poco eficientes) que te den suficiente TWR para vencer el campo gravitatorio de la tierra. Pero una vez en el espacio, la eficiencia pasa a ser el factor clave, así que debes librarte del peso muerto y maniobrar con motores más pequeños y eficientes.

La elección de los motores para cada fase es crucial en el diseño del cohete. Aquí puedes ver un resumen de todos los motores que trae el juego. Voy a hacer un  pequeño resumen de cada tipo de motor, válido para la versión 0.20.
  • Los motores líquidos consumen una mezcla de combustible líquido y oxidante. Son el tipo de motor estándar y vienen en tres tamaños. Las versiones grandes son potentes (mucho TWR y poco delta-v) así que son apropiadas para las primeras etapas del cohete. Las pequeñas tienen menos TWR, pero son más eficientes y por tanto te dan más delta-v con el mismo combustible.
  • Los motores de combustible sólido son muy potentes, pero tienen el grave inconveniente de que una vez encendidos no se pueden apagar ni regular. Normalmente, se usan para reforzar las primeras etapas del cohete, cuando más empuje necesitas.
  • Los motores nucleares son mucho más eficientes que los líquidos "normales", pero tienen muy poco empuje. Son ideales (¿necesarios?) para viajes interplanetarios, donde la eficiencia es crítica. También consumen una mezcla de combustible líquido y oxidante.
  • Los "aerospike" son un  tipo de motor líquido muy eficiente en atmósfera. Se suelen utilizar en los módulos de aterrizaje para planetas y lunas con atmósfera, como Duna. 
  • Las turbinas (motores "jet") consumen combustible líquido y toman el oxígeno de la atmósfera. Por tanto, necesitan una atmósfera con oxígeno :P (Kerbin, Lathye y no sé si me dejo alguno). Suelen emplearse en aviones y, a veces, en las primeras fases de los cohetes.
  • Los motores de iones consumen gas Xeon. Son los más eficientes de todos, pero tienen tan poco empuje que prácticamente sólo se usan en satélites y sondas, o para ajustes de órbita.
Bueno, con esto tienes lo necesario para plantar un cohete en cualquier sitio del sistema solar. Suerte por ahí fuera :)

domingo, 7 de julio de 2013

Kerbal Space Program: acoplando naves.

- Introducción

Kerbal Space Program es un simulador espacial que te permite diseñar naves espaciales y usarlas en un entorno (relativamente) realista.

Dentro del simulador, la operación de acoplar naves ("docking") es especialmente complicada para novatos. Sin embargo, una vez le coges el truco se convierte en algo rutinario que abre muchas posibilidades dentro del juego, desde la construcción de estaciones espaciales a operaciones de abastecimiento en órbita.

Quiero dejar claro que no soy físico. El método que explico a continuación no es el más eficiente, pero como funciona "a ojo", creo que es bastante sencillo.

Quiero darle las gracias a Haplo, del foro http://www.puntadelanza.net , por la serie de artículos que escribió sobre el juego y que me ayudaron a iniciarme

http://www.puntadelanza.net/Foro/phpBB3/viewtopic.php?f=41&t=14887

- Preparativos

Para acoplar dos naves necesitas, evidentemente, dos naves. Pueden ser de cualquier tipo (una estación y una nave, dos naves, etc) , pero lo que es importante es que tengan dos escotillas de acoplamiento del mismo tamaño. También es importante montarlas bien, no serías el primero en darte cuenta de que una escotilla está mal montada mientras orbitas el último pedrusco del sistema solar.



Si te fijas en la imagen, verás que las piezas que se van a acoplar tienen una especie de "rebaba", un círculo más interno. Ese círculo debe quedar mirando hacia fuera.

La naves que se van a acoplar necesitan llevar montado un sistema de RCS (reaction control system) para maniobrar, y uno o más tanques de monopropelente. En los primeros intentos vas a gastar mucho combustible RCS y para motor (ojo, son distintos) , así que asegúrate de ir sobrado de los dos tipos.

Un consejo muy importante: no intentes hacer la maniobra de forma visual, porque no es nada intuitiva. En la Tierra, cuando quieres acercarte a un objeto, lo normal es acelerar hacia él, ¿no? Pues eso en el espacio no funciona. Cuando aceleras, estás variando tu órbita, así que acelerando hacia el objeto sin más sólo te hará pasar por encima o por debajo, envuelto en nubes de juramentos y palabrotas.

Hasta la fase final, la información que necesitas está en el "navball" o la ventana de órbita, no en tu nave.

Deberías familiarizarte con los controles RCS. Por defecto, el RCS se activa con la tecla R. Usa H y N para ir adelante/atrás, e IJKL para moverte a los lados. El juego lleva un "modo de docking" pero en este tutorial NO se usa, la nave la manejaremos siempre desde la ventana de órbita o en "modo phasing" (el normal, vamos).


Es aconsejable que la órbita de la nave a la que te vas a acoplar sea lo más circular posible, y poco excéntrica. También es aconsejable que sincronices el despegue de una nave con la órbita del objeto al que te vas a acoplar. Digo "aconsejable" porque permite hacer la maniobra de forma algo más sencilla y eficiente, pero no es necesario.

Y un último consejo: monta un par de focos en las DOS naves. Si no lo haces, acoplarse a la sombra de un planeta puede complicarse mucho. Monta también un par de placas solares y alguna batería.

- Primera parte: aproximando las órbitas.

Si quieres acoplar una nave que va a despegar con otra que está orbitando, intenta sincronizar el despegue. Para hacerlo a ojo, sencillamente espera a que la nave que está orbitando pase sobre la nave que va a despegar. Te ahorrarás muchos ajustes orbitales.

. Uno: igualando el plano de las órbitas.

El objetivo de este paso es que las órbitas estén en el mismo plano.

Ve a la ventana de órbitas (M); debes hacer click sobre la nave a la que te quieras acoplar y seleccionarla como objetivo.




Una vez hayas seleccionado el objetivo al que te quieres acoplar, la imagen cambiará. En azul, como siempre, está tu órbita y tus puntos de apoapsis y periapsis. En verde, casi amarillo, aparecerá la órbita de tu objetivo. Los puntos verdes sobre tu órbita son los nodos ascendentes (AN) y descendentes (DN) , que son los puntos donde las dos órbitas están en un mismo plano. Los puntos de máximo acercamiento están en rojo.

Si colocas el ratón sobre uno de los nodos te dará la diferencia de inclinación entre las dos órbitas (p. ej 0.5). Tienes que planificar una maniobra sobre uno de los dos nodos para situar las dos órbitas en el mismo plano (0.0º de diferencia) con un error de -0.1 a 0.1




. Dos: tocando las órbitas.

Una vez las dos órbitas están en el mismo plano, debes conseguir que se toquen en al menos UN punto. NO es necesario igualar las órbitas,



. Tres: puntos de encuentro.

Nuestro objetivo ahora es que las dos naves estén a una distancia de menos de 50 kilómetros. Lo ideal serían 10 o 20, pero como es nuestra primera vez, tampoco vamos a ponernos muy exigentes :)

Cuando seleccionaste el objetivo, además de los nodos aparecieron uno o dos puntos de mínima separación (en rojo en la imagen). Si pasas el ratón por encima verás a qué distancia estarás cuando tu nave llegue a ese punto.

Para conseguir que se acerquen, tenemos que jugar con el hecho de que las órbitas más pequeñas tardan menos tiempo en completarse, y las órbitas grandes tardan más tiempo.

Por tanto, si tu nave está detrás de su objetivo, necesitarás reducir su órbita para que gire más rápido que el objeto al que quieres  alcanzar. En el ejemplo de arriba, debes mantener la periapsis por debajo de la órbita de tu objetivo.

Sin embargo, si tu nave está por delante de su objetivo, te interesará que gire más despacio para que el objetivo le dé alcance. En ese caso, tendrás que subir la apoapsis por encima de la órbita de tu objetivo.

Hagas lo que hagas, ten en cuenta dos cosas. Primera, que las dos órbitas deben tocarse siempre en un punto. Segunda, que si estás orbitando un cuerpo con atmósfera debes tener cuidado al bajar la órbita para no meterla en la atmósfera, frenarte, y acabar dándote el gran morrazo.


Ahora solo te queda usar la función "time warp" para que las naves den una vuelta completa, y puedas observar cómo ha cambiado la separación mínima. Probablemente tendrás que hacer ajustes, irás muy de prisa y te pasarás, o muy despacio y se te escapará. No te preocupes, vuelve a ajustar las órbitas y mira qué pasa en la siguiente vuelta.

Cuando consigas que la separación mínima sea menor de 50 kms, pasa al siguiente paso.

. Cuatro: igualando la órbita.

Una vez estés contento con la separación mínima, haz un último ajuste para que las dos órbitas sean lo más parecidas posibles. Es decir, las dos órbitas deben quedar "una encima de la otra".




(En la imagen, no hagas caso de los puntos de aproximación. En tu juego deberían estar más cerca.)


- Segunda parte: aproximando las naves.

. Uno: Aproximación.

Sal de la ventana de órbitas (tecla M). Bien, ésto es muy importante:  a partir de ahora tu "navball" debe estar siempre en modo "target", no superficie ni órbita.


Si no estás ya en modo "target", puedes cambiar el modo de tu "navball" haciendo click sobre el texto que aparece en verde. La posición de tu objetivo aparece en rosa. Tanto los puntos "prograde" y "retrograde" como la lectura de velocidad lo son con respecto al vector de velocidad de tu objetivo. En la imagen, los 20.4 m/s significan que me estoy acercando o alejando de mi objetivo a 20.4 metros por segundo.

Bien, hay dos opciones: o te estás alejando, o te estás acercando. Si te estás acercando, vas bien y no tienes que hacer nada. Pero como las dos órbitas son distintas, llegará un momento en que empieces a alejarte. En ese momento tienes que hacer "La Maniobra" (en mayúsculas, negrita y subrayado :D ). Consta de dos pasos.

  • Primero, coloca la nave mirando hacia TU retrograde (el círculo amarillo con la cruz en el centro, como ya sabrás). Con cuidado (no los pongas al máximo), enciende los motores y vete reduciendo la velocidad  hasta unos 10 m/s



  • Segundo, cuando la nave haya perdido la velocidad, colócala mirando hacia el objetivo (NO hacia el prograde, directamente hacia el objetivo que es ese círculo rosa). Vuelve a encender el motor, y poco a poco, aumenta la velocidad a un valor con el que estés cómodo (dependiendo de la distancia, pero como máximo unos 50 m/s, si está cerca no pases de 5 - 10 m/s)





Si todo ha ido bien, verás que vuelves a acercarte a tu objetivo. Al cabo del rato volverás a alejarte. Repite La Maniobra cuantas veces sea necesario. Cuando estés a unos 50 metros del objetivo, pasa al siguiente apartado.

Si tienes curiosidad por lo que hace "La Maniobra", échale un vistazo a la siguiente foto.  Como ya comenté, si aceleras directamente hacia tu objetivo, sólo conseguirás pasar por encima o por debajo. "La maniobra", por contra, modifica la órbita de forma que los dos objetos vuelven a cruzarse.


Pero vamos, que a efectos prácticos da absolutamente igual. Lo importante es que te acercas. 

. Dos: contacto.

Cuando llegues a una distancia de unos 50 metros apunta la nave a tu retrograde y deja la velocidad a 0.0 o 0.1 Luego cambia la orientación de forma que la escotilla que se vaya a acoplar quede mirando a tu nave objetivo.

Lo más probable es que la otra nave esté orientada hacia el peor sitio posible (Ley de Murphy). Debes tomar el control de la otra nave, y cambiar su orientación para que las escotillas que se van a acoplar queden una mirando a la otra. Con eso te ahorrarás una enorme cantidad de combustible, ajustes, gritos y fracasos :) Para ello, pasa a la ventana de órbita (M) pincha sobre la nave objetivo y selecciona "switch to"



Una vez hayas cambiado a la nave objetivo, sal de la ventana de órbitas (M), y orienta la nave objetivo hacia tu nave.

Bien, pues en este punto tienes las dos naves a 50 metros, prácticamente inmóviles, y mirando la una hacia la otra.



Lo único que te queda por hacer es encender el RCS (tecla R), y usar H y N para acoplar las naves. Normalmente, la tecla H aumentará la velocidad de aproximación de las naves, y N la reducirá. En la maniobra de aproximación final, no pases de 0.5 m/s. Cuando vayan a tocarse, es aconsejable ir a 0.1o  0.2  m/s como máximo.


Una vez esté lo bastante cerca, los imanes de las escotillas harán su trabajo y terminarán de unir las naves. La nave (lander + impulsor interplanetario) completa.



- MOAR HELP!.

Si sigues atascado, quizá podrías probar un mod llamado MechJeb.

El mod puede ayudarte con varias cosas. Primero, trae un  piloto automático para despegar la nave que permite sincronizar el despegue con otro objeto en órbita. Eso te ahorrará infinidad infinidad de ajustes orbitales.

Segundo, y más importante, trae un módulo llamado "rendezvous" que da información útil para el acople de dos naves. El dato crítico es cual va a ser la separación mínima entre tu objetivo y tu. Eso te permite predecir cuando vas a tener que hacer la siguiente Maniobra.

Tercero, te permite mantener el morro orientado en la dirección que quieras (prograde, retrograde, objetivo...) Si sabes lo que quieres hacer, sólo tienes que darle a un botón y el mod colocará la nave mirando hacia donde tú le digas. Eso te dará más tiempo para ocuparte de otros aspectos de la maniobra.

Finalmente, a partir de la versión dos también trae un  piloto automático para hacer acoples. Personalmente no lo he usado, pero en un momento de desesperación puede ser una opción mejor que mandar el juego a paseo :)



viernes, 28 de junio de 2013

Instalando Vmware player en Debian Jessie

Tras actualizar a la última versión de Debian, me he encontrado con que Vmware Player se quedaba parado al intentar compilar los módulos. La solución es compilar los módulos "a pelo" con la orden:

vmware-modconfig --console --install-all --icon=vmware-player --appname=VMware


jueves, 11 de abril de 2013

Accediendo a los números de versión ClickOnce desde C#

Más que una entrada de blog, es una nota para mi mismo. Para acceder a los números de versión ClickOnce :

a- Añadir una referencia a System.Deployment en el proyecto.

b- Añadir directiva

using System.Deployment.Application;

c- Antes de acceder a los números de versión, debemos comprobar si la aplicación está corriendo en una instalación, o si estamos dentro de Visual Studio. Si queremos mostrar la información en la barra del título de nuestro formulario:

 if (ApplicationDeployment.IsNetworkDeployed)
                this.Title += " v. " + ApplicationDeployment.CurrentDeployment.CurrentVersion.Major + "." + ApplicationDeployment.CurrentDeployment.CurrentVersion.Minor;
else
                this.Title += " (entorno desarrollo) ";


Instalar Debian desde USB

Bueno, antes que nada, quiero aclarar que este método está basado en un artículo de http://www.esdebian.org , en un artículo escrito en 2008 por Membris Khan. Éste es el enlace al mensaje original:

http://www.esdebian.org/foro/26476/howto-instalar-debian-usb

Yo lo único que he hecho es actualizar un poco los enlaces, pero es que es un método tan sencillo y tan rápido, que pocas mejoras se pueden hacer.

1- Descargar una imagen .iso del instalador. Las imágenes están disponibles en:

http://www.debian.org/devel/debian-installer/

Probablemente, estés buscando la imagen para PC de 64 bits:

http://cdimage.debian.org/cdimage/daily-builds/daily/arch-latest/amd64/iso-cd/debian-testing-amd64-netinst.iso

2- Coge un cliente de ftp (lftp, por ejemplo), y entra en cualquier mirror de Debian

ftp://ftp.debian.org

Una vez dentro, navega hasta la carpeta :

/debian/dists/wheezy/main/installer-amd64/current/images/hd-media

Debes cambiar "wheezy" por el nombre de la distribución que quieres instalar, e installer-amd64 por el de la arquitectura que uses. Una vez dentro, bájate el archivo boot.img.gz

3- Vale, ya tenemos todo lo necesario. Inserta la memoria USB en el ordenador, y SIN MONTAR el dispositivo, copia la imagen de arranque en la memoria:

zcat boot.img.gz >/dev/sdb

La orden destruirá todo el contenido y las particiones de la memoria USB. Para volver a usar la memoria más adelante, tendrás que volver a particionarla. Fíjate que debes indicar el nombre del dispositivo (sdb) , no de la partición (sdb1)

4- Copia el fichero del instalador a la raiz del nuevo dispositivo. Para eso, debes montar la memoria (lo más sencillo es sacarla y volverla a meter para que se monte sola), y copiar el fichero:

cp debian-testing-amd64-netinst.iso /media/DEBIAN\ INST

Ya está. Ahora sólo tienes que desmontar la memoria USB y usarla para arrancar el ordenador donde quieras instalar el nuevo Debian.

viernes, 1 de febrero de 2013

Cómo llevar el IVA en GnuCash

- Introducción.

Esto es un pequeño tutorial explicando cómo calcular el IVA con GnuCash, un programa gratuito de contabilidad. Voy a dar por supuesto que tienes una idea del manejo general del programa, yo me voy a centrar en el IVA.

No soy contable, sólo un autónomo intentando llevar bien sus cuentas. Desconozco si es el método más correcto, lo único que sé es que no he encontrado ningún tutorial más claro que éste, y que los números salen bien.


- Preparación del programa.

La preparación es un poco farragosa, pero sólo hay que hacerla una vez.

Para este tutorial he creado un conjunto de cuentas de prueba, con un saldo de partida de 2000€


El primer paso consiste en crear las cuentas de IVA. Las vamos a meter todas en el Pasivo.

Pasivo : IVA - Tipo de cuenta: Pasivo. Cuenta padre : pasivo. Esta será la cuenta padre de las otras cuentas.

Pasivo : IVA : IVA Repercutido -  Tipo de cuenta: Pasivo. Cuenta padre : IVA. Aquí aparecerá el IVA que estamos cargando en nuestras facturas.

Pasivo : IVA : IVA Soportado -  Tipo de cuenta: C/ Pagos pendientes . Cuenta padre : IVA. Aquí aparecerá el IVA que nos cobran a nosotros. Se cambia el tipo de cuenta para que aparezca en negativo (luego verás por qué).

Pasivo  : IVA : IVA Pagado -    Tipo de cuenta: C/ Pagos pendientes . Cuenta padre : IVA. Aquí anotaremos los pagos que hacemos.

Al final, las cuentas deben quedar así:


Ahora hay que definir las tablas de impuestos. Vete al menú principal,  Negocios, Impuestos de Ventas. Crea un nuevo impuesto, IVA, indica el tipo actual (21%)  y asocialo a la cuenta Pasivo:IVA:IVA Repercutido. Quedará así:


Si necesitas emitir facturas con tipos de IVA distintos, necesitarás crear varias tablas.

Si emites facturas que no cobras en el momento, deberías crear una cuenta Activo:Pendiente de cobro del tipo C/Cobros pendientes.

Dependiendo de la actividad de la empresa, deberías crear una cuenta de ingresos. Por ejemplo, si te dedicas a instalar redes locales (por decir algo), crea una cuenta Ingresos:Instalación de redes locales.

Con esto hemos terminado la preparación. Vamos a ver los procedimientos a seguir cada vez que se introduce una factura.

- Cuando EMITIMOS una factura.

Yo llevo el control de las facturas que emito a través del menú de negocios. Vamos a suponer que necesitamos emitir una factura de 100 € más IVA, y vamos a suponer que nos la pagan 30 días más tarde mediante una transferencia bancaria.

El primer paso es dar de alta el cliente. Nos vamos al menú de Negocios -> Cliente -> Nuevo cliente.

Ahora, vamos a crear una factura nueva. Vuelve al menú de Negocios -> Cliente -> Nueva Factura. En el primer formulario, escribe el número de factura, selecciona al cliente que creaste en el paso anterior, y dale a Aceptar.

Aparecerás en la ventana de edición de la factura:


Bien, ahora puedes empezar a meter conceptos. En la cuenta de ingresos deberías especificar la actividad que está generando el ingreso (igual tienes que crear la cuenta antes). En el precio unitario debes especificar el precio sin IVA. En la tabla de impuestos, debes seleccionar IVA. Si todo está bien, verás que te calcula los impuestos en la última columna.

Una vez hayas terminado de introducir los datos, dale a Guardar y fíjate en el grupo de tres iconos que aparecen en último lugar  en la barra de herramientas. Debes darle a "Contabilizar esta factura en su cuadro de cuentas.". Cuando te salga la ventana, aprovecha para crear una nueva cuenta de Activo: Pendiente de cobro (si no lo has hecho todavía), y dale a aceptar. Vete a la solapa general, y vamos a ver cómo han quedado las cuentas porque han pasado varias cosas interesantes:


En primer lugar, como la factura está emitida pero no cobrada, en nuestra cuenta de Activo:Pendiente de cobro nos aparecen los 121 euros. En nuestro Pasivo:IVA:IVA Repercutido aparecen los 21 euros de la factura emitida y en nuestros ingresos aparecerán los 100 euros de la base imponible.

Finalmente, suponemos que han pasado 30 días y nos pagan la factura. Tenemos que volver a nuestra factura (Negocios -> Cliente -> Buscar Factura), visualizarla y seleccionar "Introducir un pago para el dueño de nuestra factura" (en la barra de herramientas, el último icono). En la pantalla que nos sale tenemos que seleccionar Contabilizar en : Activo:Pendiente de pago y cuenta de transferencia Activo:Activo Circulante:Cuenta Corriente.

Si vuelves a la pantalla general, verás que  el dinero de la cuenta Activo:Pendiente de cobro se ha transferido a la cuenta corriente.

- Cuando PAGAMOS una factura de la que nos podemos deducir el IVA.

Vamos a suponer que hemos hecho una compra de material de informática de 50 euros + IVA = 60.5€ en total , y que hemos pagado con una transferencia bancaria desde nuestra cuenta corriente.

Para las facturas pagadas prefiero no usar el menú de negocios, y meter las transacciones en su cuenta directamente. Para este caso, iría a a Activo:Activo Circulante:Cuenta Corriente , haría doble click para que se abra una cuenta, y empezaría a meter una nueva transacción.

Introduce la fecha y el concepto, sáltate la columna de transferir y mete el total en la columna Total Salida.... ¡pero no le des a intro todavía! Necesitamos desglosar la entrada, así que dale al botón desglosar (en la barra de herramientas), e introduce la base imponible y el IVA por separado:


Fíjate cómo queda el asiento. De tu cuenta corriente sale un total de 60.5€ . 50€ van a la cuenta de gastos de informática, mientras que 10.5 van a tu IVA soportado. Si revisas la solapa de cuentas:

En la cuenta de IVA aparece nuestro IVA soportado como una cantidad negativa, y nuestra cuenta de IVA refleja la cantidad que le debemos a Hacienda (en nuestro caso, 21 - 10.50 = 10.50 €) .

- Cuando pagamos el IVA.

Supongamos que nuestra empresa no ha tenido más actividad, y que ha llegado el feliz día de rendir cuentas.

Para reflejar el pago creamos una transacción desde Activo:Activo Circulante:Cuenta Corriente a Pasivo:IVA:Iva Pagado. La cantidad se descontará del total de IVA que seguirá reflejando nuestra deuda con Hacienda (21 euros IVA repercutido - 10.5 IVA soportado - 10.5 IVA Pagado = 0 €, en el caso de nuestra empresa. Si hubiéramos seguido facturando, aparecería el IVA del trimestre actual)

Nuestras cuentas quedarán así:


lunes, 22 de octubre de 2012

¡Coño! ¡Diez mil visitas! :D

Bueno, antes que nada decir que soy consciente que diez mil visitas no es mucho para un blog que lleva activo desde 2010. Otros blogs tienen ese volumen de tráfico por día.

Por otro lado, mi intención nunca fue tener el blog más popular de Internet. Desde siempre me ha gustado escribir pequeños artículos sobre temas técnicos. Esos artículos siempre acababan perdidos por mi disco duro o desperdigados por distintos foros. Así que un día me dije: "Para acabar perdiéndolos, mejor creo un blog y los dejo ahí. Así los tengo todos localizados, y a lo mejor hasta le resultan útiles a alguien".

Unos cuantos años más tarde, parece que el blog sí le ha resultado útil a alguien. Además, para mantener el blog activo tanto tiempo hace falta ser constante, y esa es una virtud que no me sobra. Razón de más para tomarme una buena cerveza alemana a mi salud. ¡Prosit!


Linux: cómo encriptar una partición de disco.

- Introducción.

El uso de datos o particiones encriptadas en Linux es un tema bastante amplio. Este artículo no pretende ser una descripción exhaustiva, me voy a centrar en un caso muy simple. Los mismos principios que aprenderás aquí podrás usarlos para encriptar particiones de sistema, de usuario, etc. Solo necesitarás automatizar todo un poco.

Mi caso es el siguiente. Uso un disco duro externo con interfaz eSATA para mis copias de seguridad. Como considero que parte de la información que almaceno ahí es sensible, quiero encriptar la partición para que, en caso de pérdida, no sea accesible.  Tan sencillo como eso.

Actualmente estoy usando una distribución Debian Wheezy con un kernel 3.2.0-3-amd64 Las instrucciones deberían valer para cualquier distribución de Linux moderna.

- Copia de seguridad

Que yo sepa no hay forma de convertir una partición no encriptada en una encriptada. Para crear la partición encriptada es necesario borrar todos los datos que hay en ella, así que, si tienes datos que quieras conservar, tendrás que hacer una copia externa y luego restaurarla.

Por otro lado, es evidente que si pierdes la contraseña de la partición encriptada, pierdes los datos. Actúa en consecuencia.

- Preparando la partición

En primer lugar, necesitas instalar cryptsetup. En Debian:

apt-get install cryptsetup

Ahora vamos a crear el dispositivo. Suponiendo que queremos encriptar la partición /dev/sdb2

root@jose:~# cryptsetup luksFormat /dev/sdb2
WARNING!
========
This will overwrite data on /dev/sdb2 irrevocably.
Are you sure? (Type uppercase yes):
YES
Enter LUKS passphrase:
Verify passphrase:

Bien, ya hemos creado nuestra partición y le hemos dado una clave. Ahora tenemos que abrirla :

root@jose:~# cryptsetup luksOpen /dev/sdb2 vol-backup
Enter passphrase for /dev/sdb2:

IMPORTANTE: a partir de ahora, sólo nos referiremos al dispositivo como /dev/mapper/vol-backup (o cualquier otro nombre que quieras darle en la orden luksOpen), no como /dev/sdb2.

Una vez abierta, creamos nuestro sistema de ficheros encima. Yo uso ext4, puedes usar el que quieras.

root@jose:~# mkfs.ext4 /dev/mapper/vol-backup 


Nuestro sistema ya está listo para ser utilizado. Vamos a cerrarlo para enlazar con la siguiente sección:

cryptsetup luksClose  vol-backup

- Usando la partición.

Cuando quieras usar la partición encriptada, primero tienes que abrirla (dando la contraseña), y luego montarla. Recuerda que, una vez la has abierto, tienes que acceder a la partición a través de /dev/mapper/ :


root@jose:~# cryptsetup luksOpen /dev/sdb2 vol-backup
Enter passphrase for /dev/sdb2: 
root@jose:~# mount /dev/mapper/vol-backup /mnt/backup

Cuando hayas terminado, la desmontas y la cierras:


umount /mnt/backup/
cryptsetup luksClose  vol-backup



domingo, 12 de agosto de 2012

Linux: Cómo pasar a segundo plano un proceso que ya ha arrancado.

Cuando se está trabajando en una consola y se quiere arrancar un programa, lo habitual es arrancarlo en segundo plano para poder seguir trabajando en la consola:

 $ gedit &
 [1] 8274
 $

Es muy típico arrancar el programa, olvidarte de poner el & para que funcione en segundo plano, y quedarte con la terminal bloqueada:

 $ gedit

Bien, pues con la terminal bloqueada puedes pulsar ctrl+z para detener el proceso:

 $ gedit
 ^Z
 [1]+ Detenido gedit
 $

Ahora el proceso está completamente detenido, así que obviamente no funciona. Lo que hay que hacer es ponerlo a funcionar otra vez en segundo plano con la orden bg :

 $ gedit
 ^Z
 [1]+ Detenido gedit
 $ bg
 [1]+ gedit &
 $

... y ya tienes el terminal desbloqueado y el proceso funcionando

miércoles, 1 de agosto de 2012

Mi empresa no me paga, ¿qué hago?

Introducción.

Bueno, antes que nada quiero dejar claro que no soy abogado. En este artículo sólo quiero compartir mi experiencia y mis opiniones como trabajador. También quiero comentar que estas experiencias se produjeron en España durante los años 2011 y 2012, y ha habido algunos cambios normativos (a peor) desde entonces.

Espero que esta información te pueda resultar útil como una especie de segunda opinión, pero por favor, si vas a tomar decisiones que afectan a tu bolsillo, asesórate bien en una fuente solvente.

Buscando ayuda.

Cuando tenemos problemas laborales, lo primero que nos acude a la mente es un sindicato.

La mayoría de sindicatos (al menos, con los que yo he hablado) ofrecen asistencia jurídica a las personas que llevan una cantidad de tiempo afiliadas, p. ej. un año. Para las personas no afiliadas, cobran como cualquier abogado privado.

Si crees que en el futuro puedes tener problemas laborales, puede que te interese afiliarte con antelación. Si tienes problemas ahora y no estás afiliado, tienes otras dos opciones.

La primera es buscar un abogado de oficio. Por el momento, no hay restricciones a la hora de pedir uno (puedes solicitarlo aunque ganes 6000 euros al mes). Busca en la web de tu Comunidad Autónoma. Es gratis pero tiene el inconveniente que no se elige, te lo asignan, y como en cualquier colectivo los hay mejores y peores.

La segunda es contratar un abogado. En ese caso, te costará de un 15 a un 20 por ciento de la cantidad que consigas recuperar, con un anticipo de unos 300 euros (creo que son los precios del Colegio Oficial) Sin embargo, si estáis varios trabajadores en el mismo problema podéis -debéis- negociar las tarifas. En mi caso, he conseguido ofertas de 100 euros y un 6 por ciento de la cantidad rescatada, aunque éramos bastantes.

No me han pagado una nómina.

En general, la empresa tiene la obligación de pagar las nóminas del día uno al cinco de cada mes, por tanto, el día seis puedes reclamar tu nómina. El plazo máximo para reclamar es de un año.

Lo primero que hay que hacer es acudir al Servicio de Conciliación de tu Comunidad Autónoma, y presentar una papeleta de conciliación en el Registro. Puedes obtener las plantillas en la página web del Servicio de Conciliación.

Una vez presentada, se te asignará un día y una hora para el acto de conciliación, normalmente en unos 15 días, y se citará a tu empresa para que también acuda. En el acto de conciliación, ante el letrado conciliador, pueden pasar tres cosas.

La primera, es que ya te hayan pagado la nómina. En ese caso, no te presentes (y avisa a tu empresa para que tampoco vaya). El procedimiento se archiva y termina aquí, así de simple.

La segunda, es que se presenten las dos partes, y se llegue a un acuerdo de reconocimiento de deuda y una fecha de pago. Ésto último es muy importante. El acuerdo es de obligado cumplimiento por parte de la empresa, creo que tiene el mismo rango que una sentencia judicial.

La tercera posibilidad es que no se presente la empresa, o se presente y no se llegue a un acuerdo. Saldrás del acto de conciliación con un papel que dirá exactamente eso. A partir de ese momento, puedes irte al juzgado, poner una demanda y seguir el camino judicial.

Probablemente tengas el juicio ganado, a fin de cuentas estás pidiendo la aplicación directa de la ley. Pero, dependiendo de cómo esté el juzgado que te toque, un juicio de reclamación de cantidades puede tardar más de un año en salir, y hay que tener en cuenta la posibilidad de recurso.

Otra observación. El trámite de la conciliación es muy sencillo, y puedes hacerlo solo. Pero si vas a poner una demanda, es imprescindible conseguir un abogado.

Mi empresa me debe varias nóminas.

Aunque la ley no da un número exacto, cuando te deban tres nóminas, o haya habido un retraso frecuente en el pago de al menos seis nóminas, puedes pedir la rescisión del contrato (junto con la cantidad adeudada).

El trámite es similar al anterior: rellenas un formulario, se convoca un acto de conciliación, y si no hay acuerdo te vas al juzgado. En tu demanda vas a decir que la empresa no ha cumplido su parte del contrato, por lo que pedirás la indemnización máxima, es como si te hubieran despedido.

Las rescisiones de contrato son más "urgentes" que las reclamaciones de cantidades. Dependiendo de cómo esté el Juzgado, el juicio puede tardar "sólo" 8 o 9 meses.

Recuerda que, con independencia de si tienes juicios pendientes o del número de nóminas que te deban, tienes la obligación de seguir yendo a trabajar, o la empresa te despedirá de forma procedente (sin indemnización y sin derecho a paro) por incumplir tu parte del contrato.

Mi empresa ha entrado en concurso de acreedores.

Siguiendo con el catálogo de horrores a los que puedes enfrentarse, llegamos al concurso de acreedores (antigua suspensión de pagos).

Cuando una empresa no puede hacer frente a sus deudas tiene la obligación de declararse en concurso de acreedores. También es posible que un deudor la obligue a entrar en concurso, pero en este caso el administrador de la empresa debe responder con sus bienes, así que lo normal es que entre de modo voluntario.

Para ello, debe solicitar el concurso ante la autoridad laboral. Dicha autoridad  nombrará un administrador judicial para la empresa (trámite que ahora dura un par de meses) y publicará el concurso en el BOE (varias semanas más desde el nombramiento del administrador). Es muy probable que esos plazos de tiempo se traduzcan en más nóminas impagadas.

Lo primero que hace el administrador es trincar sus honorarios, y después examina la situación de la empresa. Si considera que no es viable (las más de las veces), despedirá a todo el personal y cerrará la empresa. Si la considera viable, aplicará cuantas medidas sean necesarias para que pueda continuar su actividad (normalmente muchos despidos, y más cosas).

¿Y en que te afecta el concurso si tienes nóminas impagadas?  Te jode vivo.

En el concurso de acreedores la deuda de la empresa se clasifica entre "prioritaria" y "normal". Sólo se considerará "prioritaria" la nómina correspondiente a los treinta días anteriores al nombramiento del administrador, y las que se generen hasta que finalice el concurso. El resto de nóminas se consideran "no prioritarias".

Ten en cuenta que las deudas que son "prioritarias" no son de pago obligado. Si y sólo si hay dinero (de la venta de bienes, o por los contratos de la empresa), éste se reparte entre tus nóminas prioritarias, Hacienda, Seguridad Social y bancos. ¿Te creías que no iban a aparecer todos juntos para para poner el cazo en el peor momento? ¡Ja!  Lo que sobre (si sobra), se usa para el resto de deudas, como nóminas no prioritarias, proveedores, alquileres, etc.

Por tanto, es perfectamente posible tirarse tres meses en concurso de acreedores, sin cobrar un duro, y obligado a seguir yendo a trabajar.

Una vez seas despedido y la empresa cerrada, podrás reclamar al FOGASA las nóminas (prioritarias o no) que no te hayan pagado, así como la indemnización por despido.

FOGASA

Ahora sí, estás en la última parada. El Fogasa (Fondo de Garantía Salarial) se hará cargo de parte de las deudas (nóminas e indemnización) a las que tu empresa no ha hecho frente.

Cuando yo tramité mi solicitud, el FOGASA cubría hasta tres veces el salario mínimo interprofesional por nómina hasta un máximo de cuatro, y una indemnización de hasta 12 días por año trabajado. En las reformas llevadas a cabo por el PP en el verano del 2012, las coberturas se han rebajado considerablemente.

Para solicitar tu indemnización, tendrás que realizar un trámite tercermundista que incluye rellenar un formulario,adjuntar cierta documentación, y hacer cola desde las 6 de la mañana durante 7 u 8 horas en el organismo correspondiente. Luego sólo hay que esperar un mínimo de 7 u 8 meses a que se resuelva el expediente, y una cantidad indeterminada de tiempo hasta que te paguen.

Actualización a 03-07-13 : Ahora es posible pedir cita previa. Pero una vez presentado el expediente, el tiempo de respuesta es superior al año. 

Conozco gente que ha tardado hasta tres años en cobrar. No sé si es habitual, si tuvo problemas en la tramitación o qué, pero desde luego no cuentes con tu dinero a corto plazo.

Mis conclusiones.

La Justicia española es incapaz de garantizar un derecho tan básico como el cobro del salario. Las leyes son muy claras, pero tardan meses o años en aplicarse, y ningún trabajador puede aguantar tanto sin cobrar.

No dejes que la complejidad de algunos trámites te desanime. Es tu dinero. Exígelo.

A veces, la indemnización actúa como un gancho, hace que te quedes en la empresa contra viento y marea, y al final del camino te quedas sin nada.

Si tenías un contrato de antes de la reforma laboral de 2012, tenías derecho a 45 días por año trabajado, ¿no? Pues si la empresa presenta un ERE, van a darte 20. Y si quiebra, en el FOGASA no va a  llegar a 12 (y creo que lo han bajado más).  Pero para llegar al FOGASA se tarda muchos meses que es posible que no te paguen, así que... ¿merece la pena?

En resumen, haz muy bien tus cuentas, y si las nóminas impagadas se acumulan, empieza a buscarte otro trabajo YA.


viernes, 27 de julio de 2012

Linux: como generar un número limitado de subprocesos en segundo plano

Esta situación se me ha dado con bastante frecuencia. Imagínate que tienes que procesar una gran cantidad de archivos en un árbol de directorios, y que por cada archivo tienes que ejecutar un proceso algo pesado (por ejemplo, bzip2).

A voz de pronto, la forma más fácil de hacerlo es:

$ find . -type f -exec bzip2 \{\} \;

Esto ejecutará nuestro  proceso ... de uno en uno. Estamos en el año 2012, nuestros procesadores tienen muchos núcleos, y ya que los pagamos queremos usarlos. Bien, la alternativa podría ser:

$ find . -type f -exec bzip2 \{\} \& \;

¡Olé! Ahora en lugar de un solo proceso, vamos a empezar a crear procesos sin control hasta que el sistema se colapse o alcancemos el límite máximo (ver ulimit), y obtengamos un error. No parece la mejor solución.

Lo que realmente queremos es que el sistema genere 4, 5, ó 20 procesos, y que a medida que vayan acabando se generen otros nuevos que reemplacen a los que han terminado. La solución más simple nos la da xargs :

$ find . -type f -print | xargs -P 5 -d "\n" -n 1 bzip2

La clave está en el parámetro -P , que limita exactamente el número máximo de procesos a crear. De hecho, si hacemos un ps -ef ....


jose      8462  2856  0 13:44 pts/3    00:00:01 xargs -P 5 -d \n -n 1 bzip2
jose     24599  8462 39 13:57 pts/3    00:00:02 bzip2 ./Backups/servers/mail/vhosts/tri.com/egd/cur/1310570188.V811I1ad008cM674902.mail:2,S
jose     24613  8462 53 13:57 pts/3    00:00:01 bzip2 ./Backups/servers/mail/vhosts/tri.com/egd/cur/1310562280.V811I1ad0048M849935.mail:2,S
jose     24615  8462 44 13:57 pts/3    00:00:01 bzip2 ./Backups/servers/mail/vhosts/tri.com/egd/cur/1310569446.V811I1ad0080M942514.mail:2,S
jose     24622  8462 41 13:57 pts/3    00:00:00 bzip2 ./Backups/servers/mail/vhosts/tri.com/egd/cur/1310560224.V811I1ad0024M906849.mail:2,S
jose     24623  8462  0 13:57 pts/3    00:00:00 bzip2 ./Backups/servers/mail/vhosts/tri.com/egd/cur/1310571017.V811I1ad0096M988948.mail:2,S


Por cierto, no te pases mucho con el número de procesos simultáneos, o la carga del sistema subirá demasiado y puede que sea más lenta la solución en paralelo a la solución en serie.


martes, 19 de junio de 2012

Configuración avanzada router Movistar Home Station ASL-26555

Si recientemente has contratado una línea ADSL con Movistar, probablemente habrás recibido un router de marca Amper Home Station AS-265555.

Esta maravilla de la tecnología viene con un interfaz de configuración en http://192.168.1.1 La contraseña por defecto es 1234

He intentado cambiar la configuración LAN para que, en lugar de estar en el segmento 192.168.1.0/255.255.255.0 estuviera en el segmento 192.168.0.0/255.255.255.0

Problema: el impresionante interfaz de configuración cambia el segmento de red, y el servidor de DHCP empieza a dar direcciones en el nuevo segmento, pero no cambia el gateway, que sigue siendo 192.168.1.1 Obviamente, con el gateway en una red diferente, no se puede navegar en la red local.

Solución: entrar en el interfaz de configuración de verdad, que está en http://192.168.1.0:8000 , usuario 1234, contraseña 1234 Realizar los cambios de uno en uno en esa interfaz e, importante, tras cada cambio ir a Maintenance -> System settings -> reboot.

Con el interfaz avanzado sí he podido cambiar el segmento de red y después la configuración del servidor DHCP para que diera las direcciones en el segmento correcto.

Saludos.

viernes, 6 de abril de 2012

Nokia C5-03: Mi último Nokia.

No sé qué fue de aquella marca que hacía unos móviles a prueba de bombas. En mala hora elegí semejante CACHARRO.

1- Cuando intento escuchar la radio, el teléfono se reinicia. Otras aplicaciones me bloquean el móvil (la pantalla aparece llena de puntos, y tengo que quitar la batería)

2- La memoria del teléfono se llena misteriosamente, y el teléfono se BLOQUEA. Ahora mismo no puedo ni enviar SMS.


3- Falta de aplicaciones para Symbian. Todo sale para Android o iOS.

4- Instalar What's app bloquea mi teléfono.  Instalar "Radio por internet" bloquea mi teléfono. Realmente, ya no sé qué puedo hacer con el teléfono para que NO se bloquee. Imagino que todo estará relacionado con la porquería de memoria interna que le han puesto al cacharro.

5- No tiene un botón externo para la camara, y no tiene flash.

6- No trae "lápiz" para manejar la pantalla táctil con precisión. El resultado es que es una tortura usar cualquier aplicación un poco delicada, como el navegador web.

7- Y la cosa sigue, y sigue y sigue...


Quiero aclarar que tengo el software actualizado a la última versión. También he seguido los asistentes para liberar memoria (de hecho, ahora tengo dos mensajes SMS y una agenda de menos de 100 contactos) y las páginas de soporte de la web oficial de Nokia.

Así que si estás en comprate este engendro, ¡huye insensato!

martes, 3 de abril de 2012

SSH: Eliminando claves erróneas del fichero known_hosts

Otro recordatorio para mi memoria de pez.

Debian almacena las claves públicas de los hosts a los que se conecta en el fichero

/home/usuario/.ssh/known_hosts

En ocasiones, la clave pública de un ordenador puede cambiar. Por ejemplo, porque hayamos trasladado el servidor. En esos casos, SSH se negará a conectarse al servidor nuevo porque su clave pública actual no coincidirá con la antigua. Lo hará con un mensaje apocalíptico:



@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for ftp.xxxxx.es has changed, and the key for the corresponding IP address x.x.x.x is unchanged. This could either mean that DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/jose/.ssh/known_hosts:18
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
6f:16:ff:ce:2f:30:15:86:d8:69:dd:6c:c7:fe:21:0c.
Please contact your system administrator.
Add correct host key in /home/jose/.ssh/known_hosts to get rid of this message.
Offending key in /home/jose/.ssh/known_hosts:11
RSA host key for ftp.xxxxx.es has changed and you have requested strict checking.
Host key verification failed.
lost connection

Bueno, pues hay tres formas de arreglar ésto:

a- Configurando SSH para que no haga un chequeo estricto de claves. No es aconsejable, por motivos de seguridad.

b- Borrando el fichero known_hosts. Tampoco es aconsejable por motivos de seguridad, y encima cada vez que te conectes a tus servidores te volverá a preguntar si quieres confiar en la clave pública. Un coñazo.

c- Usar ssh-keygen para eliminar sólo la clave problemática en el fichero known_hosts :

jose@jose:~$ ssh-keygen -R "ftp.xxxxx.es"
/home/jose/.ssh/known_hosts updated.
Original contents retained as /home/jose/.ssh/known_hosts.old

Fin del problema.

jueves, 22 de marzo de 2012

Sirviendo actualizaciones ClickOnce desde un servidor Apache.

Como programador, estoy encantado con el sistema "ClickOnce" de actualización de Microsoft. Permite instalar y distribuir actualizaciones de forma práctica y rápida.

Como administrador de sistemas, soy un firme partidario del servidor web Apache, por razones técnicas, económicas (sin coste de licencias) y prácticas (es el servidor web más utilizado en Internet).

Pero independientemente de las opiniones de cada uno, a veces hay que hacer funcionar ClickOnce sobre Apache, y punto pelota  :) Veamos como.

Lo primero, aclarar que sólo he conseguido que funcione para actualizar, no para instalar por primera vez el programa. Por eso el artículo se llama "sirviendo actualizaciones". Yo suelo hacer la instalación manualmente en los equipos de los clientes, y luego utilizo Apache para distribuir las actualizaciones, que suele ser el 90% del trabajo.

En primer lugar, hay que preparar el alojamiento web para nuestros ficheros. Puedes hacerlo mediante un host virtual, a través de un puerto diferente o de un subdirectorio dentro de tu sitio web. En mi caso, utilizo un subdirectorio, por lo que los ficheros son accesibles desde:

http://www.miweb.com/aplicacion

Mientras preparas el alojamiento, ten en cuenta las restricciones de seguridad que quieras aplicar. Creo que es aconsejable, al menos, limitar las IPs desde las que se pueden conectar a las IPs del cliente. En fin, haz lo que quieras. En el manual de Apache viene todo muy bien explicadito :)

En segundo lugar, hay que preparar la aplicación para que se actualice a través de web.

En Visual Studio 2010, saca las propiedades de tu proyecto y vete a la solapa de Publicar. En la casilla Ubicación de la carpeta de publicación debes poner una carpeta de tu ordenador, por ejemplo "C:\publicaciones".

En el botón de Actualizaciones, selecciona "la aplicación debe buscar actualizaciones", y en la "Ubicación de actualizaciones" pon el alojamiento que preparaste en el primer paso. En mi caso, http://www.miweb.com/aplicacion El resto de parámetros ponlos como quieras. Yo prefiero que las actualizaciones se busquen antes de ejecutar la aplicación, pero eso ya es cosa de cada uno.

Finalmente, quedan los pasos que hay que seguir cada vez que quieras liberar una actualización.

En primer lugar, evidentemente, debes generar los ficheros de publicación. En las propiedades del proyecto, selecciona "Publicar ahora". En nuestro ejemplo, eso generará los ficheros de actualización en la carpeta C:\publicaciones

Copia todo el contenido de "C:\publicaciones" a tu alojamiento web (probablemente algo como /var/www/miweb/aplicacion o /home/usuario/public_html/aplicacion).

Ahora, debes asegurarte de que todos los ficheros tienen activado el permiso +r para todos los usuarios. Si puedes conectarte por SSH, la orden es:

find .  -exec chmod ugo+r \{\} \;

Si no puedes conectarte por SSH, usa tu cliente de FTP para cambiar los permisos.

Finalmente, debes activar el permiso +x a todos los directorios. Por SSH, se haría:

find . -type d -exec chmod ugo+x \{\} \;

o usa tu cliente FTP.

Debes cambiar los permisos cada vez que subas una actualización, o lo más probable es que los clientes no se actualicen.

Pues eso es todo. Happy ClickOnce.

viernes, 17 de febrero de 2012

Backups usando RSYNC

Introducción.

rsync es una de esas pequeñas maravillas en el arsenal de los administradores de Linux. Aunque se le puede dar muchos usos, aquí voy a centrarme en las copias de seguridad.

En el trabajo, tengo varios terabytes de información repartidos en servidores de la red local e Internet. He probado varias soluciones de backup. Algunas me daban problemas con los nombres de archivo, otras no podían conectarse a los servidores externos o no funcionaban en Linux o en Windows. A la mayoría les costaba manejar esa cantidad de información, y podían tardar días en actualizar la copia de seguridad.

rsync es la solución más eficiente que he encontrado. En una o dos horas, es capaz de mantener la copia de seguridad actualizada, así que lo que antes eran copias de seguridad semanales, ahora son diarias. Ahorra ancho de banda al trasferir ficheros por Internet, y a veces es capaz de actualizar sólo la parte del fichero que ha cambiado. Encima gratuito, claro.

Vamos a ver cómo funciona.

Instalación.

apt-get install rsync

Uso básico.

El ejemplo más simple de uso de rsync sería:

rsync -av /home/jose/datos /mnt/disco_usb

Eso copiaría el directorio /home/jose/datos dentro del directorio /mnt/disco_usb. El destino podría ser un sistema de ficheros montado previamente o no ... para rsync, son dos sistemas de ficheros locales.

La opción -a activa el "modo archivador", lo que significa que hará una copia recursiva lo más fiel posible al origen. La opción -v hará que imprima los nombres de los ficheros que copia.

rsync permite hacer copias entre dos sistemas de ficheros locales, o entre un sistema de ficheros local y uno remoto. Hay dos formas de conectarse a un sistema remoto: a través de SSH o conectándose a un demonio RSYNC.

Para conectarse a un demonio RSYNC, previamente hay que configurarlo.Básicamente, hay que editar el fichero rsyncd.conf en la máquina remota, y luego conectarse al módulo correspondiente.

Yo personalmente prefiero conectarme por SSH. La sintaxis es la siguiente:

rsync -avz jose@192.168.0.50:/home/jose/datos /mnt/disco_usb

La orden anterior se conectará a la máquina 192.168.0.50 con el usuario jose, pedirá una clave, y copiará /home/jose/datos a nuestra carpeta local /mnt/disco_hd

La opción -z activará la compresión de datos. Comprimir los datos ahorra ancho de banda a cambio de un mayor tiempo de procesador; es una opción útil para pasar datos a través de Internet, pero no tanto a través de una red local.

Como ya he dicho, uno de los dos sistemas de ficheros tiene que ser local. Rsync no permite, por ejemplo, copiar ficheros entre dos conexiones ssh. Sin embargo, nada te impide montar un sistema de ficheros de red (CIFS, ntfs, shfs...) y hacer copia entre ellos. Rsync considerará estos sistemas locales.

Sincronizando sistemas de ficheros.

Bueno, lo que hemos visto hasta ahora no tiene nada de novedoso ... parece que rsync es como un cp -r o un rcp.

La diferencia fundamental es que rsync no sólo copia, sino que sincroniza los dos directorios y todas sus subcarpetas. Nuestro ejemplo anterior...

rsync -avz jose@192.168.0.50:/home/jose/datos /mnt/disco_usb

... se comporta de la siguiente manera:

. Si el fichero no existe en el destino, lo copia.
. Si el fichero existe en destino y ha sido modificado en origen, lo sobreescribe.
. Si el fichero existe en destino y no ha sido modificado en origen, no hace nada.
. Si el fichero ha sido borrado en origen y existe en destino, lo deja tal cual.

La gracia está en el punto tres. La primera vez que ejecutemos la orden, rsync copiará todos los ficheros. Las siguientes veces, sólo copiará los ficheros nuevos o los que hayan sido modificados. Eso supone un ahorro tremendo de tiempo y ancho de banda.

Copias de seguridad.

Con la funcionalidad básica que hemos visto arriba podemos hacer copias de seguridad algo chapuceras. Si un fichero se modifica, las modificaciones reescribirán cualquier versión anterior. Si un fichero se borra, permanecerá indefinidamente en la copia de seguridad (que irá engordando con el tiempo). Sólo necesitamos un par de opciones más para pulir este comportamiento.

La opción --delete borra los ficheros en destino que no se encuentren en el origen. Así, cuando en el directorio de datos se borre un fichero, también desaparecerá de nuestra copia de seguridad. De esa forma, nuestra copia será una imagen exacta de nuestros datos. En general es una buena cosa, pero también queremos mantener un histórico.

Las opciones --backup y --backup-dir  son las últimas que necesitamos. La primera le dice a rsync que antes de sobrescribir o borrar un fichero, debe hacer una copia de seguridad. La segunda le dice en qué directorio debe hacerla.

Ejemplo de copia de seguridad funcional.

Vamos a poner un ejemplo. Fíjate en la siguiente orden:

rsync -av --delete --backup --backup-dir=historico/cambios-`date +%d-%m-%y` admin@192.168.1.15:/share/MD0_DATA/datos /share/MD0_DATA/datos/qnap1

Cuando ejecutes esta orden en la línea de comandos, el intérprete de ordenes expandirá `date +%d-%m-%y` por la fecha actual. Es decir, si lo ejecutas el 5 de febrero, la orden que se ejecutará será

rsync -av --delete --backup --backup-dir=historico/cambios-5-2-2012 admin@192.168.1.15:/share/MD0_DATA/datos /share/MD0_DATA/datos/qnap1

... y si lo ejecutas el día 6 será

rsync -av --delete --backup --backup-dir=historico/cambios-6-2-2012 admin@192.168.1.15:/share/MD0_DATA/datos /share/MD0_DATA/datos/qnap1

Es decir, se creará un directorio de backup por cada día que ejecutes rsync.


¿Que va a hacer esta orden? Se va a conectar a la máquina 192.168.1.15 con el usuario admin, y va a sincronizar el directorio /share/MD0_DATA/datos con el directorio local  /share/MD0_DATA/datos/qnap1 Exactamente se va a comportar así:

. Si el fichero no existe en el destino, lo va a copiar.
. Si el fichero existe en el destino, pero no ha sido modificado en origen, no hará nada.
. Si el fichero existe en el destino y ha sido modificado, creará una copia de seguridad en el directorio correspondiente al día y lo sobreescribirá.
. Si el fichero ha sido borrado en origen, creará una copia de seguridad en el directorio correspondiente al día y lo borrará en destino.

¿Cómo quedará nuestra copia de seguridad? Veamos...

[~] # ls  /share/MD0_DATA/datos/qnap1
datos/     historico/

En el directorio datos tenemos una copia exacta de nuestros datos. Está la última versión de cada fichero, y si un fichero ha sido borrado en la carpeta de datos, habrá sido borrado de la copia de seguridad. Pero ....

[~] # ls  /share/MD0_DATA/datos/qnap1/historico/
cambios-13-02-12/ cambios-16-02-12/ cambios-31-01-12/
cambios-14-02-12/ cambios-17-02-12/
cambios-15-02-12/ cambios-30-01-12/

¡Ajam! Aquí está nuestro histórico. En estas carpetas están todos los ficheros borrados o modificados. Si un fichero se cambió el día 17, tendremos una copia actual en la carpeta  datos, y una copia de la versión anterior en historico/cambios-16-02-12 Si un fichero fue borrado, desaparecerá de la carpeta de datos, pero tendremos nuestro respaldo en la carpeta del histórico correspondiente.

Dependiendo del espacio de almacenamiento disponible tendremos que ir borrando carpetas históricas. Una simple orden find puede hacer el trabajo.

Espero que el artículo te resulte útil :) 



viernes, 18 de noviembre de 2011

C#: Ficheros y rutas de trabajo temporales en Windows.

Ésto lo escribo más como un recordatorio para mi mismo que otra cosa.

Para obtener el directorio de trabajo temporal en Windows, puede usarse la siguiente función:

Path.GetTempPath() 

Esta función crea un fichero vacío con un nombre único , y te devuelve su nombre:

Path.GetTempFileName()

sábado, 6 de agosto de 2011

Jazztel, no quiero tu puto ADSL

Como estoy pensando en cambiar de ADSL, y vivo en un pueblo, hace unos meses se me ocurrió comprobar la cobertura que tenía en distintas compañías. Miré en las páginas web de ONO , Jazztel, y no sé si alguna más.

Sabía que, al introducir mi número de teléfono en una página web, iba a tener alguna llamada comercial. En ONO, por ejemplo, nos llamaron una vez para ofrecerme sus servicios. Bien, es razonable. Pero lo que no esperaba es la pesadilla que ha venido después.

Durante MESES, hemos recibido de una a tres llamadas diarias por parte de Jazztel para ofrecernos su ADSL. Hemos probado de todo, desde decir que no educadamente, hasta explicarles que ya nunca contrataremos nada en su compañía, hasta mandarles a tomar por culo de la peor forma posible, pero han seguido llamando, a todas horas, hasta tres veces al día. Incluso he llamado al 900 809 400  (teléfono de jazztel para que no te llamen más) y aunque se ha reducido la frecuencia de las llamadas, siguen molestando.

He llegado a un punto en el que preferiría vivir sin Internet a contratar nada en esa maldita compañía.

He querido comentar esto en el blog para avisaros de que NO METAIS VUESTRO NÚMERO DE TELÉFONO EN LA WEB DE JAZZTEL. Empiezas haciendo una simple comprobación de cobertura, y acabas planteándote cambiar tu número de teléfono.