viernes, 24 de julio de 2009

JC4 - Estructuras de Control en Java y C#

Estructuras de Control en Java y C#

Breve introduccion

Antes de escribir un programa que de solucion a un problema, es necesario tener una idea detallada del problema, asi como la comprensión de los bloques para la construcción de diagramas de flujo.

Cualquier problema de computación puede resolverse ejecutando una serie de acciones en un orden especifico, a esto se le conoce con el nombre de algoritmo y depende de dos cosas principales:

1.- Las acciones a ejecutar

2.- El orden en el que se ejecutan las acciones.

Definicion de Pseudocodigo: Es un lenguaje informal que ayuda a los programadores a desarrollar algoritmos sin tener que preocuparse por los estrictos detalles de la sintaxis de un lenguaje de programación. El pseudocódigo es semejante al lenguaje cotidiano, es amigable con el usuario y ayuda a organizar un programa.


Estructuras de Control

Por lo general, en un programa las instrucciones se ejecutan una después de otra en el orden en que están escritas, este proceso se conoce como ejecución secuencial. Varias instrucciones en Java y C# permiten al programador especificar que la siguiente instrucción a ejecutarse tal vez no sea la siguiente secuencia. Esto se conoce como transferencia de control.


Java tiene solo tres estructuras de control: la secuencia de estructura, la estructura de selección (tres tipos) y la estructura de repetición (tres tipos), en C# tenemos la estructura de selección (tres tipos) y la estructura de repetición (cuatro tipos). Cada programa se forma combinando tantas estructuras de secuencia, selección y repetición como sea apropiado para el algoritmo que implemente el programa.


Estructura de Selección if Simple

Esta intruccion sirve para elegir entre entre los cursos alternativos de acción, por ejemplo:

Supongamos el siguiente pseudocódigo:

Si la edad de un individuo es mayor a 18

Imprimir “Mayor de edad”

Codigo en Java

if (edad > 18 )

System.out.println(“Mayor de edad”);


Codigo en C#

if (edad > 18)

Console.WriteLine(“Mayor de edad”);


Estructura de Selección if… else…

La estructura de selección if… else permite al programador especificar una acción cuando la condición es verdadera y otra cuando la condición es falsa, como en el siguiente pseudocodigo:

Si edad de una persona es mayor a 18

Imprimir “Mayor de Edad”

De lo contrario

Imprimir “Menor de Edad”


Codigo en Java

if (edad > 18)

System.out.println(“Mayor de Edad”);

else

System.out.println(“Menor de Edad”);

Codigo C#

if (edad > 18)

Console.WriteLine (“Mayor de Edad”);

else

Console.WriteLine (“Menor de Edad”);


Instrucciones if… else Anidadas

Un programa puede evaluar varios caso colocando if… else… anidados, por ejemplo el siguiente pseudocódigo:

Si la calificación del estudiante es mayor o igual a 90

Imprimir “Excelente”

De lo contrario

Si la calificación es mayor o igual a 70

Imprimir “Aceptable”

De lo contrario

Imprimir “Reprobado”


Codigo Java

if ( calificación >= 90 )

System.out.println(“Excelente”);

else

if (calificación >= 70 )

System.out.println(“Aceptable”);

else

System.out.println(“Reprobado”);


Codigo C#

if ( calificación >= 90 )

Console.WriteLine(“Excelente”);

else

if (calificación >= 70 )

Console.WriteLine (“Aceptable”);

else

Console.WriteLine (“Reprobado”);


Hay que tener cuidado de no caer en el error de no adidar correctamente el else, en Java y C# el ultimo else es asociado con el if que precede inmediatamente. Por ejemplo el siguiente código en Java.

if ( x > 5 )

if( y > 5 )

System.out.println(“x e y son > 5”);

else

System.out.println(“x es >= 5”);


En realidad el compilador lo interpreta de la siguiente manera:

if ( x > 5 )

if( y > 5 )

System.out.println(“x e y son > 5”);

else

System.out.println(“x es >= 5”);

Para lograr que la instruccion se ejecute como se pensaba en un principio se utiliza las {} para indicar que la intruccion else se ejecuta con la primer sentencia if.

if ( x > 5 ){

if( y > 5 )

System.out.println(“x e y son > 5”);

}

else

System.out.println(“x es >= 5”);


Tambien es forzoso usar las {} cuando se ejecutan mas de una instruccion dentro de cada if… else

Por ejemplo:

if (edad > 18){

Console.WriteLine(“Ya eres mayor de edad”);

Console.WriteLine(“Y puedes sacar tu licencia de manejo”);


}

else{

Console.WriteLine(“Aun eres menor de edad”);

Console.WriteLine(“No puedes sacar tu licencia de manejo hasta después de los 18 anios”);

}

NOTA: Cuando no ponga los dos ejemplos para Java y C# quiere decir que la sintaxis es parecida en este caso lo único que diferencia es System.out.println y Console.WriteLine, ya que tienen el mismo fin.


Instrucción de Selección Multiple switch

La instrucción switch permite tomar una decisión en base a los posibles valores de una variable o expresión, cada acción se asocia con un valor integral constante (es decir un valor de tipo byte, short, int o char pero no long) que la variable o expresión pueda asumir.

Por ejemplo pedir la orden de un menú en base a lista formada por los menus 1, 2, 3

Codigo Java

switch (myOpcion) { //inicio de switch

case 1:

System.out.println(“-Sopa de letras \n –Pechuga empanizada\n –Gelatina \n -Agua de fruta”);

break;

case 2:

System.out.println(“-Crema de zanahoria \n –Costillas en salsa roja\n –Helado \n -Agua de fruta”);

break;

case 3:

System.out.println(“-Torta de Milaneza \n –Papas a la francesa\n –Refresco de cola”);

break;

default:

System.out.println(“Debe de elegir un menú de la lista”);

} //fin de switch


Codigo C#

switch opcion (myOpcion) { //inicio de switch

case 1:

Console.WriteLine(“-Sopa de letras \n –Pechuga empanizada\n –Gelatina \n -Agua de fruta”);

break;

case 2:

Console.WriteLine (“-Crema de zanahoria \n –Costillas en salsa roja\n –Helado \n -Agua de fruta”);

break;

case 3:

Console.WriteLine (“-Torta de Milaneza \n –Papas a la francesa\n –Refresco de cola”);

break;

default:

Console.WriteLine (“Debe de elegir un menú de la lista”);

} //fin de switch


Nota: Para Java no se pone la instruccion break despues de default, en C# si.


Estructura de Repeticion while

Una estructura de repetición (también llamada estructura ciclo) permite al programador especificar que un programa debe repetir una acción mientras cierta condición sea verdadera. Por ejemplo el siguiente pseudocódigo para una persona que sale de compras:

Mientras existan mas artículos en mi lista de compras

Comprar el siguiente articulo y quitarlo de mi lista


Ahora veamos un ejemplo:

Encontrar la primera potencia que sea mayor a 1000, suponiendo que la variable la inicializamos en 2.

int producto = 2;

while( producto <= 1000 )

producto = 2 * producto;

//Java

System.out.println(producto);

//C#

Console.WriteLine(producto);


Instrucción de Repeticion do… while

Es similar a la instrucción while, y la única diferencia es que en la istruccion while la condición se evalua al principio, por lo que si la condición es falsa el ciclo no se ejecuta y en la condición do…while por lo menos se ejecuta una vez el ciclo ya que la condición se evalua al final. Cuando termina una estructura do… while el programa continua inmediatamente después de la instrucción while.

El siguiente ejemplo imprime de el numero 0 al 9, notemos como si inicializamos la variable en 10 el ciclo se ejecuta por lo menos una vez.

int myVariable = 0;

do {

System.out.println(myVariable);

//C#

//Console.WriteLine(myVariable);

myVariable++;

} (while myVariable < 10);

Notemos que debemos de terminar con punto y coma (;) al finalizar la condición del while.


Instrucción for

La instrucción for es la instrucción de iteración mas potente. El código de control de la instrucción for se divide en tres partes:



  1. Un indicador. Que fija las condiciones iniciales de la instrucción de bucle for.

  2. Una condición que especifica la expresión booleana que mantiene ejecutándose la instrucción for.

  3. Un iterador que especifica las instrucciones que se ejecutan al final de cada paso por las instrucciones incrustadas


A continuación vemos un ejemplo que imprime también los números del 0 al 9:

int myVariable;

For(myVariable = 0; myVariable < 10; myVariable++)

{

System.out.println(myVariable);

//C#

//Console.WriteLine(myVariable);

}

El iniciador, la condicion y el iterador de un bucle for son opcionales. Si prefiere no usar alguna de estas partes, simplemente escriba un punto y coma sin especificar la instrucción. Por ejemplo:

int myVariable = 0;

For(; myVariable < 10; myVariable++)

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

}

//------------------------

//O también

int intVaribale;

For (myVariable = 0; ; myVariable++ )

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);


myVariable++;

}

Hay que tener cuidado cuando se omita la parte de la condición en un bucle for. El siguiente código es un ejemplo de los problemas que pueden surgir.

for(int myVariable = 0; ; myVariable++)

{

Console.WriteLine(myVariable);

}

Este código se ejecuta hasta que myVariable provoca un error porque contiene un numero demasiado largo para ser almacenado.


Instrucción foreach (Solo C#)

Se puede usar la instrucción foreach para repetir varias veces los elementos de una colección. Las matrices de C# admiten la instrucción for each y pueden usarse para trabajar fácilmente con cada elemento de la matriz.

La sintaxis es la siguiente:

Foreach (tipoDato nombreVariable in Colleccion)

{

}

Por ejemplo:

int[] myArray;

myArray[0] = 0;

myArray[1] = 1;

myArray[2] = 2;

myArray[3] = 3;

myArray[4] = 4;


foreach( int ArrayElement in myArray)

{

Console.WriteLine(ArrayElement);

}


Instrucciones de salto para moverse por el código

Hago mención de estas instrucciones ya que por lo regular se utilizan en estructuras de ciclos o repetición.

La instrucción break

Como ya vimos en la estructura switch la instrucción break sirve para salir de un bloque de instrucciones en el que se encuentre.

int myVariable = 0;

while(myVariable < 10)

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

if( myVariable == 5 )

break;

myVariable++;

}

El código anterior se sale cuando myVariable = 5, Imprime en pantalla del 0 al 4

La instrucción break suele usarse con bloques de instrucciones switch, while, do… while, for y foreach(solo C#).


La Instrucción continue

La instrucción continue devuelve el control a la expresión booleana que controla una instrucción de iteración, por ejemplo:

int myVariable;

For (myVariable = 0; myVariable < 10; myVariable++ )

{

if (myVariable == 5)

continue;

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

}

El codigo anterior imprime del 0 al 9, excepto el 5, es decir “Si el valor de myVariable es 5”, continua con la siguiente iteración sin ejecutar ninguna instrucción después del continue”. Al igual que break, continue se usa en instrucciones switch, while, do… while, for y foreach(solo C#).


Instrucción goto (C#)

La instrucción goto transfiere sin condiciones el control a una instrucción etiquetada. Puede etiquetarse cualquier instrucción de C#. Las etiquetas de instrucción son identificadores que preceden a una instrucción. Despues de una etiqueta se colocan dos puntos(:). Un identificador de etiqueta sigue a la palabra clave goto y la instrucción goto transfiere el control a la instrucción designada por el identificador de etiqueta. Por ejemplo:

int myVariable = 0;

while(myVariable < 10 )

{

Console.WriteLine(myVariable);

if ( myVariable == 5 )

goto done;

myVariable++;

}

done: Console.WriteLine(“Fuera del ciclo”);

El código anterior escribe del 0 al 4 y a continuación la leyenda “Fuera del ciclo”


break etiquetado(Java)


En Java tambien tenemos una opcion para poder hacer lo que se hace con goto de C#. A continuacion muestro un ejemplo:


String salida = "";

alto: { //bloque etiquetado

// contar 10 filas

for ( int fila = 1; fila <=10; fila++){

for ( int columna = 1; columna <= 5; columna++) {

if ( fila == 5 ) // si la fila es 5.

break alto; //saltar al final del bloque alto

salida += "* ";

} // fin de for interno

salida += "\n";

} // fin de for externo

// la siguiente linea se evita

salida += "\nLos ciclos terminaron normalmente";

} // fin del bloque etiquetado

// en el codigo anterior cuando fila es 5 se ejecuta break de la etiqueta y termina tanto el bloque interno del for como el externo, el for externo nunca se completa


Instruccion foreach (Java)
Hago una correccion a peticion de un amigo Tonat , que como bien es cierto desde la version 1.5 del jdk incorporo una estructura de control en Java que tiene la misma funcion que el ciclo foreach de C#, y a continuacion muestro un ejemplo sencillo y la sintaxis que maneja.
Sintaxis:
for (TipoBase variable: ArrayDeTiposBase)
{..}
Ejemplo:

List list = new ArrayList();

// Añadimos elementos
list.add("Primitivo");
list.add("Roman");
list.add("Montero");

for (String nombre: list)
System.out.println(nombre);

Pues como podemos ver la sintaxis de Java y C# para estructuras de control es muy parecida, a excepcion del ciclo foreach. Y de antemano agradezco sus comentarios y tambien si alguien quisiera que publicara algo en especifico me haga sus comentarios de lo que les parece este blog, Y el motivo de no incluirlo es debido a que actualmente desarrollo en C# y VB 2005, y como comentaba en la introduccion de esta serie de blogs dedicados a Java y C#. Que es solo una guia para no olvidarnos de la sitaxis de cada lenguaje ya que la vida nos lleva por rumbos distintos, pero tambien no hay que olvidarnos de lo que sabemos...

sábado, 11 de julio de 2009

JC3 - Comentarios y Declaracion de Variables en Java y C#

Comentarios

Los comentarios sirven para explicar el codigo y estos son ignorados por el compilador, ademas de que facilitan la comprension del codigo por otros programadores, facilita su mantenimiento y hacen mas claro el panorama del program.

Y en este caso los comentarios son igual en Java y C# con una pequenia diferencia, que mencionare mas adelante.

Podemos hacer comentarios de una sola linea de la siguiente manera:

//Comentario de una sola linea

O Podemos hacer comentario de mas de 1 linea como por ejemplo:
/*Comentario
de mas de
una linea*/

Bien ahora vamos a ver una diferencia entre estos dos lenguajes que es para comentarios de documentacion.

JAVA

/** Este es un comentario para documentacion */

C#

///
/// Este es un comentario para documentacion
///


------------------------------
Declaracion de Variables
En Java Tenemos los siguientes tipos de datos:


En C# Tenemos los siguientes tipos de datos:

Ahora vamos a ver unos ejemplos.

JAVA


Notemos que para la declaracion de Long, Float y Double ponemos una L, F, D respectivamente despues del valor de la variable para indicar que se trata de ese tipo de datos respectivo.


C#



Como conclucion de este tema podemos decir que practicamente la declaracion de variables es la misma en Java y C#, aunque en C# tenemos por ejemplo los uint (enteros sin signo), en base a la tabla vamos a declarar nuestras variables dependiendo de la necesidad del uso que se le de para no desperdiciar memoria.

sábado, 4 de julio de 2009

JC2 - Hello World en Java y C#

Bien para iniciar vamos a ver como crear nuestra primera y clasica aplicacion de Hello World! en Java y C#. Para trabajar con Java vamos a usar el IDE de NetBeans y para C# el IDE de Microsoft. A continuacion pongo los links para que descarguen cada una de estas herramientas.


Java: http://www.netbeans.org/downloads/index.html

C#: http://www.microsoft.com/exPress/


Y ovio para C# descargamos la version de C#
Para los siguientes articulos trabajaremos con aplicaciones de Consola a menos que el articulo lo requiera les indicare el tipo de proyecto que vamos a crear.


JAVA


Abrirmos Net Beans. Nos vamos al menu Archivo -> Nuevo Proyecto -> Aplicacion Java. Como a continuacion.
En la siguiente figura vemos la salida asi como el codigo del programa.



La linea

//--------------------

package helloworld2;

//--------------------

Esta linea es creada por NetBeans al momento de crear un nuevo proyecto y indica que se esta creado el paquete helloworld2.

//--------------------
public class Main {
}
//--------------------
Indica que la clase principal es Main, la cual tambien es creada por el IDE de NetBeans.
//--------------------
public static void main(String[] args) {
}
//--------------------
Es el metodo principal de la clase y contiene el codigo nesecario para las entradas y salidas del PC.
//--------------------
System.out.print("Hello World!");
//--------------------
Esta es la linea de codigo que vamos a usar para mandar datos a la salida estandar.


C#
Abrimos Visual Studio. Nos vamos a Archivo -> Nuevo Proyecto -> Aplicacion de Consola. Como en la siguiente figura.
Para correr nuestra aplicacion de consola vamos al menu Depurar-> Iniciar sin depuracion y nos quedaria algo asi:


A continuacion describo el codigo del programa por si alguno de ustedes tiene duda.

La directiva using es ocupada para llamar a otros codigo ya desarrollados y probados por Microsoft. Las lineas:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


Son agregadas automaticamente por el IDE al momento de generar un nuevo proyecto. Estas se desarrollan dentro de un espacion de nombres para tener organizado el codigo. Como las siguientes lineas:

namespace HelloWorld2
{
//Nuestro codigo
}

Asi por ejemplo para la directiva
using System.Collections.Generic;

El codigo seria algo mas o menos asi

Namespace System{
Namespace Collections{
//Codigo
}
}


Por ultimo las lineas

//-------------------------
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
//-------------------------


//-------------------------
class Program
{
}
//-------------------------
Indica que la clase principal se llama Program, la cual siempre va a ser esta para los proyectos de consola, ya que Visual Studio la asigna por defecto, por el momento la vamos a dejar asi.
//-------------------------
static void Main(string[] Array)
{

}
//-------------------------
Indica que el metodo principal es de tipo estatico no regresa valor y recibe un arreglo de Strings, este metodo se encarga de procesar las entradas y salidas de datos de la PC.

Por ultimo la linea.
//-------------------------
Console.WriteLine("Hello World!");
//-------------------------
Permite escribir una linea en consola con la cadena "Hello World!"


Como vimos las lineas que mas nos interesan son las siguentes, ya el codigo restante es creado por el IDE de cada lenguaje

JAVA:
System.out.print("Hello World!");

C#:
Console.WriteLine("Hello World!");

Para los ejemplos siguientes voy a omitir la creacion del proyecto, y solo nos enfocaremos al codigo de cada lenguaje. =)

JC1 - Introduccion a Java y C#

En vista que Java y C# son unos de los lenguajes de programacion de mayor aceptacion iniciare una serie de articulos relacionados con estos dos lenguajes, asi como la sintaxis utilizada por cada uno de ellos. Dando al lector estas dos opciones de lenguajes y asi puedan apreciar las ventajas, la potencia , el uso y la creacion de aplicaciones completas.

Creo que la parte de historia, les voy a poner los siguientes link para los que les interese, profundizar un poco mas.

Java: http://distritos.telepolis.com/java/lib/documentos/historia.htm
C#: http://www.scribd.com/doc/9018328/Historia-C

Espero que estos articulos sean lo mas claros para aquellos que inician en el mundo de la programacion, ya que de no ser asi me hagan sus comentarios y preguntas correspondientes para que asi podamos profundizar en algunos conceptos basicos si es que mis lectores asi lo desean. Y espero que aquellos que ya conocen los lenguajes les sirva de guia ya que en la programacion existen infinidad de lenguajes y a veces, me ha pasado (confundimos la sintaxis entre un lenguaje y otro).

Para los siguientes articulos que se refieran al curso los nombre seran con el siguiente formato JC(Por Java C#) y el numero del articulo, el cual va a ser en orden ascendente y si alguno contiene un subTitulo, seria por ejemplo (JC Num_Articulo - Num_SubTitulo)

miércoles, 24 de diciembre de 2008

Conexion MySQL - Java en Ubuntu

Primero vamos a instalar mysql de la siguiente manera:

$sudo apt-get install mysql-server mysql-client

Descargamos el conector de mysql desde el siguiente link:

http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.7.tar.gz/from/pick?file=Downloads/Connector-J/mysql-connector-java-5.1.7.tar.gz&mirror=pick&file=Downloads/Connector-J/mysql-connector-java-5.1.7.tar.gz&mirror=pick#mirrors

Lo instalamos de la siguiente manera:

$sudo chmod +x mysql-connector-java-5.1.7.tar.gz
$tar -xzvf mysql-connector-java-5.1.7.tar.gz
$cd mysql-connector-java-5.1.7
$sudo cp /home/user/Documents/mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jar /usr/lib/jvm/jre/lib/

Ahora agregamos el archivo jar a la PATH de la siguiente manera...

#export set CLASSPATH=/path/mysql-connector-java-[ver]-bin.jar:$CLASSPATH

Donde path sera la ruta en la que tenemos el archivo .jar, en este ejemplo /usr/lib/jvm/jre/lib/

Otra forma que para mi caso seria lo mas recomendable es poner el archivo .jar en nuetro proyecto de netbeans... De la siguiente manera:
Damos clic derecho sobre nuestro proyecto y despues en Properties, nos abre una ventana donde damos clic en libraries y despues en add Jar/Folder y buscamos el archivo .jar que contiene el conector que vamos a ocupar...


Ahora vamos a crear la base de datos y la tabla de prueba, con los siguientes comandos:

mysql> create database prueba;
mysql> use prueba;
mysql> create table persona (id smallint auto_increment, nombre varchar(60),nacimiento date, primary key(id));

Insertamos un registro.

mysql > insert into persona (nombre, nacimiento) values ('primitivo', '1985-07-18')

Una vez creada la base de datos vamos a crear el codigo de nuestro archivo java con el siguiente codigo para realizar una consulta a la base de datos:

package prueba;

/**
*
* @author primitivo
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Main {

/**
* @param args the command line arguments
*/

protected Connection conn = null;
protected Statement stmt = null;

/**

* Conecta con la base de datos 'prueba' del servidor
* MySQL local.

**/

public void conectar() throws Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
this.conn = DriverManager.getConnection("jdbc:mysql://localhost/prueba", "root", "tu_passwd");
this.stmt = conn.createStatement();
}

/**

* @throws Exception DOCUMENT ME!

*/

public void desconectar() throws Exception {
if (this.stmt != null) {
try {
this.stmt.close();
} catch (SQLException SQLE) {
SQLE.printStackTrace();
}
}
if (this.conn != null) {
try {
this.conn.close();
} catch (SQLException SQLE) {
SQLE.printStackTrace();
}
}
}
protected void consultarRegistro(Connection conn, String SQLquery) throws SQLException {

ResultSet rs = stmt.executeQuery(SQLquery);
int columns = rs.getMetaData().getColumnCount();
System.out.println("------------------------");
System.out.println();
while (rs.next()) {
for (int i = 1; i <= columns; i++) {
System.out.println(rs.getString(i));
}
System.out.println();
}
rs.close();
stmt.close();
System.out.println("------------------------");
System.out.flush();
}

public static void main(String[] args) throws Exception {
// TODO code application logic here
Main mn = new Main();

try{
mn.conectar();
System.out.println("Conexion Satisfactoria!!!");
mn.consultarRegistro(mn.conn, "SELECT * FROM persona");
System.out.println("La Consulta se realizo exitosamente!!!");
mn.desconectar();

}
catch (Exception e) {
e.printStackTrace();
}
}
}

Y aqui tenemos la imagen de que todo funciona a la perfeccion...



Espero que les haya servido... Para realizar actualizaciones, eliminacion e insercion a la base de datos dejar su comentario para que suba el codigo correspondiente...

sábado, 11 de octubre de 2008

Servidor Web con DynDNS e ip dinamica sobre Ubuntu

Un servidor WEB es el lugar donde se hospeda toda la información que queramos dar a conocer al mundo
por Internet, que es parte de tu pagina personal, un Blog o Bitácora, lo que tu imaginación se te ocurra, por
otro lado es bueno que tenga soporte PHP, MySQL.
Empecemos...
Actualice la base de aptitude (en Ubuntu es aconsejable usar aptitude en lugar de apt porque el primero resuelve mejor las dependencias).

$ sudo aptitude update

Hará un reconocimiento de los repositorios y actualizara la base de paquetes disponibles.
Ahora instalaremos los paquetes necesarios de la siguiente forma:

$ sudo aptitude install apache2 php5 mysql-server ddclient

Confirma con Y donde te pida para la instalación. Si sale alguna pantalla en azul (no es windows eh!) para configurar algún aspecto si es de llenado de datos haz caso omiso y no pongas nada, si es de escoger de un menú selecciona el mas adecuado, pero las pantallas que te pidan escribir no lo hagas solo darle ENTER.
En este momento si no salio ningún error tendrás ya instalado estos paquetes que son los necesarios para tu servidor WEB con soporte php y mysql.

-Creando una cuenta en DynDNS ...
Para crear una cuenta en DYNDNS entramos en nuestro navegador de preferencia (viva FireFox) y nos dirigimos a la siguiente URL http://www.dyndns.com/
Este servicio nos proporciona una dirección de Internet a lo que le llamamos dominios de forma gratuita, como ejemplo http://trixmontero.homelinux.net/ pero te preguntaras ¿esto que tiene de novedoso?
Simplemente que DynDNS hace que tu pc, configurado como webserver se conecte a dicha dirección y tu PC funcione como hosting eso quiere decir que te olvides de publicidad por todos lados, direcciones largas o que tengas que pagar hosting (aunque eso es relativo el costo de la conexión a Internet y la luz cuestan).
Bueno primero definiremos que es una dirección IP dinámica y una estática.
Una dirección IP es la dirección numérica de un ordenador en Internet. Cada dirección IP se asigna a un ordenador conectado a Internet y es única. Consiste en un número de 32 bits que suele representarse como cuatro octetos separados por un punto (150.214.90.66).
Ahora...
Una IP Dinámica es el que cambia cada vez que se conecta a Internet o que el servidor del servicio hace un reset al mismo, es el que mucha gente utiliza al tener una conexión dialup, adsl, etc.
Una IP Estática es lo contrario a la anterior es un numero de IP que siempre sera de su conexión y nunca cambiara por ninguna razón, al tener una IP estática tiene mucha ventaja pues siempre lo podrán identificar, generalmente tener un IP estática es costo extra.
Ahora si a crear la cuenta
Seleccionar la opción Account.
Después creas una nueva cuenta con la opción Create Account.

Y deberás llenar toda la información que te pide desde tu nombre de usuario con el que entraras siempre, tu correo electrónico y tu password (estos datos no los olvides) cuando lo hallas hecho y mientras que el nombre de usuario no lo halla registrado alguien mas, seguiremos al siguiente paso presionando Create Account.

Cuando salga este mensaje donde nos muestra el nombre de usuario y el email es que ya estas registrado pero todavía falta activar la cuenta tenemos que esperar un correo (obviamente el correo que registraste).
En tu correo te dan un link que te servirá para confirmar la activación de la cuenta en DynDNS al hacerlo te saldrá otra pantalla donde menciona que la activación ha sido realizada.
De nuevo nos vamos a la opción Account e ingresamos el USERNAME y PASSWORD de la cuenta que activaste.

Aquí es donde podrás dar de alta un dominio gratuito haciendo click en la opción My Servicies.

Después veras como puedes hacer que cada vez que inicie tu Linux se conecte y actualice tu dirección dinámica en DynDns. Si tu IP es estática no tendrás problema.
El nombre que debes poner Hostname es arbitrario siempre que no halla sido dado de alta por otro usuario.
En este momento felicidades has creado un dominio, si desearas otro dominio pues harías le misma secuencia claro que omitiendo introducir de nuevo tu username y password de tu cuenta solo si te lo pide de nuevo.

Configurando servidor WEB APACHE
Esta versión de apache viene mucho mas fácil y esta dividido para su mejor configuración. No tenemos que mover casi nada, toma atención de lo que debes solo modificar. En tu consola primero identificaremos en donde se encuentra los archivos de configuración de apache de la siguiente forma:

$ cd /etc/apache2

Y encontraremos algo como lo siguiente aunque puede ser similar. Antes que empecemos a configurar haremos un respaldo de los archivos que trabajaremos por posibles equivocaciones que tuviéramos al editar.

$ sudo cp apache2.conf apache2.conf.back
apache2.conf es el esencial en al configuración de apache sin embargo solo le modificaremos una sola opción para que nuestras paginas no tengan problemas con la codificación de caracteres solo hay que descomentar una linea de la siguiente manera:
$ sudo vi apache2.conf

En seguida veras el extenso texto de configuración que explicar cada una de sus partes tardaría mucho tiempo por si quieres saber mas visita http://httpd.apache.org/docs/2.0/es/

Ahora presiona /AddDefaultCharset y después ENTER (se realiza la búsqueda de la opción). Y quita el # del inicio de la linea (recuerda que para editar debes presionar primero la tecla INSERT), quedaría algo así:

AddDefaultCharset ISO-8859-1

Ya modificado presiona la tecla ESC para salir del modo edición y después escribe :w y después ENTER para guardar
los cambios y escribir :q y después ENTER para salir del editor VIM.
Ahora entramos a sites-available de la siguiente forma:

$ cd sites-available

Después editaremos el único archivo que encontramos en ese directorio llamado default

$ sudo vi default

NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin <b>tuemail@com</b>
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
# Commented out for Ubuntu
RedirectMatch ^/$ /apache2-default/
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>

<VirtualHost *:80> # señalamos que hay un espacio para un sitio independiente
ServerName trixmontero.homelinux.net # Nombre del dominio que dimos de alta en la cuenta que se creo en DynDns
DocumentRoot /var/www/MyServer # el lugar donde sera el directorio base de dicho sitio en la PC(esta la pagina)
DirectoryIndex index.php index.html index.htm index.shtml # Archivos que debera buscar para iniciar la pagina principal.
</virtualhost>



En el anterior ejemplo se muestra como agregar el sitio al final, donde se hospedara los archivos pertenecientes a nuestro dominio o pagina WEB si deseamos, dar de alta otra dirección en DynDns y ocupando nuestro server pero con una pagina diferente, esto es posible ya que apache soporta multidominios es decir puedes tener infinidad de dominios o subdominios redireccionados a tu pc siempre y cuando tu PC y conexión soporten.
Solo tendrías que aumentar otro virtualhost y estará listo.

-Cambiando puerto de escucha del APACHE ...
El numero 80 es el puerto por default donde se pone un servidor WEB con apache pero si quieres redireccionarlo, en caso que tu ISP bloquee tu puerto 80 puedes cambiar el numero de puerto a un puerto alto como 8080, 8021 etc verifica cuales son los puertos http://es.wikipedia.org/wiki/Lista_de_n%C3%BAmeros_de_puerto y recomiendo escoger uno
que no veas en la lista, si quieres ver si esta bloqueado tu puerto 80 ve la pagina http://www.upseros.com/portscan.php ahí te dirá que es lo que tienes cerrado en tu conexión.
Si decidiste cambiar el puerto de escucha pues solo cambiarlo del 80 al nuevo puerto y tendrás que modificar en /etc/apache2 el archivo ports.conf

$ sudo vi /etc/apache2/ports.conf

donde en presionamos la tecla INSERT para editar.
Listen 80 # cambiar al puerto que se halla escogido y que este en tu VIRTUALHOST de default
después ESC para salir de edición y :w ENTER y :q ENTER
-Continuando ...
En este momento tendremos instalado y configurado nuestro apache solo nos falta iniciar el servicio.

$ sudo /etc/init.d/apache2 start

y deberá aparecer algo así:

• Forcing reload of web server (Apache2)... [ ok ]

Eso dirá que todo va bien hasta aquí, al menos no tienes problemas de sintaxis. Pero ya estará activo el servidor.
Para verificar que este funcionando tu Server solo entra con tu navegador a http://localhost si cambiaste el puerto de escucha a un puerto alto debes poner http://localhost:puerto
Te mostrara un texto donde dirá que tu Apache esta instalado.
-Configurando ddclient.conf
Ahora configuraremos ddclient que su función es actualizar la IP de nuestra conexión hacia nuestro dominio DynDns es decir si nuestra conexión a Internet tiene una IP Dinámica, no nos preocuparemos en como actualizar la IP en DynDns ya que ddclient se encarga de eso cada vez que reinicie Ubuntu.
Realizaremos la configuracion editando /etc/ddclient.conf
$sudo gedit /etc/ddclient.conf
Y ponemos nuestros datos segun el ejemplo a continuacion.
# Configuration file for ddclient generated by debconf##
/etc/ddclient.confpid=/var/run/ddclient.pid
protocol=dyndns2 # El protocolo
use=web, web=checkip.dyndns.org # Para obtener la IP actual
server=members.dyndns.org # El servidor para identificarse
login=usuario # El nombre de usuario
password=clave # La contraseña
trixmontero.homelinux.net #el dominio creado en dyndns
Configurado el fichero ya tenemos todo listo para funcionar. Sólo nos falta utilizar el ddclient para actualizar nuestra IP cada vez que ésta cambie. Se hace de la siguiente manera:

$ /usr/sbin/ddclient -file /etc/ddclient.conf -cache /home/nombre_usuario/.ddclient.cache
Donde nombre_usuario es el directorio de tu usuario en linux
y nos debería dar una salida de este estilo:

SUCCESS: updating trixmontero.homelinux.net: good: IP address set to 85.84.49.51

Redireccionamos los datos a un fichero .cache para que no mande información a los de dyndns si nuestra IP no ha sufrido cambios o eso he leído (no queremos "colapsar" su servidor y nos arriesgamos a un baneo temporal)
Claro, si tenemos que hacer esto manualmente cada vez que cambie nuestra IP, todo esto viene a ser un coñazo.
Así que editando el crontab (para dar ordenes y que se ejecuten periódicamente) automatizaremos la orden. Editamos el crontab:

$ crontab -e

y escribimos:

15 */2 * * * /usr/sbin/ddclient -file /etc/ddclient.conf -cache /home/nombre_usuario/.ddclient.cache -quiet

Cerramos el editor y la actualización se efectuará cada dos horas (y por lo visto cada vez que reiniciemos la máquina).
Ya tenemos un dominio personalizado y estático con una IP dinámica.
Espero que haya sido de ayuda.
Más info aquí:
http://bulma.net/body.phtml?nIdNoticia=834http://www.superiodico.net/modules/news/article.php?storyid=11 (De aquí he sacado casí toda la información)

viernes, 10 de octubre de 2008

Servidor de Archivos e Impresion Samba con Ubuntu

Samba es una implementación libre del protocolo de archivos compartidos de Microsoft Windows (antiguamente llamado SMB, renombrado recientemente a CIFS) para sistemas de tipo UNIX. De esta forma, es posible que ordenadores con Linux, Mac OS X o Unix en general se vean como servidores o actúen como clientes en redes de Windows. Samba también permite validar usuarios haciendo de Controlador Principal de Dominio (PDC), como miembro de dominio e incluso como un dominio Active Directory para redes basadas en Windows; aparte de ser capaz de servir colas de impresión, directorios compartidos y autenticar con su propio archivo de usuarios.
Entre los sistemas tipo Unix en los que se puede ejecutar Samba, están las distribuciones GNU/Linux, Solaris y las diferentes variantes
BSD entre las que podemos encontrar el Mac OS X Server de Apple.
Instalación:
$sudo aptitude install samba samba-client smbfs smbclient
esto debería instalar también varias otras dependencias.
Luego configuramos el archivo /etc/samba/smb.conf
$sudo gedit /etc/samba/smb.conf
Configurar Grupo de Trabajo:
Buscamos la linea que diga workgroup y establece tu grupo de trabajo.
workgroup = MYWORKGROUP
Para agregar una carpeta
Primero debemos crear una carpeta con permisos (por ejemplo) : $sudo mkdir /home/public
$sudo chmod 755 /home/public
Luego abrimos el archivo /etc/samba/smb.conf para modificarlo : $sudo nano /etc/samba/smb.conf
y le agregamos, al final, algo como esto :
[public]
comment = Carpeta compartida
path = /home/public
public = yes
writable = no
las opciones son auto-sugerentes, por ejemplo "public = yes" es para que se pueda acceder a la carpeta (el permiso x de sistema), y "writable = no" es para que no se pueda escribir (el permiso w de sistema).
Mas sobre los permisos de las carpetas
Generalmente (esto pasa con mi ubuntu 6.10) al usuario externo que tiene acceso al equipo a través de Samba, el sistema le da como nombre de usuario nobody y como nombre de grupo nogroup, es así como podemos cambiar el nombre de usuario y nombre de grupo a nuestras carpetas, con el fin de que el sistema también sepa quien es el propietario de esa carpeta: $sudo chown nobody:nogroup /home/public
$sudo chmod 555 /home/public
y si queremos que también pueda escribir sobre esta carpeta $sudo chmod 755 /home/public
y además debemos decirle a Samba que se lo permita (acuerdate que para que un permiso sea válido, tanto el sistema como Samba deben estar de acuerdo)

Para no usar contraseña
Buscamos (control+w) la línea donde diga algo como : ; security = user
y la reemplazamos por : security = SHARE
Agregando usuario
Suele pasar que cuando entras desde windows a una carpeta compartida en ubuntu, te pide usuario, puede hacer lo siguiente: sudo smbpasswd -a tu_usuario
si deseas le pones contraseña por motivos de seguridad, y si no necesitas la constraseña solo dale enter.

Para reiniciar samba
Luego de efectuar algún cambio en el archivo /etc/samba/smb.conf debemos reiniciar samba, para ello : $sudo /etc/init.d/samba restart
Con todo lo anterior deberíamos ser capaces de entrar desde un equipo con windows o linux a la carpeta /home/public sin necesidad de tener nombre de usuario ni password:
Desde Windows colocamos en la barra de direcciones de alguna ventana:
\\192.168.0.1\public
Desde Linux (que tenga instalado el paquete samba-client) abrimos una carpeta y colocamos en la barra de direcciones: smb://192.168.0.1/public/
donde 192.168.3.1 es "la IP privada" del equipo linux que contiene a la carpeta /home/public