La polemica de Evans: ¿Porqué Perl, PHP y Python apestan?

No. no apestan. Pero sigan leyendo y entenderán mi tono de burla…

El sitio web “TheServerSide” publicó los resultdados de una encuesta a 400 desarrolladores en los cuales se dice que la gente que estaba pensando trabajar con PHP o trabaja con PHP ha disminuido. Ellos asumen que eso se debe a que muchos de ellos se están o van a moverse a J2EE (Servlets, JSP). La noticia se aplica también a Python y a Perl.

Mis conocimientos de estadística están bastante oxidados, pero creo que es difícil asegurar que estos lenguajes están en retroceso sólo sólo por la opinión de 400 desarrolladores, localiados todos en Europa. Lo que más me asombra es que TheServerSide asume que la razón de la judanza a Java es porque es más fácil que .NET.

Vamos a estar claros: Yo pienso que .NET no va para ningún lado (aunque no es tán dificil o más que Java), que Java es superior a Perl, Phyton y sobre todo PHP en el area de aplicaciones web pero ya de allí a sacar las mismas conclusiones que la encuesta hay un trecho un poco largo.

Y usted, ¿que opina al respecto? No creo que esos lenguajes hayan recibido un LAMParazo 🙂

Buscar en Technorati: , , ,

Echando código: ¿Como hacer para que rsync sea más inteligente?

NYC Fifth Avenue
Rsync es como un tren eficiente el cual lleva información de un sitio a otro.

Rsync, uno de los mejores inventos 🙂

En otra oportunidad (y en otro blog) les comenté de que era Rsync y como utilizarlo para copiar largas cantidades de información, pero de manera inteligente; Hace poco me encontre con el siguiente problema:

  • Se está utilizando Rsync para replicar datos, pero si hay una falla queremos que Rsync reintente la conexión
  • No queremos que Rsync copie archivos ‘core‘ ya que son muy grandes y va a hacer que la copiada tarde mucho. La opción ‘-C‘ nos ayuda con eso ya que utiliza los mismos parámetros que CVS para ignorar archivos. El problema es que queremos copiar librerías dinámicas (shared libraries, *.so) y -C las excluye automáticamente.

¿Que podemos hacer?, Sencillo, sólo envenenamos a Rsync con un wrapper escrito en Bash.

   1:#!/bin/bash
2:#
3:# This small script is an "safer" version of rsync
4:# License: GPL
5:# Author: josevnz@yahoo.com
6:# Blog: KodeGeek.com
7:#
8:declare -i counter=0
9:declare -ri MAX=3
10:declare -ri ERROR=192
11:
12:if [ -z "$*" ]; then
13: exit $ERROR
14:fi
15:
16:function my_rsync {
17: rsync --include='*.so' $*
18: return $?
19:}
20:
21:for ((counter=0; counter < MAX; counter++ ))
22:do
23: my_rsync $*
24: if [ $? != 0 ]; then
25: exit $?
26: else
27: break
28: fi
29:done; exit $?

Usted puede agregar cualquier parámetro por la linea de comandos, como incrementar el tiempo de espera (–timeout); La idea es mantener al script flexible mientras le agregamos las partes que consideramos son importantes (lease los dos requisitos anteriores). Usted puede cambiar cuantas veces se debe reintentar el comando si este falla la primera vez.

Una salida de ejemplo:

[josevnz@localhost bash]$ ./safe_rsync.sh -Czv * /tmp/bash/
backup_mysql.sh
data.dat
disk-usage.sh
download_fedora.bsh
fedora_isos.txt
getautomount
host.bsh
minute_risk.pl
openldap.conf
raid-grub.sh
safe_rsync.sh
test_bc.sh

sent 7088 bytes received 284 bytes 4914.67 bytes/sec
total size is 15247 speedup is 2.07

Si está interesado, hagamelo saber y con gusto les doy más ejemplos de como Rsync puede hacer su vida más fácil en el trabajo. Puede bajarse el código de el script desde acá como siempre.

¿Como mejoraría el script?

Buscar en Technorati: ,

CBGB: Un sitio de musica legendario en New York está a punto de desaparecer

CBGB NYC
El mitico CBGB

CBGB (Country Blues Grass Blues) es una leyenda de por si. Su historia menciona como grupos de rock punk como Sex pistols o Ramones pasaron por allí; Pero ahora velve a ser noticia ya que está a punto de ser cerrado debido a problemas de renta y de seguridad (aunque creo que la palabra avaricia está también de por medio).

CBGB NYC
El sitio es emblematico, puro Rock ha sonado allí por más de 30 años

Vero y yo ya teníamos tiempo queriendo escuchar un toque; En este caso nos vacilamos a un grupo llamado “4down” los cuales tocaron un estilo pesado, definitivamente Grindcore.

CBGB NYC
4down en plena descarga…

Yo coincido que el sitio necesita un poco más de cuidado, aunque por otro lado el tratamiento debería ser meticuloso ya que una alteración fuerte seguro va a destruir el ambiente y toda la historía que allí se encuentra encerrada

CBGB NYC
Vero en pleno toque, al borde de un ataque de nervios 🙂

Su dueño piensa abrir en otro lado (las Vegas), pero quizas no será lo mismo, ya que la nota de el sitio es precisamente su aire subterraneo y subversivo. Ya hay un movimiento organizado (si usted es un amante de el Rock, le invito a que participe) para salvar el local, esperemos que una de las leyendas de el Rock & Roll no desaparesca.

CBGB NYC
¿Cual es el futuro de CBGB?

Este tipo de locales son los que ayudan a germinar el Rock autentico, no las bandas basura que son promocionadas por las disqueras. Yo recuerdo en Mérida a “El Tunel” y “Viroska Karioca” (el primero en la plaza de Glorias Patrias y el segundo al frente de la Facultad de Odontología de la ULA). como lugares de rockeros (antes existia el “Nido De el Aguila” pero fué cerrado por problemas de drogas). En Caracas (cerca de el Sambil) tenemos a “La Mosca” (sitio mínimo en donde la cerveza te la dan con todo y lata en mano. Bien artesanal).

¿Que otros sitios recomienda usted, al estilo de CBGB en su país y porqué?

Ya para terminar los dejo con el grupo de fotos de CBGB. Esperemos que el sitio se mantenga vivo por al menos otros 12 años más.

www.flickr.com


Buscar en Technorati:

Open Source en Venezuela: Richard Stallman y Walc2005

Walc2005 Mérida, Richard Stallman
Richard en Walc 2005

Walc es un evento que promueve el aprendizaje de redes, programación y tecnología en instituciones académicas; Este año invitaron a Richard Stallman para que hablara en el evento celebrado en la ciudad de Mérida, en el evento de Walc del 2005 (ya el había estado con anterioridad en otros paises de Sur America como Brasil).

Yo en particular no estoy de acuerdo del todo con todo lo que dice el señor Richard, me parece que a veces se le pasa la mano al decir que todo el software debe ser libre, ya que hay algunas realides de las cuales no podemos escapar. Sin embargo sus ideas provocadoras son la base de GNU y es un personaje el cual se merece el respeto y la admiración de todos (aunque me parece un poco estúpida la polémica de Linux vs. GNU / Linux, y sobre todo el fracaso de el kernel GNU Hurd).

La pregunta es,¿Qué tan importante es GNU?. Bueno, imaginese un mundo sin Gmake, GNU GCC, Sin GNU Tar, GNU Gzip, entre otros. Solaris por ejemplo sería un sistema operativo bien ladilla.

Las fotos de el evento son todas cortesía de al amigo Jorge Camargo, espero que las disfruten.

¿Qué es KodeGeeK.com?

Times Square
El nuevo vagón, KodeGeek.com


