viernes, 25 de abril de 2014


Instalar Solaris Server Sparc/X86 10 en un servidor


En nuestra práctica intalamos Solaris Sparc 10 en un servidor de arquitectura Sparc, hablo del Sun Blade 2500, después de mucho investigar y de instalarlo más de 7 veces, Solaris 10 quedó instalado de forma grafica y con conexión a internet por lo tanto ya podíamos hacer ping hacia el y empezarlo a configurar para instalar una aplicación en el.

Por lo tanto decidí hacer este pequeño tutorial con información que encontré y cosas que aprendí.

En el link de abajo viene un link para que descarguen el manual que encontré + el conocimiento aprendido de tanta instalación, en dicho manual viene la forma de instalar Solaris Server Sparc o X86. Antes de empezar aconsejo leer lo siguiente para que no tengan problemas y lo hagan rápido.

TIPS

-          Antes de iniciar se debe conectar el teclado y el MOUSE, De no conectar el mouse aunque se ponga el comando; Ok boot cdrom que es el comando para que la instalación sea en modo gráfico NO LO HARÁ.

-          En el modo de instalación tenemos dos opciones (Actualizar e Inicial), PONER INICIAL a menos que ya este instalado previamente.


-          Una vez que se ha apagado el servidor aparecerá (cuando sea encendido ) una pantalla donde aparezca un ok para entrar al Sistema Operativo ingresar el comando boot

-    El nombre de usuario que pide durante la instalación es el ROOT y pide la contraseña del mismo, este usuario y contraseña serán requeridos cuando inicie el equipo (o en el primer reinicio).
      Lo que general mente pide en la instalación es:

                    Nombre del sistema
                    Contraseña del usuario ROOT

       OJO no pide usuario, solo la contraseña para el usuario root.


-    Ten listo de forma correcta la IP, Máscara de Red y IP de encaminamiento (Puerta de Enlace), los DNS los ocuparás después de que haya terminado la instalación para tener acceso a internet ve al final del manual y lee como hacerlo.

-     Cuando inicia el equipo (ya cuando esta instalado) luego de haber puesto el comando root manda un mensaje que el escritorio ha sido pausado y que si queremos continuar nos salgamos de la entrada, para hacer eso sólo ponemos:

             > exit
           - Puede pedir el login y password, los ingresamos
           - Esperamos ha que nos presente la interfaz de gráfica de inicio.


Luego de haber leído lo anterior ahora si siga el manual y la instalación de Solaris 10, descargarlo de la siguiente liga.




*Si el link no llegara a funcionar, déjenme un mensaje y lo vuelvo a subir.
















domingo, 20 de abril de 2014

Actualizar/Insertar texto a un TextArea (Componente) desde otra Clase



En ocaciones si se quiere como muchos dirían "Elegante" en el código es necesario hacer diferentes clases para que sea más atendible y sea óptimo el código, pero el ser "Elegante" nos trae algunos problemas.

Si tenemos tres clases Principal.java, Ventana.java, Analisis.java. En donde:

Principal.java
Tenemos simplemente un main que tiene un objeto de tipo ventana y mostramos la ventana con ven.setVisible(true) y demás cosas como hacer que la ventana se vea más bonita.

Ventana.java
Tenemos toda la lógica de una ventana común en java es decir el tamaño, nombre, botones, textAreas, textFields, tablas, etc., nos sirven para mostrar los que hace nuestro programa.

Analisis.java
Aquí esta la lógica del programa es decir lo que realmente hace nuestro programa.

En este caso lo lógico es hacer lo siguiente si desde la clase Analisis.java queremos poner en textField, tabla o algo así alguna información para el usuario porque el usuario así lo requiera, lo que haríamos sería:


COMO NO HACERLO
public class Analisis{
//todo lo necesario

public void metodoHaceAlgo(){
//todo lo que haga

//quiero mandar a un JTextArea algo (TextArea esta definido en Ventana.java)
Ventana ven2 = new Ventana();
ven2.setAlTextArea("mi_mensaje"); 

}
}

public Class Ventana  extends JFrame{
//todo lo que lleve

JTextArea  jta1 = new JTextArea();

//lo que sea...

public setAlTextArea(String algo){
System.out.println(algo);
jta1.setText(jta1.getText() + algo);  //lo único que hace es poner lo que le mandes al TextArea
}

}

public class Principal{

public static void main( String args[] ){
//lo que sea

Ventana ven1 =  new Ventana();

ven1.setVisible(true);
//demás cosas

}//cierra main
}

CON LA LÓGICA ANTERIOR QUE PUEDE SER LA MÁS OBVIA EL PROGRAMA SIMPLEMENTE NO FUNCIONA, aunque si imprimiría el valor de "algo" en consola.

COMO HACER LO ANTERIOR CORRECTAMENTE
Sin duda hay otra forma quizás más simple de hacerlo, en esta ocasión yo les presento una no muy difícil de entender.

La solución se basa (PUEDE SERVIR PARA OTRAS COSAS) separar las cosas aunque se puede hacer con las mismas tres clases, pero para ser más "elegantes", entonces:

  -  Agregamos una clase más llamada panelContext que extiende de JPanel y su función es prácticamente pasar todo lo que teníamos en Ventana.java a su vez Ventana.java solo nos prestara un frame en donde pegaremos todo lo que tenemos en el Panel, esto es para que todo mundo accede al panel y los cambios se vean reflejados en el Frame.

- Hacemos que nuestra nueva clase sea un Singleton (Ir al final para ver que es)


Las clases quedarían

public class PanelContext extends JPanel{
 private static PanelContext pnlCtx = new PanelContext();

   public static PanelContext getInstance() {
            return pnlCtx;
    }

//constructores y todo lo demás


}

Para usar la misma instancia debmos usar
PanelContext pnlCtx =  PanelContext.getInstance();

de este modo Analisis.java quedaría

public class Analisis{
//todo lo necesario

public void metodoHaceAlgo(){
//todo lo que haga

//quiero mandar a un JTextArea algo (TextArea esta definido en Ventana.java)

pnlCtx.setAlTextArea("mi_mensaje"); 

}
}

En Ventana.java quedaría 

public class Ventana Extends JFrame{

public Ventana(){
        PanelContext pnlCtx =  PanelContext.getInstance();
        this.getContentPane().add(PanelContext.getInstance());

//**


//todo lo que haga falta

}

}

**Si por alguna razón en el constructor (o un método que se llame en el constructor que tenga eso) tenemos lo siguiente HAY QUE QUITARLO
this.getContentPane().setLayout( null );

Ya que lo que se esta haciendo con las dos lineas que pusimos es decirle a la ventana que tome lo que hay en el Panel que creamos y de esta forma podemos poner en un Frame un Panel.


Y de esta forma es como se resuelve, también es bueno decir que el anterior no funcionaba porque se estaban haciendo instancias diferentes y por lo tanto se reflejaba en otra que ni siquiera se mostraba.


También puede servir
Cuando tenemos varios clientes que quieren instanciar a algo, lo único que tienes que hacer es obligarlos a que usen la misma instancia



Un Singleton 
Según la enciclopedia más consultada del mundo (Wikipedia) es:
El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.
El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).
La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

EN pocas palabras hace que solo tengamos una Instancia pues.
http://es.wikipedia.org/wiki/Singleton

sábado, 19 de abril de 2014

Ordenar un Arreglo

Para ordenar un arreglo se puede utilizar el siguiente fragmento de codigo.

    public static double[] ordenarArray(double[] n) {
        double aux;
     
        for (int i = 0; i < n.length - 1; i++) {
            for (int x = i + 1; x < n.length; x++) {
                if (n[x] < n[i]) {
                    aux = n[i];
                    n[i] = n[x];
                    n[x] = aux;
                }
            }
        }
        
    /*    for(int k=0; k<n.length; k++){
            System.out.println(n[k]);
        }*/
     
        return n;
    }

viernes, 4 de abril de 2014

EJECUTAR PROGRAMA EN SEGUNDO PLANO SIN MOSTRARSE



En ocasiones para que algún servicio/proceso(programa) funcione es necesario de que otro servicio este activo. O bien simplemente queremos que nuestro programa que presta servicios a usuarios (servidor) no este a la vista por seguridad o para que alguien sin conocimientos lo detenga, esto es no queremos que este nada a la vista pero si que se ejecute, en otras palabras pondremos un programa a funcionar que se ejecute cuando la maquina encienda y solo lo podamos matar cuando la maquina se apague y/o cuando vallamos al administrador de tareas de windows y lo matemos.

Para este caso lo que haremos es dos archivos; el primero .vbs que lo pondremos en el INICIO de windows lo cual permitiría que algo se ejecute cuando se inicie el programa y el segundo .bat para que no se vea la ejecución del programa el cual seria activado desde el archivo .vbs.

Ahora bien el contenido de los archivos puede cambiar dependiendo de que es lo que quieran ejecutar aquí se muestra un ejemplo en términos generales:

El archivo .vbs debe estar en C:\Users\Samuel\AppData\Roaming\Microsoft\Windows\Start Menu es importante mencionar que la carpeta Start Menu puede estar en español o llamarse INICIO incluso puede estar en el menú inicio de windows/todos los programas/inicio en esta carpeta es donde se ponen todos los programas que se desean que se inicien cuando enciende windows.

primero.vbs
Este archivo debe estar en: C:\Users\Samuel\AppData\Roaming\Microsoft\Windows\Start Menu
Y el contenido es el siguiente:
********************************************************************************
Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:inicio.bat" & Chr(34), 0 
Set WshShell = Nothing

donde:
"C:inicio.bat" es la dirección y el nombre del archivo a ejecutar.
********************************************************************************

inicio.bat
En este archivo se estable que programa se desea ejecutar y se pone la dirección de donde se encuentra guardado para ejecutarse.

El contenido es el siguiente:
********************************************************************************
cd c:\Program Files\ + subcarpetas hasta llegar al ejecutable de nuestro archivo


Ej.
cd c:\Program Files\IIS Express
iisexpress /site:Bienes

********************************************************************************
PD. este fue un ejemplo para levantar el MATRIX de windows para que este nos permitiera levantar el IIS (nos permite correr archivos con localhost express). Por falta de tiempo no hice un hola mundo para mostrarlo más sencillos pero en cuanto pueda agregaré un ejemplo más sencillo.

martes, 1 de abril de 2014

Pintar y Hacer que un JPanel escuche (Graphics)

Introducción
En java en ocasiones es necesario hacer una aplicación en la cual requerimos de obtener coordenadas del panel o bien simplemente mostrar algo desde un panel (no en un Frame que también se puede y es más sencillo).

Funcionamiento
El código esta dividido en tres clases; Principal.java, Ventana.java y Panel.java el funcionamiento es el siguiente: desde la clase principal se crea un objeto de la clase Ventana que es un JFrame para que está se visualice, en la clase Ventana se ponen las especificaciones de Ventana/Frame (Tamaño, Titulo, Menú, etc.), además se hace una llamada a la clase Panel y se agrega a la ventana para poderlo mostrar y en la clase Panel se pone todo lo que se requiera hacer sobre el panel es aquí donde podemos escuchar al panel y obtener valores.

Código
Clase Principal.java

package package1;

import javax.swing.UIManager;

public class Principal {
    
    public static void main(String [] args ){
        
        /* El siguiente codigo es para que la ventana se vea de mejor estilo*/
        for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
                    if("Nimbus".equals(laf.getName()))
                     try {
                         UIManager.setLookAndFeel(laf.getClassName());
                     } catch (Exception ex) {
                          ex.printStackTrace();
                      }
                }
        
        //objeto clase Ventana
        Ventana con4 = new Ventana();
        con4.setLocationRelativeTo(null); //permite centrar la ventana
        con4.setVisible(true); //se muestre en pantalla
        con4.setDefaultCloseOperation(con4.EXIT_ON_CLOSE); //al cerrar se cierre el proceso
    }
}

Clase Ventana.java
package package1;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Ventana extends JFrame implements ActionListener {   
    private JMenuBar menuBar = new JMenuBar();
    private JMenu menuFile = new JMenu();
    private JMenuItem menuFileExit = new JMenuItem();
    
    public Ventana() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        this.setJMenuBar( menuBar );
        this.getContentPane().setLayout( null );
        this.setSize(new Dimension(400, 401));
        this.setTitle( "Conecta 4" );
        this.setBackground(new Color(82, 255, 82));
        menuFile.setText( "File" );
        menuFileExit.setText( "Exit" );
        menuFileExit.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent ae ) { actionPerformed( ae ); } } );
        
        Panel panel = new Panel(); 
        panel.setBounds(new Rectangle(30, 50, 320, 260));
        panel.setBackground(new Color(82, 198, 255));
        menuFile.add( menuFileExit );
        menuBar.add( menuFile );
        this.getContentPane().add(panel);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}

Clase Panel.java
Es importante mecionar que para el panel escuche en el constructor debe llevar estas dos instrucciones:
-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
        addMouseListener(this);
        addMouseMotionListener(this);
-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|

package package1;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Panel extends JPanel implements MouseListener, MouseMotionListener{
    
    Panel(){
        addMouseListener(this);
        addMouseMotionListener(this);
    }
    
    /*
     * Metodo necesario para pintar sobre el panel (mostrar graficos/imagenes)
     * */
    public void paintComponent(Graphics g2){
        super.paintComponent(g2);
        
        g2.drawOval(20, 20, 50, 50);
        g2.drawLine(40, 40, 50, 80);
        
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {
        JOptionPane.showMessageDialog(null, "Esto es una prueba de que escuche: X= "+e.getX() +", Y="+e.getY());
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }
}

Las clases pueden ser modificadas dependiendo de que sea lo que se necesiten en este caso el objetivo es solo mostrar un simple ejemplo de como se puede trabajar sobre un panel y no sobre el Frame y también como escuchar al panel.

Al final se tiene una pantalla similar a la siguiente:

                                                                           Imagen 1

Pintar en el panel desde otro método
En ocasiones una vez que entramos a mouseClicked (o algún otro) y obtenemos las coordenadas X,Y se las pasamos a otro método como parámetro para que este método ejecute alguna acción, para que este cambio se muestre en el panel en caso de quererlo así solo se define un objeto de tipo Graphics y le asigna getGraphics() como se muestra en las siguientes lineas:

public void tira(int x, int y){
                   
                       ...

        Graphics g = getGraphics();
             
        Graphics2D g2d1 = (Graphics2D) g;
        g2d1.fillOval(fil, col, 35, 35);  //muestra esto sobre lo que ya esta


}