Archivo del Autor: phenobarbital

Garimpeiros digitales

bitcoin1

Introducción

¿Qué es minar?, ¿como es eso de echar pico y pala en una red?, ¿por qué nace Bitcoin?, ¿debería estar minando?, sería interesante conocer para “al menos” estar informado y que no te agarre por sorpresa, aquí algunos conceptos previos:

Glosario:

Criptografía: Se trata de un ámbito de la criptología, dedicado a la construcción de reglas de cifrado o codificado de información para permitir su “ocultamiento” y transmisión, para hacerlo inentendible por ojos no autorizados; la criptografía además es todo un ámbito de las matemáticas científicas destinada a elaboración de técnicas de cifrado mediante algoritmos y pruebas matemáticas.

Hash (cadena): Se conoce como “hash” a la cadena generada por algún algoritmo criptográfico de suma resumen (o función hash), algunas sumas no pueden ser resueltas al valor inicial, por ejemplo:

“hola mundo” en SHA256 es: 41d85e0b52944ee2917adfd73a2b7ce3d3c8368533a75e54db881fac6c9ad176, la suma no puede ser “devuelta” a la forma “hola mundo”, en su defecto, ámbos lados de la operación (cliente y servidor) conocen la cadena “hola mundo” y se intercambian los hashes resultantes, así, comprueban que están usando la misma cadena origen.

Otros algoritmos de resumen, como “base64″, son deterministas, es decir, una cadena siempre devuelve la misma suma, por lo que la “reversión” es posible.

Entre los algoritmos de función hash más comunes estan:

* Base64
* CRC
* MD5
* SHA1
* SSHA
* SHA256
* SHA512
* Whirlpool

Cryptocurrency (cryptomoneda): Se trata de un concepto de pago entre 2 usuarios, utilizando una “moneda” común entre ámbos, la transacción es “cifrada” utilizando reglas matemáticas criptográficas de alta seguridad, para evitar que más nadie fuera de la red pueda alterar, falsificar o reversar la transacción, por utilizar reglas matemáticas tanto para su cifrado, como para su “demostración” (resolución) a dicha moneda se le conoce como criptomoneda; las criptomonedas más comunes hoy día son:

* Bitcoin
* Litecoin
* Dogecoin
* PeerCoin

Bitcoin: Criptomoneda de uso más común y más popular, su símbolo monetario es BTC, en la actualidad se cotiza alrededor de los 310US$ por Bitcoin, es una moneda multidecimal (a diferencia de los dólares o bolívares, que no tienen más de 2 decimales), con un valor mínimo de 1 Satoshi (igual a 0.00000001 ฿), llamado así por Satoshi Nakamoto, el *creador* de Bitcoin (coloco entre comillas, puesto que la verdadera identidad del creador del Bitcoin es un misterio).

Altcoin: Se conocen como altcoins a todas las monedas alternativas surgidas a raíz de bitcoin, diseñadas con propósitos especificos o como alternativas directas al bitcoin.

Red P2P: Una red P2P (Point-to-Point o “punto a punto”) es una red colectiva de usuarios, cada individuo de la red interactúa directamente con los otros individuos, evitando la existencia de un ente “central”, las emisiones en una red P2P son distribuidas (broadcast) por lo todos los usuarios reciben la información que generó cada uno de ellos.

Red de la cryptomoneda: La criptomoneda opera en una red distribuida (P2P) de usuarios, dicha red permite a todos los usuarios emitir o recibir pagos en la criptomoneda, mientras todo el conjunto de usuarios valida las transacciones para aumentar la seguridad de dicha red, como cada usuario auto-contiene el conjunto global de transacciones realizadas, la red se auto-protege contra fraudes (como por ejemplo el “doble gasto”, nadie puede gastar su dinero 2 veces, los usuarios de la red determinarán cual de las transacciones es la única correcta); además, es descentralizada, ya que no hay ente central (Banco Central) que dicte las normas o sea el contenedor de único de las transacciones de la red; además, al ser descentralizada y distribuida, todos los usuarios cuentan con los mismos derechos dentro de la red.

Dirección (address): es una dirección física que identifica a un usuario en la red de la cryptomoneda, tiene la forma de una larga secuencia de dígitos y letras, para mantener el anonimato de los usuarios, un usuario puede tener múltiples direcciones físicas asociadas a una billetera (wallet) y puede usar una dirección para una única transacción, por ejemplo VrV1WaEMBcQmK6e4w4ydU27M5WQG3bnP75 es mi dirección para pagos con Vertcoin.
Las transacciones son emitidas usando una “dirección” del usuario “A” hasta la dirección del usuario “B”.

Transacción: Es el proceso de enviar crytomoneda desde A hasta B, es un proceso sencillo en el cual, la dirección “A”, emite un conjunto de crytomonedas almacenadas en su billetera, para realizar un pago a “B”, cada transacción (o conjunto de transacciones) es almacenada en una estructura de datos conocida como “bloque”.

Wallet (Billetera): también conocida como “monedero”, es una cuenta dentro de la red de la cryptomoneda, dónde almacenas tus monedas y permite generar direcciones para realizar o aceptar pagos, el wallet es tu propio “banco central”, pues se sincroniza con la red de la cryptomoneda y almacena la cadena de bloques mostrando todas las monedas que están “a tu nombre”.

Bloque: Cada transacción (o varias) realizadas en cryptomoneda, son almacenadas en una estructura (registro o “record”) conocida como “bloque”, esta estructura contiene el tamaño total del conjunto de transacciones pendientes de ser permanentemente almacenadas, la información de las transacciones (las “direcciones” que realizaron la misma), el contador de la cantidad de transacciones contenidas, un número mágico (siempre el mismo para cada tipo de cryptomoneda) y obviamente el espacio de descripción de las transacciones, además de una referencia al bloque predecesor, el proceso de “capturar, identificar y resolver” dicho bloque, se conoce como “resolución de bloque”, el conjunto de todas las transacciones ya permanentemente almacenadas se conoce como “cadena de bloques”.

Resolución de bloque (solving block o “romper el bloque”): además de la información transaccional, cada bloque provee una “prueba de trabajo” (proof-of-work), que es única por cada bloque (por la alta aleatoriedad y la baja probabilidad de cada bloque), ningún bloque es registrado permanentemente en la cadena de bloques si no es “resuelta” esta prueba, luego de que algún “usuario” de la red “resuelve” el bloque (y se gana la “recompensa”), el resto de usuarios puede validar fácilmente que la solución que encontró es la correcta; al tratarse de de hashes, hay múltiples soluciones posibles, pero solo es necesaria que se encuentre una para determinar que el bloque es correcto y se registra en la cadena de bloques.

Confirmación de bloque: Cuando se captura, identifica y resuelve el bloque, se produce un proceso de “confirmación”, aunque alguien haya “resuelto” el bloque, no se espera sino hasta un número de confirmaciones (usuarios que indican que la resolución de bloque es correcta) para determinar que el bloque es “legal” y debe ser registrado en la cadena de bloques; con muchas confirmaciones se evita que alguien pueda “reversar” la transacción. La cantidad de confirmaciones depende de la cryptomoneda, en la red bitcoin se requiere de al menos 6 confirmaciones para la validez de un bloque.

Reward (recompensa): Cuando ocurre un conjunto de transacciones entre “A” y “B”, un tercer usuario “C” encuentra y “resuelve” el bloque para demostrar que la transacción entre A y B es válida, para “recompensar” a dicho usuario C, la red de la cryptomoneda emite “monedas nuevas” como gratificación (bounty) por su dedicación a resolver el bloque, es como un “coste de transacción” o fee, pero que no es pagado ni por A ni por B, sino con la emisión de monedas nuevas. El valor de dicha recompensa es fijo, pero decrece con el tiempo al aumentar la complejidad (y la cantidad total de clientes) de la red de la cryptomoneda, por ejemplo:

* Bitcoin: 25BTC por bloque
* Litecoin: 50LTC por bloque
* Dogecoin: 15mil DOGE por cada bloque

Por ejemplo, en bitcoin la recompensa se reduce a la mitad cada 210 mil bloques (que ocurre aproximadamente cada 4 años).

Mining (Minería): Se conoce como “minería” a la “competencia” que ocurre entre todos los usuarios de la red, de encontrar un bloque y “resolverlo” para ganarse la recompensa, el tiempo de resolución depende del algoritmo de la moneda, en Bitcoin es aproximadamente 60 segundos, en dogecoin son 70 segundos, si en el tiempo de resolución (confirmation time) quien “encontró” el bloque no resuelve el bloque, otro más podrá resolverlo.
Como la red de la cryptomoneda es “broadcast” (de difusión) la probabilidad de ser quien “encuentre” un bloque sin resolver es la misma para todos los nodos dentro de la red, pero la velocidad con la cual resuelves el bloque depende de tu poder de resolución (“hashing power”).

Miner (software|hardware): Consiste en un software o una pieza de hardware, diseñada para capturar los bloques y resolverlos, la resolución del mismo se basa en un algoritmo de prueba de trabajo (POW: Proof-of-Work) que determina la validez de la solución; para Bitcoin se han diseñado dispositivos FPGA (Compuertas lógicas programables) y más recientemente Circuitos programables de aplicación específica (ASIC) que computan la solución de la prueba de trabajo; en algunos casos la solución de la misma no es resoluta vía FPGA o ASIC (ASIC-Resistant), entonces se utiliza para minar algún software que usa trabajo del CPU o de la GPU.

Cadena de bloques (blockchain): Consiste en todo el conjunto de bloques (transacciones) generados durante la vida de la cryptomoneda (desde sus inicios), por ejemplo, la transacción cero (génesis) fue incorporada a la red Bitcoin por Satoshi Nakamoto en 2009. Para mantener la “descentralización” de la moneda, todo operario (cliente) debe mantener junto a él el bloque transaccional; esto es debido a la forma como se calcula cada bloque, como cada bloque contiene el bloque anterior, para cambiar un bloque, se requiere la re-generación de todos los predecesores, re-haciendo además todo el trabajo que ellos contienen (recalcular sus hashes), esto protege la cadena de bloques contra su manipulación, por ende, todos los usuarios de la cryptomoneda poseen la misma cadena de bloques (idéntica) evitando así que alguien pueda cambiarla.

El tamaño actual de la cadena de bloques es de:

Bitcoin: 33GB
Dogecoin: 6GB
LiteCoin: 4GB
Feathercoin: 800MB

Proof-of-work (POW): Una prueba de trabajo, es un pequeño pedazo de información que es muy difícil de obtener/generar (consume tiempo y trabajo por parte del cliente) y usualmente es calculado/generado por el computador del cliente, el POW (La prueba de trabajo) se usa para evitar ataques de denegación de servicio ya que para el cliente debe ser moderadamente difícil de generar (es un proceso aleatorio y de baja probabilidad de obtención de 2 resultados iguales), pero a su vez debe ser sumamente trivial para el servidor determinar la validez de la prueba de trabajo una vez resuelta y enviada por el cliente.

Algoritmos de prueba de trabajo: Para determinar que “en verdad” has trabajado en la resolución de un bloque, se realiza una prueba de trabajo, que consiste en calcular un hash correspondiente al bloque actual, combinado con el bloque anterior, dicho cálculo utiliza un tipo determinado de algoritmo (muchos de hechos diseñados específicamente por la criptomoneda en cuestión), por ejemplo:

* Hashcash de doble iteración: Bitcoin utiliza un algoritmo HASHCASH de doble iteración (doble cifrado) usando el algoritmo de función hash SHA256, es hashcash es difícil de obtener con CPU o con GPU, pero a dispositivos FPGA programados para ello se les hace trivial (y muy barato) resolver dicha función.

* Scrypt: En vista de que el algoritmo hashcash es fácilmente resoluto con equipos específicos de puerta lógica de baja memoria (FPGA) y con la alta proliferación de dichos equipos para la resolución de bloques Bitcoin, se diseñó Scrypt, que incorpora algoritmos que requieren el uso intensivo de memoria (al usar mucha memoria, reducen la eficiencia de los FPGA), para su resolución es más útil el uso de GPU (Graphic Process Unit, comunmente encontrados en tarjetas de video) con un buen ancho de banda de memoria (ejemplo, tarjetas AMD Radeon o NVIDIA). Dogecoin, Litecoin y otras cryptomonedas usan scrypt como algoritmo de prueba de trabajo.

* NeoScrypt: con el diseño de circuitos integrados de aplicación específica (ASIC) que resolvian muy fácilmente el algoritmo scrypt, se diseño neoscrypt, un combinado de algoritmos de cifrado (Salsa20/20, ChaCha20/20, Blake2, etc) con un uso altamente intensivo de memoria que lo hace resistente a su descifrado con dispositivos ASIC. Phoenixcoin y Feathercoin utilizan NeoScrypt.

* X11: Es un algoritmo de prueba de trabajo, que combina 11 algoritmos diferentes en cadena para la resolución de la prueba, haciendolo ASIC-resistant y GPU-oriented, Darkcoin y otro conjunto de criptomonedas usan dicho POW.

* Lyra2RE: Con el diseño de ASIC que resolvían Neoscrypt y scrypt, Vertcoin diseñó un algoritmo de prueba de trabajo conocido como Lyra2RE, al igual que neoScrypt y scrypt-N, Lyra2RE es realmente un combinado de cifrados que incluye NIST5, Blake-256, Lyra2 y Groestl-256, debido a su naturaleza, la paralelización y la optimización de Lyra2RE es prácticamente imposible, con lo cual, paralelización vía múltiples nodos con GPU u optimizaciones agresivas de la GPU son inútiles con el mismo, garantizando los mismos derechos a todos los usuarios de la red.

* M7M: Con el advenimiento de ASIC que minan scrypt y neoscrypt y con el hash-power de granjas de GPU, la criptomoneda MAGI (XMG) diseña M7M, es una POW que combina 7 algoritmos únicamente resolutos vía CPU (ASIC-Resistant, GPU-Resistant).

La razón del cambio de la prueba de trabajo, es para evitar la “centralización de minería” y evitar “que los ricos se hagan más ricos”, personas con gigantescas granjas paralelas de ASIC que pueden resolver cualquier bloque con facilidad, llevándose el máximo de las recompensas, por ejemplo, la distribución de la riqueza en la red bitcoin es:

Top 10 usuarios: 6.29%
Primeros 100 usuarios: 21.20%
Primeros 1000 usuarios: 40.03%
Resto: 63.41% Total

Como vemos, 10 usuarios concentran 6% de la riqueza bitcoin (unos 700 millones de US$), 1000 usuarios concentran el 40% de la riqueza, en cambio en la red vertcoin, hay solo 1 cuenta con más de 1 millón de vertcoins (unos 27 mil US$) y el 85% de la riqueza está distribuida en la mayoría de los usuarios.

Proof-of-Stake (prueba de participación): Nuevas monedas como Peercoin introducen la “prueba de participación”, es el sistema actual de las cuentas con intereses de los bancos, cada usuario gana por su participación en la red un “interes” y dicho interés es calculado en base a la cantidad de monedas con las que participe en la red, eso asegura que botnets (grandes robots minando día y noche) sin participación monetaria en la red, pudieran ganar algún interés.

Hash Power: Es la cantidad de hashes (resoluciones del algoritmo de cifrado) que puedes computar en un segundo, el Hash power requerido para resolver rápidamente un bloque depende enormemente de la complejidad inherente de la red, de la cantidad de usuarios compitiendo y de la cantidad de moneda disponible, la unidad de medida es el Hash/Segundo, mientras más Hashes/segundo puedas computar, más rápidamente obtendrás la resolución del bloque/segmento, algunas monedas requieren pocos KiloHashes/segundo mientras por ejemplo, Bitcoin requiere equipos que pueden estar rondando los varios GigaHashes/segundo (GH/s).

Velocidad Hash/Hash Rate: La tasa de hash o “hash rate” es la unidad de medida de la potencia total de la red de procesamiento de la criptomoneda, es la combinación de todo el poder encontrado en la red durante un momento en el tiempo, esto determina la dificultad con la cual se captura/procesa/resuelve cada bloque, en la actualidad el Network Hash rate de algunas monedas:

* Bitcoin: 290 PH/s (Petahashes sobre segundo)
* Litecoin: 1.3TH/s (Terahashes sobre segundo)
* Dogecoin: 1.2TH/s
* Darkcoin: 78 mil GH/s (Gigahashes sobre segundo)
* Vertcoin: 2500 GH/s

Solo mining (Minería en solitario): Consiste en conectarse a la red P2P de la criptomoneda y dedicar tu poder de procesamiento directamente a descubrir y resolver bloques, cuando minas solo, la totalidad de la recompensa recae en el usuario; sin embargo, debido a la aleatoriedad y alta complejidad de los bloques, se requiere una buena conexión y un alto poder de resolución de hashes (además de mucha suerte) para ser el primero en encontrar un bloque y resolverlo.

Pool Mining (Minería en grupo): Debido a que es una red P2P (distribuida), no importa si tienes un terahash/segundo de poder (eso sólo ayudará a que resuelvas más rápido un bloque, no a que te otorguen más bloques), como el otorgamiento de resolución de bloques es broadcast (distribuido) entonces cuando muchas personas de diferentes partes del mundo se juntan para resolver un único bloque, entonces se incrementa el chance no solo de resolver más rápido (el bloque total se divide en shares, que son resueltos por cada uno de los minadores) sino de además hay más nodos con probabilidades de capturar un nodo, así las ganancias se distribuyen entre todos los participantes del Pool.

Minería para no-mineros

bitcoin-miner

Conocidos algunos conceptos previos, entendamos el proceso de manera general y sin tanta jerga técnica, en el mundo real, todos compramos con dinero, el dinero es una representación o fracción de la “riqueza total” de una nación y solamente el banco central de un país puede emitirlo; “A” toma su riqueza (en oro y bienes) y las convierte en “dinero”, que usa para pagarle a “B” otros bienes, que su valor ha sido calculado con anterioridad en base a su proporción “riqueza-dinero”.

En el mundo digital, ocurre algo semejante, Sujeto “A” desea pagarle a Sujeto “B” una cierta cantidad de dinero, entonces, entre A y B ocurre una “transacción”, dónde “A” le pasa a “B” el dinero demandado por algún bien o servicio; para asegurar la transacción de ojos “curiosos”, “A” y “B” cifran su transacción con la lógica que la criptomoneda que estén usando ha diseñado; para validar que *en verdad* A y B movilizaron dinero, en vez de Bancos y Banco Central, están otros sujetos alrededor de la red P2P, que ven la transacción de “A” con “B” y sirven de testigos, le gritan al mundo “Si!, A le envió dinero a B!”, la transacción es confirmada y el dinero es debitado de la billetera de “A” y es confirmado en la billetera de “B”.

Para que sea “rentable” participar como testigo de dicha red P2P, cada transacción paga un fee (impuesto) que es otorgado a la primera persona que *aparece* como testigo de A->B, además, la propia red P2P (así como el Banco Central imprime más billetes cuando ha incrementado la riqueza del país) emite “monedas nuevas” que son otorgadas adicionalmente al término de cada transacción (recompensa), así, la riqueza de cada uno va incrementándose a medida que se incrementa la riqueza de la red P2P en general.

Adicionalmente, hay personas que toman dinero del mundo “real”, y compran monedas del mundo digital (a sujetos que ya tienen monedas en su poder) en casas de cambio (Stock Exchange), lo que incorpora más “nodos” a la red P2P, por ende más complejidad, más emisión de moneda y más “riqueza”.

En la actualidad la red Bitcoin cuenta con 4100 millones de US$ en dinero circulante mientras que la red litecoin cuenta con 75 millones de US$.

Garimpos del Bitcoin

Se conoce como Garimpeiro (palabra portuguesa que significa  “trabajador de los Garimpos”, sitio remoto de minería ilegal), a aquellos trabajadores que destinados a sitios de minería que realizan su explotació de manera manual, ineficiente, ilegal y a veces en condiciones infrahumanas, los Garimpeiros suelen “arriesgar su vida” dedicados a la minería ilegal en zonas muy alejadas, expuestos a venenos como mercurio o cianuro y a la destrucción ecológica.

En algunas regiones del mundo, pero por sobre todo en latinoamérica, han proliferado los que he descrito como “Garimpeiros digitales”, ¿por qué?, se dedican a minar sin un ápice del conocimiento arriba descrito, a veces simplemente colocan máquinas a minar y creen que la máquina está “haciendo plata solita” (como un Garimpeiro toma 2 toneladas de tierra, le inyecta mercurio y saca 2 gramos de oro y cree que le fue “bien”), sin entender los conceptos de resolución de bloque, transaction fee o bounty reward, tampoco entienden los algoritmos con los que están cifrados los bloques (algunos que he hablado con ellos, ni siquiera entienden el concepto de “bloque”), minando en condiciones “infrahumanas” (por decirlo de algún modo) con un profit (beneficio) ínfimo.

¿A qué se debe esto?, veamos …

La tragedia de los comunes

Aunque la tragedia de los comunes es un principio descrito por el ecologista Garret Hardin para describir el comportamiento de cómo individuos, incluso inocentes, todos motivados únicamente por un interés personal y de manera independiente uno del otro (con un comportamiento racional, desconociendo las intenciones de los demás) pueden llegar a acabar y/o destruir un bien común limitado, incluso con pleno conocimiento (como individuos y/o como conjunto) de que dicha destrucción no beneficiará a nadie en el largo plazo, (un ejemplo de ello es la contaminación, los individuos siguen contaminando porque consideran que su impacto individual es ínfimo, pero el proceso en conjunto terminará por destruir la atmósfera y acabar con la vida en el planeta a largo plazo); en la red bitcoin se hace uso de ese principio una y otra vez, ¿por qué cada vez más gente entra a minar aunque las transacciones para usarlo no crecen con la misma intensidad?, pues el beneficio intrínseco e individual de minar, ganar “como moneda” simplemente por el hecho de quedarse con el botín y venderlo para adquirir otra moneda (la moneda como mercancía, fábrica de la especulación), sin embargo, con la incorporación de más y más nodos (y su hash-power) matemáticamente la complejidad de la red bitcoin se irá incrementando, reduciendo a su vez el botín, acercándose cada vez más a nivel de recompensa “0” (cero), ¿qué significa esto?, que los usuarios minadores sólo obtendrán como recompensa los ínfimos transactions fees generados, convirtiendo a los minadores en individuos sub-pagados (margenes de ganancia efímeros comparados con el poder de procesamiento que tuvieron que invertir para resolver los bloques), haciendo que los minadores en esas condiciones se retiren y toda la red bitcoin dejaría de funcionar correctamente.

¿Por qué ocurre esto?, las condiciones son diferentes en varios países, aunque en Venezuela tiene una explicación lógica, CADIVI y la restricción cambiaria.

La moneda como mercancía

Durante siglos la moneda fue el instrumento de canje con el que se tasaban productos y servicios y permitía intercambiarlos, en un mercado convencional, individuo “A” siembra una mazorca de maíz, su coste de producción es tasada en 5 monedas, por lo que individuo “A” la vende (para ganarle algo) en 8 monedas al productor de harina “B”, que le suma sus costes de producción (2 monedas por mazorca) y de dicha mazorca obtiene 2 envases de harina de maíz que tienen un coste de 5 monedas por paquete, vendiéndolas al comprador “C” en 8 monedas cada una.

En la actualidad, ciertas monedas se convierten en mercancía, como el dólar, esto es debido a las restricciones cambiarias impuestas en Venezuela, que hacen imposible a ciertos individuos acceder a los dólares necesarios para realizar sus compras e importaciones; entonces, individuos inescrupulosos toman el dólar adquirido a precio “A” más bajo y lo venden con sobreprecio a precio “B” a los interesados, no hubo ni bienes ni servicios, sino exclusivamente un intercambio de una moneda de un valor “ficticio” (impuesto por una entidad cambiaria alejada de la realidad) a otro valor ficticio (impuesto por los especuladores de moneda, en base a la capacidad de compra de los clientes).

El Bitcoin (y otras criptomonedas) se han convertido entonces en monedas de intercambio (la gente “genera” bitcoins, compra con ellos dólares, y vende los dólares en el mercado paralelo), no estoy criticando su uso (aunque me parece controversial el concepto de moneda como mercancía) sin embargo, mucha gente se dedica a minar desde la ignorancia, afectando el desempeño general de la red; aunque ciertamente es complicado escribir “recomendaciones de minería” que pudieran verse como “intentos” de adquirir divisas por métodos no descritos en la legislación y cometer un ilícito cambiario.

Sería interesante saber, por ejemplo, si el “distinguido” empresario Venezolano que compró una empresa que fabricaba dispositivos ASIC de minería (ASIC-miners) y su inventario de equipos por 1.2 millones de US$, los usará para generar una red bitcoin y una estructura de pagos alrededor de él (tipo MercadoPago pero con bitcoins), o será otro “garimpeiro más” que se dedicará a generar bitcoins para luego comprar dólares y venderlos en el mercado paralelo.

Otra pregunta sin respuesta, pero eso es otra historia …

Wow!, mino 1US$ diario, le estoy ganando a CADIVI!

Fue la expresión de alguien hace algún tiempo, cuando dedicó su computador 24/7 a minar litecoins usando una combinación de CPU/GPU, esto representaba 365US$ anuales, ciertamente un poco más de lo que CADIVI asigna anualmente para gasto electrónico (300US$), sin embargo, con la complejidad del bloque Litecoin, una GPU decente (una AMD RADEON R9 290, por ejemplo) tiene un costo de entre 400 a 800US$, a menos que tengas muy muy bien refrigerado tu centro de datos, el quemar la GPU de tu tarjeta de video (muy probable con la alta tasa de computo a la que es sometida diariamente) te llevará 2 años de minería recuperarla.
Incluso adquirir ASIC destinados a resolver los algoritmos scrypt y neoscrypt (o scrypt-n) de ciertas altcoins, será una inversión “a mediano-largo” plazo, puesto que la velocidad de resolución contrastará con la siempre incremental complejidad de la red.
A este factor, se unen 2 factores más que no tienen nada que ver con el usuario, la pésima velocidad de la red en Venezuela y una mucho más pésima infraestructura de servicios; si, ciertamente la velocidad del Internet promedio deja mucho que desear cuando una red exige 60 segundos de respuesta a un bloque que mide aproximadamente 500Kb y que hay que procesar con una prueba de trabajo cada vez más compleja (en el transcurso de redactar este artículo, ABA de CANTV me ha dejado sin conexión 3 veces), además cuando el blockchain (cadena de bloques) de Bitcoin mide 33GB sincronizarlo (un usuario nuevo tardaría 40 horas en descargarlo completo), pero esto no es nada al enfrentar un apagón de vez en cuando que pudiera “freir” nuestros equipos sin la protección debida (y la inversión necesaria en protección eléctrica y UPS sería mayor que la tasa de rentabilidad -profitability- que pudieramos obtener, por ejemplo, en la red Bitcoin) o simplemente “dejarnos a oscuras” y fuera de la red por mucho tiempo.

¿Me quedo mirando mientras los demás se hacen ricos?

No, no estoy diciendo eso, pero vale la pena entender los recursos que tenemos y/o pudieramos tener y dedicarnos a la red que más se adecúe a nuestros recursos, con la complejidad de los algoritmos actuales, la minería en pool parece más rentable que la tentadora pero traicionera minería en solitario (en promedio, una red como Litecoin “pudiera” otorgarte un bloque cada 300 días, aunque esto como es aleatorio, pudiera darse en mucho menos tiempo).

Minar Bitcoins con CPU es absurdo hoy en día (y costoso incluso a los costos de la electricidad en Venezuela), a menos que se apueste por minería de CPU como VertCoin o Darkcoin, si aún *considera* que tendrá suerte minando bitcoins y uniéndose a un pool, sería recomendable hacer una inversión inicial en ASIC Miners modernos que soporten *al menos* el algoritmo Scrypt (para permitirle “cambiar” a minería de Litecoins o Dogecoins); si con lo que cuenta es con tarjetas de video (perfectamente refrigeradas para que no se quemen) entonces busque altcoins con algoritmos ASIC-Resistant pero que tengan una alta rentabilidad; en general, es un proceso “a futuro” y la minería de altcoins (exactamente igual como pasó con Bitcoin en un inicio) es un proceso a largo plazo, por ejemplo, un dogecoin vale solamente 0,00005 de BTC (y bajo las perspectivas actuales de uso, su precio se mantendrá estable por un largo tiempo), en cambio, los Darkcoin tienen una alta expectativa de crecimiento a mediano plazo, Los peercoin y Paycoin mantienen un precio estable, mientras que Litecoin pierde el interés de inversionistas frente a otras altcoins más modernas.

Yuppies de sillón

Minar, y en general trabajar con criptomonedas, es un proceso de conocimiento, tanto de economía de moneda, de mercado, como de matemáticas y computación, no es “puse mi portátil a minar litecoins porque un amigo de facebook me dijo que eso hace plata”, hay “yuppies” que pasan toda su vida en Wall Street y ganan lo necesario para vivir y otros que llegan con el conocimiento, las ganas de invertir y se hacen ricos en 30 días.

Sería interesante saber de cual tipo de yuppie quisieras considerarte …

 

Happy Mining!

¡Feliz año 2015!

Reinicio actividades en 2015 deseándole a mis lectores un feliz año 2015, esperamos seguir contando con su presencia por estos predios digitales y yo espero seguir escribiendo para ganarme su aprecio.

 

Feliz y venturoso 2015! … y ya saben

Happy Hacking!

Impresoras: Entre el consumismo y el reciclaje

Tengo una impresora laser Samsung CLP-325 que compré hace poco más de 3 años, extremadamente fiel en el sentido de la impresión, solo ha recibido 2 cambios de toner magenta, imprime sin bandas de ningún tipo y pues, me ha salido muy bien en ese aspecto.

Donde no me he visto para nada satisfecho, es en esa capacidad infinita de estímulo al consumismo que fabricantes como Samsung obligan a sus clientes y he acá 2 anécdotas alrededor de esta impresora.

El sofisticado pote de plástico

Un día le estaba haciendo el servicio “de rigor” a la impresora (mi cuñado intentó imprimir usando cartulina brillante y se ensució el transfer kit) cuando de repente, al armarla, un sonido de “trancado” se escucha y se enciende una luz roja fija, comienza el pavor ¿qué se dañó?, ¿qué dañe?, pensando que era el fusor (transfer kit) lo saco una y otra vez, lo reviso y nada, la misma luz roja.

$_57

Revisando los códigos de error que emite el driver de auto-diagnóstico, este indica “replace waste toner”, ¿replace what?, según el manual, el “waste toner container” es un receptáculo para los residuos de polvo de toner, se va llenando poco a poco y tiene un “rendimiento” de aproximadamente 10 a 20 mil hojas, luego del cual debe ser reemplazado; el manual no dice absolutamente nada de algún tipo de servicio y me refiere a la página de ventas de Samsung para comprarlo por módicos 12US$.

Nunca había escuchado el concepto de una papelera que hubiera que botarla junto con la basura cada vez que se llena, pero vivimos en la época del consumismo y con tal de gastar, cualquier cosa se inventan.

Pensando que se trataría de algún sensor “oculto” (por más que vaciaba el polvo de tinta del mismo, este reportaba “replace waste toner”), decidí comprarlo y entonces comencé a buscarlo por ebay, amazon y en cualquier tienda (acá en Venezuela ese repuesto no se consigue) cuando de repente, un “review” en Amazon abrió mis ojos, decía:

“No gasten su dinero!, es un simple pote de plástico!, si lo lavan y secan muy bien también sirve”, revisando páginas de servicio y otros comentarios (y mirando mi propia impresora) descubro que hay un sensor infrarrojo por detrás del “Waste Toner Container” que apunta a una banda blanca que está detrás del mismo, si la luz infrarroja es difractada o absorbida por el polvo de toner, entonces la impresora “asume” que el “Waste Toner Container” está lleno y hay que reemplazarlo.

Tomando agua caliente, jabón líquido y algo de desengrasante, descargué todo polvo de toner del contenedor (en una bolsa plástica con papel húmedo, el polvo de toner es extraordinarimente perverso en lo que a ensuciar se refiere) y llené con agua caliente y jabón líquido, agitando muchísimas veces hasta que el agua dejara de salir gris, luego agua tibia con desengrasante (para evitar la grasa del jabón líquido), secarlo al sol (no directo, simplemente que las corrientes de aire evaporen toda el agua), en algunos lugares para los ansiosos recomendaron horno caliente a temperatura mínima por 5 minutos (sin que el plástico toque nada muy caliente); esperé que se secara y “voilá”, ¡contenedor de desechos limpio y operativo!.

Es insólito que dicho servicio no aparezca descrito en absolutamente ninguna parte del manual.

Imprimes hasta donde yo diga

El otro detalle que tuve con la impresora fue el utilizar toners recargados, al parecer (al igual que las Epson), las impresoras Samsung almacenan los códigos de los últimos toners insertados, un toner declarado “vacío” no puede ser insertado “lleno”, y la propia impresora le escribe en un chip a los toners, indicándole que están vacios.

Eso me pareció bochornoso, puesto que el kit de toners nuevos (cyan, magenta, amarillo y negro) cuesta 100US$; sin embargo, recordé que mi Epson C67 tenía un “software reset”, una aplicación hecha por un ruso que desbloqueaba las impresoras para que pudieran aceptar cartuchos genéricos y cartuchos recargados.

Buscando encontré alguien en Ebay, que vende el mismo software para las Samsung, a un costo de 10US$, ¡Extraordinario!, tomando en cuenta que en Mercadolibre Venezuela, alguien (que debe ser un simple revendedor o “bachaquero”) pretende vender lo mismo en 1500Bs.

Los toners requieren mucha protección para su traslado, incluyendo cintas de seguridad, plásticos que trancan los rollos internos, una bolsa de aire anti-impacto y una cantidad insólita de material que se descarta, como para además tener que botar el propio toner cuando se acaba, porque al fabricante se le antoja que dichos contenedores no pueden ser reciclados, rellenados o que se puedan utilizar genéricos de otros fabricantes.

Otros casos

Un amigo me reportó un caso similar con el transfer roll de su HP Laserjet, con “groseros” precios de servicio que rondan los 4 ó 5 mil Bs (mi impresora me costó hace 3 años 2000 Bs), buscando descubrí que dicho rollo no es más que un tubo de metal rodeado de una goma espuma, el “kit” para re-construir un transfer kit para una HP 1020 cuesta solo 15US$; lo cual es infinitamente más barato que comprarlo nuevo.

Si, ahorramos dinero y ayudamos al medio ambiente reduciendo los desechos, pero prevenir el consumismo es además aprendizaje.

Estancamiento tecnológico

Me encontré, en mi regreso a Barquisimeto, discutiendo con un profesor universitario acerca de las tecnologías libres (y las tecnologías modernas en general)  y su impacto en “la comodidad” y en el estancamiento tecnológico de la sociedad.

Todo comenzó hablando de “tecnologías que usabamos” (en vista de que yo saqué mi portátil en el carro para cargar mi teléfono y al abrir la pantalla se vió el Debian Linux instalado) y de para qué las usábamos, le comenté que venía de dictar un taller de OpenLDAP en Caracas y la semana pasada había terminado uno de postgreSQL 9.3, que estaba planificando uno de PL/Python y un hacklab de PL/Javascript-v8 con datos JSON, a la usual pregunta ¿y a qué se dedica?, vinieron los elogios a Python (y que lo estaba aprendiendo para cosas *personales*) y que estaba aprendiendo algunas cosas de .NET mientras en su universidad enseña C, C++ y algunos proyectos los pide en Java (en mi mente vino la imagen de algún viejo y desgastado libro de Turbo Pascal de Luis Joyanes Aguilar en la Biblioteca de la universidad), defendió su uso ya que enseña “lo básico para aprender a programar” y que era muy difícil en esta época de modernidad tecnológica, diferenciar las tecnologías emergentes de “la moda”, así que era mucho mejor seguir con lo clásico y tradicional, eso lo bauticé como “estancamiento tecnológico”, comentario que no fue del agrado del profesor.

Yo hablaba de “estancamiento tecnológico” ante la imposibilidad de ciertas universidades de mejorar su currícula de informática (e incluso otras carreras), su argumento, aparentemente válido, hace referencia a que las universidades no pueden dedicarse a enseñar “moda” (habla que muchas cosas se hacen populares por moda y no por su idoneidad técnica) y que las tecnologías seleccionadas por ellos eran mucho más fáciles de asimilar por estudiantes y que eso les habría “el mercado” para aprender nuevas cosas, además, tecnologías como Windows XP llevan con nosotros demasiado tiempo y estamos “demasiado acostumbrados” como para saltar “de una” a nuevas y radicalmente diferentes tecnologías como Linux, sólo porque se van haciendo populares o porque alguien “lo decrete”.

Bajo ese argumento, las universidades deben fomentar la “homogeneidad” y la “estandarización” por sobre la modernidad y/o “la moda”, base fundamental para que nuestra sociedad no “sucumba” ante tecnologías invasivas que pudieran, de plano, echar por el piso el trabajo de años de formación e investigación en las universidades y dejar a miles de estudiantes y profesores sin trabajo, simplemente porque la sociedad decidió usar nuevas tecnologías que la universidad no está aún preparada para enseñar.

Es extraño que se defienda el estancamiento tecnológico bajo esos argumentos, antes de las Neveras existían Cavas en las casas, para tener hielo y cosas frías, la gente compraba hielo a grandes fábricas de hielo y lo depositaba en dichas Cavas, algunas muy “modernas” con revestimiento de cobre (mantienen el frío más tiempo, pero desde hace tiempo se sabe que el cobre es tóxico) y todo transcurrió sin problemas hasta la llegada de los refrigeradores eléctricos, desaparecieron las grandes fábricas de hielo, muchos perdieron su trabajo o se dedicaron a otras cosas, se crearon incluso nuevos oficios (refrigeración comercial y doméstica) fue pues, una tecnología nueva altamente invasiva en un mercado homogéneo completamente acostumbrado a una única forma de hacer las cosas y, salvo para guardar las cervezas en alguna reunión, dudo que hoy en día alguien eche de menos esa forma de tener hielo en casa.

Entonces, ¿no es acaso el mismo argumento? pues en efecto, una cava es una tecnología más estandarizada, más sencilla de aprender y mucho menos invasiva que un complejo, difícil de reparar y mantener y más invasivo que un Refrigerador, ahora me gustaría saber si alguien en la actualidad abandonaría su Refrigerador para tener una cava forrada de cobre llena de hielo en su casa.

¿Estamos estancados?, ¿o no debemos sucumbir ante la moda y la modernidad en pos de mantener el mercado y las posibilidades a nuestros estudiantes?, ¿debemos modernizarnos a fuerza y riesgo o mantenernos en la zona de confort? …

Si me preguntan, me sentía estancado porque aún no he aprendido angular.js ni Go, pero en retrospectiva siento que más bien me salgo mucho de una zona de confort …

¿qué opinarán mis lectores? …

Las bases de datos gritonas: una explicación a Unicode

Cuenta la cultura de Internet que escribir todo en mayúsculas es gritar, parte de la “etiqueta de Internet” (o Netiqueta) surgió de las nuevas formas de comunicación, como los BBS y los foros de discusión que llevaron incluso a la IETF a categorizar dichas reglas de etiqueta en un RFC (RFC 1855).

Es por eso que, ¡SI LES ESCRIBO ASÍ LES ESTOY GRITANDO!, ¡OYERON! …

“El grito” en bases de datos

En los inicios, cuando sólo existía ASCII, las cadenas de texto sólo podían ser representados con algunos de los 127 carácteres de 7-bit representados en la tabla ASCII:

Para los niveles de almacenamiento de la época era más que suficiente, además la cantidad de “idiomas” incorporados a la computación además del inglés era “casi nula”, así que ASCII vivió sus días de Gloria escribiendo bases de datos con simples y hermosas letras (mayúsculas y minúsculas) no acentuadas.

Sin embargo, las computadoras almacenaban bytes de 8-bits, así que nos sobraba “un bit”, muchas personas alrededor del mundo tuvieron ideas “diferentes” de cómo representar más carácteres, en general, la forma más popular fue el estandar ANSI-ISO/IEC 8859, que “más o menos” mantenía intactos los primeros 128 carácteres pero agregaba otros más como “la eñe” y la á acentuada.

Esto creó un grave problema para los “trabajadores” de las bases de datos, que ahora tenían que lidiar entre JOSE, JoSE, JOSé y JOSÉ como derivaciones del mismo escrito (pero a nivel lógico, cadenas completamente diferentes), convenciones como “todo debe escribirse en mayúsculas y sin acentos para evitar problemas” comenzaron a surgir.

Otro punto a favor de este mito ocurrió con los Code-pages, cada “idioma” en ISO-8859 tenía su propia “codificación” (ejemplo: para el alfabeto latino era ISO-8859-1) por lo que el ISO-233 (é latina con acento agudo) en el conocido latin1, representa la letra yā (ي) en ISO-8859-6 árabe lo cual significaba DESASTRE a la hora de mover aplicaciones de datos de un idioma a otro.

En definitiva, el mundo en los 90 eran distintos, apenas “saliendo” de la guerra fría, nadie se le hubiera ocurrido tener más de un idioma en un mismo computador, mucho menos almacenar datos en diversos idiomas.

Y en eso llegó Internet …

Con Internet vino el advenimiento de las comunicaciones globales y de hecho, se “enraizaron” los fundamentalistas que, con más razón, las bases de datos debían almacenar los datos con la menor complejidad posible, incluso, si eran 7-bit ASCII, que fueran los octales más bajos (las letras mayúsculas), y así se ha mantenido muchísimas cosas hasta ahora.

Con Internet llegó UNICODE, y con él una mejor forma de escribir todos los caracteres posibles inventados por el hombre (UTF-7, 8, 12 ó 16).

Unicode en parte se sincroniza con ASCII-7 en sus primeros carácteres (por eso, ARBOL en ASCII y ARBOL en UTF8 se representan igual), sin embargo “Árbol” o “ñandú” se representan con carácteres acentuados en valores octales distintos en ISO-8859-1 y en UTF-8.

¿y el espacio?

Como es imposible representar miles y miles de carácteres con solamente 8-bits, entonces UNICODE echa mano del multi-byte, es decir, un glifo o carácter puede requerir más de un byte para representarse, algunos dicen “Unicode es un sistema de 16-bits por ende una cadena UNICODE mide más que una cadena ASCII o Latin1″, es entendible este error común acerca de un encoding multi-byte, pero es errado.

En general, Unicode es multi-byte, así que aquellos (y sólo aquellos) glifos que no pudieran ser representados con 8-bits serán representados con más de un byte; ejemplo, una A ocupa los bits “0100 0001″:

A -> 0100 0001

A mide 8-bits, por ende, en UTF-8, los carácteres de la tabla desde 0-127 serán representados por un solo BYTE (la razón por la cual, “ARBOL” en ISO-8859-1 y “ARBOL” en UTF-8 lucen exactamente idénticos), el resto de carácteres y glifos serán representados por combinaciones de 2 y hasta 6 bytes.

Un buen ejercicio es crear en postgreSQL 2 bases de datos, una en SQL ASCII y otra en UTF-8, llenarla con cadenas regulares y preguntar ¿cual mide más?:

He creado una tabla “testnames”:

CREATE TABLE testnames
(
 id serial NOT NULL,
 test character varying,
 CONSTRAINT pk_test PRIMARY KEY (id)
)

La cual hemos llenado con 1000 cadenas sencillas:

insert into testnames(test) select * from  repeat('abcdef',1000);

Y luego le preguntamos a TOAST cuanto miden ambas tablas:

select pg_column_size(test), pg_column_size(repeat('abcdef',1000)) FROM testnames;

Lo cual es *no* sorprendentemente el mismo resultado:

pg1

abcdef mide exactamente igual (en bytes) en UTF-8 que en ISO-8859-1 (32Kb en espacio en disco).

¿Dónde queda la META?

El gran culpable de esta discusión es el carácter de error de encoding o -> � el cual tristemente aparece en más páginas web de las que uno se imagina; pero para algo que se cura con:

Content-Type: text/html; charset=UTF-8

O usando XML con:

<?xml version="1.0" encoding="UTF-8"?>

No entiendo por qué para “evitar” tener que codificar y re-codificar adecuadamente (o forzar una codificación en las aplicaciones a nivel programático) entonces ¿por qué no seguir escribiendo con únicamente los primeros 128 carácteres de la tabla ASCII?

Porque vivimos en un mundo globalizado.

¡YO NO ME LLAMO ASÍ!

En efecto, nuestro hermoso idioma, el español, difiere en muchísimas cosas del inglés (que valgame Dios, puede ser escrito bien con ASCII, UTF-8, ISO-8859-1 y con *casi* cualquier codepage o charset que exista), empezando por su nombre y esa letra N con sombrerito sinuoso (la Virgulilla o “rabo e’ cochino” para los venezolanos), pero igual de hermoso es el cirílico, el arameo o el árabe, por ende, pretender decirle al mundo que toda cadena plana y llana es un ASCII es un absurdo.

De hecho, como leí por allí alguna vez ¡”no existe esa cosa mal llamada el *texto plano*”, punto!.

Hay miles de millones de personas leyendo en idiomas y codificaciones de carácteres que van más allá del carácter 127, hay que respetarlos.

¡Y no!, mi nombre, mientras la Real Academia Española de la Lengua no derogue los acentos es Jesús, no es JESUS ni jesus; Es *Jesús*, con la J mayúscula (en señal de un nombre) y con la ú acentuada, es que incluso, si se escribe en mayúsculas, es ¡JESÚS!, esa regla que algunos se inventaron de que “las cosas en mayúsculas no se acentúan” no existe.

La codificación Moderna

El último incoveniente viene de la adaptación, mientras algunos profesores universitarios aún dan clases de bases de datos con viejos dinosaurios como FoxPro (ASCII), Access (ISO-8859-1) ú Oracle 8 (ANSI UNICODE) (todas de fines de los 90, cuando UTF-8 estaba en pañales) en la actualidad, interactuar con usuarios de diferentes codificaciones viene reflejado por simplemente ejecutar un:

SET NAMES = 'UTF8'

E incluso, bases de datos modernas como PostgreSQL soportan diversas codificaciones entre bases de datos y diversas versiones (COLLATIONS) de UNICODE incluso en una misma tabla, con columnas en diferentes locales; además, “ARBOL” y “arbol” y “Arbol” son completamente iguales si usamos ILIKE y otros tipos de búsquedas no-sensibles al uso de mayúsculas.

Dejo de gritar …

¡Oye!, ¡Qué ese pájaro no se llama Ñandú, sino NANDU! …

La posibilidad infinita de permitirle a una persona escribir su nombre, correctamente, con todas sus letras, acentos y carácteres diacríticos es para mí, más que suficiente, para adaptarme y hacer conversiones de CHARSET a conveniencia, hacer operaciones de “Capitalizado” y “lowercase” y agregar etiquetas META correctamente, que tener que almacenar sólo 127 carácteres por ahorrarme unos pocos bytes y un esfuerzo de codificación (y decirle a la gente que no se llama como lo registraron en su partida, sino como a mí, el DBA de turno, me da la gana llamarlo).

A ver si nos modernizamos un poco y abandonamos ese hueco en la arena donde te escondiste con tu ANSI SQL89 y tu SQL ASCII y nos alzamos de patas como las Suricatas, para ver que hay un hermoso mundo que describir allá afuera …

… y por favor, ¡con acentos!.

[OpenLDAP] Password policies

He incorporado una nueva entrada sobre openLDAP, referente a los password policies (política de contraseñas).

Puedes leerla acá: http://blog.phenobarbital.info/2014/10/openldap-password-policies/

Del por qué Lácteos los Andes usa UPC y no EAN

y otras absurdas afirmaciones …

 

Mientras dictaba una charla-taller de postgreSQL y programación en PL/Python, se me ocurrió hacer algo bastante simpático y que a Python se le da bastante bien y es una operación matemática, más especificamente para validar el código de barras de los productos (código EAN) y puse a mis compañeros a escribir una sencilla función en PL/Python y que, combinada con un Dominio, funcionaba de maravilla.

Eso, me llevó a escribir el siguiente artículo en mi blog técnico.

para saber más: http://blog.phenobarbital.info/2014/10/crear-un-dominio-en-postgresql-para-validar-codigos-de-barra/

 

Sin embargo un resultado imprevisto surgió de dicho ejercicio, y es que al taller nos enviaban refrigerios variados de Lácteos Los Andes (naranjada y jugos) y al intentar probar nuestra función de códigos de barra, los códigos de barra de dichos productos fallaban …

¿Cómo puede ser eso?, ¿cómo la industria láctea “bandera” del Estado Venezolano puede estar emitiendo códigos de barra corruptos en sus propios productos? …

Pues para quien no lo crea, acá una foto:

Choco-Lat Lacteos Los Andes

Choco-Lat Lacteos Los Andes

El producto es un “Choco-Lat”, bebida achocolatada hecha por Lácteos Los Andes en las plantas de Nueva Bolivia, Estado Mérida y Cabudare, Estado Lara, también lo verifiqué en el Papelón con Limón y el jugo mixto.

codigo_barras

Entre otras cosas:

  • El código tiene un valor par (12) de longitud, lo que lo hace un UPC Americano (Universal product Code)
  • Aunque el código de empresa está bien (709862) al no empezar en cero (0709862) falla el reconocimiento por ser un código de producto erróneo para el checksum digit asociado.
  • Si el código de producto fuera 01201 y no 01301, el checksum sería 4, el código sería: 709862012014 y la función indicaría que es un código válido.
  • 709 es el código GS1 para Noruega (en EAN)
  • El Global Trade Item Number válido para ese producto debería ser: 00709862013011

Tal vez Lácteos Los Andes buscaba “ahorrarse dólares con GS1″ dirán alguien por allí, sin embargo, este es un trámite que sugiere el propio organismo regulador SENCAMER (Una institución del Estado) y la representación de GS1 en Venezuela (Adscrita a FONDONORMA) emite códigos EAN completamente gratis a las empresas que se inscriban y paguen una membresía anual en GS1 de Venezuela.


GLN 0709862000004
UPCPrefix 709862
GS1Prefix 0709862
CompanyName Lacteos Los Andes, C.A.
StreetAddress Apartado 51442
City Caracas
ZipCode 1050-A
StateProvince
Country Venezuela
PrefixStatus Active
ModifiedDate 2013-11-22T00:00:00

¿Por qué entonces, en vez de usar códigos EAN universalmente aceptados, echa mano de códigos UPC americanos?

Como dice la propia página de GS1:

GTIN-12 (UPC-A): this is a 12-digit number used primarily in North America

Esta bien, ellos son buena-nota con el Imperio y decidieron etiquetar no con el universal EAN-13 o GTIN-14 sino con UPC-A americano y pagar los 2500US$ (con renovación anual de 500US$) que UCC exige por usar el código, mientras que en Venezuela, con el apoyo de SENCAMER, le pagas una membresía anual en bolívares a GS1 de Venezuela, con emisión de códigos EAN-13 completamente GRATIS.

Pero no, UPC/GTIN-12 es un código más chevere, porque tal vez pensamos exportar papelón con limón para USA.

Sigan mi nuevo (viejo) blog!

Mi blog phenobarbital.info se había quedado sin hosting por casi un año, he vuelto a recuperarlo de sus respaldos y está ahora online.

Será netamente técnico con algunas dosis de frikismo geek, así que los espero por allá y lo sigan tanto como a este.

Si notan mucha publicidad en ese blog, bueno, les pido disculpas de antemano, el blog está en un hosting VPS que se debe pagar y aunque trato en lo posible de seguir en mi ruta de publicar lo más que pueda sobre software libre y abierto en español, necesito cubrir los gastos del VPS y los ads son una forma de hacerlo.

Espero no les molesten mucho, le den algunos “clicks” y mantengan vivo ese blog.

 

Gracias y por allá los espero!.

 

[OpenLDAP] Bitácora de instalación

He decidido recuperar mi blog técnico, y para comenzar su uso, he incluído una completa guía de instalación, configuración y personalización del servicio de directorio OpenLDAP bajo Debian GNU/Linux.

Espero poder contar con sus visitas y comentarios en esta nueva etapa de documentación en mi blog.

Gracias y allá nos vemos!

[PostgreSQL] Crear triggers dinámicos con postgreSQL

¿Qué es un trigger dinámico?, es aquel trigger que la metadata de en cual tabla/campo va a operar es pasado de manera dinámica (parámetros) a la función de trigger (trigger function).

¿Y para qué sirve?, bueno, imaginen un sistema dónde cada operación debe ser por ejemplo, agregada a una tabla auditoría, o por ejemplo, que una operación en una tabla, causa una operación en otra tabla, que aunque el código sea *casi* el mismo, depende de la tabla que dispara el trigger, qué tabla va a operar.

La utilidad de esto es simplemente poder re-utilizar una única funcion trigger para diversas acciones a ser tomadas de acuerdo a los parámetros recibidos.

El ejemplo

Este ejemplo se construyó durante un taller de postgreSQL que estaba dictando, el criterio era el siguiente:

  • El trigger toma el valor insertado en una tabla
  • Busca dicho valor en otra tabla, usando otro campo como criterio
  • Si el valor no existe, retorna NULL
  • Si el valor existe, retorna el objeto NEW del disparador, con lo cual la inserción sí ocurre

Los campos TG_*

En los disparadores de postgreSQL se cuenta con un conjunto de variables muy útiles, como son:

  • TG_OP: define la operación realizada en la tabla (INSERT, UPDATE o DELETE)
  • TG_TABLE_SCHEMA: define el schema al que pertenece la tabla (ej: “public”)
  • TG_TABLE_NAME: define el nombre de la tabla que disparó este trigger
  • TG_ARGV: es un arreglo (array []) que contiene los parámetros enviados a una función de trigger.

Con esto podemos hacer cualquier tipo de condicional en la función de trigger, reduciendo el código a sólo una función que se usará, de acuerdo a los parámetros que se le pasen.

La Función

CREATE OR REPLACE FUNCTION permitir_insert() RETURNS trigger AS

Comenzamos con la definición, la llamaremos “permitir_insert()” y obviamente, retorna un trigger.

luego, en la sección de declaración, definimos las únicas variables que vamos a necesitar para este ejemplo:

 vrecord integer;
campo text;
tabla text;
id int;
rc int;

BEGIN

En el cuerpo de la función, preguntamos qué tabla y campo voy a consultar para verificar si permito o no el insert, esto se hace consultando a TG_ARGV:

 tabla := TG_ARGV[0];
campo := TG_ARGV[1];

Como ven, ya que podamos recibir cualquier cantidad de parámetros en el trigger, las opciones son infinitas.

Ahora, necesito saber que hay en el campo trigger (NEW.campo), en este caso, debo reemplazar “campo” con el nombre del campo de la tabla que disparó el trigger (y que voy a consultar en otra tabla), como en mi caso el valor de el “campo” en todas las “tablas” que usarán esta función de trigger es entero, he declarado “vrecord” integer, si su tipo será distinto, sería conveniente declararlo “anyelement”.

EXECUTE 'SELECT ($1).' || quote_ident(campo) || '::text' INTO vrecord USING NEW;

Lo que hace ese código, es ejecutar un $1.”campo”::text (dónde campo es una variable) y mete su valor en la variable “vrecord”, se usa el objeto NEW para la sustitución del $1.

Ejemplo, si el campo se llama “piezas“, ese “EXECUTE” quedaría “NEW.piezas” y entonces metería el valor de NEW.piezas en la variable “vrecord”.

¿sencillo, no?.

La consulta

Ahora, debo verificar que en el campo “campo”::text de la tabla tabla::text (variable) existe un valor con lo que está contenido en “vrecord”, de lo contrario retorno NULL y el trigger no se ejecuta (la operación de inserción no ocurre).

Sería algo como un “constraint” pero sin usar reglas de constraint, ¿entendido?.

IF TG_OP = 'INSERT' THEN

EXECUTE format('SELECT '||quote_ident(campo)||' FROM '||quote_ident(tabla)||' WHERE '||quote_ident(campo)||' =$1') USING vrecord INTO id;

En este caso, he ejecutado un SELECT (SELECT “campo”::text FROM “tabla”::text WHERE campo::text = vrecord), claro que haciendo las conversiones y los reemplazos respectivos.

El valor de esa ejecución lo agrego a la variable id.

Si adicionalmente se desea averiguar si esa consulta anterior retornó filas, colocamos seguidamente al EXECUTE:

GET DIAGNOSTICS rc = ROW_COUNT;

Si “rc” es igual a cero, entonces no existe el valor “vrecord” en el campo “campo” de la tabla “tabla”, caso contrario, se retorna NEW.

 IF rc = 0 THEN
    RAISE EXCEPTION 'no existe el valor % en el campo % de la tabla %', vrecord, campo, tabla;
    RETURN NULL;
END IF;
RETURN NEW;

Y listo!, definimos el cierre y que esta es una función VOLATILE:

END;
LANGUAGE plpgsql VOLATILE

Y ya podemos usarla.

Usando la función dinámica

Para usar la función dinámica, simplemente creamos un trigger en cada tabla que necesite convocarla, pasando como parámetros de la función trigger la tabla referencia y el campo que debe evaluar, ejemplo:

CREATE TRIGGER trg_insert_detalle_reportes
BEFORE INSERT
ON reportes
FOR EACH ROW
EXECUTE PROCEDURE permitir_insert('reportes', 'id_reporte');

Se insertará un detalle de reporte, solamente si el valor de “id_reporte” aparece en la tabla “reportes”.

Conclusiones

Sé que parece muy “rebuscado” un ejemplo que bien podría salir con una clave foránea, pero sirve para el hecho de demostrar la posibilidad de obtener e iterar sobre el objeto NEW, consultar metadata al “information_schema” o realizar cualquier operación de manera dinámica, pasando parámetros y consultando las variables mágicas TG_* de postgreSQL.

¿Se les ocurre alguna idea para estos triggers dinámicos? …

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 3.222 seguidores

A %d blogueros les gusta esto: