Queremos tu pasta… y ya

Llevo ya 15 años siendo empresario, siempre de una pequeña empresa (apenas he tenido más de 6 empleados a la vez) y he pasado ya por muchas situaciones muy diversas (muchas las podéis encontrar en este blog), pero siempre, siempre, he sido escrupulosamente respetuoso con la normativa fiscal. No he hecho (tampoco es que haya podido) ingeniería fiscal y no he tenido asesores lo suficientemente despiertos para optimizar lo que me dejaba en impuestos.

Pero no me he quejado, soy consciente de que las empresas han de ser las que más aporten al estado, que son entes sin más finalidad que la de generar beneficios y que, al final, esos beneficios han de revertir en la sociedad a la que pertenece. Creo que gran parte de los males que estamos viviendo estos años viene por el fomento de la codicia a la que la acumulación de dinero, infinita y sin restricciones, en las empresas modernas. Mucho rollo de resposabilidad social corporativa, conciliación y miliongas varias, pero las multinacionales y sus dueños tienen un único objetivo: acumular más y más dinero.

Dicho esto (soy consciente de que tengo que pagar impuestos como empresa) y habiendo tenido un buen ejercicio el año pasado, no tuve problema en pagar la tercera parte de esos beneficios a hacienda. Y aquí empieza la pesadilla.

Este ejercicio no está siendo tan bueno como el anterior, ni los clientes tienen tantos proyectos, ni yo tengo el mismo personal y he reducido la capacidad productiva en consonancia, por lo que tengo más gastos y menos ingresos. Pero me encuentro con que a hacienda eso le importa menos que nada, porque en el último gobierno de Rajoy se instauró la retención a cuenta del impuesto de sociedades. Algo similar a lo que se hace con los trabajadores y el IRPF, se retiene «a cuenta» un porcentaje de lo que se ingresa como adelanto de lo que habría que pagar posteriormente. ¿Cual es el problema con las empresas? Que no hay importe de beneficios sobre el que calcular esta retención y, en nuestro caso, se hace sobre los beneficios del año pasado… ¡Lo que es una locura! las empresas, por naturaleza, no tienen una fluctuación muy importante de ingresos y gastos.

El caso es que tras hacer la declaración del impuesto de sociedades del año pasado me tocaba pagar ya cada trimestre esta retención y, obviamente, era mucho más dinero del que correspondería a tenor de los resultados del año en curso… Así que, ni corto ni perezoso, intento que me fraccionen la «deuda» para poder pagarla sin tener que andar pidiendo financiación externa (que los bancos siguen a la suya), cosa que suele ser habitual en otras deudas tributarias… Aquí os dejo la respuesta:

En resumen, que quieren mi dinero y lo quieren ya… Si eso el año que viene, a mediados, cuando haga la declaración del impuesto de sociedades y salga a devolver, ellos, meses después se dignarán devolverme mi dinero (probablemente usando el que yo mismo les esté adelantando)… Y mientras, la empresa sin recursos y sin poder contratar más gente porque «hay que asegurar la regularidad en la entrada de fondos en la hacienda pública»…

A este paso me vuelvo liberal (Dios no lo quiera)!!!

Medidor de temperatura casero

Dado que tengo unos cuantos arduino pro micro que he usado para otras cosas, creí bastante conveniente diseñarle una placa para poder ponerle un display oled de 0,96 pulgadas (ssd1306 que ya utilicé en otras entradas) para poder hacer proyectos rápido (en principio pensando en conectarlo a un ordenador y que actúe como teclado, ratón y/o puerto serie). El esquema es el siguiente:

Y la placa resultante quedó así:

Podéis encontrar el proyecto, por si queréis mejorarlo en https://easyeda.com/biblioeteca/promicro-oled

El caso es que, lo primero que se me ocurrió para probarlo, una vez recibidas las placas, fue utilizar otro componente que tenía desde hace tiempo (un sensor de temperatura) y convertirlo en un termómetro… Una pena que no pensara en ello al hacer la placa, por lo que tendré que hacer alguna soldadura de más para conectar el sensor. En concreto quedaría así:

Que visto después de aplicar el soldador se vería así (he aprovechado las pistas de GND y VCC que llegaban al display):

