sábado, 23 de enero de 2010

Usando el API de Twitter con Java


Siempre quise usar la API de Twitter, pero en vez de leer entender todo el funcionamiento del servicio opté por usar las librerías ya existentes, ¿para qué reinventar la rueda? Soy un flojo del demonio.

En el sitio de Twitter puedes encontrar numerosas librerías que te servirán para utilizar la API de Twitter y hacer tus juegos o experimentos, yo me decidí por JTwitter. Una vez descargado su archivo .jar e importarlo a un Java Project en Eclipse ya puedes empezar a hacer las maniobras que desees. Ojo, la API deTwitter fija un límite de requests así que no podrás usar bucles infinitos para espamear ni borrar todo tu timeline.

En mi caso, quise hacer lo que mencioné, borrar todos mis tweets pero es imposible. Les copio el código para borrar tus últimos 100 tweets. Es bueno crear una procedimiento wait para no saturar las llamadas al servidor de un solo porrazo. Otra cosa, tu perfil tuitero debe estar sin el candadito.

import winterwell.jtwitter.Twitter;
import winterwell.jtwitter.Twitter.Status;

public class TwitterRevenge {

public static void wait (int n){
long t0,t1;
t0=System.currentTimeMillis();
do{
t1=System.currentTimeMillis();
}
while (t1-t0<n);
}

public static void main(String[] args) {

// Nos logueamos. Usuario y contraseña.
Twitter twitter = new Twitter("zajnostiko","fujimoridemela");
// Usamos un bucle para borrar siempre el último estado
for (int i = 0; i < 100; i++){

Status estado = twitter.getStatus("zajnostiko") ;
System.out.println(i);
System.out.println(estado);
twitter.destroyStatus(estado);
wait(100);
}}}

¿Alguien tiene más código para compartir?

domingo, 10 de enero de 2010

Planificación Estratégica en el País: El CEPLAN

La semana pasado nos habremos enterado de que un tal CEPLAN presentó un plan ¿estratégico? en no sé dónde y que éste fue criticado por unos economistas de no sé dónde . ¿Qué es el CEPLAN? ¿qué es un plan estratégico? Contestemos de atrás para adelante, eso lo veremos en este sencillo post. Cualquier aporte será bienvenido.

La planificación estratégica es un proceso sistémico y sistemático de definición de objetivos y metas de alcance a largo plazo. Dicho proceso es utilizado en organizaciones, ya sea empresas, instituciones u otras asociaciones cuando se tiene (o debería tener) una visión compartida. El Estado, visto bajo un enfoque organizacional, también debería articular acciones que trasciendan gobiernos y que busquen en un horizonte de ocho, diez, quince o veinte años (como se desee) alcanzar tales objetivos.

El Centro Nacional de Planeamiento Estratégico (CEPLAN) es la entidad responsable de las labores de planificación y difusión de la cultura planificadora en el Estado. El miércoles 10 de enero, dicha institución hizo la presentación pública del proyecto del Plan Estratégico de Desarrollo Nacional 2010 -2021 (un horizonte de 11 años que culmina con la celebración del bicentenario de nuestra “independencia”). En la presentación se recibieron algunas críticas por parte de los economistas participantes de la comisión del Congreso que monitorea el Plan Anticrisis.

Cabe necesario tomar algunas consideraciones dentro del debate de la planificación estratégica en nuestro país:

1. Un plan estratégico debe contar con la participación de todos los miembros de la organización.

¿Quiénes son los miembros del Estado? ¿Las instituciones? ¿Los ciudadanos? ¿Los partidos políticos? ¿Qué es lo que persiguen las instituciones? ¿Qué aspiramos los ciudadanos con este país? ¿Qué objetivos desinteresados persiguen los partidos políticos? ¿Qué consensos pueden existir entre los diversos poderes del Estado? ¿Qué consensos pueden existir entre todos los ciudadanos del país? ¿Cuál sido el grado de participación de cada uno de estos actores en el proceso de planificación estratégica?

2. La planificación estratégica debe ser liderada por los niveles más altos de la organización.

¿El CEPLAN lidera la planificación o debería ser un facilitador de tal proceso? ¿El CPELAN se encuentra en el nivel más alto del Estado? ¿La planificación estratégica tiene rango ministerial? ¿Alan García, sus ministros y los congresistas están comprometidos con la planificación estratégica del país? ¿La planificación estratégica debería gozar de un rango ministerial como ocurre en Brasil? ¿Con cuántos recursos cuenta el CEPLAN para cumplir su misión institucional?

3. La planificación estratégica persigue objetivos alcanzables.

