Yo tengo Ubuntu 10.10 de 64 bits.

Para instalar un buen OCR efectué lo siguiente:

sudo apt-get install tesseract-ocr python-gtkspell python-enchant python-poppler
wget http://sourceforge.net/projects/gimagereader/files/0.8.1/gimagereader_0.9-1_all.deb
sudo dpkg -i gimagereader_0.9-1_all.deb

Cheers,
Goose

En esta ocasión, me complace presentarles un conjunto de snnipets que, en su totalidad integran un componente personalizado para JSF 2.0.

El componente en si es bastante sencillo (es una serie de botones de tipo radio junto con unas ligas que no llevan a ninguna parte enmarcado todo en una tabla con bordes invisibles)

Considero que lo verdaderamente ilustrativo es el proceso de fabricación del componente, ya que incluye la secuencia de pasos requeridos para su elaboración y puede ser modificado para la creación de componentes realmente útiles.

Dicho lo anterior, ya no necesitaremos esperar al release PM 3.0. Ahora ya podemos crear nuestra propia suite de componentes…. ¿Verdad?…

Paso 1

Crear el archivo infotec.custom.taglib.xml dentro del directorio WEB-INF/facelets (si no existe “facelets” hay que crearlo) :

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

<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
<namespace>http://mx.com.infotec.arq/customTags</namespace>
<tag>
<tag-name>customLink</tag-name>
<component>
<component-type>customTag.CustomLinkComponent</component-type>
</component>
</tag>
<tag>
<tag-name>customColl</tag-name>
<component>
<component-type>customTag.CustomCollComponent</component-type>
</component>
</tag>
</facelet-taglib>

Paso 2

Declarar el archivo anterior en web.xml de la siguiente manera:

<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/facelets/infotec.custom.taglib.xml</param-value>
</context-param>

Paso 3

Declarar nuestos custom tags en el archivo faces-config.xml de la siguiente manera:

<component>
<component-type>customTag.CustomLinkComponent</component-type>
<component-class>mx.gob.se.upci.expe.support.customTag.CustomLinkComponent</component-class>
</component>
<component>
<component-type>customTag.CustomCollComponent</component-type>
<component-class>mx.gob.se.upci.expe.support.customTag.CustomCollComponent</component-class>
</component>

Paso 4

Crear las clases CustomLinkComponent y CustomCollComponent de la siguiente manera:

import java.io.IOException;
import java.util.Collection;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class CustomLinkComponent extends UISelectOne {

public CustomLinkComponent() {
    super();
}

protected void validateValue(FacesContext context, Object value) {
    setValid(true);
}

public void encodeEnd(FacesContext context) throws IOException {
}

public void encodeChildren(FacesContext context) throws IOException {
}

public void encodeBegin(FacesContext context) throws IOException {
    final ResponseWriter writer = context.getResponseWriter();
    final String clientId = getClientId(context);

    CustomCollComponent childColl = null;
    for (UIComponent comp : getChildren()) {
        if(comp instanceof CustomCollComponent) {
            childColl = (CustomCollComponent) comp;
        }
    }
    if((childColl==null)||(childColl.getValue()==null)) {
        writer.writeText("La coleccion esta vacia.",null);
    } else {
    @SuppressWarnings("unchecked")
    Collection<Product> prods = (Collection<Product>)childColl.getValue();
    writer.startElement("table",null);
    writer.writeAttribute("border","0",null);
    for(Product prod : prods) {
        encodeRadio(writer,prod,clientId);
    }
    writer.endElement("table");
    }
}

private void encodeRadio(ResponseWriter writer, Product prod, String clientId) throws IOException {
    writer.startElement("tr",null);
    writer.startElement("td",null);
    // input de tipo radio
    writer.startElement("input",null);
    writer.writeAttribute("type","radio",null);
    writer.writeAttribute("name", clientId, "clientId");
    writer.writeAttribute("value", prod.getKey(), "value");
    writer.endElement("input");
    // anchor con href y target
    writer.startElement("a",null);
    writer.writeAttribute("href",prod.getDescUrl(),null);
    writer.writeAttribute("target","_blank",null);
    writer.writeText(prod.getLabel(),null);
    writer.endElement("a");
    writer.endElement("td");
    writer.endElement("tr");
}

public void decode(FacesContext context) {
    @SuppressWarnings("rawtypes")
    Map requestMap = context.getExternalContext().getRequestParameterMap();
    final String clientId = getClientId(context);
    String string_submit_val = ((String) requestMap.get(clientId));
    setSubmittedValue(string_submit_val);
    setValid(true);
}

}// ends class


