Archivo

Archivo para Martes, 30 de noviembre de 2004

Echando código: Como conectarse a una base de datos usando Perl

Martes, 30 de noviembre de 2004
Comentarios desactivados

Bueno, dado que últimamente sólo he puesto código de Java, vamos a hacerle un cariñito a Perl :)

Resulta que Perl también tiene una API muy fácil de usar llamada DBI; Cada base de datos a su vez cuenta con un módulo especializado llamado DBD::XXX. Así hay modulos para PostgreSQL (DBD:Pgsql), MySQL (DBD::Mysql), Sybase (DBD::Sybase) y así sucesivamente.

¿Que tal fácil es de usar?. Bueno, este pequeño programa se conecta a una base de datos MySQL y hace un simple ‘select count(*)':

   1:#!/usr/bin/perl

2:# Author: Jose Vicente Nunez Zuleta (josevnz@yahoo.com).
3:#
4:use DBI;
5:use DBD::mysql;
6:use strict;
7:
8:my $user = "bugs";
9:my $password = "xxxx";
10:my $database = "bugs";
11:my $driver = "Mysql";
12:my $host = "localhost";
13:my $port = 3306;
14:
15:my $sql = <<SQL
16:SELECT count(*) FROM bugs
17:SQL
18:;
19:
20:my $dsn = "DBI:mysql:database=$database;host=$host;port=$port";
21:my $con = undef;
22:my $res = undef;
23:eval {
24: DBI->connect($dsn, $user, $password);
25:
26: $res = $con->prepare($sql);
27: $res->execute();
28: while (my ($count) = $res->fetchrow()) {
29: print("$count\n");
30: }
31:};
32:if ($DBI::errstr) {
33: die "$DBI::errstr";
34:}
35:
36:if (defined $res) {
37: $res->finish();
38:}
39:if (defined $con) {
40: $con->disconnect();
41:}
42:
43:__END__

Estos modulos los puede conseguir en CPAN (la base de datos de software para Perl más grande del mundo). Puede empezar con este tutorial si de verdad quiere aprender más.

Sin categoría

El Blog como medio de expresión: vuelve la mula al trigo

Martes, 30 de noviembre de 2004

Y la polemica sobre si escribir en un Blog es o no periodismo continua. Todo depende de el contenido de el Blog en mi opinión. Por ejemplo, si alguien reporta algo (como un evento en vivo) entonces pudiera considerarse un reportaje, pero si por otro lado lo que hace es opinar acerca de una noticia que ya alguien cubrió en mayor detalle entonces es una opinión.

Este articulo de la revista ‘Foreign policy’ acerca de los Blogs es buenisimo y puede darle ideas de hacia donde enfocar el suyo. Por supuesto en Slashdot no se hizo esperar la coñiza acerca de quien tenía la razón:

Blogs aren’t journalism. They aren’t about reporting the news, they’re about commenting on it. I realize that a lot of people these days have real trouble understanding the difference between news and commentary, but there is a fairly significant divide between the two.

Journalists go out and find out what’s going on, they (hopefully) check their sources out and get confirmation and input from both sides and then report on it. Commentators — and this includes bloggers — are consumers of what journalists generate. They add (or, some might argue, remove) value by way of interpretation.

Remember way back in like 1996 when we all expected the internet to give voice to the common man? Create a new golden age in the spirit of the pamphlet writer that would have Patrick Henry and the rest of the printing press crew smiling down on us? Well, that’s what the blogs are — the fact that some are regularly insightful/interesting/ignorant/funny/biased enough to gain relative popularity should not obscure that fact or cause us to think they’re something beyond that.

Aside from that, I think it’s important not to get too carried away with this whole “we busted Dan Rather” thing. Frankly, it reminds me of when Drudge got out in front of the Monica Lewinski thing; he got the story out, sure, and suddenly we were hearing all about how internet media was going to come out and crush the slow lumbering ten-minute-ago types on TV. But, as it turned out, that was *one time* as opposed to the hundreds of times before and since where he’s been completely off-base and his “Flash!” stories have vanished without a trace.

Pero no todos opinan así, por ejemplo vean lo que dijo uno acerca de ‘Drudge Report‘:

By the parents definition, Drudge is a Journalist. not a blogger. He rarely comments, usually he is reporting news that you wouldn’t otherwise see.

¿Interesante, no es así? Yo si creo que Internet ha democratizado la opinión de las masas ya que ellas pueden expresarse por muy bajo costo. Yo mismo estoy sorprendido de cuanta gente puede leer diariamente lo que se publica en un Blog, y de como alrededor de este se forman comunidades.

¿No me cree?. Bueno, aqui les tengo una anecdota interesante: La gente de Veneblogs se reunió este año para celebrar su comunidad en Internet. Es decir, extraños dejaron de serlo al hablar de sus intimidades e ideas por Internet (por las fotos en varios de los blogs, se veia que la rumba estuvo muy animada). Lo curioso es que este tipo de reuniones no son nuevas; Por allá en 1999, cuando el “Diario El Universal (llamado EUD)” aún tenia un chat (el producto que usaba el periódico era el famoso Ichat) en el cual la gente se podía reunir a conversar y uno de los programadores (Rolando R.) decidió hacer una rumba para la gente de el chat de EUD en ‘Weekends‘ (Si Weekends, hoy en día TJ Fridays en Altamira, Caracas). Sin exagerar debo decir que no fueron menos de 20 personas y en el momento (si, yo estaba allí de asomado) me pareció bastante bizarro (luego la sensación desapareció ya que el grupo resultó ser increiblemente desenvuelto y amigable, además de que ELLOS pagaron todo :D).

En mi opinión los Blogs son el nuevo chat, ya que visualmente son más poderosos y las ideas persisten más allá de una simple sesión.

Como siempre pregunto, ¿Qué opina usted al respecto?

Sin categoría

Echando código: Obteniendo la metadata de una base de datos en Java

Martes, 30 de noviembre de 2004
Comentarios desactivados



Más de una vez me tocó revizar si podía conectarme a una base de datos después de la instalación; Normalmente estas base de datos eran Open Source (MySQL, PostgreSQL) o comerciales (Oracle, Sybase). Cada una de ellas tiene una herramienta nativa que permite ejecutar SQL desde la línea de comando.

Por ejemplo, para PostgreSQL usted puede utilizar el comand ‘psql‘:

psql -U postgres -d template1 -h 127.0.0.1

Y para Sybase puede utilizar el comando ‘isql:’

isql -U sa -P -S localhost -D tempdb

¿No tienen nada que ver, verdad?. Bueno, viene Java al rescate. Java cuenta con un API estandar para conectarse a base de datos llamada ‘JDBC‘. JDBC ofrece métodos consistentes sin importar el tipo de base de datos, lo cual hace la programación mucho más fácil.

¿Y que tipo de información podemos obtener con el API de JDBC acerca de la base de datos? Bueno, esa parte si es dependiente del driver (manejador) particular con el que nos conectamos a la base de datos; Si un método no es soportado entonces lo más seguro es que Java arroja una ‘MethodNotImplementedException‘, asique es bueno revizar el manual del vendedor antes de utilizarlo para evitar sorpresas.

Este no es un tutorial completo de JDBC, pero si le voy a mostrar el código de un programa que escribí hace tiempo para probar instalaciones nuevas de BD; No es perfecto pero le dará una idea de todo lo que se puede hacer. El ejemplo está corriendo contra una base de datos Sybase 12.5.1 en Linux:

   1:import java.sql.Connection;