¿Qué queremos lograr como país? ¿En cuánto tiempo pensamos cumplirlo? ¿Pueden ser realizables? ¿Qué iniciativas estratégicas deberán primar? ¿Qué limitaciones tenemos? ¿Hemos identificado la relación causa-efecto de nuestros objetivos? Creo yo que aquí la palabra consenso es clave para que todos los interesados tengamos metas comunes por trabajar.

4. Un plan estratégico no es la panacea.

Efectivamente, un plan estratégico no es más que un documento estructurado de buenas intenciones. El plan estratégico no es el fin, es un medio. Las metas e indicadores definidos en el plan deben ser controlados a través del tiempo, ahí radica la importancia del compromiso de todos los actores políticos. ¿Los siguientes gobiernos respetarán un plan estratégico del gobierno antecesor? ¿Evitarán mezquindades para darle continuidad al proceso estratégico? ¿Qué influencia tendrá el CEPLAN durante la ejecución del plan en las acciones del gobierno y sus ministerios?

Algunos conocemos de planes muy prometedores que empiezan con gran expectativa y dentro de poco tiempo acaban en el olvido (por cierto, ¿qué le pasó al Acuerdo Nacional?). En mi facultad la planificación estratégica fue impulsada por sus estudiantes después de la toma del 2004, pero jamás comprometió a las autoridades a mediano plazo, razón de su estancamiento. Es responsabilidad de todos los ciudadanos y partidos políticos darle viabilidad al país sin importar quién esté sentado en el sillón presidencial.

Qué bueno sería que esto fuese un tema de discusión permanente en los medios. Estoy a la espera de la publicación del documento final del CEPLAN, pensé que estaba disponible pero no es así. ¿Cuándo se pronuncian los políticos? Estamos a la espera.

Links:
- Un poco de la documentación del CEPLAN que se tiene hasta la fecha.
- ¿Estrategias? Aterrizamos a Porter con Hax y Majluf, recomendado.

jueves, 7 de enero de 2010

Jóvenes Traidores (o Estúpidos): Ataque a Chan Chan


Al ver estas imágenes no pude creer que compatriotas míos hagan lo que seguramente jamás le perdonaríamos a un foráneo: una horda de subnormales atacando las ruinas de la ciudadela de Chan Chan. ¿El enemigo de un peruano es otro peruano? Para este caso pareciera que sí.

Estos jóvenes se han zurrado en el patrimonio nacional y en todos los que lo apreciamos, han tenido la osadía de subir el video de su estupidez a Youtube. El usuario Tilintil0n es el sospecho que ya ha borrado el video que subió, pero no contó con la astucia de los internautas.

Por si acaso, subí el video a mi cuenta, seguramente otros ya se han anticipado para evitar que estos jóvenes traidores se salgan con la suya. Jalón de orejas para las autoridades "vigilantes" y para los padres que forman a chicos cada vez más incivilizados.

Policía, sociedad... ¡a ellos! Una sanción ejemplar es suficiente, no respondamos a la incultura con salvajismo amenazante.


Actualización:

@marcogg15: Si uno googlea "Tilintil0n youtube" se ve "promocion 5B Luzuriaga" como videos puestos.

Y gracias a @Arianita1, la foto de los implicados. He quitado la foto de los chibolos estúpidos. Protección al menor, ya saben.

domingo, 3 de enero de 2010

Lecturas de Estado en ORCE Usando Java SE

No pude evitar la curiosidad. Aprovechando mis últimos momentos de descanso quise probar lo mismo que ayer pero usando Java en vez de Python. Quiero aclarar que no se está haciendo ninguna consulta a base de datos sino trabajar con el código HTML obtenido de las URL's invocadas. Ahí va el código:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.io.File;
import java.io.FileReader;

public class Lector {
public static void main(String[] args) {

File f = new File( "\\codigos.txt" );
BufferedReader entrada;
try {
entrada = new BufferedReader( new FileReader( f ) );
String codigo;
int eg=0,ba=0,ti=0,su=0,re=0 ;
while(entrada.ready()){
codigo = entrada.readLine();

URL url = new URL("http://www.orce.uni.edu.pe/detaalu.php?id="+codigo+"&op=detalu");
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = bufferedReader.readLine();
String nombre = null;
String condicion = null;

while (line != null) {

if (line.equals("      <td style=\"font-weight: bold;\"><img src=\"/images/flechita.gif\"> Nombres:</td>")){
line = bufferedReader.readLine();
nombre = line.replace("", "").replace(" ", "").replace(" ", "-").replace("", "");
if(nombre.charAt(nombre.length()-1)=='-'){
nombre= nombre.replace(nombre, nombre.substring(0,nombre.length()-1));
}
}
if (line.equals("      <td style=\"font-weight: bold;\"><img src=\"/images/flechita.gif\"> Situación:</td>")){
line = bufferedReader.readLine();
condicion = line.replace("", "").replace(" ", "");
if (condicion.equals("BACHILLER"))
ba=ba+1;
if (condicion.equals("SUSPENSION VOLUNTARIA"))
su=su+1;
if (condicion.equals("EGRESADO"))
eg=eg+1;
if (condicion.equals("TITULADO"))
ti=ti+1;
if (condicion.equals("EN REGULARIZACION DE CURSO(S)"))
re=re+1;

}
line = bufferedReader.readLine();
}
bufferedReader.close();
System.out.println(nombre+": "+condicion);
}
System.out.println("");
System.out.println("RESULTADOS");
System.out.println("");
System.out.println("TITULADOS: "+ti);
System.out.println("BACHILLERES: "+ba);
System.out.println("EGRESADOS: "+eg);
System.out.println("EN REGULARIACION DE CURSO: "+re);
System.out.println("SUSPENSIONES VOLUNTARIAS: "+su);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}}}
Al correr este código se imprime lo siguiente en la consola de Eclipse:

Y también las cantidades de cada estado:

Definitivamente en Python se requiere de menos código, de todas maneras si alguien puede mejorar el código bienvenido sea, seguro que así será. Chau vacaciones.

Nota: Por si acaso, descarga la fuente aquí. Usa tu propio .txt, no lo olvides.

sábado, 2 de enero de 2010

Conociendo Python

Gracias a Unimauro me animé a probar Python (un lenguaje de programación). Ayer me envió su script .py y un archivo .txt para hacer una prueba accediendo a una sección de consultas de nuestra universidad. La idea es conocer el estado (egresado, titulado, bachiller, etc.) de ciertos estudiantes y graduados (se necesitan sus códigos universitarios, por ejemplo, 20016798X) en la base de datos de la UNI.

Descargué e instalé primero el Python 3.1.1 en Windows Vista -no se desmayen, linuxeros- pero aparentemente no era la versión que usó mi amigo y había problemas con una librería. Desinstalé y probé con el Python 2.6.4. y funcionó de maravilla.

Replico el código:

import urllib2
import string
sv=ba=en=eg=ar=ti=0
for i in open("codigos.txt","r").readlines():
s="http://www.orce.uni.edu.pe/detaalu.php?id="+i[:-1]+"&op=detalu"
r=urllib2.urlopen(s)
h=r.read()
no=string.rstrip(" ".join(h.split('Nombres')[1][0:104].split("")[1].split("")[0].split("-"))).title()
si=h.split('Situaci')[1][0:54].split("")[1].split("")[0]
print "+ "+i[:-1] +" "+no+" -> " +si
if si=='SUSPENSION VOLUNTARIA':
sv=sv+1
elif si=='BACHILLER':
ba=ba+1
elif si=='EN REGULARIZACION DE CURSO(':
en=en+1
elif si=='EGRESADO':
eg=eg+1
elif si=='TITULADO':
ti=ti+1
else:
ar=ar+1

print "+ TITULADOS : "+ str(ti)+ "\n+ BACHILLER : "+ str(ba)+ "\n+ EGRESADO : "+ str(eg) +"\n+ SUSPENSION VOLUNTARIA : "+ str(sv)+"\n+ EN REGULARIZACION DE CURSO : "+ str(en)+" \n+ ALUMNOS REGULARES : "+ str(ar)

El archivo codigos.txt es un archivo que contiene un arreglo simple con los códigos universitarios de las personas consultadas. Lo siento, pero no tengo la autorización para publicar estos códigos, pero pueden probar con los de sus amigos, escriban un código en cada línea y listo.

Después de correr el script obtengo el estatus de cada compañero de mi promoción, je je je:

También obtengo la cantidad total de titulados, bachilleres, egresados y otros:

Estos resultados están en función a la base de datos de la universidad en la Web, que no está actualizada aún porque Unimauro ya obtuvo su título pero parece que aún no está registrado eso en el sistema. O sea, hay 1 titulado y no 0 hasta donde sé.

Así fue mi primer contacto con Python, reutilizando código y aprovechando un día nublado. ¡Gracias, Unimauro!

Links:
- Kaká sacando la vuelta "al sistema".
- Descarga Python si deseas.

viernes, 1 de enero de 2010

¡Feliz Año 2010!

Feliz Año Nuevo, lectores. El 2009 se fue, ¿qué nos deparará el 2010? Exactamente hace 365 días empecé el año hablando de retos y oportunidades (¡sobretodo con la crisis!), harto positivismo, y todo fue bien, felizmente. ¿Pero saben qué? Ya no arranco el año con buenos deseos, sino con determinación. ¡Allá vamos!