miércoles, 1 de julio de 2015

Growth rate of the children of Israel in Egypt

Reading the bible I've found some things that I'd like to share, about the growth rate of the children of Israel ein Egypt.

According to Genesis 46:27: "And the sons of Joseph who were born to him in Egypt were two persons. All the persons of the house of Jacob who went to Egypt were seventy."

And Numbers 1:45-46: " So all who were numbered of the children of Israel, by their fathers' houses, from twenty years old and above, all who were able to go to war in Israel--all who were numbered were six hundred and three thousand five hundred and fifty."

And Numbers 1:1: "Now the Lord spoke to Moses in the Wilderness of Sinai, in the tabernacle of meeting, on the first day of the second month, in the second year after they had come out of the land of Egypt, saying:"

So, taking this data it is not hard to see that in 430 years, 70 were multiplied to 603550, giving a growth rate of 0.0212982635902, it means 2,1%.

Today, wikipedia says: "The CIA World Factbook gives the world annual birthrate, mortality rate, and growth rate as 1.89%, 0.79%, and 1.096% respectively.[5] The last 100 years have seen a rapid increase in population due to medical advances and massive increase in agricultural productivity[6] made possible by the Green Revolution.[7][8][9]"

So, the growth rate of the children of Israel in Egypt was 2 times the current growth rate of world population taking account that today we have medical advances! Is it not amazing?

PD: as an attachment I've wrote some code in python to see the number of people of Israel in the 430 years

def fu(pob, grow, delta_t):
 i_delta_t = int(delta_t)
 for i in range(i_delta_t+1):
  if i%10==0:
   print "year",i,"->",pob
  pob*=grow

Here is the output(this is every 50 years):

year 0 -> 70.0
year 50 -> 200.783359284
year 100 -> 575.913676647
year 150 -> 1651.91260935
year 200 -> 4738.23661356
year 250 -> 13590.8437765
year 300 -> 38983.0752706
year 350 -> 111816.468686
year 400 -> 320726.945802
year 410 -> 395969.179647
year 420 -> 488863.169379
year 430 -> 603550.0

viernes, 5 de septiembre de 2014

Upper bound en java


La funcion en c++ de upper_bound suele ser muy util. En java quedaria algo como lo que aparece en la siguiente imagen:



Asi tendriamos complejidad de O(log2(n))
Basicamente se trata de escribir una busqueda binaria y modificarla.
El if final es por si no encontramos ningun valor mayor que el dado, entonces al igual que en la funcion de C++ se devuelve la posicion final dada a la funcion.

martes, 31 de diciembre de 2013

Sherlock Homes y el problema del caballo

Después de un rato jugar el videojuego The testament of Sherlock Holmes me encontré con este acertijo conocido.



Se trata del tour del caballo como las máquinas sirven para hacer prueba y error dejé la consola y encendí el PC para escribir la solución a este.

Hay que decir que este problema es bastante sencillo de resolver para tableros pequeños y basta con un dfs o backtracking y se obtienen no sólo una sino todas las soluciones posibles :)

Así pues la idea básica del algoritmo es:


Guardar los deltas de los movimientos en alguna estructura puede ser un arreglo.

función solución(f, c, cam, vis):
  si ya visitó todas las casillas imprima cam y retorne
  para cada movimiento:
    si es posible(no se ha realizado y no se sale del tablero)
      movf = f+deltaf iésimo
      movc = c+deltac iésimo
      solución(movf, movc, cam+(movf+movc), vis+(movf+movc))
      remover movf y movc de cam y de vis

y la llamada inicial sería algo como

solucíon(0,0,'',estruc)
donde estruc es alguna estructura que permita eficientemente controlar qué casillas ya se han visitado.


Si se usa un conjunto se puede saber cuántas se han visitado aunque con una matriz también funcionaría se necesitaría un contador como parámetro adicional.

Que se diviertan!

martes, 15 de octubre de 2013

Búsqueda binaria

Hola, en muchas ocasiones tendremos que escribir una búsqueda binaria y deberemos tener el concepto claro, ya que no siempre se puede ver tan fácilmente que el problema que debemos solucionar, se puede resolver con una búsqueda binaria.