2:import java.sql.DatabaseMetaData;
3:import java.sql.DriverManager;
4:import java.sql.ResultSet;
5:import java.sql.SQLException;
6:import java.util.ResourceBundle;
7:
8:/**
9: * This program performs metadata tests on a given database.
10: * License: LGPL
11: * @author Jose Vicente Nunez Zuleta (josevnz@yahoo.com)
12: * @version 0.1 - 05/06/2003
13: */
14:public class TestJDBC {
15:
16: /**
17: * Command line processing
18: * @param args Currently ignored
19: * @throws Exception If any of the required properties is missing
20: */
21: public static void main(String [] args) throws Exception {
22: Connection con = null;
23: ResultSet result = null;
24: ResultSet result2 = null;
25: DatabaseMetaData metadata = null;
26: try {
27: // Connect to the database
28: ResourceBundle bundle = ResourceBundle.getBundle("TestJDBC");
29: System.out.println("Using driver: " + bundle.getString("driver"));
30: Class.forName(bundle.getString("driver")).newInstance();
31: System.out.println("Requesting connection using: user='" +
bundle.getString("user") +
"', password='" + bundle.getString("password") + "', url='" +
bundle.getString("url") + "'");
32: con = DriverManager.getConnection(bundle.getString("url"),
bundle.getString("user"), bundle.getString("password"));
33: System.out.println("Got connection");
34:
35: // Retrieve the database metadata information
36: metadata = con.getMetaData();
37: result = metadata.getCatalogs();
38: String catalog = null;
39: while(result.next()) {
40: System.out.println("Catalog: " + result.getString(1));
41: catalog = result.getString(1);
42: }
43: result.close();
44: // Get information about a catalog and table if both are defined
45: if ( (bundle.getString("catalog") != null) &&
(bundle.getString("catalog").length() > 0) &&
(bundle.getString("tableName") != null) &&
(bundle.getString("tableName").length() > 0)) {
46: result = metadata.getTables(bundle.getString("catalog"),
null
, bundle.getString("tableName"), null);
47: while(result.next()) {
48: System.out.println("Table name: " +
result.getString("TABLE_NAME"));
49: }
50: result.close();
51: System.out.println("Getting the best identifiers for table "
+
bundle.getString("tableName"));
52: result = metadata.getIndexInfo(bundle.getString("catalog"), null,
bundle.getString("tableName"), true, false);
53: while(result.next()) {
54: if (result.getString("INDEX_NAME") != null) {
55: System.out.println("\t\tBest id for the table: "
+
result.getString("COLUMN_NAME"));
56: }
57: }
58: result.close();
59: }
60: if ( (bundle.getString("catalog") != null) &&
(bundle.getString("catalog").length() > 0)
&
& (bundle.getString("procedureName") != null) &&
(bundle.getString("procedureName").length() > 0)) {
61: result = metadata.getProcedureColumns(bundle.getString("catalog"),
null, bundle.getString("procedureName"), null);
62: while(result.next()) {
63: System.out.println("Procedure parameter: " +
result.getString("COLUMN_NAME"));
64: System.out.println("\t\t" +
result.getString("COLUMN_NAME") + " Is there\n");
65: }
66: }
67: } catch (SQLException sqlExp) {
68: System.err.println("Error code #: " + sqlExp.getErrorCode());
69: System.err.println("Error string : " + sqlExp.toString());
70: System.err.println("SQLState: " + sqlExp.getSQLState());
71: sqlExp.printStackTrace();
72: } catch (Exception exp) {
73: exp.printStackTrace();
74: } finally {
75: if (result != null) {
76: try { result.close(); } catch (SQLException ignore) {};
77: }
78: if (result2 != null) {
79: try { result2.close(); } catch (SQLException ignore) {};
80: }
81: if (con != null) {
82: try { con.close(); } catch (SQLException ignore) {}
83: }
84: }
85: }
86:}

Y el archivo de configuracion (ResourceBundle):

   1:user=postgres

2:#user=XXXX
3:#password=XXXX
4:password=
5:url=jdbc:postgresql:dbsrv:5432/template1
6:#url=jdbc:sybase:Tds:dbsrv:4100/tempdb
7:#driver=com.sybase.jdbc2.jdbc.SybDriver
8:driver=org.postgresql.Driver
9:tableName=cmo_details
10:#catalog=SECURITIESDB
11:#procedureName=dealpool_bucket
12:catalog=
13:procedureName=

La salida del programa es como sigue:

[josevnz@god jdbc]$ java TestJDBC

Using driver: com.sybase.jdbc2.jdbc.SybDriver

Requesting connection using: user=’XXXX’, password=’XXXX’, url=’jdbc:sybase:Tds:dbsrv:4100/tempdb’

Got connection

Catalog: MYDB1

Catalog: MYDB2

Catalog: SECURITIESDB

Catalog: master

Catalog: model

Catalog: sybsystemdb

Catalog: sybsystemprocs

Catalog: tempdb

Table name: cmo_details

Getting the best identifiers for table cmo_details

Best id for the table: dealname

Best id for the table: groupnumber

Procedure parameter: RETURN_VALUE

RETURN_VALUE Is there

Procedure parameter: @deal_name

@deal_name Is there

Procedure parameter: @groupnumber

@groupnumber Is there

Procedure parameter: @total_currentbalance

@nb_total_currentbalance Is there

Procedure parameter: @debug_flag

@debug_flag Is there

[josevnz@god jdbc]$

Como siempre, espero haberle despertado su curiosidad :)

Sin categoría

¡Ya viene Red Hat Enterprise 4!: primeros 4 meses del 2005

Martes, 30 de noviembre de 2004
Comentarios desactivados



Bueno, la compañia en la cual trabajo aún no ha terminado de saltar a Red Hat Enterprise 3, y ya ya la versión 4 se asoma por la esquina; Debo decir que como usuario de Fedora he podido ver las mejoras en el sistema operativo y realmente !esta versión va a ser bien atractiva en terminos de seguridad y desempeño!

Sin categoría

A %d blogueros les gusta esto: