A la pàgina 21 del text de "Execució de projectes" de José Ramón Rodrígez ve una reflexió molt curiosa de les diferents accepcions que hi ha en anglès del que naltros anomenam "problemes":
concern: és una preocupació, una cosa que algun dia podria convertir-se en un issue.
issue: una cosa que requereix la nostra atenció i val la pena ocupar-se.
problem: cosa molt seriosa, només passa excepcionalment i supera el nostre control ("Houston, we have a problem...")
De manera que la gestió del issues és important per si de cas un dia es converteixen en un problema.
És tota una filosofia de vida: la gent en compres de pre-ocuparse, s'ocupa.
jueves, 19 de diciembre de 2013
lunes, 16 de diciembre de 2013
Oracle log como SYSDBA sin ser del grupo dba
Para poder hacer este logeo, primero abrimos una sesión con sqlplus con la opción /nolog para que no escriba en el log del dba sin tener permisos. Luego logeamos como "as sysdba".
$sqlplus /nolog
SQL> connect sys/password as sysdba
Connected
SQL>
$sqlplus /nolog
SQL> connect sys/password as sysdba
Connected
SQL>
domingo, 15 de diciembre de 2013
Oracle formatear fecha incio sesión
CREATE OR REPLACE
TRIGGER set_formato_fecha
AFTER LOGON ON SCHEMA
BEGIN
dbms_session.set_nls('nls_language','SPANISH');
dbms_session.set_nls('nls_territory','SPAIN');
dbms_session.set_nls('nls_date_format','''dd/mm/yyyy''');
END set_formato_fecha;
Mucho cuidado con el sqldeveloper: Formatea las fechas por su cuenta pasando de los nls.
Recordar que siempre podemos forzar con
select to_char(sysdate,'"día" dd "de" month "de" yyyy','nls_date_language=spanish')
from dual;
TRIGGER set_formato_fecha
AFTER LOGON ON SCHEMA
BEGIN
dbms_session.set_nls('nls_language','SPANISH');
dbms_session.set_nls('nls_territory','SPAIN');
dbms_session.set_nls('nls_date_format','''dd/mm/yyyy''');
END set_formato_fecha;
Mucho cuidado con el sqldeveloper: Formatea las fechas por su cuenta pasando de los nls.
Recordar que siempre podemos forzar con
select to_char(sysdate,'"día" dd "de" month "de" yyyy','nls_date_language=spanish')
from dual;
Oracle crear rol y asignárselo a usuario
-- http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9013.htm#i2077938
$sqlplus "/as sysdba"
create role programador;
GRANT CONNECT TO programador;
GRANT create session, alter session TO programador;
GRANT create procedure to programador;
GRANT execute any procedure to programador;
GRANT create table TO programador;
GRANT create sequence TO programador;
Grant create trigger to programador;
Grant create type to programador;
grant create view to programador;
grant create any index, create indextype to programador;
grant debug connect session to programador;
grant debug any procedure to programador;
-- CREATE USER username IDENTIFIED BY apassword;
-- GRANT role_name TO user_name;
-- en 11g la tablespace users ya viene hecha, si queremos podemos crear otra tablespace con
CREATE SMALLFILE TABLESPACE USERS DATAFILE 'u01/app/oracle/oradata/ORCL/espacio.dbf' SIZE 50g;
-- el size puede ser unlimited
ALTER DATABASE DEFAULT TABLESPACE USERS;
ALTER USER user_name QUOTA UNLIMITED ON USERS;
$sqlplus "/as sysdba"
create role programador;
GRANT CONNECT TO programador;
GRANT create session, alter session TO programador;
GRANT create procedure to programador;
GRANT execute any procedure to programador;
GRANT create table TO programador;
GRANT create sequence TO programador;
Grant create trigger to programador;
Grant create type to programador;
grant create view to programador;
grant create any index, create indextype to programador;
grant debug connect session to programador;
grant debug any procedure to programador;
-- CREATE USER username IDENTIFIED BY apassword;
-- GRANT role_name TO user_name;
-- en 11g la tablespace users ya viene hecha, si queremos podemos crear otra tablespace con
CREATE SMALLFILE TABLESPACE USERS DATAFILE 'u01/app/oracle/oradata/ORCL/espacio.dbf' SIZE 50g;
-- el size puede ser unlimited
ALTER DATABASE DEFAULT TABLESPACE USERS;
ALTER USER user_name QUOTA UNLIMITED ON USERS;
ORA-12528: TNS:listener: all approriate instances are blocking new connection
En un máquina con Windows XP SP3, me salia este error al intentar arrancar OracleXE 11g. Después de googlear un rato, realicé las siguientes acciones:
cd \oraclexe\app\oracle\product\11.2.0\server\bin
>lsnrctl
status
-- mirar si alguno de los servicios está BLOCKED
-- p.e. Instance "xe", status BLOCKED...
-- parar e iniciar el listener
stop
start
-- volver a comprobar el estado
Ahora, entrar como SYSDBA y hacer un startup
set ORACLE_SID=XE
sqlplus "/as sysdba"
-- opcional por si se había quedado con sesiones restringidas
alter system disable restricted session;
-- startup
startup
Volver a probar la conexión. Si el listener ya no está BLOCKED ya está todo bien.
Peeero..... En mi caso, lo que realmente estaba ocurriendo es que el registro de eventos de windows estaba lleno y por eso el listener no arrancaba. No he encontrado este error en Internet documentado de esta manera. Supongo que puede presentarse en multitud de escenarios, por ello conviene cercionarse de vez en cuando de cómo está el registro de eventos y vaciarlo.
El error en concreto lo vi cuando entraba en el sqlplus:
cd \oraclexe\app\oracle\product\11.2.0\server\bin
>lsnrctl
status
-- mirar si alguno de los servicios está BLOCKED
-- p.e. Instance "xe", status BLOCKED...
-- parar e iniciar el listener
stop
start
-- volver a comprobar el estado
Ahora, entrar como SYSDBA y hacer un startup
set ORACLE_SID=XE
sqlplus "/as sysdba"
-- opcional por si se había quedado con sesiones restringidas
alter system disable restricted session;
-- startup
startup
Volver a probar la conexión. Si el listener ya no está BLOCKED ya está todo bien.
Peeero..... En mi caso, lo que realmente estaba ocurriendo es que el registro de eventos de windows estaba lleno y por eso el listener no arrancaba. No he encontrado este error en Internet documentado de esta manera. Supongo que puede presentarse en multitud de escenarios, por ello conviene cercionarse de vez en cuando de cómo está el registro de eventos y vaciarlo.
El error en concreto lo vi cuando entraba en el sqlplus:
viernes, 6 de diciembre de 2013
Enviar ficheros al servidor que residen en la máquina cliente mediante http POST
Siguiendo con el último artículo, supongamos que lo que queremos es enviar al servidor una o varias imágenes que están en la máquina cliente. Este es un tema muy espinoso y lo más recomendable es instalar un servidor web en la máquina cliente y hacer que el servidor vaya a buscar esos ficheros.
También es cierto que por tema de "atomicidad" queda más bonito enviar imágenes y datos en un solo POST que sólo puede o tener éxito o fallar.
Si en concreto usamos chrome en el cliente, podemos hacer un sencillo "work arround" instalando una extensión de chrome que pida la lectura de unos ficheros en concreto y dándole permisos. Esto tiene la ventaja de que hacemos un solo POST con toda la información necesaria.
Para acceder a los ficheros en el cliente, primero creamos el manifiesto de la extensión de chrome con la lista de ficheros a los que queremos acceder, que deben estar todos en el mismo directorio. El manifiesto también lo guardamos en ese directorio.
manifest.json
Ahora, instalamos la extensión: Vamos a chrome->extensions, activamos developer mode y hacemos Load unpacked extension. A partir de este momento, podemos acceder las imágenes locales desde el navegador con
donde [app-id] es el id de aplicación que nos sale cuando instalamos la extensión. Ya podemos acceder a los ficheros locales con el protocolo chrome-extension, por ejemplo con
Podemos enviar la imagen al servidor mediante un POST, así:
Fuente: varios en stackoverflow y
http://stackoverflow.com/questions/10611796/is-there-any-way-to-load-a-local-js-file-dynamically
También es cierto que por tema de "atomicidad" queda más bonito enviar imágenes y datos en un solo POST que sólo puede o tener éxito o fallar.
Si en concreto usamos chrome en el cliente, podemos hacer un sencillo "work arround" instalando una extensión de chrome que pida la lectura de unos ficheros en concreto y dándole permisos. Esto tiene la ventaja de que hacemos un solo POST con toda la información necesaria.
Para acceder a los ficheros en el cliente, primero creamos el manifiesto de la extensión de chrome con la lista de ficheros a los que queremos acceder, que deben estar todos en el mismo directorio. El manifiesto también lo guardamos en ese directorio.
manifest.json
{ "name": "File holder", "manifest_version": 2, "version": "1.0", "web_accessible_resources": ["imagen1.jpg", "imagen2.jpg", "imagen3.jpg"] }
Ahora, instalamos la extensión: Vamos a chrome->extensions, activamos developer mode y hacemos Load unpacked extension. A partir de este momento, podemos acceder las imágenes locales desde el navegador con
chrome-extension://[app-id]/[imagen]
donde [app-id] es el id de aplicación que nos sale cuando instalamos la extensión. Ya podemos acceder a los ficheros locales con el protocolo chrome-extension, por ejemplo con
chrome-extension://debeanplnpndkfnlbalbmkikofkghfmk/imagen1.jpg
Podemos enviar la imagen al servidor mediante un POST, así:
$("#bt_envia").on("click", function (e) { var x = new XMLHttpRequest(); x.onload = function() { // Create a form var fd = new FormData(); fd.append("upfile", x.response); fd.append("csrfmiddlewaretoken", "{{ csrf_token }}"); // Upload to your server var y = new XMLHttpRequest(); y.onload = function() { alert('File uploaded!'); }; y.open('POST', '/gestion/prova/'); y.send(fd); }; x.responseType = 'blob'; x.open('GET', 'chrome-extension://debeanplnpndkfnlbalbmkikofkghfmk/foto.jpg'); x.send(); });
Fuente: varios en stackoverflow y
http://stackoverflow.com/questions/10611796/is-there-any-way-to-load-a-local-js-file-dynamically
Django hacer POST desde javascript con contenido binario
Si queremos hacer un POST con contenido binario como una imagen desde el navegador contra Django, tenemos que tener en cuenta que la llamada a ajax codifica el stream en UTF-8.
Para desactivar este funcionamiento y hacer el envío "raw" tenemos que poner el responseType como 'blob', de esta forma:
En la parte del servidor, los FILES nos vendrán directamente en el formato nativo, así que sólo tenemos que tratarlos directamente, por ejemplo grabando una imagen en un fichero.
Fuente: varios en stackoverflow
Para desactivar este funcionamiento y hacer el envío "raw" tenemos que poner el responseType como 'blob', de esta forma:
$("#bt_envia").on("click", function (e) { var x = new XMLHttpRequest(); x.onload = function() { // Create a form var fd = new FormData(); fd.append("upfile", x.response); // x.response is a Blob object fd.append("csrfmiddlewaretoken", "{{ csrf_token }}"); // Upload to your server var y = new XMLHttpRequest(); y.onload = function() { alert('Fichero subido!!'); }; y.open('POST', '/gestion/prova/'); y.send(fd); }; x.responseType = 'blob'; x.open('GET', 'http://planetary.s3.amazonaws.com/assets/images/spacecraft/2013/20131108_2013-3896_f537.jpg', true); x.send();
En la parte del servidor, los FILES nos vendrán directamente en el formato nativo, así que sólo tenemos que tratarlos directamente, por ejemplo grabando una imagen en un fichero.
def prova(request): #print str(request.body) # veure https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ print "Els files son ", str(request.FILES) f = request.FILES['upfile'] with open('c:/prova.jpg', 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk) return HttpResponse('Mu guay')
Fuente: varios en stackoverflow
Suscribirse a:
Entradas (Atom)