Primero que todo hay que aclarar, la búsqueda binaria, nos sirve para eso, buscar. Segundo, la restricción para usar la búsqueda binaria es que los elementos estén ordenados. Tercero, si queremos obtener un beneficio de esta, debe realizarse sobre una estructura a la cual se pueda acceder a cualquier elemento en tiempo constante, es decir O(1).

La idea del algoritmo está basado en el paradigma divide y vencerás. Divide y vencerás viene de los romanos, ya no recuerdo por qué, pero lo importante es la idea detrás. Se suele hablar de dividir un problema en subproblemas y de esta forma resolverlos más fácilmente. En la búsqueda binaria se aplica simplemente dividiendo el arreglo en dos, olvidando lo que no nos interesa y centrándonos en lo que sí.

Si tenemos un arreglo y sabemos que está ordenado, por ejemplo:

1 3 6 8 9 11 15

y necesitamos buscar el número 9 y hacemos una búsqueda lineal(iterar uno por uno) tendríamos que hacer 6 iteraciones. Sin embargo, si nos damos cuenta, no es necesario iterar por cada uno y verificar que sea el número que buscamos, por ejemplo, si estamos en la mitad(número 8) sabremos que si el valor que buscamos está en el arreglo tendría que estar a la derecha, y no es necesario buscarlo en la mitad de la izquierda. De esta forma ya nos habremos olvidado de la mitad del arreglo. Luego, podríamos, ¿por qué no?, hacer lo mismo con el arreglo resultante y verificar si el número está en este arreglo, ¿cómo? mirando si es el valor de la mitad el que buscamos. Se recomienda que se haga por cuenta propia el intento de escribir el código que realiza esto, lo cual no es muy complicado. A continuación el pseudocódigo:


Por la ley de la tricotomía, para los enteros se cumple que solo puede entrar a un if de los mostrados anteriormente, y como de una u otra forma, en los computadores sólo trabajamos con valores enteros, entonces podemos estar tranquilos.

Escribir esto en código no es muy complicado, solo hay que tener cuidado de no enredarse, ya sea por desesperación o apuro se pueden cometer errores tontos :)

Finalmente, al dividir el arreglo en dos cada vez, estamos obteniendo una complejidad de O(log(n)) lo cual es lo suficientemente rápido para valores muy grandes. Digamos 10**1000 tiene 1000 dígitos y aún así podríamos buscar un valor en 3321 iteraciones, lo cual no es nada comparado con la cantidad de elementos en total.

Si no tenemos los elementos ordenados, tendremos que pensarlo dos veces, ya que la forma más rápida de ordenar es lineal, es decir O(n), pero con ciertas restricciones y para propósito general tenemos O(n*log(n))

En el siguiente link pueden encontrar implementaciones en varios lenguajes de programación:  http://www.codecodex.com/wiki/Binary_search

Información adicional:
http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binarySearch

martes, 18 de diciembre de 2012

Solucionando sudokus



Su Doku es un juego muy conocido, no entraré en detalles históricos. Este problema puede ser visto como el problema de colorear un grafo, de esta forma los colores son cada uno de los números del uno al nueve, los nodos son cada una de las casillas y están conectados si están en un mismo recuadro, en una misma fila o en una misma columna.

Pasando a la solución por backtracking bien se puede ver que la fuerza bruta consiste en ubicar las casillas vacias y poner un numero en cada una de ellas y ver cuando ya no hayan casillas vacias si el sudoku ha sido resuelto, de no ser así se vuelve a atrás y se intenta con otros números. El problema de este enfoque es que si hay n casillas vacías se tendrán n! (n factorial) formas de llenar estas casillas. Tal vez para unas 9 casillas vacías funcione, pero si se intenta con 10 o más en un ordenador común en la actualidad, puede tardar mucho tiempo.

Así que la mejor forma de hacerlo es ver cuál casillas de las vacías tiene menos posibilidades y optar por una de ellas y hacer lo mismo recursivamente hasta que no hayan casillas vacías, en este punto se verifica si el sudoku está bien, de ser así ya está, si no entonces se vuelve atrás y se opta por otra de las posibilidades en la casilla que tenia varias posibilidades. Finalmente, si el sudoku está bien construido se podrá llegar a una solución.

En pseudocódigo esto podría ser algo como (la implementación en java o cpp no va más de 80 líneas! :) )



Creo que esta es la forma mas simple de resolver este problema, otro enfoque es usando la ténica de Knuth de "Dancing links". El enfoque presentado aquí no es el más eficiente pero es bastante sencillo de programar y puede ser útil en un concurso de programación :)

Cualquier comentario o duda, comenten.






Nota: les dejo algunos problemas que se pueden resolver con este algoritmo.

https://icpcarchive.ecs.baylor.edu/index.php?option=onlinejudge&page=show_problem&problem=2246
http://projecteuler.net/problem=96

domingo, 18 de noviembre de 2012

Mínimo común divisor

En algunos problemas se debe encontrar el divisor común mínimo de uno o más números. Sí, el divisor común mínimo, no el máximo. El mímimo común divisor es muy similar al máximo común divisor, en ocasiones es el mismo pero no se deben confundir. El GDC(máximo común divisor) entre 54 y 24 es 6 mientras que el mínimo común divisor es 2.

Para obtener el gcd se puede usar el algoritmo de euclides, el cual en código es:


static int gcd(int a, int b){
if(b==0)return a;
return gcd(b,a%b);
}

Una vez que se tiene el gcd se puede encontrar el divisor común mínimo.

Si r = gcd(a,b) y r = c*d entonces c y d dividen a y b.

De esta forma, lo que debemos hacer es descomponer el gcd en sus factores primos y sacamos el mínimo. De esta forma obtendríamos el mínimo común divisor.

Nota: un problema que se resuelve con esta idea es este.

lunes, 16 de julio de 2012

Interfaz en java se congela



Hola, no se si alguna vez les haya pasado cuando están trabajando en alguna GUI en java y necesitan realizar una tarea mas o menos pesada, la GUI se bloquea y se queda congelada como si la aplicación hubiera muerto, pero en realidad esta haciendo el trabajo, en estos casos lo que se puede hacer para no dar la impresión que el programa ha muerto (e inhabilitar el botón mientras se hace la tarea, o poner un "loading...") es pasarle la tarea que se hacia en el botón a un hilo y tan pronto el hilo acabe que vuelva a activar el botón o que quite el "loading...".

Espero les sirva y si tienen algo que agregar o alguna duda no duden en preguntar.

martes, 5 de junio de 2012

Criba de Eratostenes


Hola, antes habia puesto un par de algoritmos para saber si un numero era primo, pero y si queremos saber la cantidad de primos en un intervalo dado? Tardariamos mucho si el intervalo es muy grande. Asi que lo mejor para este caso es usar el algoritmo de la criba de eratostenes.

Lo que se hace, es tomar un primo y tachar todos los multiplos de ese primo, luego tomamos el siguiente numero no tachado(que seria un primo) y eliminamos todos sus multiplos, y asi sucesivamente, hasta que todos los no primos se hayan tachado en el intervalo. Pero como sabemos eso? Pues bien, esto lo sabemos porque como se dijo antes solo necesitamos iterar hasta la raiz de un numero para saber si es primo. Es decir que cuando lleguemos a la raiz del maximo numero del intervalo habremos eliminado todos los no primos.

Asi pues, el algoritmo en java para hacer esto seria:

public static boolean criba(int n){
 boolean primos[] = new boolean[n+1];
 Arrays.fill(primos,true);
 primos[0] = primos[1] = false;
 for(int i=2;i<(int)Math.sqrt(n)+1;i++)
  if(primos[i])
   for(int j=i*i;j<primos.length;j+=i)
    primos[j] = false;
 return primos;
}


Con el primer ciclo recorremos los numeros hasta la raiz cuadrada, y con el segundo tachamos sus multiplos si el numero "i" es primo. De esta forma los valores que queden en true seran los primos, es decir primos[2] sera true.

El algoritmo en C podria ser algo como lo siguiente:

char* criba(int n){
 char *p = (char*)malloc((n+1)*sizeof(char));
 memset(p,' ', n+1);
 n = n+1;
 int i=0,j=0;
 int f = sqrt((double)n)+1;
 p[0] = p[1] = 'n';
 for(i=0;i<f;i++)
  if(p[i]==' ')
   for(j=i*i;j<n;j+=i)
    p[j]='n';
 return p;
}

Y en C los valores que queden con una 'n', no seran primos y los que queden con ' ' seran los primos, eso ya es de gustos :)

Si hay alguna pregunta o algo que agregar, comenten.

PD: les dejo unos cuantos problemas en los cuales hay que aplicar la criba para resolverlos.
http://www.codechef.com/problems/PRPALIN
http://projecteuler.net/problem=7
http://projecteuler.net/problem=10
http://projecteuler.net/problem=249

martes, 1 de mayo de 2012

Exponenciacion binaria y modular

Hola, estuve haciendo un par de cosas y tuve que usar un algoritmo de exponenciacion binaria y modular pero no queria que fuera recursivo asi que luego de algunos intentos, esto fue lo que consegui, espero les pueda servir de ayuda, tanto como a mi(aunque esta en java se entiende si manejas otro lenguaje :P) :

public static int expomod(int a, long b,int mod){
    int res = 1;
    while(b>0){
        if((b&1)==1)
            res=(a*res)%mod;
    b>>=1;
    a=((a%mod)*(a%mod))%mod;
    }
return res;
}

y el algoritmo en python es:
def ex(a, b,m):
     r = 1
     while(b):
             if(b&1):
                     r = (r*a)%m
             b>>=1
             a = ((a%m)*(a%m))%m
     return r

La verdad luego de ver el algoritmo recursivo, se entiende este. Lo que se hace es cambiar la recursividad a las variables, por decirlo de alguna forma. Saludos y espero sus comentarios!

Un buen tutorial donde se tratan a fondo otros algoritmos relacionados es este de topcoder.

Nota: un problema en donde se puede aplicar este algoritmo es este.

jueves, 19 de abril de 2012

Generar particiones de un numero


Hola, a veces necesitamos generar las particiones de un numero, una partición es una forma de escribir un numero entero positivo como la suma de otros numeros enteros positivos. Por ejemplo:

Para 3, las particiones serian:
1+1+1, 2+1, 3

Ahora, podemos necesitar los numeros que conforman las particiones o simplemente cuantas particiones tiene. Para este caso, explicare como obtener el numero de particiones con programacion dinamica y modificando este algoritmo se puede obtener que numeros conforman cada una de las particiones.

La pregunta es como llegamos a que las particiones de 3, en este caso, son esas. Bien, luego de ver varios ejemplos(el 4 y el 5) si ordenamos las particiones nos daremos cuenta de algo:

Particiones hasta 5:
N. 1:
1

N. 2:
11
2

N. 3:
1 11
1 2
3

N. 4:
1 111
2 11
2 2
3 1
4

N. 5:
1 1111
2 111
2 21
3 11
3 2
4 1
5

Si nos damos cuenta, las particiones del 3 tienen a las del 2. Las del 4 tienen las del 3 y las del 2 y asi sucesivamente.
En otras palabras, podemos formar un numero de la siguiente forma(para el 4 por ejemplo):
1 + alguna forma de escribir el tres (4-1)
2 + alguna forma de escribir el dos (4-2)
3 + alguna forma de escribir el uno (4-3)
4 (solo hay una forma de escribir el numero con el mismo)

Entonces si quisieramos hacerlo para un numero y obtener todas las particiones hariamos algo como:

1+p(numero-1)
2+p(numero-2)
...
(n-1)+p(numero-(n-1)) es decir p(3) para el caso de las particiones de 4
n
p(numero) serian las particiones o el numero de particiones del numero
Y estas serian todas las particiones de n

El algoritmo para hacer esto en python seria:
numero = 5
particiones = [1] + [0] *numero
for i in xrange(1,numero+1):
    for j in xrange(i, numero+1):
        particiones[j] +=particiones[j-i]
    #print(particiones)
print(particiones[numero])
La ejecucion de este programa daria lo siguiente:
[1, 1, 1, 1, 1, 1]
[1, 1, 2, 2, 3, 3]
[1, 1, 2, 3, 4, 5]
[1, 1, 2, 3, 5, 6]
[1, 1, 2, 3, 5, 7]
y en cada iteracion sucede, tomamos un valor y anadimos las particiones del valor que falta para completar el numero.
particiones[j] = particiones que lleve + formas de hacer el valor que falta (j-i)

Podriamos modificar este algoritmo y en vez de solo sumar, agregar cada una de las particiones y asi obtendriamos los valores que conforman estas particiones


Nota: este problema esta relacionado con un problema muy conocido que consiste en saber de cuantas formas diferentes se puede devolver una cantidad de dinero usando solo las denominaciones dadas.

Nota2: una pregunta interesante es como hacer para que en las particiones un valor no aparezca mas de una vez, sin necesidad de validar luego de haber obtenido las particiones.

Espero les sirva!

martes, 10 de enero de 2012

Project euler problema 1 (A papel y lapiz)



Estaba revisando un libro sobre sumatorias y recordé este problema de PE( projecteuler.net/problem=1 ): hay que sumar los números menores a 1000 que son múltiplos de 3 o de 5.

El problema es muy simple si sabes algún lenguaje de programación y lo básico(estructuras de repeticion y de selección) entonces será sencillo. Una forma posible diferente a la común es (en python):

sum(range(3,1000,3)) + sum(range(5,1000,5)) - sum(range(15,1000,15))

Lo que hace es sumar todos los múltiplos de 3, luego los de 5 y restarle los de 15, ya que cuando hizo los de 3 (3,6,9,12,15...)y los de 5(5,10,15...) contó dos veces los múltiplos de 15.

Bueno pero esta forma es muy común y muy simple, así que la abordé desde el punto de vista de las sumatorias, primero algo básico:

La sumatoria de los n primeros enteros positivos(1+2+...n) es: n*(n+1)/2

En este problema queremos sumar los múltiplos de 3 menores a 1000. Los múltiplos de 3 los podemos expresar mediante: 3*i. De la misma forma expresaremos los múltiplos de 5( 5*i)

Ahora si son los múltiplos menores a 1000, pues será la suma desde 1, hasta [999/3] de 3*i (donde [ ] es la parte entera) y lo mismo con los múltiplos de 5. Luego le restaremos los múltiplos de 15 y tendremos la respuesta. Con la fórmula anterior tendríamos que(la constante se puede escribir por fuera de la sumatoria):

3*(n*(n+1)/2) = 3*(333*334/2)
Igual para 5 y 15, y luego los sumamos(restamos la de 15 por lo que se dijo antes):

Solución = (3×333×334÷2)+ (5×199×200÷2) − (15×66×67÷2)

De esta forma obtenemos la solución para el primer problema de PE de una forma bastante rápida(Si es que no es la más rápida y sencilla una vez que sabemos cómo abordarlo con sumatorias). Si tienes alguna solución diferente, coméntala!

miércoles, 4 de enero de 2012

Test de primalidad


Cómo saber si un número es primo? Muchas veces necesitamos crear un algoritmo para saber si un número es primo o no. Pues bien, no se trata de una tarea muy difícil, si están participando en alguna competencia, seguro les servirá alguno de los siguientes algoritmos.

Un número es primo si sólo es divisible por él mismo y la unidad. Por definición el uno no es primo.
2,3,5,7,11,13,17,19,23,29...

Si queremos escribir el código para saber si un número es primo tendríamos que iterar desde 1 hasta el número y preguntar y esos números dividen a n. Si al final sólo 2 lo dividen, entonces el número es primo. (Un número i divide a n si el residuo de la división es 0, es decir si la división es exacta, si el % es 0)

cont = 0;
for(int i=1;i<=n;i++)
    if (n%i==0)
        cont+=1;
if(cont==2)
    System.out.println("Primo");
else
    System.out.println("No es primo");

o podriamos iterar desde 2 hasta uno antes que n y si algun numero divide a n, estos serian diferentes a 1 y a n, entonces no es primo:

boolean primo = true;
for(int i=2;i<n;i++)
    if (n%i==0){
        primo = false;
        break;
    }
if(primo)
    System.out.println("Primo");
else
    System.out.println("No es primo");

Estas son las formas que se nos ocurren a todos, y es fácil de pensar pero no es muy eficiente, ya que si pusiéramos un número un poco más grande...o mejor aún varios números tardaría bastante. Una pequeña mejor que le podemos hacer es sólo iterar hasta la mitad del número(incluyéndolo) ya que un número no tiene divisores más allá de su mitad. Pero algo aún mejor es sólo iterar hasta la raiz cuadrada del número ya que si dividimos un número por un número más grande que su raíz cuadrada el cociente será un número menor a su raíz. Por ejemplo:
16/8=4
Lo que es igual a la raíz cuadrada.

Mucho más simple si tan pronto encontramos un divisor decimos que n no es primo:(además si descartamos si es par, ya sabemos que no es primo o si es uno y luego sólo iteramos a través de los impares):
if((n&1)==0 && n!=2) || n==1) return false;//si es par y es diferente de 2 porque el 2 es primo
for(int i=3;i<=Math.sqrt(n);i+=2)
    if(n%i==0)
        return false;
return true;

Existen otras formas más complicadas pero más eficientes de saber si un número es primo, para complementar me gustaría compartir una regex que encontré por ahí para verificar si un número es primo en binario:
http://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex

miércoles, 20 de julio de 2011

Algo de awk



Necesitaba enviar algunos parámetros a un script en awk, el problema es que eran varios, mi solución fue:

$ awk -v param1=$var1 -v param2=$var2 '{acciones}'

De esta forma se tenía los parámetros necesitaba usar.

Algunos tutos y libros interesantes para aprender awk:
    - http://www.linux-es.org/node/31
    - http://www.lawebdelprogramador.com/cursos/AWK/5752-Guia_del_usuario_para_AWK.html

lunes, 18 de julio de 2011

Renombrar archivos masivamente desde consola

En ocasiones nos encontramos con que tenemos muchos archivos que tienen una extensión que nos gustaría cambiar o que tienen alguna cadena que nos gustaría quitar. Por ejemplo tener muchos archivos que digan: nombreDelArchivo-NombreAutor, o cosas por el estilo. Esto es algo muy sencillo de arreglar con la orden rename.

Una de las formas de aplicarlo es:

rename 's/cadenaAreemplazar/cadenaNueva/' archivosAaplicar

Por ejemplo, supongamos que tenemos muchos archivos, para este caso que los archivos fueron generados por el siguiente script:


#!/bin/bash
   echo "Comenzando la ejecucion"
   for i in $(seq 2 10)
   do
   touch archivo$i\(Nombre\)
   done
   echo "Finalizado correctamente"


Cuando haya finalizado la ejecución tendremos varios archivos: archivo1(Nombre), archivo2(Nombre), etc

Si quisiéramos quitar la cadena "(Nombre)" de cada uno de ellos, sería ejecutar:

$ rename 's/\(Nombre\)//' *\(Nombre\)

La parte final del comando toma todos los archivos cuyo nombre contenga la cadena "(Nombre)" en la carpeta que estamos trabajando.

jueves, 14 de julio de 2011

Debian en Lenovo z470



Si alguno de ustedes ha comprado una lenovo Z470 e instaló debian squeeze como OS tal vez tenga un problema con las gráficas y es que todo el entorno gráfico se verá horrible, la resolución de la pantalla será de 1024 x 768, en fin. No les aconsejo ni siquiera intentar instalar los controladores nvidia, lo primero que les aconsejo es utilizar los repos de debian testing y actualizar todo, ya que con este kernel se configurarán las gráficas (al menos para obtener una mejor resolución), y podremos trabajar mejor. Para mí fue suficiente con esto, ya que aún no logro instalar los controladores oficiales de nvidia. Además si quiero multimedia uso algún otro OS.

Repos debian testing:


deb http://ftp.de.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.de.debian.org/debian/ testing main contrib non-free


Para agregarlos, abrir la consola y ejecutar

# gedit /etc/apt/sources.list


agregan las 2 líneas anteriores.


Luego, hay que actualizar todo así que tarda un poco, recomiendo que tengan una buena conexión a internet:

# aptitude update && aptitude upgrade


Después de esto, reiniciar y cuando vuelvan a la interfaz gráfica ya tendremos resolución de 1366 x 768 y las demás.

miércoles, 13 de julio de 2011

Instalar wine en Debian

Lo primero que debemos hacer como todo programa en debian es agregar los repositorios para poder instalarlo, así que:

1. Abren el archivo donde están los repos:

# gedit /etc/apt/sources.list


2. Agregan según sea:


-Si usas lenny: deb http://www.lamaresh.net/apt lenny main
-Si usas squeeze: deb http://www.lamaresh.net/apt squeeze main
-Si usas sid: deb http://www.lamaresh.net/apt sid main


3. Para que deje actualizar se debe obtener la llave:

# wget http://www.lamaresh.net/apt/key.gpg && sudo apt-key add key.gpg


4. Si tienes instalado alguna versión de wine, se debe desinstalar:

# aptitude purge wine


5. Actualizamos:

# aptitude update && aptitude upgrade


6. Instalamos wine:

# aptitude install wine

y listo!


Ahora si lo queremos usar, simplemente:

$ wine archivo.exe
o
desde la interfaz click derecho sobre el .exe, "abrir con" y seleccionas wine.


Para evitarnos estar haciendo esto desde consola, por ejemplo si quisiéramos crear un lanzador en alguna parte, en la parte donde dice comando colocarías: wine /ubicacion/del/archivo.exe

Nota:
Para los que no saben, wine crea una carpeta donde se guardan los programas instalados ahí es donde tendrás que buscar el .exe del programa que hayas instalado. (La carpeta está en $HOME/.wine/ )


Para abrir el configurador de wine deben escribir desde la consola:
$ winecfg

Instalar eclipse y netbeans en Debian

Instalando Eclipse en Debian

Es algo muy simple si ya tenemos los repositorios oficiales agregados, para verificar:
# vim /etc/apt/sources.list

Si no sabes cómo es lo de los repositorios, o para agregar alguno:

http://www.esdebian.org/wiki/introduccion-repositorios-debian

(Si recien agregas los repositorios: # aptitude update && aptitude upgrade)

Luego, ejecutar:

# aptitude install openjdk-6-jdk openjdk-6-jre eclipse

Si por alguna razón te dice que no están los paquetes(No se puede encontrar ningún paquete cuyo nombre o descripción coincida con....), revisa que estén en los repositorios con:

# aptitude search openjdk-6-jdk openjdk-6-jre eclipse

Aparecerá una lista, revisa que estén los 3. Si no están, es cuestión de los repos.

Y listo!



Instalando Netbeans 7.0 Debian

Para muchos usuarios Debian no debe ser difícil hacerlo sin embargo aquí vamos:

1. Descargar la versión de netbeans que se desea de la página oficial.

2. Por la consola ir al directorio donde está el archivo, si fuese en descargas:

$ cd $HOME/Descargas/

3. Ejecutar el comando "su" para quedar como root.

4. $ sh nombreDelArchivo.sh

5. Seguir la instalación tipo tintows: next, next, accept, next, finish...

Listo! Netbeans instalado.

viernes, 7 de enero de 2011

Servidor detrás de router

Bien, resulta que tengo un router Thomson TG782 y quería montar mi propio WebServer, luego de instalar LAMP y tener todo configurado y listo, sólo me faltaba poder acceder a mi WebServer desde Internet así que me puse a googlear un rato, pero no encontré absolutamente nada relacionado con mi router. Entonces, tuve la osadía de ponerme a "cacharrear" con mi router y luego de unas cuantas horas logré configurarlo, así pues me decidí sentarme a escribir este tuto para aquellos que estén en las mismas.

Luego de tener todo el servidor montado en alguna computadora o en un servidor dedicado, algunos nos encontramos con un inconveniente, y es poner nuestro servidor en línea, sobre todo si se trata de un servidor casero ya que por lo general la configuración que hacen los ISP's del router no permite la comunicación por el puerto 80 o 21(HTTP y FTP respectivamente).

Para lograr esto lo único que debemos hacer es: abrir los puertos o hacer NAT, NAPT o portfowarding. En cualquiera de los casos nuestro servidor debe quedar con conexión a internet.

Debido a que existen muchas marcas de routers y por cada una hay diferentes modelos me limitaré a dar una explicación no muy detallada pero que estoy seguro les servirá:

-En algunos routers basta con entrar a la interfaz de configuración del router por medio de algún navegador (si no sabes cómo entrar a la configuración de tu router abre una terminal y teclea ifconfig aparecerán las conexiones ya sea conexión por cable o wifi busca una parte donde dice Difus.###.###.#.###.........luego teclea esos números en un navegador y entra como si fuera una página web) y buscar donde dice NAT ó games & application, donde obtendremos un menú como este, luego de  rellenar los cuadros todo estará hecho(donde dice global IP addres se pone nuestra ip pública, donde dice Internal IP Addres ponemos nuestra IP Privada, donde dice type ponemos TCP ó UDP y finalmente escogemos el puerto que queremos) sin embargo, en otros routers no es tan sencillo, muchas veces el menú de NAT o de NAPT no se encuentra, por esa razón deberemos hacerlo desde la terminal.

-Para hacerlo desde la terminal basta con teclear:

 telnet ipDeNuestroRouter (la ip de la mayoría de los routers es 192.168.0.1)

Luego de teclearlo nos pedirá un usuario y un password, (si tu ISP instaló el router entonces debes llamar y pedirles el usuario y el password de administrador para el router, si no lo consigues no podrás hacer nada) luego de ingresar el usuario y el password ya estaremos en el router sólo que desde la terminal y desde acá podremos ver menús que no aparecían desde la interfaz gráfica, como es en mi caso.

Ahora, la configuración depende de cada router por lo que no podré ahondar mucho, esto dependerá de cada cual. En este punto si no conocemos los comandos, podemos ejecutar la ayuda la cual nos servirá bastante para este proceso, así que tecleamos:

 help

Esto nos mostrará una serie de comandos que podemos ejecutar, por lo general, uno de ellos es el de "menú", el cual si no eres un experto en la terminal o no conoces bien los comandos nos ayudará a guiarnos y nos hará de la configuración del router, una tarea mucho más sencilla.

Todo lo que debes hacer ahora es buscar el menú de NAT y desde ahí podrás configurar todas las redirecciones de los puertos a tu gusto. Si tienes dudas o necesitas ayuda no dudes en escribir en los comentarios y en lo que pueda te ayudaré.

Nota: Antes que todo haz una copia de seguridad de la configuración de tu router.

Montando un servidor en Ubuntu o Ubuntu Server


Navegando por la red me encontré con un excelente tutorial en el cual explican paso a paso cómo instalar un servidor en Ubuntu Server. Cabe aclarar que también sirve para Ubuntu, lo único que varía es la instalación de LAMP.

Si desean hacer un servidor casero y ya tienen instalado alguno de los sistemas operativos bien pueden empezar desde el Volumen No 4 y saltarse la configuración de la red (para que tenga salida  internet) ya que suele ser la que más problemas da (almenos en mi caso), además se puede dejar para el final.

Nota: La instalación de LAMP en Ubuntu se hace de la siguiente forma. Ir a Sistema-Administración-Gestor de paquetes Synaptic-Editar-Marcar paquetes por tarea-Seleccionan LAMP y listo!

Si por el contrario quieren hacer un servidor dedicado y "con todos los juguetes" entonces pueden empezar leyendo desde la Introducción.

En una próxima ocasión colocaré un breve tutorial sobre cómo hacer para que las páginas webs o los servicios que ofrezca tu servidor puedan ser percibidos desde internet (sobre todo para aquellas personas que quieren un servidor casero o detrás de un router).