KodeGeeK.com
es la nueva encarnación de mi viejo blog, El Angel Negro. Decidí cambiar de dirección, ya que el Angel Negro es una idea que viene flotando desde hace 10 años y que stá un poco divorciada de mis intereses actuales. El hecho de tener un dominio y un servidor a mi disposición hace mucho más fácil el poner ciertas ideas en práctica.

¡Así que sean todos bienvenidos!

Mazinger AD 1901: La última aparición de el clásico

Mazinger AD 1901
Mazinger Z

Ya en la última entrega de Mazinger de esta semana, los dejo con fotos de un modelo que no salió en tiras comicas; Sin embargo el concepto me pareció bestial y debo admitir que es el favorito de todos los de la serie.

Mazinger AD 1901
Mazinger

Este Mazinger es una versión mucho más pequeña, creo que de 12 metros de altura y usada por la policia en Tokio. Allá quedaron los tiempos de los robots gigantes.

Mazinger AD 1901
Mazinger

Este diseño es mucho más de vanguardia y por alguna razón se me asemeja más a un traje blindado de policia que a otra cosa. También es mucho más organico

Mazinger AD 1901
Mazinger

Un detalle que no mostré en las fotos es que el piloto ahora está dentro de el robot, usando un traje de realizad virtual y sensores pegados a el cuerpo. Esto quiere decir que Maziner ahora es más como un exo-esqueleto, no una nave de combate como las versiones anteriores. Adios al ‘pilder’.

Mazinger AD 1901
Mazinger

De nuevo el futuro dirá en que aventuras nos sumerge este personaje que se ha mantenido vivo por más de 30 años y aún despierta interés. Y es que Go Nagai creó una leyenda, quizas sin saberlo

Mazinger AD 1901
Mazinger

En este caso sobran las palabras, asi que los dejo con las fotos. Y deje volar su imaginación.

Etiquetas en Technorrati, Flickr: ,mazingerad1901

Mazinkaiser: Uno que no llegó a Venezuela

Mazinger Z
Mazinkaiser, transparente

Hoy sigo en la misma tónica que ayer. Estoy preparando un ejemplo de código interesante, pero por los momentos sólo les voy a traer un Mazinger que no llegó nunca a Venezuela: Mazinkaiser.

Mazinger Z Mazinkaiser
Este diseño se parece más a un vampiro gigante, combinado con una armadura Samurai.

Siempre me gustaron los detalles de este robot. Este me recuerda a Venezuela, ¡ya que lo compré en Caracas!

Mazinger Z
Mazinkaiser

Por los momentos los dejo con un comic de el pasado, los cuales espero le traigan recuerdos agradables.

Etiquetas en Flickr, Technorrati: ,

Mazinger clásico: Unas fotos para descansar la vista

Mazinger Z
Mazinger Z

Hoy por fin hicimos el release; Hubo cucarachas, el equipo hizo atrapadas espectaculares y el día termino bien, eso si cansado….

Así que sólo me voy a limitar a compatir unas imagenes de mi heroe de la infancia favorito: Mazinger Z.

Mazinger Z
Otra pose de el super-heroe

Mazinger Z
30 años y aún es un icono

Los clasicos nunca pasan de moda….

Etiquetas en Technorrati: ,

Echando código: ¿Como monitorear a NFS usando Java? (hablemos ONC RPC, II)

Manhattan
Bueno, vamos a ver ahora como terminar montar el puente MOUNT / NFS con RPC para monitorear un servidor (las piezas encajan perfectamente)

Esta es la continuación de el articulo anterior. Sólo que esta vez nuestro cliente va a hacer algo más interesante que sólo conectarse al servidor, vamos a obtener el listado de los archivos que están siendo exportados por el servidor de NFS.

Sólo les voy a mostrar el código de la aplicación, no tiene caso ver el código de los archivos generados con JRPCGEN:

   1:package com.blogspot.elangelnegro.nfs.app;
2:
3:import java.net.InetAddress;
4:
5:import java.io.IOException;
6:
7:import org.acplt.oncrpc.OncRpcProgramNotRegisteredException;
8:import org.acplt.oncrpc.OncRpcClientAuthUnix;
9:import org.acplt.oncrpc.OncRpcAuthenticationException;
10:import org.acplt.oncrpc.OncRpcException;
11:import org.acplt.oncrpc.OncRpcProtocols;
12:import org.acplt.oncrpc.OncRpcAuthStatus;
13:
14:import com.blogspot.elangelnegro.nfs.client.nfs_protClient;
15:import com.blogspot.elangelnegro.nfs.client.mountClient;
16:import com.blogspot.elangelnegro.nfs.client.readdirargs;
17:import com.blogspot.elangelnegro.nfs.client.readdirres;
18:import com.blogspot.elangelnegro.nfs.client.exports;
19:import com.blogspot.elangelnegro.nfs.client.exportnode;
20:import com.blogspot.elangelnegro.nfs.client.dirpath;
21:import com.blogspot.elangelnegro.nfs.client.fhstatus;
22:
23:import com.blogspot.elangelnegro.nfs.client.nfscookie;
24:import com.blogspot.elangelnegro.nfs.client.nfs_prot;
25:import com.blogspot.elangelnegro.nfs.client.nfsstat;
26:import com.blogspot.elangelnegro.nfs.client.nfs_fh;
27:import com.blogspot.elangelnegro.nfs.client.entry;
28:
29:/**
30: * This class does a read only 'Ping' against a NFS server, by getting the list
31: * of files on a given directory.
32: *
33: * Blog: El Angel Negro - http://elangelnegro.blogspot.com/
34: *
35: * License: GPL
36: *
37: * Please consult the following RFC as they contain usefull information about the protocol:
38: * <ul>
39: * <li> XDR: External Data Representation standard, http://www.faqs.org/rfcs/rfc1014.html
40: * <li> RPC: Remote Procedure Call Protocol Specification Version 2, http://www.ietf.org/rfc/rfc1831.txt
41: * <li> NFS: Network File System Protocol specification, http://www.faqs.org/rfcs/rfc1094.html
42: * </ul>
43: *
44: * @author Jose Vicente Nunez Zuleta (josevnz@users.sourceforge.net)
45: * @version 0.1 - 07/17/2005
46: */
47:public final class Ping {
48:
49: /**
50: * Error exit code
51: */
52: public static final int ERROR_EXIT_CODE=192;
53:
54: /**
55: * User and group to be used when authenticating
56: * You can get that information yourself from the /etc/passwd file:
57: * perl -F':' -lane 'print "$F[2] $F[3]" if $F[0] eq "josevnz"' /etc/passwd
58: */
59: public static final int [] USER_AND_GROUP = {500, 500};
60:
61: /**
62: * Constant for the number of dirs 'up to count bytes'
63: */
64: public static final int MAX_DIRS = 10000;
65:
66: /**
67: * Command line argument processing
68: * @param args args[0] is the hostname to check.
69: * @throws Exception If any error.
70: * @since 0.1
71: */
72: public static void main(String [] args) throws Exception {
73: nfs_protClient nfs = null;
74: mountClient mount = null;
75: readdirres dirResult = null;
76: readdirargs dirArgs = null;
77: exports exportsList = null;
78: fhstatus fhStatus = null;
79: boolean hasDir = false;
80: OncRpcClientAuthUnix authUnix = null;
81: if ( ! ( (args != null) && (args.length == 2) && (args[0] != null) && (args[1] != null)) ) {
82: throw new IllegalArgumentException("Please specify the NFS server host / directory to check!");
83: }
84: try {
85: authUnix = new OncRpcClientAuthUnix(args[1], USER_AND_GROUP[0], USER_AND_GROUP[1]);
86: // Get some information with mount
87: mount = new mountClient(InetAddress.getByName(args[0]), OncRpcProtocols.ONCRPC_TCP);
88: System.out.println("Connected with Mountd");
89: // Get the list of exported directories
90: exportsList = mount.MOUNTPROC_EXPORT_1();
91: exportnode node = exportsList.value;
92: while (node != null) {
93: System.out.println(
94: "Exported filesystem: " +
95: node.ex_dir.value
96: );
97: if (node.ex_dir.value.equals(args[1])) {
98: hasDir = true;
99: }
100: node = node.ex_next.value;
101: }
102:
103: // Do the remote NFS server has the directory we are looking for?
104: if (hasDir) {
105:
106: mount.getClient().setAuth(authUnix);
107: fhStatus = mount.MOUNTPROC_MNT_1(new dirpath(args[1]));
108: if (fhStatus.fhs_status != 0) {
109: throw new IOException("There was a problem mounting the directory: '" + args[1] + "', reason: " + getNFSCodeReason(fhStatus.fhs_status));
110: }
111: nfs = new nfs_protClient(InetAddress.getByName(args[0]), OncRpcProtocols.ONCRPC_TCP);
112: nfs.getClient().setAuth(authUnix);
113: System.out.println("Connected with NFSD");
114:
115: /*
116: * Try to get the directory listing. Up to here all has been generic.
117: * The RFC 1094 describes which methods can be called for a NFS server.
118: *
119: */
120: dirArgs = new readdirargs();
121: dirArgs.count = MAX_DIRS;
122: // Create an empty 'zero' NFS cookie, first time read
123: byte [] zeroCookie = new byte[nfs_prot.NFS_COOKIESIZE];
124: for (int i = 0; i < nfs_prot.NFS_COOKIESIZE; i++) {
125: zeroCookie[i] = 0;
126: }
127: nfscookie cookie = new nfscookie(zeroCookie);
128: dirArgs.cookie = cookie;
129:
130: // Use the information obtained for the previous NFS file handle
131: nfs_fh nfsFh = new nfs_fh();
132: nfsFh.data = fhStatus.fhs_fhandle.value;
133: dirArgs.dir = nfsFh;
134: dirResult = nfs.NFSPROC_READDIR_2(dirArgs);
135: if (dirResult.status != 0) {
136: throw new IOException("Got an error from the NFS server: " + getNFSCodeReason(dirResult.status));
137: }
138: entry currEntry = dirResult.reply.entries;
139: System.out.println("Current directory entries: ");
140: while(currEntry != null) {
141: System.out.println(currEntry.name.value);
142: currEntry = currEntry.nextentry;
143: }
144: }
145: } catch (OncRpcAuthenticationException exp) {
146: // Get a better explanation why the auth failed
147: switch (exp.getReason()) {
148: case OncRpcAuthStatus.ONCRPC_AUTH_BADCRED:
149: System.err.println("Bad credential (seal broken)");
150: break;
151: case OncRpcAuthStatus.ONCRPC_AUTH_BADVERF:
152: System.err.println("Bad verifier (seal broken)");
153: break;
154: case OncRpcAuthStatus.ONCRPC_AUTH_FAILED:
155: System.err.println("Reason unknown");
156: break;
157: case OncRpcAuthStatus.ONCRPC_AUTH_INVALIDRESP:
158: System.err.println("Bogus response verifier");
159: break;
160: case OncRpcAuthStatus.ONCRPC_AUTH_REJECTEDCRED:
161: System.err.println("Client must begin new session");
162: break;
163: case OncRpcAuthStatus.ONCRPC_AUTH_REJECTEDVERF:
164: System.err.println("Verifier expired or replayed");
165: break;
166: case OncRpcAuthStatus.ONCRPC_AUTH_TOOWEAK:
167: System.err.println("Rejected for security reasons");
168: break;
169: }
170: throw exp;
171: } catch (OncRpcProgramNotRegisteredException exp) {
172: System.err.println("ONC/RPC program server not found");
173: throw exp;
174: } catch (OncRpcException exp) {
175: System.err.println("Could not contact portmapper:");
176: exp.printStackTrace(System.err);
177: throw exp;
178: } catch (IOException exp) {
179: System.err.println("Could not contact portmapper:");
180: exp.printStackTrace(System.err);
181: throw exp;
182: } finally {
183: if (mount != null) {
184: try {
185: if (hasDir) {
186: try {
187: mount.MOUNTPROC_UMNTALL_1();
188: } catch (Exception ignoreInner) {
189: // Ignore any exceptions here
190: }
191: }
192: mount.close();
193: } catch (Exception ignore) {
194: // Do nothing
195: }
196: }
197: if (nfs != null) {
198: try {
199: nfs.close();
200: } catch (Exception ignore) {
201: // Do nothing
202: }
203: }
204: }
205: }
206:
207: /**
208: * Map the NFS return code to messages in English
209: * @param theCode
210: * @return String Translated String
211: */
212: private static String getNFSCodeReason(int theCode) {
213: String reason = null;
214: switch (theCode) {
215: case nfsstat.NFS_OK:
216: reason = "NFS OK"; break;
217: case nfsstat.NFSERR_PERM:
218: reason = "NFSERR PERM"; break;
219: case nfsstat.NFSERR_NOENT:
220: reason = "NFSERR NOENT"; break;
221: case nfsstat.NFSERR_IO:
222: reason = "NFSERR IO"; break;
223: case nfsstat.NFSERR_NXIO:
224: reason = "NFSERR NXIO"; break;
225: case nfsstat.NFSERR_ACCES:
226: reason = "NFSERR ACCES"; break;
227: case nfsstat.NFSERR_EXIST:
228: reason = "NFSERR EXIST"; break;
229: case nfsstat.NFSERR_NODEV:
230: reason = "NFSERR NODEV"; break;
231: case nfsstat.NFSERR_NOTDIR:
232: reason = "NFSERR NOTDIR"; break;
233: case nfsstat.NFSERR_ISDIR:
234: reason = "NFSERR ISDIR"; break;
235: case nfsstat.NFSERR_FBIG:
236: reason = "NFSERR FBIG"; break;
237: case nfsstat.NFSERR_NOSPC:
238: reason = "NFSERR NOSPC"; break;
239: case nfsstat.NFSERR_ROFS:
240: reason = "NFSERR ROFS"; break;
241: case nfsstat.NFSERR_NAMETOOLONG:
242: reason = "NFSERR NAMETOOLONG"; break;
243: case nfsstat.NFSERR_NOTEMPTY:
244: reason = "NFSERR NOTEMPTY"; break;
245: case nfsstat.NFSERR_DQUOT:
246: reason = "NFSERR DQUOT"; break;
247: case nfsstat.NFSERR_STALE:
248: reason = "NFSERR STALE"; break;
249: case nfsstat.NFSERR_WFLUSH:
250: reason = "NFSERR WFLUSH"; break;
251: default:
252: reason = "UNKNOWN CODE"; break;
253: }
254: return reason;
255: }
256:}

La salida de nuestro programa es la siguiente:

Connected with Mountd
Exported filesystem: /usr/local/src
Connected with NFSD
Current directory entries:
linux-wlan-ng-0.2.1-pre26
..
WAG54GV2
.

Debo admitir que lo único que no me gustó de las librerías es la cantidad tan grande de objetos intermedios que hay que crear; Por otro lado no me tomó mucho darme una idea de que metodos llamar y como hacerlo, gracias a lo intuitivo de las clases y el contenido de los RFC.

Ahora piense en las posibilidades de monitoreo utilizando Java y RPC:

  • NIS
  • Espacio en disco, interfaces de redes, carga de el CPU
  • NFS (Ya vimos algo de eso)
  • Y cualquier otro servicio en su máquina que hable RPC

Los dejo con un enlace al código fuente, binarios y las librerías de Remote Tea. Bajeselo, compilelo y juegue con él. Y sobre todo, opine, quizas todos podamos sacar algo interesante de todo esto.

Etiquetas en Technorrati: