Google Website Translator Gadget

miércoles, 14 de noviembre de 2012

Java 7: SortSet implementation and example

Un cop revisat les diferents funcionalitats i implementacions de les Collections i els SortSet (veure entrada Collections i sortset ) i presa la decisió de implementar un SortSet voldràs veure un exemple.
Habitualment els exemples que es troben a Internet son exemples trivials amb tipus natius (int, char, ...).
Si treballes amb objectes complexos cal tenir en compte els següents detalls.

AccióExample
La classe ha de implementar Comparableclass P0102UsuariDetail
implements Comparable <P0102UsuariDetail>
El procediment ha de retornar un int
public int compareTo(P0102UsuariDetail pUsuari)
{
int result = UsuariID.compareTo(pUsuari.UsuariID);
return result;
}
Ja es pot declarar la el SortSetprivate TreeSet <P0102UsuariDetail> P0102Llista
=new TreeSet<P0102UsuariDetail>();
I utilitzar les funcions heredadesusuariP02 = new P0102UsuariDetail(); ...
P02Llista
.add(usuariP02);

Que pasa si intentes utilitzar les funcions i no hi ha un compareTo?
Per defecte si no hi ha la funció de comparació (compareTo) obtindrás un error: ClassCastException
 definit com a:
ClassCastException - if the specified object's type prevents it from being compared to this object.


Informació addicional:
http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html


martes, 13 de noviembre de 2012

Xarxes Socials: Com menjar un donut

Via Neus Arques i el seu article www.neusarques.com: Como comerse un donut en las redes sociales he trobat el interessant article de raventools.com: Social media and the art of being interested
que resumeix a la perfecció les diferents formes en que funcionen les xarxes socials.

Ara ja puc explicar als meus pares com funciona Internet :-)

lunes, 12 de noviembre de 2012

Oracle i Java: Com programar commit i rollback

www.oracle.com

Commit i Rollback amb Oracle i Java

Quan programes aplicacions i tens informació a grabar en diverses taules et cal tractar totes les sentències SQL com a un única transacció per a mantenir la integritat de la informació.
Per exemple: Si actualitzes la informació de la venda, i del stock disponible, han de ser efectuades al mateix temps.
La transacció es un conjunt de execucions que es tracten de manera única de manera que totes les instruccions son confirmades o denegades de manera conjunta.

Pas 1: Desactivar el auto commit.
Per defecte totes les instruccions es tracten com transaccions individuals, per tant cal desactivar-ho amb la instrucció:
con.setAutoCommit(false);


Pas 2: Activació manual de commit.
Un cop desactivat les instruccions SQL només seran confirmades si explicitament invoquem el mètode commit.
conn.commit();


Pas 3: Activació manual de rollback.
Si per alguna raó hi ha una incidència es pot evitar la grabació del tots els registres amb la instrucció rollback:
conn.rollback();


Enllaços relacionats:
http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

domingo, 11 de noviembre de 2012

Mapping de Oracle SQL a Java Types

Java logo
java.com
www.oracle.com
Al desenvolupar una aplicació tindràs dubtes de quin mapping fer entre Oracle i Java.
Aquest es el mapping que he utilitzat amb Oracle XE 11g2 i Java 7.

Mapping Oracle - Java

JavaJDBCOracle 11.2Java to SQLOracle DB to Java
byte (8-bit signed)
-128,+127
TINYINT (8-bit)
signed: -128, +127
or unsigned: 0, 255
NUMBERupdateByte(Column name, value)getByte("Column name")
short (16-bit)
-32768 , +32767
SMALLINTNUMBERgetShort("Column name")
int
(32-bit signed)
-2147483648 to 2147483647
INTEGER
32-bit signed
NUMBERgetInt("Column name")
float (32 bit)DECIMAL,
NUMERIC (*3)
NUMBERupdateFloat(Column name, value)getBigDecimal("Column name")
getFloat("Column name")
long (64-bit)BIGINTNUMBERgetLong("Column name")
double (64-bit)FLOAT
DOUBLE
NUMBER
booleanBITgetBoolean("Column name")
char
(16-bit Unicode)
StringVarchar2(nn)getString("Column name")
Timestamp
(*1,*2)
TimestampgetTimestamp("Column name")
Timestamp
(*1,*2)
TimestampgetDate("Column name")
-Fallarà-

Java Timestamp <- Java Date (Cast)
*1: Si es treballa amb molta precisió (nanosegons) es millor revisar el link de Oracle per tal de assegurar les conversions.
*2: Amb Java7 hi ha algunes diferències però estic buscant la documentació oficial.
*3: JDBC requires that all DECIMAL and NUMERIC types support both a precision and a scale of at least 15. Example: "12.345" has a precision of 5 and a scale of 3
NUMERIC (12,4) types representes with exactly the specified precision
DECIMAL (12,4) types allows an implementation to add additional precision beyond that specified

Source font:
Oracle: JDBC Developer's Guide (Actualitzat a la versió 11.2)
Java: Primitive datatypes: Aqui trobaràs els formats primitius de Java
http://docs.oracle.com/javase/6/docs/technotes/guides/jdbc/getstart/mapping.html#996857
http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html

viernes, 9 de noviembre de 2012

BLAT Command-line SMTP

BLAT.EXE es un dels programes més antics, en funcionament des de 1998,  i utilitzats per a enviament de logs a bústies de mail des de scripts Windows i amb llicència Public Domain.
No conec cap administrador de sistemes que no l'hagi utilitzat en algun script, i entre altres coses l'he utilitzat per a verificar funcionament de servidors SMTP.

Es un programa fiable i molt útil que es pot descarregar des de http://sourceforge.net/projects/blat

Disposa encara de la pàgina web original: http://www.blat.net/  però des del 2003 es va moure a sourceforge.net


En aquests moments va per al versió 3.0.7 publicada el

Exemple de crida
blat.exe "file_with_body_text.txt" -server smtp.server.com -f noreply@mydomain.com -subject "subject text" -to receiver@domain.com


Change Log
3.0.7
[-] Removed a line of debug code that printed command line arguments to the
    screen, always.
-------------------------------------------------------------------------------
3.0.6
[+] Added error messages for attachment problems.  These include: no file was
    found for a given search string, a name that matches the search string does
    not appear to be an actual file, a file that is larger than 4 GB, a file
    that cannot be opened, and a file that cannot be read.  These extra
    messages should help people understand why their attachment(s) did not get
    sent, or why Blat exits with error code 12.
[+] Add more intelligence for checking UTF-8 byte sequences when the UTF-8 Byte
    Order Marker (BOM) is not present.  This helps reduce the likelihood of
    incorrectly marking the charset as "UTF-8" or not.
[-] Forgot to properly set charset= in headers when Blat determines the message
    body is UTF/Unicode.  Blat will now set charset= to UTF-8/UTF-7 as needed.
[-] Fixed options file parsing that I broke in 3.0.5, trying to support UTF-8
    and Unicode files that may not have a BOM.

jueves, 8 de noviembre de 2012

Transferències bancaries: Format del fitxer

a l'hora de transferir fitxers a entitats bancàries cal acordar un format a seguir.
En el cas d'Espanya aquest format està definit per l'Associació Espanyola de Banca (www.aebanca.es), en coordinació amb la CeCa (Confederació Espanyola de Caixes de Estalvis), el Tesoro de Espanya (www.tesoro.es) i a nivell Europeu amb SEPA (Single Euro Payments Area).

Com a guia s'han editat diversos documents que detallen els requisits tècnics a seguir:

martes, 6 de noviembre de 2012

Encriptación nativa en Windows 7

Windows 7 logo
http://windows.microsoft.com/

Encriptación nativa en Windows 7

He trobat un article fàcil de llegir, escrit per Juan Carlos Rodríguez Rico (Responsable S21sec university), de com encriptar les carpetes en Windows de manera nativa.



Article de lectura recomanada i que dona respostes clares a preguntes interessants:
  • ¿Están realmente cifrados los archivos?
  • Si copiamos uno de estos archivos a un pendrive o lo enviamos por correo electrónico, ¿el archivo se copia o envía cifrado?
  • ¿Cómo podrá entonces descifrarlo su destinatario?


Enllaços relacionats:
http://acc.icfs.uam.es/como-proteger-informaci%C3%B3n-mediante-efs

domingo, 4 de noviembre de 2012

How to get the Java Types from a SQL Type

The Java driver maps by default to BigDecimal, even if a column is defined as NUMBER(15) (which could be mapped to BigInteger)


What could you do to know the mapped Class?


Do a getObject() on the column and check the class.


ResultSet rs = statement.executeQuery("select column from table");
if (rs.next())
{
  Object o = rs.getObject(1);
  System.out.println("Class: " + o.getClass().getName());
}



viernes, 2 de noviembre de 2012

Struts2: The default expression... not match a property

Al programar una pàgina JSP per a Struts2 pots cometre alguns errors que només apareixen als logs.

Un d'aquests errors que apareixen al log es el següent:
07:17:41,632 WARN org.apache.struts2.util.TextProviderHelper.warn:56 - The default value expression 'Example:Field required.' was evaluated and did not match a property. The literal value 'Example:Field required.' will be used.

Veiem un exemple del codi JSP que genera el error:
<s:text name="property_code_800" />:<s:text name="peticiocarpeta.origPath" />


Que està passant aqui?
A la pàgina es mostrarà el text literal correcte, malgrat això hi ha un error amagat i està produït per l'ús incorrecte de la instrucció <s:text name="peticiocarpeta.origPath" />

Aquesta instrucció demana un literal que serà localitzat en el fitxer de properties, com en el cas del property_code_800
El literal peticiocarpeat.origPath no es pot trobar ja que el que està realment rebent es el text substituït.

Solució:
Si el que vols es emetre un text que prové d'un Bean cal utilitzar la instrucció: <s:property

<s:text name="property_code_800" />:<s:property value="peticiocarpeta.origPath" />




Informació addicional:
http://struts.apache.org/2.3.4/docs/text.html
http://struts.apache.org/2.3.4/docs/property.html