Visto por el otro lado:

La parte de programar la temperatura es un poco más «liosa», básicamente habría que leer la hoja de especificaciones del termistor y resolver la ecuación de Steinhart-hart.

En mi caso, con el valor de 10KOhm en la resistencia y el modelo de termistor que tenía (aquí su hoja de especificaciones) el código resultante para leer la temperatura quedó así:

const int Rc = 10000; //valor de la resistencia
const int Vcc = 5;
const int SensorPIN = A0;
 
float A = 1.11492089e-3;
float B = 2.372075385e-4;
float C = 6.954079529e-8;
 
float K = 2.5; //factor de disipacion en mW/C

void loop() {
  float raw = analogRead(SensorPIN);
  float V =  raw / 1024 * Vcc;
  float R = (Rc * V ) / (Vcc - V);
  float logR  = log(R);
  float R_th = 1.0 / (A + B * logR + C * logR * logR * logR );
  float kelvin = R_th - V*V/(K * R)*1000;
  float celsius = kelvin - 273.15;
  delay(2000);
  // Imprimir la temperatura...
}

Para sacar en el display la temperatura he utilizado la librería Adafruit_SSD1306 que depende de Adafruit_GFX y permite hacer bastantes cosas… Eso sí, dado que mi arduino era lento (estoy usando el de 3.3v) he tenido que inicializar el display cambiando la velocidad del I2C a 400Mhz para que no se note demasiado lag (este display hay que limpiar la zona en la que escribes antes y eso quita ciclos).

Finalmente, una vez probado que funciona, mi intención es hacerlo portable, por lo que le he añadido una pila de 6v conectada a los pines «raw» y «gnd» (el pro micro tiene una entrada regulada en el pin raw) y le he montado una carcasa… Quedando de esta manera (si queréis más detalles me los pedís):

Probando cosillas con arduino beetle

Lo que veis en la foto es un arduino beeetle, bueno, realmente es una placa pro micro con menos pines de los que debería y un conector directo a usb… Como véis es muy pequeño y podéis encontrarlo por un precio bastante económico, aquí, por ejemplo.

Yo ya había utilizado antes el arduino pro micro (leonardo compatible) para simular un teclado en otro proyecto, por lo que sabía que podría utilizar este también para algo similar. Dado su tamaño y lo fácil que se camufla como un «pincho» usb podría pasar desapercibido a la vista… Así que me decidí a ir un pasito más y añadirle un poco más de hardware para controlarlo. Qué mejor que ponerle un botón para indicarle cuando quiero que «teclee algo»… Para ello me aprovecho de que los pines digitales pueden actuar como pull-up y solo tenía que conectar el interruptor entre un pin digital y tierra. En mi caso lo conecté entre el D9 y GND como se puede ver en la foto:

Hice las soldaduras por detrás para proteger un poco más los componentes, pero podría ponerse por delante teniendo un poco más de cuidado.

Una vez el hardware preparado llega el momento de hacer las cosas interesantes… Tampoco es que vaya a ser muy original, pero aquí os dejo el programa que cargué inicialmente…. Funciona en windows y lo que consigues cuando pulsas el botón es que se te abra el chrome con la página web nomorepass.com… (igual sirve como propaganda y todo).

#include "Keyboard.h"
const int buttonPin = 9;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  while (digitalRead(buttonPin) == HIGH) {
    delay(200);
  }
  delay(100);
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('r');
  Keyboard.releaseAll();
  delay(500);
  Keyboard.print("chrome https>&&nomorepass.com");
  Keyboard.write(KEY_RETURN);
  delay(500);
}

Básicamente lo único que hace es esperar a que el estado del pin al que está conectado el botón pase de alto a bajo (esto es así por la configuración INPUT_PULLUP) y cuando cambia, señal de que hemos pulsado el botón, lo que hace es enviar un COMMAND+r que abre el diálogo de ejecutar de windows y luego envía el texto chrome https://nomorepass.com. Como se puede ver he tenido que transliterar los caracteres que en el teclado americano están colocados en otro sitio (un defectillo de la librería de arduino).

Visto que funciona… Pues ya solo queda hacer una cajita e imprimirla en 3d:

He dejado el diseño en thingiverse por lo que podéis aprovecharlo… Mientras, a inventarnos cosas que hacer con el trasto… «No demasiado diabólicas»..

¿Qué pasa con Correos?

Desde que su revolucionario cambio de imagen decidió quitar las bolitas de la corona Correos ya no es lo que era. Al menos en mi caso, dejadme que os cuente la última que me ha hecho:

La verdad es que compro muchas cosas en Aliexpress, generalmente porque no las encuentro en proveedores locales, otras veces porque el precio en estos proveedores es varias órdenes de magnitud más grande que en Aliexpress, siempre me fastidia tener que esperar, pero hasta el momento, siempre he elegido que me lo enviasen por correos – los de DHL ya me intentaron robar más de una vez con sus «tramitaciones aduaneras» innecesarias-. En este último pedido no fue diferente, lo hice para mi empresa y, como tal, aparece el nombre de la empresa como destinatario.

El pedido lo hice el 20 de Agosto y Aliexpress me va informando de su evolución, de hecho, estaba muy contento porque el día 28 ya estaba en Madrid tras pasar aduanas y demás… 8 días es muy buena marca para Aliexpress, así que me dispuse a esperar a que Correos llamase a mi puerta el día siguiente… Y no llegó.

A las 20:30 de la noche recibí un sms diciendome que no estaba en la oficina y que habían intentado entregar el paquete sin éxito y que lo volverían a intentar al día siguiente… Obviamente todo esto es un sinsentido. ¿Quien entrega un paquete a una empresa a las 20:30 de la noche? En fin, era jueves y quería tener el paquete para el fin de semana, así que esperé toda la mañana del viernes y el cartero no apareció, así que supuse que la sinrazón se volvía a repetir y me lo entregarían por la tarde. Cerré la oficina, me fui a comer y volví escopetado para esperar al cartero… Esperé hasta las 21:00 dentro de la oficina, y tampoco llegó. Bueno, supuse que habrían tenido algún problema en el reparto y tendría que esperar al lunes… Pero mi sorpresa vino al ir a ver el estado del envío en su aplicación:

Sin ninguna verguenza afirman que vinieron a las 19:37 y que yo no estaba ¡MENTIRA COCHINA! y que tendría que irlo a recoger el siguiente día hábil a la oficina (también comprobé que no habían dejado notificación en l buzón, así que 100% que por aquí no habían pasado).

Pero como yo ya estaba encabezonado, me decido a pasar el sábado por la mañana por la oficina de correos a ver qué había pasado… Después de esperar hasta las 9:30 me indican en la oficina que el reparto de ayer todavía no les ha llegado y no me pueden antender ¡¿?!

Espero mañana (lunes) ir a la oficina a media mañana a ver si, por azares del destino, puedo recoger mi paquete, pero ya habrían pasado 5 días más de los que debían haber pasado… ¡Que alguien me lo explique! ¿tan dificil es hacer que en la página de seguimiento te permitan decir que quieres que te entreguen el paquete por la mañana en lugar de por la tarde? ¿en qué cabeza cabe que si vas a una empresa que esta cerrada a una hora cuando vuelvas al día siguiente a la misma hora estará abierta?

Un poquito de sentido común, please.

ACTUALIZACIÓN 1: Esta semana me ha vuelto a pasar dos veces, el cartero dice que pasa a una hora y no es verdad (a las 12:30 es dificil que no haya nadie en la oficina), luego deja el papel del envío en el buzón al día siguiente, por lo que retrasa 3 días la recepción del paquete (teniendo en cuenta que vayamos a recogerlo ese mismo día y que no haya festivos por medio…) . El caso es que entregas de paquetes certificados NUNCA llegan a nuestra oficina y tenemos que ir a recogerlos aunque se haya pagado por que te los lleven… ¡Algo no funciona!

Subir a maven central una librería propia

Ahora que ya acabas de construir una librería interesante en Java, la has hecho pública (en github, por ejemplo) y quieres que todo el mundo la use… Queda una tarea pendiente, subirla a un repositorio maven para ponerla a disposición de los que utilicen este sistema (o gradle, que hoy en día ya son casi todos).

Vamos a verlo con un ejemplo que he subido esta mañana… Hay cosas que todavía no entiendo del todo, pero el resultado ha sido bueno, por lo que, al menos, podremos usar esta receta como guía para próximas veces.

El código que intento subir es una librería simple que tengo alojada en github con su pom.xml básico y que si te descargas el proyecto podrías compilar e instalar en tu maven con mvn install. La dirección es esta:

https://github.com/yoprogramo/nomorepass-java/

Ahora, para que todo el mundo pueda descargárselo como dependencia y no tenga que hacer el mvn install del proyecto, tenemos que subirlo a un repositorio público, podemos ver una guía en esta página: Guide to Public Maven Repositories. Tal como explican en la página, lo más sencillo para publicar en Maven Central es usar el repositorio Sonatype. Dicho y hecho… Lo intentamos por aquí.

Lo primero es crear una cuenta en el Jira de Sonatype aquí. Lo siguiente, y esto es un poco «tricky» es crear un ticket solicitando un nuevo id de grupo en esta dirección. No se puede pedir cualquier id de grupo (en mi caso quería pedir com.nomorepass) y generalmente se pedirá alguna prueba de que el dominio es tuyo. En mi caso este es el ticket que creé: https://issues.sonatype.org/browse/OSSRH-49426, para demostrar que el dominio era mío cambié el DNS e incluí una entrada TXT con el identificador del ticket:

Una vez autorizado (tarda un poco, es un proceso manual) hay que modificar nuestro código y prepararlo para la subida, pero, antes de eso, tenemos que generar nuestras claves gpg para poder firmar el código. eso se hace con este comando:

gpg --gen-key

Una vez generada podremos acceder a la lista de claves con el comando:

gpg --list-keys

Toma nota del id de la clave y recuerda la contraseña que usaste para generarla, porque tendrás que recordarla. Además, tendrás que publicarla en algún servidor de claves públicas para que pueda ser comprobada.

gpg --keyserver hkp://keys.gnupg.net --send-keys <el-id-de-la-clave>

Ahora empezamos a modificar el pom.xml para que cumpla con los requisitos para el repositorio Maven Central. En nuestro caso pusimos esto:

<groupId>com.nomorepass</groupId>
  <artifactId>nomorepass</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>Nomorepass java library</name>
  <description>NoMorePass protocol 2 implemented on Java.</description>
  <url>https://nomorepass.com</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Jose Antonio Espinosa</name>
      <email>[email protected]</email>
      <organization>Nomorepass</organization>
      <organizationUrl>https://nomorepass.com</organizationUrl>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:git://github.com/yoprogramo/nomorepass-java.git</connection>
    <developerConnection>scm:git:ssh://github.com:yoprogramo/nomorepass-java.git</developerConnection>
    <url>https://github.com/yoprogramo/nomorepass-java/tree/master</url>
</scm>

Y, una vez informado de todo esto, hay que incluir los plugins que nos permitirán hacer el despliegue directamente. Yo añadí esto:

<distributionManagement>
    <snapshotRepository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

Y puse en mi directorio de maven settings.xml los datos de mi usuario

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>xxxxxxxxxx</username>
      <password>xxxxxxxxxx</password>
    </server>
  </servers>
</settings>

Por último, toda la sección de build (que no tenía) la sustituí por esto:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.7</version>
        <extensions>true</extensions>
        <configuration>
          <serverId>ossrh</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <autoReleaseAfterClose>true</autoReleaseAfterClose>
        </configuration>
      </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.2.1</version>
          <executions>
            <execution>
              <id>attach-sources</id>
              <goals>
                <goal>jar-no-fork</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.9.1</version>
          <executions>
            <execution>
              <id>attach-javadocs</id>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
    </plugins>
</build>

Y ya, finalmente, pude ejecutar el mágico:

mvn clean deploy

Si todo ha ido bien, el artefacto estará subido a un repositorio que tendremos que promocionar a «Release» para que se sincronice con el repositorio central… Pero al final ya lo tendremos disponible para todo el mundo…

Aquí podéis encontrar lo que acabo de subir: https://search.maven.org/artifact/com.nomorepass/nomorepass/1.0/jar