Wednesday, November 27, 2013

Invento: El "Boss Detection Genie"


¿Cuantos programan escuchando música con headphones puestos? ¿Cuantas veces has tenido un visitante en tu cubículo y no te has percatado?


No te preocupes, a mi me pasa lo mismo y gracias a eso nació el gran Boss Detection Genie! (Es pariente cercano del famoso genio Akinator pero con poderes sensoriales!)



¿Como funciona? Sencillo. El Boss Detection Genie es energizado por una bateria 9v y posee un sensor PIR (entre otras cositas) que se activa con el movimiento. 




El mismo lo tengo apuntando hacia la entrada de mi cubículo para cuando detecte movimiento encienda los LEDs y así me alerte que tengo un visitante. 

Así es como funciona: http://www.youtube.com/watch?v=1UPeb6EJ1r0 


Espero les guste!








Wednesday, October 2, 2013

BASH: Buscar el día anterior al día provisto.

Este pequeño "if" es muy útil. El mismo calcula el día anterior de la fecha provista (formato YYYYmmDD) y si no se le provee ninguna automáticamente le asigna el día de hoy y el de ayer a las variables pertinentes.


#!/bin/bash

#Si el parametro $1 NO viene vacio
if [ ${#1} != 0 ]
then
        #Entonces TIMESTAMP es igual al valor de $1
        TIMESTAMP=$1

        #ONEDAYBEFORE es un dia antes del dia provisto
        ONEDAYBEFORE=$(date -d "$1 - 1 day" "+%Y%m%d")
else
        #De lo contrario TIMESTAMP sera el dia de hoy
        TIMESTAMP=`date +"%Y%m%d"`
        
        #ONEDAYBEFORE sera el dia de ayer
        ONEDAYBEFORE=`date --date="yesterday" "+%Y%m%d"`
fi

Utilidad:
Supongamos que diariamente tienes que generar un reporte que compare el día de ayer con el de hoy. La ventaja que provee este if es la flexibilidad de poder ejecutar este script tanto manual como automáticamente, osea, puedes ponerle una fecha en el pasado y obtendrá el día anterior al provisto.

Thursday, September 12, 2013

Llenar una tabla de MySQL utilizando un archivo local (MySQL Loader)


Muchas veces me envían reportes llenos de data que desean analizar y/o cruzar con otra. Si los archivos son pequeños no hay problema pues muchas veces podemos hacer el cruce con grep y diffs utilizando shell scripting. Pero, ¿si son millones de records y tienes que comparalos con una tabla existente? Para esto utilizamos el SQL Loader. El SQL loader nos permite cargar archivos directamente a la tabla que necesitamos. 

La estructura del comando es la siguiente:

'load data LOCAL infile '/carpeta/archivo.txt' into TABLE <NombreDeLaTabla> FIELDS <OPCION1> <OPCION2> (CAMPO1,CAMPO2,...,CAMPON);


<OPCION> - Entre las opciones que puedes poner aquí están:
TERMINATED BY ',' : Con este le decimos que los campos estan separados por comas.
ENCLOSED BY '"': Con este le decidmos que los campos estan encerrados entre comillas ".


Hay muchas más pero usualmente estas son las más que uso. 

Si utilizamos las dos opciones le decimos que los campos estan encerrados entre comillas pero separados por comas.

La parte de CAMPO1,CAMPO2 van los nombres de los campos de la tabla a donde vas a insertarlos. Es importante que estén en el mismo orden que se encuentran en el archivo.

Ejemplo:

Tabla Usuarios:
ID NOMBRE

Archivo:
1,Pedro

3,Juan
2,Maria

Para subir este archivo a la tabla Usuarios el comando sería el siguiente:

load data LOCAL infile '/desktop/files/usuarios.csv' into TABLE USUARIOS FIELDS TERMINATED BY ',' '(ID,NOMBRE);

Pendiente a los errores y a los warnings que te pueda tirar el SQL.

Ya con eso el archivo se cargo a tu base de datos! Suerte!



Controlling an Air Conditioner with Android and Arduino

For my first Arduino project I decided to control my Air Conditioner over the internet with the help of Arduino and my Android Cellphone wherever I have internet access.


Video: (its in spanish but you'll get what I'm demonstrating"





I made this on a Windows environment but it should be pretty similar in Linux.

Pre-requirements:
- An Air Conditioner ( You don't say!)
- AC IR Control Remote (It MUST be in good working order because we need to decode the IR codes)

Hardware: 
- Arduino MEGA 2560  - Bought it here
- Arduino compatible Ethernet Shield  Bought it here
- Small breadboard Bought it here
Jumper Cables Bought it here
(1) IR Receiver Diode Bought it here
- (1) IR LED Bought it here

Software:
- Arduino SDK - http://arduino.cc/en/main/software
- IR Remote Arduino Library - Download (Library official website)
- WebDuino Library - Download (Library official website)


We are ready!

First of all we need to unzip the IR Remote and Webduino library that we just downloaded to the Arduino SDK libraries folder.

X:\...\arduino-1.0.4\libraries
Now we have to make sure that our Arduino Mega is connected to our computer and that Windows has the correct driver.


Now we have to tell the Arduino SDK which type of Arduino we are using. So we go to:
Tools > Board > Arduino Mega 2560 or Mega ADK
And choose Arduino Mega.



Now we choose the port where your Arduino was detected
Tools > Serial Port > <Port>

Now we have to connect the IR Receiver to the Arduino. The pins are connected as follows:

Pin 1 goes to pin 19 from Arduino.
Pin 2 goes to pin from Ground.
Pin 3 goes to pin from 5V.

Illustration:
*Orden de Pins means "Pin's Order"

Now we copy this sketch to the Arduino SDK. (This sketch decodes the IR from your Remote Control) **Careful copy pasting, it might give you compilation errors

/*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
 */

#include <IRremote.h>

int RECV_PIN = 19;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) { 
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}
You'll have something like this:


Now let's press  (verify) to compile the code then 
 (upload) to load it up to our Arduino.

Now we have to go to Menu > Tool to open up the Serial Monitor windows. After its open, point your AC Remote Control to the IR receiver connected to your Arduino and press each button one by one. You'll get something like this:


NOTE* The IR library can decode most brands of remote controls, but there's a slight chance that yours might not be supported. Go check on the library website if support was added. In my case my remote control ended up being manufactured by NEC. 

Decoded NEC: 80FF48B7 (32 bits) - AC ON
Decoded NEC: 80FFC837 (32 bits) - TEMP UP
Decoded NEC: 80FF58A7 (32 bits) - TEMP DOWN
Decoded NEC: 80FFD827 (32 bits) - TIMER
We have decode our control's codes. Now we have to create another sketch, this time to implement a webserver that will help us to communicate with the arduino over the internet. To do this I modified the Web_Demo example from the Webduino library. 

In order for this to work you'll have to make sure about the following:

-You must have the ethernet shield installed in your Arduino.
-You have to define your Arduino's MAC address and IP in the sketch.
-You have to define the port where the webserver will be working.
- The IR Led should be installed in the Arduino with the anode (shortest leg) on GRD (ground) and the cathode (largest leg, positive) in pin #9.



* Web_Demo.pde -- sample code for Webduino server library */

/*
 * To use this demo,  enter one of the following USLs into your browser.
 * Replace "host" with the IP address assigned to the Arduino.
 *
 * http://host/
 * http://host/acOn
 *
 * This URL turns on the Air Conditioner
 * 
 */

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include <IRremote.h>


// no-cost stream operator as described at 
// http://sundial.org/arduino/?page_id=119
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }

//IR Variable declaration
IRsend irsend;

// CHANGE THIS TO YOUR OWN UNIQUE VALUE
static uint8_t mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

// CHANGE THIS TO MATCH YOUR HOST NETWORK
static uint8_t ip[] = { 192, 168, 1, X };

#define PREFIX ""

WebServer webserver(PREFIX, 80 ); //ASSIGN PORT HERE

// commands are functions that get called by the webserver framework
// they send the IR Code to the AC

void acOn(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  //server.httpSuccess(false, "application/acOn");
  server.httpSuccess();

  //Replace for your IR Code here. 
  irsend.sendNEC(0x80FF48B7, 32); //irsend.send(IRTYPE)(0x(IRCODE), (BITS)); 
  delay(40);
}

void tempUp(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();
  
 //Replace for your IR Code here. 
  irsend.sendNEC(0x80FFC8A7, 32); //irsend.send(COMPANYIR)(0x(IRCODE), (BITS)); 
  delay(40);
 
}

void tempDown(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();

  //Replace for your IR Code here.
  irsend.sendNEC(0x80FF5837, 32); // 
  delay(40);
}


void timer(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();

  //Replace for your IR Code here.
  irsend.sendNEC(0x80FFD827, 32); // 
  delay(40);
}


void setup()
{

  Ethernet.begin(mac, ip);
  webserver.begin();

//Rename the commands to your liking
  webserver.addCommand("acon", &acOn);
  webserver.addCommand("tempup", &tempUp);
  webserver.addCommand("tempdown", &tempDown);
  webserver.addCommand("timer", &timer);
}

void loop()
{
  // process incoming connections one at a time forever
  webserver.processConnection();

  // if you wanted to do other work based on a connecton, it would go here
}



After pasting this to our Arduino SDK we press  (verify) to compile the code and then (upload) to upload it.

At this very moment you can actually control your Air Conditioner from any PC connected to your Network. All you have to do is to put in your address bar http://<Assigned IP>/acon your AC should turn on. Make sure the IR is pointing to your AC.


Now, this is optional and it's all under your own risk due to security issues. In order to be able to control your AC from anywhere you have internet access you must create a Port Forwarding rule in your router. That rules should contain the IP and Port you assigned to your Arduino. I recommend using a port that's NOT port 80.

After creating that Port Forwarding rule you should be able to control your AC anywhere you have internet access. (You have to know your home IP address)

The android application is not really necessary because you can actually control the AC from your cellphone's browser but its more interesting (and look really cool!) to have an android app for that.


I'm a beginner on Android so most probably there's a better way to do most of the things I did in the app, but hey, it works!

Here you can download the project for the android app: Download

Modify it as you like and you are done!


Any doubts or questions let me know!

Monday, June 3, 2013

BASH: Como encontrar el primer y último día del mes anterior.

Hoy tuve que hacer un script para generar un reporte que contenga información del mes pasado completo. 

Para encontrar el primer día del mes pasado utlizamos este comando:


$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) -1 month" +%Y-%m-%d
2013-05-01 
Para encontrar el último día del mes pasado utlizamos este:


$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) -1 day" +%Y-%m-%d
2013-05-31 
Si deseas hacerlo para el mes corriente seria de la siguiente manera:

$ date -d `date +%Y-%m-%d` +%Y-%m-01
2013-06-01
$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) +1 month -1 day" +%Y-%m-%d
2013-06-30
*Esto fue probadocon BASH shell en RedHat 6

Wednesday, April 3, 2013

Arduino + Android: Como controlar un Aire Acondicionado

Para mi primer proyecto de Arduino y Android decidí controlar mi aire acondicionado con receptor infrarrojo con una aplicación de android en mi celular desde cualquier lugar que me encuentre que tenga acceso a internet.

Video del resultado final




Este proceso lo realicé en un ambiente Windows pero es lo mismo para Linux.

Aquí les explicaré como lo logré.

Prerequisitos:
- Aire Acondicionado
- Control remoto del aire acondicionado (Tiene que funcionar para poder decodificar el IR)

Hardware: 
- Arduino MEGA 2560  - Lo compré aquí
- Arduino compatible Ethernet Shield  Lo compré aquí
- Small breadboard Lo compré aquí
Jumper Cables Lo compré aquí
(1) IR Receiver Diode Lo compré aquí
- (1) IR LED Lo compré aquí

Software:
- Arduino SDK - http://arduino.cc/en/main/software
- IR Remote Arduino Library - Descarga (Site oficial del autor de esta librería)


Ya estamos listos!

