NuBuMu

Wednesday, February 04, 2009

$current_user

Pues finalmente lo encontre y... la verdad es que no se si tirarme al tren o a la maquinista :)

A ver, el asunto funciona de la siguiente manera: $current_user no es una variable global como yo creia... vaaaaaaya!

De donde viene la confusion? de estos 5 archivos:
  • config.php
  • user.php
  • libs/user.php
  • login.php
  • libs/login.php <- Este es el maldito rodeor que tantos dolores de cabeza me ha dado!!!
Vale, vamos por pasos.

En config.php hay una entrada, en la que no me habia fijado, o mejor dicho, en la que no me habia fijado lo suficiente (la penultima, para mas inri!):

include mnminclude.'login.php';

Yo, apresurado de la moda juvenil, me fui de cabeza a mirar que habia en ./login.php sin ver nada que me resolviera mi terrible duda: Donde se declara/inicializa la maldita variable!!!!

Que hay en include mnminclude.'login.php': Una bonita clase que se llama "AuthUser" (!!!!!!) no me pregunteis por que el Sr. Ricardo Galli decidio tener una clase en un archivo de nombre diferente... para confundirme a mi y al resto de los pescados, imagino.

Bueno, que pasa, que al final de dicha clase, cosa que tambien se me habia pasado por alto... hay una sentencia que dice asi:
// No es verdad angel de amor...
$current_user = new UserAuth();
Los comentarios son mios, pero voy a pedirle a Ricardo que los incluya en su codigo para la posteridad cosa que, por supuesto, ignorara...

So, resumiendo. En todas las paginas se hace un include del config.php cosa que hace que en cada pagina se incluya tambien dicha clase: UserAuth bajo el oscuro nombre de login.php... y que ademas, en cada pagina, se cree un objeto llamado (famoso) $current_user y que se inicializa mediante tremendo constructor-of-the-death.

Vale, me ha quedado claro... o sea, que en cada pagina, se inicializa el usuario y se recuperan los detalles desde la "databass" (por favor, si alguien lee esto, que lo haga usando acento frances).

Vale, si estas autentificado, deberias tener una cookie con dos claves: mnm_user (meneame user) y mnm_key (meneame key). Ademas, en el $_REQUEST te vendra un parametro mnm_key que ha de coincidir con el de la cookie. (Esto se hace por seguridad, y no para volver loco al "probe pogramador" que lee el codigo de Ricardo). Una vez se tienen esos datos, se va a la databass, se chupa la info de la fila, y ala, objeto $current_user habemus.

Asi que con esto y un bizcocho, hemos resuelto el problema del usuario que no existia... :)

y en PHP?

Despues de pasarme un dia entero maldiciendo el obscurantismo del php, creo que he aprendido algunas cosas que, hasta ahora, ni me habia planteado.

Tengo una mini aplicacion que he hecho primero en Java usando JSF, Apache Faces, iBatis y demas frameworks. Ayer me puse a recodificar dicha applicacion en PHP... por que? por que en Java la arquitectura esta muy bonita y tal, pero hay dos problemas: el precio del hosting es, de momento, prohibitivo, y la escalabilidad es bastante compleja... ademas, de como tengo tiempo y no tengo dinero, pos mejor me paso a php y aprendo.

Por que no Rails? por que me da miedo que me vuelva a pasar lo mismo que con java, que escalar la aplicacion no sea sencillo... y eso que ya cuento con que lo voy a ejecutar en Amazon, pero bueno, seguro que con php puedo controlarlo mas. Lo dicho, tengo tiempo :) y no tengo dinero.

Vale, primero problema: la gestion de usuarios. Que hago? pos me voy, me descargo codigo que ya tiene ese problema resuelto desde hace siglos e intento aplicarlo a mi caso. Problema? no funciona. Problema mas gordo aun? no encontre en ninguna parte como funcionaba.

Cuando haces gestion de usuarios: login, autentificaciones, etc... Esta el metodo de coger y guardar objetos en la session ($_SESSION) o tenr una variable global que hace, mas o menos lo mismo.

Meneame y Wordpress usan el metodo de la variable global $current_user y en internet hay mogollon de ejemplos de como guardar objetos en la session.

Claro, yo queria saber como narices, se hace para tener tu objeto del tipo User guardado en $current_user... nada, donde se crea esa variable... parece que es uno de los secretos mejor guardados de internet.

O sea, te miras el codigo y ves que se hacen asignaciones del tipo:

function Login(){
global $current_user,globals;

$user = new User();
// bla bla bla
$current_user = $user
}


y luego en otras partes se saca, del dicho $current_user el email o el nombre, por ejemplo:
echo $current_user->user_name;

Todo esto esta muy bien, mi lo entiende y tal pero... donde narices se crea dicha variable???

Por que si yo hago eso me dice que ni hablar, que el $current_user is blank :(

Al final, despues de pasarme todo el dia ayer para encontrar como hacerlo funcionar, abandone y lo hice guardando objetos en la session :( Vale, acepto la derrota! Php 1 - Ivan 0 :(

Friday, November 28, 2008

Divagando

Curioso como uno, despues de conseguir algo, se pone a rascarse la cabeza y se lo vuelve a cuestionar todo.

Y si uso algo como Amazon EC2 o Google App Engine... Que conste que el motivo por el que he empezado a plantearme esta opcion es por el coste de tener un buen hosting y estas opciones parecen opciones de lo mas baratito ($75/mes Amazon). Y es que he pasado de mirarme Online Virtual Hostings (desde 9€/mes) hasta hostings decicados (40 €/mes)... como se acerca mi cumple he decidido regalrame un netbook para asi tener una idea de lo rapido que corre mi applicacion en un sistema "de recursos limitados"... y por que mola mazo, que caray!

Claro, ya puestos a cuestionarnos cosas, me pregunto si no deberia dejar el modelo Myfaces por algo mas sutil como rails (eeeeeeeek) o python :)

De momento, ayer consegui por fin meterle canya al user interface y ya tengo casi la home acabada :)

Thursday, November 27, 2008

Catching up - Celebracion



No recuerdo en que blog lei que tenias que tener 3 cosas muy claras:
  • Milestones
  • Asumptions
  • Tasks
Pues bien, hoy, y sin querer, he conseguido DOS de mis milestones... y es que la cosa, cuando empieza a rodar, caray lo que rueda!

Vale yo tenia dos Milestones como la copa de un pino: Poder hacer un login cualquiera :) y poder guardar una entrada en mi base de gatos.

Claro, dicho asi, parece muy gilipollas, pero cuando te has pasado los ratos perdidos de casi un mes pensando como hacer las cosas con 3 tecnologias, que la verdad, de saber, se bastante bien poco, pos eso, que le he dado mas vueltas que a una peonza.

Pero ya si que si: entro en mi paginilla, le meto mi usuario y mi contrasenya y registro lo que como :D por que, a ver, alguien se pensaba que yo iba a hacer algo que no estuviera relacionado con la comida? con lo que me gusta comer???

Pues bien, esa excel maldita que tanto tiempo use, ahora va a ser mi super application. Lo cachondo del tema es que ya puedo hacer casi de todo con los unit tests, pero me faltaba engancharlo con el user interface (arghhhhhhh myfaces de mis horrores!!!!).

En fin, que hoy, estamos de fiesta! Un condado de Haza para celebrarlo?

Wednesday, November 19, 2008

Auto-commit mode en iBatis con ScriptRunner

java.sql.SQLException: rollback() should not be called while in auto-commit mode.
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.rollback(ConnectionJDBC2.java:2031)
at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:328)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:312)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

Si alguien se encuentra este problemilla del cual parece no haber mucha documentacion... La solucion es leerse bien los parametros del constructor :)










public void runScript(String file) throws FileNotFoundException, SQLException, IOException{


Connection conn = this.getSqlMapClientTemplate().getSqlMapClient().getDataSource().getConnection();
conn.setAutoCommit(false);
if(conn!=null){
ScriptRunner runner = new ScriptRunner (conn,false,true);
runner.runScript( new FileReader(file));
}else{
throw new SQLException("Connection is null");
}
}


Friday, November 14, 2008

Enumeraciones

Despues de estar pegandome con las enumeraciones voy y descubro que con los JSF las enumeracones no funcionan bien... No si es que...







public enum LengthUnits {
cm(100),
in(3.93598656E1),
ft(3.2799888),
Km(0.0001),
m(1),
mi(6.2121E-4),
mm(1000),
yd(1.0933296)
;
public final double value;

LengthUnits(double value){
this.value = value;
}

}

Wednesday, November 12, 2008

iBatis

Una rapida nota al respecto. iBatis realmente no es muy, erm, flexible a la hora de hacer frente refactorings de este tipo. Si, tengo todos los servicios linkados y no hay que tocarlos, pero tener que rehacer todas las queries me esta tocando mucho las narices: que pesadez!

Refactorizando!

Bueno, si alguien (que me extranyaria) se pregunta por el paron posteador en este blog es por un sencillo motivo: estoy refactorizando la aplicacion por completo.

por que? pues a ver, empece muy bien, estos objetitos por aqui, estos servicios por alli, me defino estos beans asi, le pongo este mapeo por alla, tengo los unit tests bien ordenaditos aqui... vaya, todo orgulloso de mi mismo hasta que me invadio una duda al respecto de las unidades de medida...

La aplicacion usa mogollon diversas y muy variadas unidades de medida: pies, metros, gramos, cucharadas, pizcas, en fin, tantas medidas y tan absurdas como os podais imaginar...

Pues bien, de como montar un sistema que funcione "de forma sencilla" con las malditas unidades y sus respectivas conversiones, me ha llevado a refactorizar casi toda la aplicacion. Por que? por que no puedo disenyar toda la aplicacion como si supiera que iba a hacer, sino que tengo que hacerlo a poco a poco... especialmente teniendo en cuenta que lo hago en mis ratos libres y con mi super memoria... pos ya ves :)

De hecho ya deberia haberlo hecho asi desde un buen principio, pero te vas animando te vas animando y luego... pues pasa lo que pasa :D

De todas formas, teniendo en cuenta los ciclos del desarrollo agil, ya tocaba un refactoring de los mios :D

Wednesday, November 05, 2008

Bug habemus

Microsoft Windows XP SP2

java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot(TM) Client VM (build 1.5.0_16-b02, mixed mode)

jTDS-1.2.2

MS SQL Server 2000 SP4 (separate server running WIndows 2003 Server)

java.sql.SQLException: rollback() should not be called while in auto-commit mode.
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.rollback(ConnectionJDBC2.java:2031)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibatis.common.jdbc.SimpleDataSource$SimplePooledConnection.invoke(SimpleDataSource.java:958)
at $Proxy0.rollback(Unknown Source)


Solution? not yet :(