Últimas entradas
La razón de BDD. (Behaviour Driven Development) Parte 3
Carlos Barbiero publicó esto el 27/08/10 en Calidad, Herramientas, Ingeniería de Software, Negocios. 2 comentariosRedefiniendo el problema
No todo es pesimismo sin embargo. Hay muchos equipos por ahí que hacen sus entregas de proyectos a tiempo, dentro del presupuesto, y deleitan a sus participantes titulares, y se las arreglan para hacer una y otra vez. No es fácil. Se necesita disciplina y dedicación, y se basa en un alto grado de comunicación y colaboración, pero es posible.
El Desarrollo Orientado al Comportamiento es una de varias metodologías ágiles. En concreto se trata de una metodología ágil de segunda generación, construído sobre el labor de unos muchachos realmente inteligentes. Vamos a ver cómo estos métodos Agiles se produjeron y cómo abordar los riesgos de los proyectos tradicionales, entonces podemos ver cómo BDD nos permite concentrarnos en la escritura de software, que es realmente lo que importa.
Cómo hacen frente a los riesgos del proyecto los métodos Ágiles
Los autores del manifiesto van mucho más allá de las pocas líneas antes mencionadas en el mismo. También documentaron los principios que sustentan su pensamiento. Cabe destacar en este es un deseo de “ofrecer software de trabajo con frecuencia, desde un par de semanas a un par de meses, con una preferencia a la escala de tiempo más corto.”
Imaginemos por un momento que usted puede hacer esto, a saber, la distribución de software de calidad de producción cada dos semanas para sus grupos de interés, en su proyecto actual, en su organización actual, con su equipo actual, a partir de mañana. ¿Cómo se hace frente a los riesgos tradicionales de entrega que se indicaron antes?
No más entregas tardías según el presupuesto
Como las entregas son pequeñas, iteraciones de una o dos semanas o mini proyectos, utilizando un equipo pequeño, de tamaño fijo, es fácil de calcular nuestro presupuesto del proyecto: se trata simplemente de la velocidad de producción del equipo en el número de semanas, además de algunos de hardware y licencias.
Siempre partimos de una suposición razonable en el tamaño total del proyecto, es decir cuánto estamos dispuestos a invertir en la solución del problema de negocio en el primer lugar, y se da prioridad a las características apropiadamente, entonces el equipo puede entregar las cosas realmente importantes en las iteraciones tempranas. (Recuerde, estamos entregando por característica, no por módulo). Así
a medida que hacia el momento en que el dinero se acaba, debemos, por definición, trabajar en funciones de menor prioridad. También podemos medir la cantidad que realmente se produce en cada iteración, conocida como nuestra velocidad o rendimiento, y usar esto para predecir cuando en realidad estamos con probabilidades de terminar.
Si, como nos acercamos a la fecha límite, las partes (clientes) siguen teniendo ideas y características nuevas y ven las cosas maravillosas sucediendo, pueden optar por financiar el proyecto de unas pocas iteraciones más. A la inversa que pueden decidir antes el plazo que es suficiente para la funcionalidad que ha sido entregada, o bien que quieren terminar temprano. Esta es otra opción que tienen.
No más entregas de cosas incorrectas
Estamos entregando los programas necesarios para los interesados cada dos semanas (por ejemplo), lo que significa que estamos ofreciendo características demostrables. No tenemos dos semanas de “repetición de esquema de base de datos” o “repetición de middleware.” Después de cada iteración podemos demostrar las nuevas características para los interesados y pueden hacer ningún ajuste o corregir cualquier malentendido cuando la obra está aún fresca en el desarrollo equipo de la mente. Estos regulan, a pequeña escala micro-correcciones que garantizan que no se terminan hasta varios meses abajo de la línea con el software que simplemente no hace lo que los actores querían.
Para dar inicio a la siguiente iteración podemos reunirnos con los interesados para reevaluar las prioridades de las características en caso de que algo ha cambiado desde el pasado tiempo. Esto significa que cualquier nueva idea o sugerencia se pueden programar, y la cantidad correspondiente de trabajo puede ser descomprimida (tiempo extra)
No más inestable en Producción
Estamos entregando cada iteración, lo que significa que tenemos que ser buenos en la construcción y en el despliegue de la aplicación. De hecho contamos con la automatización en gran medida en proceso para manejar esto por nuestra cuenta. No es raro que un equipo Agil con experiencia produzca más de 100 construcciones de buen software cada semana.
En este contexto, liberar a la producción o pruebas de hardware puede ser considerado simplemente otra costrucción para otro ambiente. Los servidores de aplicaciones se configuran automáticamente y se inicializan, esquemas de bases de datos que se actualizan automáticamente, el código es automáticamente incorporado, montado y desplegado a través del cable, todo tipo de pruebas se ejecuta automáticamente para asegurar que el sistema se está comportando como se esperaba. De hecho, en un entorno ágil, la relación entre el equipo de desarrollo y las operaciones “río abajo” y los DBA es a menudo mucho más saludable y más solidaria.
Ya no es costoso mantener
Este último es uno de los mayores beneficios tangibles de un proceso ágil. Después de su primera iteración el equipo está en modo de mantenimiento eficaz. Ellos son la adición de características a un sistema que “funciona” por lo que tienen que ser muy cuidadosos.
Suponiendo que pueden resolver las cuestiones de la seguridad de cambiar el código existente a fin de no introducir a los defectos de regresión, sus prácticas de trabajo deberían ser exactamente las mismas que los desarrolladores de apoyo intermedio. No es raro que un equipo de desarrollo ágil trabaje en varias versiones de una aplicación al mismo tiempo, la adición de características a la nueva versión, la prestación de apoyo directo a una versión temprana recientemente publicada, y proporción de corrección de errores apoyando a una versión de producción de más edad
Traducido al castellano de “The Rspec Book, BDD with Rspec, Cucumber and Friends” Chapter 7 de David Chelimsky http://www.pragprog.com/titles/achbd/the-rspec-book ISBN: 978-1-93435-637-1
Barcode4J en JRuby y Rails
Carlos Barbiero publicó esto el 13/08/10 en Herramientas, Java, Lenguajes de Programación, Noticias, Open Source, Ruby. Un comentarioEn el post anterior había explicado el uso de Gbarcode, una librería para generación de códigos de barras con Ruby. El problema es que esta librería no se puede utilizar en Jruby ya que tiene extensiones nativas en C, cosa que Jruby aún no soporta.
Después de investigar alternativas de generación de codigos de barras para java como Zxing y Barbecue. Me quedé con Barcode4j por facilidad de implementación, documentación (la cual es muy completa) y sobre todo estabilidad.
A continuación paso a comentarles como utilizar esta librería en JRuby.
1) Lo primero es descargarse en paquete binario del sitio o bien de este enlace directo.
2) Al descomprimir el Zip, copiamos el contenido del directorio Build al directorio /lib de nuestra instalación de JRuby
3) Ahora vamos al código:
require 'java'
#Importamos algunas librerías que vamos a utilizar
import 'java.awt.image.BufferedImage'
import 'java.io.OutputStream'
import 'java.io.FileOutputStream'
#Importamos las librerías de los códigos de barras (Barcode4j) que necesitamos
import 'org.krysalis.barcode4j.impl.code39.Code39Bean'
import 'org.krysalis.barcode4j.impl.code128.Code128Bean'
import 'org.krysalis.barcode4j.impl.int2of5.Interleaved2Of5Bean'
import 'org.krysalis.barcode4j.impl.codabar.CodabarBean'
import 'org.krysalis.barcode4j.impl.code128.EAN128Bean'
import 'org.krysalis.barcode4j.impl.pdf417.PDF417Bean'
import 'org.krysalis.barcode4j.impl.upcean.EAN13Bean'
import 'org.krysalis.barcode4j.impl.upcean.EAN8Bean'
import 'org.krysalis.barcode4j.impl.upcean.UPCABean'
import 'org.krysalis.barcode4j.impl.datamatrix.DataMatrixBean'
import 'org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider'
import 'org.krysalis.barcode4j.tools.UnitConv'
#Creamos el Bean y establecemos los dpi y wide_factor
bean = Interleaved2Of5Bean.new()
dpi = 150
bean.wide_factor = 3
#Creamos la imagen
ofile = java.io.File.new('/home/laptop/barcodes/barcode.png')
out = FileOutputStream.new(ofile)
canvas = BitmapCanvasProvider.new(out,"image/x-png", dpi, BufferedImage::TYPE_BYTE_BINARY, false, 0)
#Generamos el código de barras
#El segundo parámetro que pasamos es el número del que deseamos generar el codigo de barras
bean.generate_barcode(canvas, '1234567890');
canvas.finish
out.close
Con esto, generamos una imagen con nuestro codigo de barras en /home/laptop/barcodes/barcode.png la cual se puede incluir en cualquier pdf/html/odf, etc.
Espero les sea útil. Cualquier duda, no duden en comentar.
Charla ‘Tendencias nuevas y no tan nuevas, y tecnologías emergentes en el desarrollo de aplicaciones’ en JUTI 2010
Roxana Pintos publicó esto el 10/08/10 en Calidad, Open Source. Un comentarioEn el marco del XI Jornadas Universitarias Tecnológicas sobre Informática (JUTI) a realizarse en la Facultad Regional Resistencia – UTN, el Lic. José A. Ramirez de IPCorp SRL brindará la Charla ‘Tendencias nuevas y no tan nuevas, y tecnologías emergentes en el desarrollo de aplicaciones‘ el día Viernes 13 de agosto de 17.30 a 18.30hs.
El Lic. José A. Ramirez se graduó en la Universidad Nacional del Nordeste como Licenciado en Sistemas. Es especialista en Arquitecturas de Software. Desarrollador J2EE, Ruby y Ruby on Rails. Administrador de base de datos PostgreSQL.
La charla tratará sobre las nuevas y emergentes tecnologías IT que se espera que ayuden a las empresas a mejorar su eficiencia y a resolver los problemas actuales. Se delinearán las tendencias para la industria IT, el desarrollo de aplicaciones web y enterprise.
Se incluirán tópicos como:
- Nuevos lenguajes
- Lenguajes Dinámicos
- Bases de datos no-relaciones
- Arquitectura Orientada a al Web (WOA)
- Cloud Computing
- Frameworks de desarrollo
- La próxima generación de aplicaciones para móviles
- Nuevos modelos de aplicaciones
Cabe mencionar que la empresa Desarrollos Nea SRL también estará presente y brindará dos charlas: el día Miércoles 11/08 de 18.45 a 20.15 hs, Visual Studio 2010: ASP .NET MVC2 + Entity Framework. Disertantes: Ing. José Fernandez – Ing. Cristina Dacunda y el Viernes 13/08 de 18.45 a 19.45 hs, Certificar Desarrollo de Software con normas ISO. Disertantes: Ing. Diego Morales – Ing. Lautaro Lomazzi.
Para más información respecto de charlas y horarios, pueden visitar el siguiente enlace Cronograma Juti 2010
IPCorp S.R.L. certificó su Sistema de Gestión de Calidad bajo Normas ISO 9001:2008
Roxana Pintos publicó esto el 05/08/10 en Calidad. Un comentarioCon enorme orgullo y satisfacción queremos compartir el haber obtenido la Certificación de nuestro Sistema de Gestión de Calidad bajo Normas ISO 9001:2008 la cual fue otorgada por IRAM (Instituto Argentino de Normalización y Certificación).

Esta Norma Internacional promueve la adopción de un enfoque basado en procesos cuando se desarrolla, implementa y mejora la eficacia de un sistema de gestión de la calidad, para aumentar la satisfacción del cliente mediante el cumplimiento de sus requisitos.
El alcance del Sistema del Gestión de Calidad abarca la comercialización, análisis y diseño, programación, testing, implementación y mantenimiento de soluciones de software propios y a medida bajo herramientas de licencia libre.
IPCorp S.R.L. es una empresa de desarrollo de software y soluciones de infraestructura orientada principalmente al uso de herramientas Open Source para el desarrollo de soluciones enterprise. Contamos con un equipo de profesionales destacados en:
- Desarrollos de soluciones:
- Sistemas críticos con Framework de desarrollo propio de aplicaciones web basado en Java cuya principal característica es la facilidad de integración con los estándares J2EE y herramientas comerciales existentes.
- Soluciones enterprise con Ruby on Rails.
- Soluciones de base con C++ y Python.
- Migraciones críticas:
- Unix System V a GNU/Linux, en particular Red Hat Linux.
- Archivos de datos IdeaFix y COBOL a Base de datos relacionales.
- SQLServer y Oracle a PostgreSQL.
Este logro tan importante se obtuvo junto a otras empresas del sector gracias a un fuerte trabajo asociativo que se inició en el mes de abril del 2009 junto al Polo IT Corrientes.
La entrega de los Certificados de Calidad se realizó el pasado 29 de julio del presente año en el acto de apertura del Seminario “Tendencias de la Industria IT a nivel global y Desarrollo de Polos Tecnológicos Regionales”, en el marco del XIII Congreso de CFESSI (Consejo Federal de Empresas de Software y Servicios Informáticos) realizado en Corrientes, organizado por el Polo IT Corrientes y que reunió a principales representantes de la industria SSI del país.
Subir múltiples archivos con JQuery, Rails y almacenarlos en la Base de Datos
Carlos Mathiasen publicó esto el 03/08/10 en Noticias, Ruby. 2 comentariosHay veces que el usuario necesita subir archivos, pero de una manera “masiva”, no guardando de a uno. Un claro ejemplo de esto es GoogleDocs,
que te deja subir varios documentos a la vez, antes de empezar a verlos.
Utilizando un plugin de jquery, en rails esto se hace de una manera muy transparente.
El plugin en cuestión se llama MultiFileUpload, en su página encontraremos una buena documentación de como usarlo correctamente
Lo que nos interesa es como implementarlo en rails y que todos estos archivos que seleccionamos se almacenen en nuestra base de datos.
Para comenzar tenemos que incluir las librerias del plugin en el aplication.html.erb
<% javascript_include_tag :default, 'multiple-file-upload/jquery.MultiFile.js', 'multiple-file-upload/jquery.MetaData.js' %>
En nuestra vista creamos el formulario, para subir los archivos
<% form_for(:archivo_digital, :html => {:multipart => true },:url => create_archivo_digital_path) do |f| %> <ul id="form"> <%= file_field_tag :files, :class => 'multi file', :name => 'pdf_files[]'%> <li> <%= f.submit 'Subir' %> <%= f.submit 'Cancelar' %></li> </ul> <% end %>
Expliquemos un poco el código:
En necesario establecer :multipart => true, para que el formulario admita la carga de archivos.
file_field_tag nos crea el tag para poder abrir el cuadro de diálogo de carga de archivos de un navegador:
:class => ‘multi file’, esta clase es la que utiliza MultiFileUpload para hacer la magia de subir varios archivos
:name => ‘pdf_files[]‘ esto es muy necesario, porque el plugin crea un arreglo con todos los archivos, pero para que ruby sepa
que nos referimos a un arreglo tenemos que poner [].
Por último tenemos dos botones, el de Subir, que va a subir todos los archivos de una sola vez y el de Cancelar, que hará lo propio.
En nuestro controller vamos a tener
#Renderiza el formulario para subir los archivos def new @archivo_digital = ArchivoDigital.new respond_to do |format| format.html end end def create respond_to do |format| if params[:commit] == "Subir" unless params[:pdf_files].blank? params[:pdf_files].each do |archivo| params[:archivo_digital][:nombre_archivo] = archivo params[:archivo_digital][:archivo] = archivo.read @archivo_digital = ArchivoDigital.new(params[:archivo_digital]) if @archivo_digital.save flash[:notice] = 'Archivo agregado' end end format.html{redirect_to archivos_digitales_path} else flash[:error] = 'Debe seleccionar al menos un archivo' end else format.html{redirect_to archivos_digitales_path} end end end
Expliquemos un poco el código:
Sobre el primer método no hay mucho que decir, solo nos renderiza el formulario que creamos en el paso anterior
El método create es el que hace todo, para empezar tenemos una condición donde pregunta si params[:commit] == “Subir”
esto es para que diferencie entre el botón subir y el cancelar. Cuando presionamos un botón, rails inmediatamente manda un parámetro, llamado
commit con el nombre del botón. Con está condición lo que hacemos es darle tareas diferentes a cada botón.
Si no se cumple la condición, es porque se presionó el botón “Cancelar” y nos redirigirá al listado de archivos.
En caso de que la condición se cumpla, tenemos otro condicional: unless params[:pdf_files].blank?, esto es para saber si se seleccionó algun archivo_digital
y caso contrario muestra un flash[:error]. Si se cumple la condición, recorremos el arreglo y vamos guardando en nuestra base de datos el nombre del
archivo y el archivo en sí.
Bueno, esto es una manera sencilla de subir archivos de forma “masiva” con Jquery y Rails, cualquier cosa no duden en preguntar
JasperReports con Jruby y Rails
Carlos Barbiero publicó esto el 29/07/10 en Herramientas, Java, Lenguajes de Programación, Noticias, Open Source, Ruby. 6 comentariosUno de los grandes problemas en el desarrollo con Ruby on Rails son los reportes multipágina. Debido a que el HTML (inclusive HTML 5) no soporta multipágina, si utilizamos Jruby tenemos la posibilidad de usar cualquier librería Java en nuestro desarrollo.
Afortunadamente en Java tenemos JasperReports (http://jasperforge.org/), una excelente solución al problema antes mencionado.
Para poder incluir un reporte realizado con JasperReports en nuestra aplicación Jruby necesitamos:
1) Descargar I-Report, la herramienta de administracion de reportes de JasperReports. http://jasperforge.org/projects/ireport y descomprimirlo.
2) Dentro del directorio del i-report, ir a modules/ext/ y copiar todos los archivos .jar (si, todos
) al directorio lib de la instalación de JRuby. De esta manera, ya incluimos las librerías necesarias y tenemos preparado nuestro JRuby para utilizar JasperReports.
3) Nos resta crear un reporte para prueba, si nunca hiciste un reporte con i-report: http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_design_a_report.html?header=project&target=ireport
4) Finalmente el código para correr nuestro reporte es el siguiente:
require 'java'
import 'oracle.jdbc.OracleDriver' #Aqui necesitas Utilizar el Driver de la Base de datos que estas usando, en mi caso es oracle
import 'net.sf.jasperreports.engine.JasperCompileManager'
import 'org.apache.commons.dbcp.BasicDataSource'
import'java.util.HashMap'
import'net.sf.jasperreports.engine.JasperFillManager'
import'net.sf.jasperreports.engine.JasperExportManager'
#Creo el datasource
basicdatasource = BasicDataSource.new
basicdatasource.driver_class_name = 'oracle.jdbc.OracleDriver'
basicdatasource.username = 'usuario'
basicdatasource.password = 'password'
basicdatasource.url = 'jdbc:oracle:thin:@localhost:1521:XE'
basicdatasource.connection
conexion = basicdatasource.connection
#Compilamos el reporte
jasperReport = JasperCompileManager.compile_report('/url_de_tu_archivo_jrxml/reporte.jrxml')
#Para pasar los parámetros, definimos un objeto HashMap
m = HashMap.new
m.put('parametro_1','valor_parametro_1')
m.put('parametro_2','valor_parametro_2')
m.put('parametro_n','valor_parametro_n')
#Genero el reporte
jasperPrint = JasperFillManager.fill_report(jasperReport, m,conexion)
#Exporto el PDF
JasperExportManager.export_report_to_pdf_file(jasperprint, 'path_al_archivo_PDF.pdf')
Si deseamos generar reportes en Rails, podemos por ejemplo ubicar los reportes en el directorio public/reportes y utilizar send_file para enviarlos, por ejemplo:
JasperExportManager.export_report_to_pdf_file(jasperprint, RAILS_ROOT+"/public/reportes/reporte.pdf") send_file RAILS_ROOT+"/public/reportes/reporte.pdf"
Espero les sea de utilidad, cualquier cosa comenten y trataré de despejar dudas
Lo nuevo de PostgreSQL 9.0 ilustrado
alfredo publicó esto el 07/07/10 en Bases de Datos, Open Source. Un comentarioEsta nueva release de PostgreSQL tiene tantas mejoras que la comunidad de desarrolladores decidió saltear lo que sería la siguiente versión -PostgreSQL 8.5- pasando directamente a la 9.0, ya que se introdujeron más de 200 mejoras en dicha versión.
Para ir preparándonos y estar al tanto de todas estas mejoras, habilitaron en la wiki de PostgreSQL una sección especial donde se explican estos cambios con sus correspondientes ejemplos.
Entre los cambios más importantes tenemos la incorporación de características como:
- Hot Standby: Esta característica nos permite crear una base de datos ‘Standby’. Esto es una segunda instancia de la base de datos: normalmente en un servidor separado a partir del log binario de la primera base de datos, permientiendo que el servidor standby esté disponible para consultas de sólo lectura.
- Streaming Replication: Es un complemento de Hot Standby. Si bien existen varias soluciones de replicación de terceros disponibles para PostgreSQL, ésta nueva versión trae una simple e integrada versión que probablemente será usada como default en la mayoría de las soluciones de High Availability de PostgreSQL.
Más info de las características nuevas y ejemplos en What’s new in PostgreSQL 9.0
Detectando una dirección IP en conflicto a través de Linux.
marcelo publicó esto el 11/05/10 en Sistemas Operativos, Sistemas Operativos. 3 comentariosEn redes grandes y sin control es muy común encontrarse con IP duplicadas, si bien es un problema sencillo de resolver “Cuando lo encontramos”; suele causar dolores de cabeza hasta los mas experimentados administradores que muchas veces recurren a soluciones tales como:
- Cortar segmentos de la red.
- Comprar software costosos.
- Incorporar Hardware tipo cazafantasmas con luces psicodélicas.
- Enviar memos y reprimir a los empleados que no son de sistemas, que no tienen la mas mínima idea de lo que es una dirección de IP.
Si en nuestra red tenemos una pc con linux esto es muy sencillo de resolver, el paquete se llama: arping.
Pasos para utilizarlo:
1) Instalación
sudo apt-get install arping
2) Uso
sudo arping -I eth0 192.168.0.1 ARPING 192.168.0.1 60 bytes from 00:26:55:36:ec:a1 (192.168.0.1): index=0 time=74.863 usec 60 bytes from 00:1a:92:4e:4c:9e (192.168.0.1): index=1 time=160.933 usec
Como se puede observar el problema aquí es una IP duplicada asociada a dispositivos de red diferentes (placa de red, switch, router).
Su utilidad principal es hacer ping a direcciones mac, por ejemplo:
sudo arping -I eth0 00:26:55:2e:95:EE ARPING 00:26:55:2e:95:EE 98 bytes from 192.168.0.1 (00:26:55:2e:95:EE): icmp_seq=2738 time=771.392 msec 98 bytes from 192.168.0.1 (00:26:55:2e:95:EE): icmp_seq=2740 time=770.830 msec
Esto ultimo resulta interesante de utilizarlo en redes WIFI. Entonces, de manera muy sencilla y sin costos adicionales resolvimos un problema con Linux, espero les sea útil esta información.
EGit: plugin de git para Eclipse
Roxana Pintos publicó esto el 26/03/10 en Herramientas. 3 comentarios
Para aquellos desarrolladores que utilizan el IDE Eclipse y el sistema de control de versiones git les va a interesar esta info: org.eclipse hizo pública la primera versión del plug-in EGit que proporciona soporte integrado para el SCM distribuído git, utilizando JGit.
JGit es una biblioteca que implementa Git en Java. EGit, a diferencia de Eclipse Subversion, no tiene dependencias externas o de los requisitos del código nativo.
En la página del proyecto hay un manual muy completo.
Gbarcode. Codigos de barra con Ruby
Carlos Barbiero publicó esto el 16/03/10 en Lenguajes de Programación, Open Source, Ruby, Uncategorized. 3 comentariosGbarcode es una librería de generación de códigos de barra para Ruby. Es una extensión de C que envuelve el proyecto GNU Barcode. Se distribuye en formato GEM
Link: http://gbarcode.rubyforge.org/
Ejemplo de uso:
require 'rubygems'
require 'gbarcode'
# Incluir el módulo
include Gbarcode
# Existen tres pasos para generar un codigo de barras
# 1) preparar el espacio para el string
# 2) codificar el string como un codigo de barras
# 3) imprimir el codigo de barras
# preparar el codigo de barras para el string "TEST1234"
bc = barcode_create("TEST1234")
# codificar el codigo de barras usando code 39,
# desde que code 39 no usa dígito de verificacion (checksum),
# lo podemos pasar en un flag
barcode_encode(bc, BARCODE_NO_CHECKSUM | BARCODE_39)
#imprimir el codigo de barras usando postcript
barcode_print(bc, File.new("testout.ps", "w"), BARCODE_OUT_PS)
# ó
barcode_print(bc, File.new("testout.eps", "w"), BARCODE_OUT_EPS)