Primero añadimos (unzip) las librerias que descargamos la carpeta de libraries donde se instaló el SDK de Arduino. 
X:\...\arduino-1.0.4\libraries
Luego nos aseguramos que el Arduino este conectado a la computadora y que Windows haya instalado bien el driver.

Ahora tenemos que decirle al SDK que board y que puerto de comunicación utilizaremos.

Tools > Board > Arduino Mega 2560 or Mega ADK

Tools > Serial Port > (El puerto donde se haya detectado tu arduino)

Ahora tenemos que conectar el IR Receiver al Arduino de la siguiente manera:

Pin 1 va al pin 19 del Arduino.
Pin 2 va al pin de Ground.
Pin 3 va al pin de 5V.

Ilustración:

Luego copiamos este sketch en el Arduino SDK. 

/*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
 */

#include <IRremote.h>

int RECV_PIN = 19;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) { 
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}
Quedará algo así:


Oprimimos  (verify) para que se valide/compile el código y luego 
 (upload) para que suba a nuestro Arduino.

En este momento debes ir a al menú de Tools y abrir el Serial Monitor. Luego de que lo abras, con el control remoto del aire acondicionado apunta al IR Receiver y aprietas los botones uno a uno. Obtendrás algo así:


En este caso el control de mi AC resultó ser uno marca NEC con los siguientes codigos:

Decoded NEC: 80FF48B7 (32 bits) - AC ON
Decoded NEC: 80FFC837 (32 bits) - TEMP UP
Decoded NEC: 80FF58A7 (32 bits) - TEMP DOWN
Decoded NEC: 80FFD827 (32 bits) - TIMER

Ya tenemos una parte completada. Ahora hacemos otro sketch, esta ves para implementar el webserver que nos va a ayudar a ejecutar los comandos en el arduino. Para hacer esto utilicé y modifiqué el ejemplo de Web_Demo de la librería de Webduino.

Aqui debes asegurarte de definir las siguientes cosas:

-Tengas el EthernetShield ya instalado en tu MEGA 2560.
-Debes definir el MAC Address de tu Ethernet Shield y su IP.
-Debes definir el puerto donde el webserver estará corriendo.
-Debes cambiar los comandos infrarrojos por los que obtuviste.
-El IR LED debe estar en el arduino con el ánodo (negativo) en GRD y el cátodo (patita mas larga, positivo) en el pin #9.



* Web_Demo.pde -- sample code for Webduino server library */

/*
 * To use this demo,  enter one of the following USLs into your browser.
 * Replace "host" with the IP address assigned to the Arduino.
 *
 * http://host/
 * http://host/acOn
 *
 * This URL turns on the Air Conditioner
 * 
 */

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include <IRremote.h>


// no-cost stream operator as described at 
// http://sundial.org/arduino/?page_id=119
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }

//IR Variable declaration
IRsend irsend;

// CHANGE THIS TO YOUR OWN UNIQUE VALUE
static uint8_t mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

// CHANGE THIS TO MATCH YOUR HOST NETWORK
static uint8_t ip[] = { 192, 168, 1, X };

#define PREFIX ""

WebServer webserver(PREFIX, 80 ); //ASSIGN PORT HERE

// commands are functions that get called by the webserver framework
// they send the IR Code to the AC

void acOn(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  //server.httpSuccess(false, "application/acOn");
  server.httpSuccess();

  //Replace for your IR Code here. 
  irsend.sendNEC(0x80FF48B7, 32); //irsend.send(IRTYPE)(0x(IRCODE), (BITS)); 
  delay(40);
}

void tempUp(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();
  
 //Replace for your IR Code here. 
  irsend.sendNEC(0x80FFC8A7, 32); //irsend.send(COMPANYIR)(0x(IRCODE), (BITS)); 
  delay(40);
 
}

void tempDown(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();

  //Replace for your IR Code here.
  irsend.sendNEC(0x80FF5837, 32); // 
  delay(40);
}


void timer(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  server.httpSuccess();

  //Replace for your IR Code here.
  irsend.sendNEC(0x80FFD827, 32); // 
  delay(40);
}


void setup()
{

  Ethernet.begin(mac, ip);
  webserver.begin();

//Rename the commands to your liking
  webserver.addCommand("acon", &acOn);
  webserver.addCommand("tempup", &tempUp);
  webserver.addCommand("tempdown", &tempDown);
  webserver.addCommand("timer", &timer);
}

void loop()
{
  // process incoming connections one at a time forever
  webserver.processConnection();

  // if you wanted to do other work based on a connecton, it would go here
}



Oprimimos  (verify) para que se valide/compile el código y luego 
 (upload) para que suba a nuestro Arduino.


En este momento ya puedes manejar tu aire acondicionado desde el web browser de alguna computadora conectada a tu misma red. Con poner (IP simulado) http://192.168.1.20/acon  el aire acondicionado debe prender.

Ahora esto es opcional y bajo su reponsabilidad por las posibles consecuencias de seguridad que pueda traer. Para poder manejar el arduino de cualquier lugar en el internet necesitaremos hacer una regla de "Port Forward" en nuestro router. La misma debe contener el IP del arduino y el puerto escogido para el webserver. Les recomiendo que utilicen un puerto que no sea el 80.

Luego de que hagan esa regla van a poder acceder el webserver en el arduino desde el internet y no limitado a su network.

La aplicación de android no es realmente necesaria pues ya puedes controlar el aire desde tu web browser desde el internet. Pero es mas interesante (y se ve mas cool) tener un app para esto.

Soy un beginner programando en android asi que muchas de las cosas que hice lo mas probable se pueden hacer de una manera mas efectiva.

Aquí les dejo el projecto de la aplicación de Android: Descarga

Modifiquenla de acuerdo a su setup y ya!


Cualquier pregunta dejenme saber!


Friday, January 25, 2013

Instalación Oracle Instant Client 11g en Red Hat

Hoy tuve la necesidad de automatizar reportes que se generan utilizando información de varias bases de datos Oracle. El Oracle Instant Client nos permite accesar y manejar bases de datos utilizando sqlplus sin la necesidad de hacer una instalacion completa. 

Aquí verás como hacer esta instalación.


1. Primero necesitamos bajar el Instant Client y sqlplus de aqui.
- oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm 
- oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm

2. Luego de que los bajes los instalas con este comando (tienes que ser root):
$ rpm -ilv oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
3. Creamos un grupo específico para Oracle:
$ groupadd -g dba
4. Ahora creamos el usuario y le asignamos un password: 
**Nota: Si tu sistema es 32 bits elimina el numero 64 de todos los comandos que sometamos de este paso en adelante.
$ useradd -d /usr/lib/oracle/11.2/client64 -g "dba" oracle
$ passwd 
5. Modificamos el profile del usuario oracle (añade las lineas en negro):
vim ~oracle/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
export TNS_ADMIN=/usr/lib/oracle/11.2/client64
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
PATH=$ORACLE_HOME/bin:$PATH
export PATH
6. Creamos el archivo tnsnames.ora que es donde se definen las conexiones de las bases de datos:
$ vim /usr/lib/oracle/11.2/client/tnsnames.ora
Recuerda: Las entradas en este archivo deben tener este formato:
<AddressName> =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <IP>)(PORT = <Puerto>))
    )
    (CONNECT_DATA =
      (SID = <SID>)
    )
  )
Entras al servidor con el usuario oracle e intentamos conexion a una base de datos con el siguiente comando:
$ sqlplus user/pass@DB

SQL*Plus: Release 11.2.0.3.0 Production on Fri Jan 25 14:30:01 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

**Nota: Para tener la misma funcionalidad con el usuario root solo tienes que repetir el paso #5 en su .bash_profile.

Ya tenemos el Instant Client 11g de Oracle instalado y conectado a una base de datos!

Thursday, January 17, 2013

Como corregir error 'sqlplus: not found' definiendo la variable $ORACLE_HOME y añadiendola al $PATH

Heredé un servidor SunOS que tiene ya una instalación de Oracle a la cual quiero conectarme a través de command line usando 'sqlplus'. Cuando utilizé el comando me daba este error:


$ sqlplus 
sqlplus: not found
¿La causa? La variable de $ORACLE_HOME no estaba configurada. Aquí te voy a decir como solucionar ese problema.

1) Primero verificamos que tiene la variable de $ORACLE_HOME y confirmamos que esta vacía. De no estarlo entonces salta al paso 3.

$ $ORACLE_HOME
$
 2) Ahora necesitamos saber donde esta la instalación de Oracle. En mi caso estaba en /home/app/oracle/product/10.2.0.
**Nota: El ORACLE_HOME es un nivel antes de donde se encuentra el archivo llamado bin.
La parte en negro es el ORACLE_HOME:
/home/app/oracle/product/10.2.0/bin

Le asignamos el valor a la variable $ORACLE_HOME y le damos export.

$ ORACLE_HOME=/home/app/oracle/product/10.2.0
$ export ORACLE_HOME
3) Ahora lo añadimos a nuestro $PATH:


$ PATH=$ORACLE_HOME/bin:$PATH

Ya podemos intentar conectarnos con el comando 'sqlplus'


$ sqlplus

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Jan 17 16:15:39 2013

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Enter user-name: