Extracion de documentos en Oracle text


Oracle incorpora un tipo de datos llamado BLOB que permite almacenar documentos de cualquier tipo (imágenes, excel, word, access, comprimidos, vídeos, música, etc). En principio admite cualquier tipo de documento y de cualquier tamaño aunque aún sigue manteniendo el tipo de datos LONG RAW que está obsoleto, sustituido por BLOB. Las instrucciones que os mostramos a continuación admiten ambos tipos de datos: BLOB y LOB RAW.

 

Insertar o extraer documentos  desde Visual Basic

Para poder insertar documentos en un campo BLOB de Oracle con Visual Basic necesitaremos una librería (dll) llamada SAFileMgr Module (SAFileMgr.dll), esta librería está disponible de forma gratuita en la web http://www.softartisans.com. Tras descargar este fichero, deberemos copiarlo a la carpeta del sistema (normalmente C:/Windows/System32) y registrarlo con el comando:  regsvr32 C:/Windows/System32/SAFileMgr.dll .  Tras copiar y registrar el fichero SAFileMgr.dll, también necesitaremos disponer de una base de datos Oracle activa

Tras tener la tabla creada con el campo BLOB, procederemos a abrir Visual Basic y a crear un nuevo proyecto para insertar y extraer documentos en Oracle. En la ventana de “Nuevo proyecto” seleccionaremos “EXE estándar” y pulsaremos “Abrir”:Para que la aplicación funcione correctamente deberemos agregar las referencias necesarias. Para ello pulsaremos en el menú “Proyecto ” – “Referencias” de Visual Basic:Seleccionaremos la referencia FileMgr 1.1:Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero .dll copiado y registrado anteriormente:C:/Windows/System32/SAFileMgr.dll y seleccionaremos también Microsoft ActiveX Data Objects 2.6 Library: Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero ubicado en: C:/Archivos de programa/Archivos comunes/system/ado/msado26.tlb

 

Ahora veamos el código de cada uno de los tres  botones de un  formulario tipo para lanzar una consulta de inserción o extracción de un documento :

  • Para el botón “Insertar documento“:

Private Sub btInsertarDocumento_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

Dim FileMgr As New FileManager

Dim SQL As String

On Error GoTo cError

‘ Conexión mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text, _

txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos una consulta SQL sobre la tabla  para activar el recordset

SQL = “Select * from ” + txtTabla.Text + ” where 1=2″

Rs.Open SQL, Conn, 2, 3

‘ Añadimos un nuevo registro con los datos indicados

Rs.AddNew

Rs(txtCampoTitulo.Text).Value = txtDocumentoTitulo.Text

Rs(txtCampoRutaDocumento.Text).Value = txtDocumento.Text

‘ Insertamos el documento en el campo BLOB/RAW

FileMgr.ExportToBlob txtDocumento.Text, Rs(txtCampoBLOB.Text)

Rs.Update

Rs.Close

Conn.Close

Set Conn = Nothing

MsgBox “Documento insertado correctamente en ” + “la base de datos: ” + vbCrLf + vbCrLf + txtDocumento.Text, vbOKOnly + vbInformation

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

  • Para el botón “Ejecutar“:

Private Sub btEjecutar_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

On Error GoTo cError

‘ Conexión a Oracle mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text,  txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos consulta SQL introducida por el usuario

Rs.Open txtSQL.Text, Conn, 0, 1

txtExtraerTitulo.Text = Rs(txtCampoTitulo.Text)

txtDestino.Text = Rs(txtCampoRutaDocumento.Text)

Rs.Close

Conn.Close

Set Conn = Nothing

MsgBox “Consulta SQL ejecutada correctamente.”,  vbOKOnly + vbInformation

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

  • Para el botón “Ejecutar“:

Private Sub btExtraer_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

Dim FileMgr As New FileManager

Dim continuar As Boolean

On Error GoTo cError

‘ Conexión a Oracle mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text, _

txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos consulta SQL introducida por el usuario 

Rs.Open txtSQL.Text, Conn, 0, 1

‘ Comprobamos si existe ya un fichero destino

‘ con el mismo nombre

continuar = False

If Dir(txtDestino.Text) <> “” Then

continuar = MsgBox(“Ya existe un documento ” + “con este nombre ¿desea reemplazarlo?”, vbYesNo + vbQuestion) = vbYes

Else

continuar = True

End If

‘ Extraemos el documento del primer   registro de la consulta SQL  en el destino especificado por el usuario

If continuar Then

FileMgr.ImportFromBlob Rs(txtCampoBLOB.Text), txtDestino.Text

MsgBox “Fichero extraído correctamente en: ” + vbCrLf + vbCrLf +  txtDestino.Text, vbOKOnly + vbInformation

End If

Rs.Close

Conn.Close

Set Conn = Nothing

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

 

Extracción desde java

 

Ahora  veamos  usando el lenguaje   Java un ejemplo de como podemos extraer  documentos almacenados en  CLOB’s   en una base de Datos Oracle Text 9 en Java

Necesitaremos tener instalado el cliente Oracle instalado en la maquina, las credenciales de acceso  ,    asi como referenciar en el proyecto desde el Eclipse las siguientes librerías

 

 

 

Y ahora veamos  un ejemplo de una clase de extracción de campos clob’s

La clase principal es Main , la cual debería seleccionarse al exportar el proyecto desde Eclipse

Se puede ejecutar en local  o crear un pequeño script para invocar el java

En este ejemplo es  obligatorio usar tres argumentos y en este orden  para llamar al programa:

  • nodo= número del nodo a exportar
  • tope = numero de orden donde se quedo la última exportación empezando por cero
  • topefinal= umbral donde termina

 

En el proyecto se han referenciado dos versiones de la MV Java porque puede ocurrir que la MV usada en local ( 1.6 ) sea diferente a la del host  donde se ejecute ( por ejemplo  la 1.4.2_08, razon por la habria que copiar tambien esa version 1.4.2.08  dedseel host  a una ruta local

También se hace referencia al driver de oracle classes12.jar , ruta que también existe en la maquina

 

 

Este proyecto debería exportarse situándose en la raiz del proyecto como un jar sin incluir tanto los ficheros .classspath como el de .project

Antes de compilar debe eliminar manualmente el war existente desde el propio eclipse asi como el log de ejecución (manualmente habría que ubicarse en c:\ users\xxx\workspace\application)

Asimismo por ultimo , al   compilarlo  no debemos incluir el classpath

 

Veamos el código completo;

 

/*
Main.java
*
* Created on 20 de Marzo de 20174, 11:43
*

*/

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import oracle.jdbc.driver.OracleDriver;

/**
* @author CRN
*
* EXTRACTOR DOCUMENTOS
*/

public class Main {

private static int nodo;

private static int tope;

private static int topefinal;

public static void main(final String[] args) {

System.out.println(“Inicializando programa …”);

Connection conn = null;

GestorDeConexiones gc = null;

try{

gc = new GestorDeConexiones(“xxxx”, “yyyyyy”); // credenciales de  acceso a la BBDD con el user y pwd de acceso 

conn = gc.getConnection();

// Comprueba si hay argumentos en la linea de comandos

final int nnodo=1;

if(args.length != 0)
//CON ARGUMENTOS

{
for(int counter = 0; counter < args.length; counter++)
{
System.out.println(“Argument index ” + counter + “: ” + args[counter]);
}

System.out.println(” fin argumentos”);

nodo = Integer.parseInt(args[0]); // primer argumento ( el nodo)

tope = Integer.parseInt(args[1]); //segundo argumento (inicio

topefinal = Integer.parseInt(args[2]); //tercer argumento ( tope)

System.out.println(“Argumento nodo= ” + nodo);
System.out.println(“Argumento conteo incial= ” + tope);
System.out.println(“Argumento numero de documentos= ” + topefinal);

}

else

//SIN ARGUMENTOS

{
System.out.println (“No se ha incluido ningún argumento”);
System.exit(0);
}

System.out.println(“NODO” + nodo);
System.out.println(“Valor inicial= ” + tope);
System.out.println(“Valor final= ” + topefinal);

final String path1 =”d:\”;

final String nfichero= path1+”previa_carga_jd_”+nodo+”tope“+tope+”topefinal_”+ topefinal;

//generacion del fichero de salida

File theDir = new File(nfichero);

if (!theDir.exists())
{
System.out.println(“..creando directorio: ” + theDir.getName()); // SI EL DIRECTORIO NO EXISTE ,. SE CREA
boolean result = false;
try{
theDir.mkdir();

result = true;
}
catch(SecurityException se){   //handle it
}
if(result) {
System.out.println(“Directorio creado”);
}
}

//Intentamos cambiar los permisos al directorio creado
System.out.println(“Cambiamos permisos 777 a “+nfichero);
Process theProcess = null;
try
{
theProcess = Runtime.getRuntime().exec(“chmod 777 “+ nfichero);
}
catch(IOException e)
{
System.out.println(“Error en el método exec()”);
}

//creacion fichero de log

final String log1=path1;

final String nfichero1= log1+”directorio_”+nodo+”tope“+tope+”topefinal_”+ topefinal+”.log”;

System.out.println(“Fichero Log de proceso :[” +nfichero1+”]”);
System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);

//generación del fichero de salida

File fichero = new File(nfichero1);

 

if (!fichero.exists())
{

// SI NO EXISTE , SE CREA
System.out.println(“..creando fichero de log: ” + fichero.getName());
boolean result = false;
try{
fichero.createNewFile();

result = true;
}
catch(SecurityException se){ //handle it
}
if(result) {
System.out.println(“Fichero creado”);
}
}

//abre fichero de log
File TextFile = new File(nfichero1);
FileWriter TextOut = new FileWriter(TextFile, true);
TextOut.write(“********************************************************************\r\n”);
TextOut.write(“INICIANDO PROCESO DE EXTRACCIÓN DE DOCUMENTOS r\n”);
TextOut.write(“Fichero Log de proceso :[” +nfichero1+”]\r\n”);
TextOut.close();

String path=nfichero +”/”;

System.out.println (“RUTA DESTINO FINAL”+ path);

//extraemos los objetos de texto
RecuperadorBD2.RecuperarBD2(conn,path, tope,topefinal,nodo,nfichero1);

}
catch (final SQLException sqle) {
System.out.println
(“Error de acceso a BD:” + sqle.getMessage());
sqle.printStackTrace();
}
catch (final IOException ioe){
System.out.println
(“Error de acceso a disco:” + ioe.getMessage());
ioe.printStackTrace();
}

try{
if (gc != null && conn != null)
gc.closeConnection();
}

catch (final SQLException sqle)
{
System.out.println
(“Error de acceso a BD:” + sqle.getMessage());
sqle.printStackTrace();
conn = null;
gc = null;
}
System.out.println(” **** Fin extraccion ****”);
}
}

class RecuperadorBD2
{
public static void RecuperarBD2 (final Connection cn, final String path , final int topec, final int topex, final int nodo ,final String path1)
throws SQLException, IOException
{

 

String topex1= String.valueOf(topex);

String topec1= String.valueOf(topec);

String nnodo= String.valueOf(nodo);

int contador=0;
FileOutputStream fos = null;

Statement st = null;
ResultSet rs = null;

 

final String sql=” SELECT “+
“FROM(SELECT to_number (rownum) cuenta,”+
” p.
“+
” FROM “+
” ( “+
“SELECT c.nodo_co_nodo, “+
” c.infi_nu_infi, “+
” c.docu_co_documento, “+
” d.docu_no_documento, “+
” d.docu_no_extension ,”+
” d.docu_nu_version, “+
” d.DOCU_FX_MODIFICACION fecha,”+
” e.doct_do_documento doc “+
” FROM tablametadatos c, “+
tablaauxiliar d, “+
tabladocumentos e “+
” WHERE c.nodo_co_nodo = ” + nnodo +
” AND c.docu_co_documento =d.docu_co_documento “+
” AND d.docu_co_documento =e.docu_co_documento “+
” AND e.docu_nu_version =d.docu_nu_version “+
” AND c.docu_nu_version =e.docu_nu_version “+
” ) “+
” where (cuenta >”+topec1 + ” and cuenta <” +topex1 +” )”;

 

//abre fichero de log
File TextFile = new File(path1);
FileWriter TextOut = new FileWriter(TextFile, true);

System.out.println(“”);
System.out.println(“********************************************************************”);
System.out.println(“COMENZANDO PROCESO INICIAL”) ;
System.out.println(“sql general=”+sql);
System.out.println(“”);

TextOut.write(“********************************************************************\r\n”);
TextOut.write(“COMENZANDO PROCESO INICIAL\r\n”);
TextOut.write(“sql general=”+sql+”\r\n”);

try
{

st = cn.createStatement();
rs = st.executeQuery(sql);

while (rs.next())
{
++contador;
//para blobs
final String verdocu= rs.getString(“docu_no_documento”) ;
System.out.println(“Ndocu =” + verdocu );

final String verinfi =rs.getString(“infi_nu_infi”);
System.out.println(“Infi =” + verinfi );

final String verloc = rs.getString(“docu_co_documento”);
System.out.println(“Cdocc =” + verloc );

final String vernombre= verinfi+”“+verloc + ““+ verdocu;

System.out.println(“Nombre =” + vernombre );

System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);
System.out.println(“Numero fichero a extraer =” + contador );

TextOut.write(“Numero fichero a extraer =” + contador+”\r\n”);

final String nfichero =vernombre; //LE PASAMOS COMO ARGUMENTO EL NOMBRE YA MONTADO:INFI_DOCU+LOC

System.out.println(” Fichero a extraer: ” +nfichero);
TextOut.write(“Fichero a extraer =” + nfichero+”\r\n”);

final String pathname= path + nfichero ;
System.out.println(” Extrayendo fichero multimedia : “+pathname);
TextOut.write(“Extrayendo fichero multimedia =” + pathname +”\r\n”);

//deberíamos comprobar si existe ese fichero
final File file = new File(pathname);

fos = new FileOutputStream(file);
final Blob bin = rs.getBlob(“doc”);
System.out.println(“…Extrayendo BLOB”);
TextOut.write(“Extrayendo BLOB \r\n”);

final InputStream inStream = bin.getBinaryStream();
final int size = (int)bin.length();
System.out.println(“Tamaño: “+size);
TextOut.write(“Tamaño =” + size+”\r\n”);

final byte[] buffer = new byte[size];
int length = -1;

while ((length = inStream.read(buffer)) != -1)
{
fos.write(buffer, 0, length);
}

if (fos != null)

{

//Intentamos cambiar los permisos al directorio creado
TextOut.write(“Fichero extraido ok \r\n”);

permisos777(pathname);
fos.close();
System.out.println(” Fichero extraido ok.”);
System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);
TextOut.write(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n”);

}
}
}
catch (final IOException ioe)
{
throw new IOException(ioe.getMessage());

}
finally
{
if (fos !=null)
{
fos.close();
TextOut.write(“FIN DEL PROCESO \r\n”);
TextOut.close();

}
if (rs !=null)
{
rs.close();

TextOut.close();
}
rs=null;
st=null;

 

 

System.out.println(“Fin RecuperaBD2”);

System.out.println(“FIN PROCESO”) ;

TextOut.close();

}
}

 

//funcion para añadir permisos 777 a los ficheros extraidos 
public static void permisos777 (final String pathname)
{

Process theProcess = null;

//intentamos cambiar los permisos del fichero recién creeado
System.out.println(“Cambiamos permisos 777 a “+pathname);
try
{
theProcess = Runtime.getRuntime().exec(“chmod 777 “+ pathname);
}
catch(IOException e)
{
System.out.println(“Error en el método exec()”);
}
//fin de cambio de permisos

}

}

//clase para gestionar las conexiones con la BBDD

class GestorDeConexiones
{
private final String user;
private final String password;
private Connection conn = null;
private boolean conectado = false;

public GestorDeConexiones(final String usr, final String pwd){
user = usr;
password = pwd;
}

public void closeConnection() throws SQLException{
if (conectado)
conn.close();
}

private void conectar() throws SQLException {

String url;
DriverManager.registerDriver(new OracleDriver());

url = “jdbc:oracle:thin:@x.x.x.x:yyy:cadena”; ///ojo PROD

 

conn = DriverManager.getConnection(url,user, password);
System.out.println(“Conexion correcta”);
conectado = true;

}

public Connection getConnection() throws SQLException
{
if (!conectado)
conectar();
return conn;
}
}

 

 

 

 

Concurso Azure Sphere


En la era de IoT, nuestra vida está cada vez más integrada con la tecnología  gracias a la capacidad de los dispositivos de consumo cotidiano, las máquinas industriales, los vehículos y los electrodomésticos para interactuar entre sí mediante la conectividad de Internet integrada ha hecho la vida más fácil y eficiente.

Microsoft ha desarrollado Azure Sphere para el desarrollo de dispositivos de microcontroladores (MCU) altamente seguros compatibles con implementaciones de IoT  , intentando  asegurarse de que los dispositivos innovadores puedan continuar alterando el status quo y mejorando nuestras vidas sin sacrificar el importante aspecto de  nuestra seguridad, aspecto  de los mas  crucial para  que el IoT pueda  seguir evolucionando. 

En este senctido  Microsoft  ha hecho una llamada a todos los ingenieros y desarrolladores de todo el mundo para crear proyectos altamente seguros, impulsados ​​por MCU utilizando Azure Sphere, diseñando formas creativas para asegurar lo que más lo necesita: ¡todo! 

Asegurar sus datos es importante en una gran cantidad de industrias. Aquí hay algunas ideas para comenzar:

  • Integrar Azure Sphere en dispositivos perimetrales de IoT nuevos o existentes
  • Asegurar sus proyectos de electrónica de consumo .
  • Innovaciones en torno al comercio seguro e inteligente
  • Construccion de soluciones robustas y seguras para edificios y domótica.
  • Diseñar soluciones seguras de fábrica.
  • Crear soluciones de energías renovables

La idea  pues es crear un nuevo proyecto en torno al concepto de seguridad o simplemente mejore la seguridad de sus proyectos existentes con su nuevo kit de Azure Sphere  contandoles detalles urante la experiencia. ¿La mejor parte? ¡Avnet está regalando hasta 20,000 Kits de Esfera Azure gratis para que podamos comenzar!

shutterstock_674647300.jpg

 

¿Qué es Microsoft Azure Sphere?

Azure Sphere consta de tres capas de seguridad: en el sistema operativo, en la nube y en la MCU.

  • Seguridad en el sistema operativo:Un SO creado a propósito reepecto a aspectos como  la seguridad y agilidad para crear una plataforma confiable para nuevas experiencias de IoT. Un sistema operativo seguro construye innovaciones de seguridad pioneras en Windows en un HLOS lo suficientemente pequeño para los MCU.

  • Seguridad en la MCU:Asegurado desde y hasta  el silicio  Esta nueva clase cruzada de MCU ahora combina procesadores de aplicaciones y en tiempo real con tecnología de seguridad y conectividad de Microsoft incorporadas.

  • Seguridad en la nube: Protege los dispositivos con una nube construida para la seguridad de IoT. El servicio de seguridad de Azure Sphere renueva la seguridad del dispositivo, identifica las amenazas emergentes y la confianza de los intermediarios entre el dispositivo, la nube y otros puntos finales.

 El hardware

Especificaciones del Carrier Board

  • Dos zócalos de expansión MikroE Click board
  • Conector de expansión Grove (I2C)
  • Sensores a bordo: acelerómetro de 3 ejes, giroscopio de 3 ejes, temperatura, presión / barométrica, luz ambiental
  • Interfaz para pantalla OLED 128×64 opcional
  • Interfaz USB
  • Soporta depuración, servicio y recuperación
  • UARTs, y JTAG
  • Interruptores pulsadores de usuario y LEDs.
  • Regulación de potencia de 5V a 3.3V
  • Entrada de alimentación de CC: USB 5V desde la computadora central y huellas de terminales para suministros externos de 5V DC y VBAT

Módulo Azure Sphere MT3620

  • MediaTek MT3620AN SoC
  • 3 interfaces ISU configuradas para UART, SPI, I2C
  • ADC / GPIO: 3x entradas de ADC de 12 bits (o 3 GPIOs)
  • PWM / GPIO: 9x salidas PWM (o hasta 24 GPIOs)
  • RTC (requiere suministro VBAT)
  • Wi-Fi de banda dual 2.4 / 5GHz 802.11 a / b / g / n
  • Antena chip de doble banda 2.4 / 5GHz

 El software

Tenga en cuenta los escenarios del mundo real: su solución segura deberá tener una transmisión de comunicación diaria con la Nube de Azure para garantizar una conexión protegida continua. Use su kit de desarrollo de Azure Sphere para aprovechar los servicios en la nube de Microsoft..

 

 

Concurso

 

Puede  regístrese para obtener su kit gratuito , eso si deberemos pagar los costes de envío y los impuestos o aranceles aduaneros de su país. !Incluso aún puede participar si su país no es elegible para los kits gratuitos pues si su país no está en la lista, consulte con frecuencia a medida que amplian el  alcance!.(vea todos los países elegibles. )

main-view.jpg

La seguridad es sumamente importante, pero la consistencia en entornos seguros es lo que nos mantiene en línea  por ello buscan que se pueda mostrar el kit de Azure Sphere como puede permanecer en línea durante 30 días consecutivos y de esta modo  será elegible para ganar los  mejores premios.

Una vez que tenga su kit en la mano, conéctelo y regístrelo descargando la pequeña aplicación de Windows para la sincronización diaria con el servidor de concursos.( Por favor revise las instrucciones de registro ) .Más detalles se pueden encontrar en las reglas oficiales.

 SoftWeb Solutions han construido un increíble “mapa de calor” para ver dónde se han conectado nuestros 20,000 kits de Azure Sphere en todo el mundo. Estaremos representado cada vez que realizemos la sincronización diaria y se convierta en parte de la presencia global de Azure Sphere. Échele un vistazo en el Mapa de Calor de Azure Sphere .

Captura de pantalla 2019-07-23 a las 9.40.08 AM.png

 

Este concurso es parte de una campaña más grande de comunidades de Avnet. Vea el desafío Sensing the World de element14, seminarios web, talleres virtuales y más recursos en secureeverything.avnet.com .

e14-01_vv8GvW475C.png

Premios

¡Estan regalando miles de dólares en premios a los 510 mejores proyectos! Un premio por persona: ninguna persona puede ganar el premio total de $ 35,000. Los  jueces elegirán los mejores proyectos calificados según los criterios de evaluación descritos en la sección de reglas. Los premios de Nivel 3 se entregan únicamente en función de los requisitos de elegibilidad.

Tier 1

Para los proyectos que se separan claramente del resto y demostraron creatividad y uso ejemplar de Azure Sphere. Para ser considerado para los premios de Nivel 1, debe hacer ping a la Nube de Azure una vez al día durante 30 días consecutivos.

3 ganadores de Microsoft Hololens  valorasas en $ 3,500

El mejor proyecto de su clase y el diseño de referencia definitivo para Microsoft Azure Sphere.

El nivel 2

Para los proyectos que se separan claramente del resto y demostraron creatividad y uso ejemplar de Azure Sphere. Para ser considerado para los premios de Nivel 2, debe hacer ping a la Nube de Azure una vez al día durante 15 días consecutivos.

7 ganadores de Surface Laptop  valoradas en  $ 1,000

Nivel 3

Para ser elegible para el premio Tier 3, su proyecto debe usar el kit de desarrollo de Azure Sphere. ¡Los proyectos ganarán automáticamente una nueva Raspberry Pi 4! Eche un vistazo a nuestros requisitos de calificación en la pestaña de reglas.

500 ganadores de Raspberry Pi 4 valoradas en  $ 35

Premio Hackster Impact

Únase a Hackster mientras nos unimos a los Objetivos de Desarrollo Sostenible (ODS) delas Naciones Unidas para hacer del mundo de hoy un lugar más inteligente y saludable. El equipo de Hackster seleccionará el proyecto que mejor contribuya a cualquiera de los ODS.Consulte los criterios de evaluación específicos para esta categoría de premios .

5 ganadoresTarjeta de regalo de $ 250 + tarjeta de regalo Adafruit de $ 100 + entrevista en video + másValor de $ 530

El ganador recibirá lo siguiente: 
– una tarjeta de regalo de $ 250; 
– una tarjeta de regalo Adafruit de $ 100 (premio especial para el concurso Secure Everything); 
– una suscripción de 12 meses a Patchr Premium (valor de $ 180); 
– Por último, pero no menos importante, se presentarán en una entrevista en video con el único y único Alex Glow de Hackster.

Por favor, visite la página del Premio Hackster Impact para más información.

Recursos

 

 

Mas info en hackester.io

 

Error ORA-03114


Hay aplicaciones que usan un cliente Oracle para gran parte de la funcionalidad ofrecidas ,  de modo que es vital en estos casos asegurar que el servicio de  acceso a la  BBDD este funcionando adecuadamente

Puede  que su aplicación  encuentre el siguiente error al ejecutar flujos de trabajo u otros procedimientos que requieran procesamiento dentro de la base de datos de Oracle:

25/01/2019 10:21:48: Sentencia sql: SELECT *  FROM  …………. 
25/01/2019 10:21:48: Error en el proceso de conversión. Error 5: ORA-03114: no conectado a ORACLE

Cuando esto ocurre, la conexión a la base de datos se perderá   lo cual  normalmente se traduce  que la  aplicación encuentra un error grave y probablemente se cerrara.

Este error puede  producirse  si su sesión de Oracle se ha quedado sin memoria.

Para reiniciar el valor de asignación de  memoria a una sesión de Oracle, lo mas fácil es seguir estos pasos:

  1. Cierre cualquier aplicación o servicio adicional  que pueda esta usando el cliente Oracle
  2. Reinicie  el cliente de Oracle  (en versiones antiguas puede llamarse oracleHome8ClientCache  )
  3. Para ello, en el menú Inicio de Windows, abra el panel de Control y vaya a Herramientas administrativas > Servicios. 
  4. Seleccione el cliente Oracle en la listen versiones antiguas puede llamarse oracleHome8ClientCache  ) y  pulse  en Detener el servicio.
  5. Vuelva al menú Inicio de Windows, abra el panel de Control y vaya a Herramientas administrativas > Servicios. 
  6. Seleccione el cliente  Oracle (en versiones antiguas puede llamarse oracleHome8ClientCache  ) en la lista y pulse en Iniciar  el servicio.

 

Para asignar más memoria a una sesión de Oracle se requiere conexión en el propio  servidor de BBDD  así como tambien a los clientes que estén usando esos servicios.Si es su caso puede seguir estos pasos:

  1. Cierre cualquier aplicación o servicio que pueda estar usando el cliente Oracle
  2. Detenga los servicios de Oracle en  Servicios de Windows. Para ello, en el menú Inicio de Windows, abra el panel de  Control y vaya a Herramientas administrativas > Servicios. Seleccione Oracle en la lista y detener el servicio.
  3. Asegúrese de que el servicio “OracleService” se ha detenido. De lo contrario, aparecerá un mensaje de error.
  4. Asegúrese de que los clientes no están conectadon al servidor.
  5. Cada sesión de Oracle tiene una cantidad limitada de memoria disponible. Para ver la memoria actual, escriba el  siguiente comando en la máquina en la que reside el servidor de Oracle :  orastack oracle.exe
  6. El resultado será como se indica a continuación, que muestra la asignación de memoria en el equipo:   Corriente de reserva memoria; PerThread = 1048576  y  Corriente de memoria asignada  = 4096 
  7. Nos situamos desde  [ORACLE_HOME] en la  subcarpeta bin. El siguiente comando aumentará la memoria para cada sesión (hasta 5 MB):           orastack oracle.exe 5000000 
  8. Reiniciar la los servicios de Oracle.
  9. Inicie la aplicación que usa  el cliente Oracle

 

 

Para asignar más memoria a una sesión de Oracle también se puede hacer desde los  clientes  que están usando  esos servicios.Si es su caso puede seguir estos pasos:

  1. Cierre cualquier aplicación o servicio que pueda estar usando el cliente Oracle
  2. Detenga los servicios de Oracle en  Servicios de Windows. Para ello, en el menú Inicio de Windows, abra el panel de  Control y vaya a Herramientas administrativas > Servicios. Seleccione Oracle en la lista y detener el servicio.
  3. Asegúrese de que el servicio “OracleService” se ha detenido. De lo contrario, aparecerá un mensaje de error.
  4. Asegúrese de que los clientes no están conectadon al servidor.
  5. Como el   servidor no es el mismo que  la máquina , este  se denomina con un nombre de servicio (p. ej. GISTEST) y, a continuación, el comando siguiente desde  [ORACLE_HOME] en subcarpeta bin  : orastack tnslsnr.exe 5000000
  6. Cuando el  servidor se reinicie o se reinicie la instancia  los  parámetros se pierden y se tienen que volver a aplicar.

 

 

Resultado:

Con esta opció, cada sesión de Oracle reserva 5 MB de memoria lo cual debería bastar para no dar problemas.

 Windows (32 bits) sólo puede direccionar 2 GB de memoria para cada proceso, lo que  significa que Oracle tiene un máximo de 2 GB de memoria, independientemente de la cantidad de memoria del servidor.Como el valor por defecto del parámetro de Oracle asigna 892 MB de área SGA (sistema global) más 297 MB de programa global PGA (área) por ejemplar.,por tanto, aproximadamente se  tiene 1,2 GB de memoria asignada para el proceso de Oracle, sin ninguna sesión de usuario. lo cual significa  que hay  aproximadamente 800 MB disponibles para sesiones de usuario

Con 5 MB por usuario  se pueden permitir un número máximo de 160 usuarios o 150 usuarios .Para estar seguros si se ejecuta con más de 150 usuarios simultáneos, puede considerar la posibilidad de reducir la memoria total por sesión de usuario.