import javax.faces.component.UIOutput;
public class CustomCollComponent extends UIOutput {
}// end class

@ManagedBean
public class SampleCustonTagBeanMB {
    private Random random = new Random();
    private List<Product> lista;
    private Product selectedProduct;

    public SampleCustonTagBeanMB() {
        lista = new ArrayList<Product>();
        for(int i=0; i<4; i++) {
            lista.add(new Product(
                "key"+random.nextInt(1000),
                "desUrl"+random.nextInt(1000),
                "label"+random.nextInt(1000)
                )
            );
        }
    }

    public Product getSelectedProduct() {
        return selectedProduct;
    }

    public void setSelectedProduct(Product selectedProduct) {
        this.selectedProduct = selectedProduct;
    }

    public List<Product> getAvailableProducts() {
        return this.lista;
    }

}// end class

Paso 5

Usar nuestro nuevo tag dentro de un archivo xhtml de la siguiente manera:

<customTag:customLink value="#{sampleCustonTagBeanMB.selectedProduct}"   >
<customTag:customColl value="#{sampleCustonTagBeanMB.availableProducts}"/>
</customTag:customLink>

Nota: para usar el prefijo “customTag” se debió declarar el URI asociado de la siguiente manera:

xmlns:customTag="http://mx.com.infotec.arq/customTags"

Lo anterior debido a que en el archivo “infotec.custom.taglib.xml” el “namespace” indica lo anterior.

Bueno, eso es todo. Simple, ¿no?

Cheers,
Goose

Las instrucciones siguientes serán de utilidad a los usuarios de sistemas similares al mio:
LINUX Ubutu 10.10 64bits
Sin embargo, puede servir para mas sistemas.

1) Crear en “/etc/init.d” un archivo llamado “jira” de la siguiente forma:
“sudo nano /etc/init.d/jira” con el siguiente contenido:


#! /bin/sh

### BEGIN INIT INFO
# Provides:		JIRA
# Required-Start:	$remote_fs $syslog
# Required-Stop:	$remote_fs $syslog
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Inits JIRA server
### END INIT INFO

export JAVA_HOME=/home/gustavo/development/jdk-1.6.0.013-x64
export CATALINA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=768m"

COMANDO=/home/gustavo/atlassian/jira/bin
USUARIO=gustavo

case "$1" in
  start)
        su $USUARIO -c "$COMANDO/startup.sh"
	;;
  stop)
        su $USUARIO -c "$COMANDO/shutdown.sh"
	;;
  restart)
        su $USUARIO -c "$COMANDO/shutdown.sh"
        sleep 5
        su $USUARIO -c "$COMANDO/startup.sh"
	;;

  *)
        echo "Error, solo start|stop|start"
	exit 1
esac

exit 0

2) Crear ligas simbólicas como las siguiente en el interior de los directorios:
rc2.d
rc3.d
rc4.d y
rc5.d
sudo ln -s ../init.d/jira S30jira

3) Crear ligas simbólicas como las siguiente en el interior de los directorios:
rc0.d
rc1.d y
rc6.d
sudo ln -s ../init.d/jira K30jira

Cheers,
Goose

Este es un script para remplazar los ‘tabs’ por ‘cuatro espacios en blanco’ en todos los archivos de texto de un directorio dado en un sistema LINUX

Tan simple como lo que un amigo me hizo favor de instruir:

#!/bin/bash

#
# Script para remplazar los tabs por cuatro espacios en blanco
#
# autor: Erik Valdivieso
#

if [ $# == 1 ]; then
    if [ -d $1 ]; then
        IFS=$'\n'
        EXT_TMP="-rem.tmp"

        for I in $(find $1 -type f); do
            NUM=$(file $I | cut -d ':' -f 2 | grep -i text | wc -l)
    
            if [ $NUM -eq "1" ]; then
                FILE_TEMP=$I$EXT_TMP
                sed  -e 's/'"$(printf '\011')"'/    /g' $I > $FILE_TEMP
                mv $FILE_TEMP $I
            else
                echo "Se omite el archivo" $I
            fi
        done
    else
        echo "El parámetro debe ser un directorio"
    fi
else
    echo "Se requiere un argumento:"
    echo "   remplazaTabs.sh "
    exit 1;
fi

La magia está en la linea:

sed  -e 's/'"$(printf '\011')"'/    /g' $I > $FILE_TEMP

Donde el 011 es un tab y en la parte : ‘/ /g’ hay 4 espacios en blanco
Agradecimientos especiales al creador de este script: Erik Valdivieso

© 2017 Goose Workshop Suffusion theme by Sayontan Sinha