lunes, 29 de abril de 2013

Como cambiar el fondo de Slim login manager

Hace un tiempo que uso Slim en Gentoo y en Linux desde Debian,pero algo que siempre me molesto de los login managers de Linux fue la personalizacion,en KDM,la robustes no me gustaba y de hecho nunca busque como cambiarlo,en el de Ubuntu de unas vesiones pata aca tienen enlazado el fondo de escritorio de Unity al del login manager y tampoco se si hay algun programa que haga esto,en GDM(mi login manager preferido[ya casi no]),de versiones para aca hay un programa o programas que lo configuran :D incluso he hablado sobre este, y llegamos a slim(en mi caso son todos los login managers que he usado) Slim es muy bueno y muy ligero,pero para cambiar el tema,fondo,etc tiene que hacerse a modo texto,a mi lo que mas me importa es el fondo asi que lo cambie:

Tutorial

Abre una terminal

Y teclea:

Para ver que tema tenemos cambiarnos de directorio y listarlo como dicen por ahí (en el mismo calor):

Tecleamos este pipe


cd $(cat /etc/slim.conf | grep current_theme | awk '{print "/usr/share/slim/themes/"$2}') && ls



Nos sale algo como:

background.png
Es el fondo de nuestra pantalla,ahora lo tenemos que rescribir

Abrimos nuestro explorador en modo root:

sudo nautilus ./

O

sudo pcmanfm ./

O

sudo thunar ./
etc

Abrimos una nueva pestaña donde esta nuestro fondo y la copiamos y pegamos en la carpeta del tema,por ultimo solo renombramos nuestro wallpaper a


background.png

Remplazando el otro y listo :D



Es tedioso :S

KDM es demasiado fácil que ya es difícil,LXDE es difícil en cierto punto.

Como no todos podemos usar esos comandos por x razón y yo tengo los conocimientos para "facilitar" esto programe un script(programa miniatura) que hace eso cambiar el wallpaper del loogin manager de slim.


Solo descargan este programa:

Enlace

Lo descomprimen y lo instalan como en este video:




Eso es todo :D
Leer más...

domingo, 28 de abril de 2013

Como borrar datos de manera segura en iOS

Muchas veces borramos datos de nuestro iPhone o Android o Pc(Linux/Windows) y no sabemos que en realidad se queda almacenada información en este caso el iPhone,iPod,iPad algunas personas son capaces de recuperar estos datos,claro que para hacer esto se tiene que tener el dispositivo en la mano de manera física así que si creemos que al borrar un email,una foto,etc de nuestro iPhone esta segura pues no,si lo perdemos y llega a alguien con los conocimientos necesarios(cualquiera con conocimientos en computo forense o con una distribución de Linux como Kali y mucho entusiasmo) puede recuperar nuestros datos,esto ya es paranoico(en cierto punto) pero no esta de mas borrar los datos de manera segura(irrecuperable) o por lo menos irrecuperable por programas de uso común populares y algo de underground.

Lo que hacen herramientas como shared o secure delete(para linux) es borrar la memoria vacía rescribir la memoria vacía con datos vacíos,en este caso tenemos para el iPhone iWipe,una aplicación de cydia(de pago) que hace algo similar a shared o secure delete de Linux.

Para instalarla necesitamos jailbreak

Abrimos cydia

Buscamos iWipe y instalamos(es de pago pero esta de manera gratuita en repos de terceros)



Abrimos y le damos Continue:



Para hacer este proceso debe estar bien cargada la batería de nuestro iPhone,o de preferencia conectarlo a la corriente eléctrica,ya que si se apaga en el proceso sera un gran problema.



Esperamos y al final nos mostrara un mensaje de que falta memoria,le damos omitir y listo.



Eso es todo,ahora nuestros datos borrados estan mas seguros ;).


Leer más...

sábado, 27 de abril de 2013

Como usar partición swap en SD Android

Android al igual que los sistemas Linux de escritorio nos permite usar memoria swap o como le dicen normalmente de intercambio o virtual.

La memoria ram es la memoria principal de una computadora o un smartphone la Ram es la memoria que se encarga de ejecutar los programas,esta memoria es temporal y es real(hardware) la memoria swap o de intercambio es una memoria de tipo ram pero que no existe en hardware,por eso el nombre de memoria virtual,la memoria swap se activa cuando la ram se acaba y esta usa intercambio con la swap.

La memoria Swap es mucho mas lenta que la ram,ya que estamos usando un archivo o una particion de una memoria SD de almacenamiento masivo,aunque las memorias son de diferentes clases,para obtener un resultado similar al de la Ram necesitamos la clase mas alta,las mas comun es 4 o 10.En los sistemas con kernel Linux podemos usar memoria virtual(swap) para ayudar a la ram(real) en la administración de procesos/ ejecución de programas.

Bien eso es un poco de explicación que casi nunca hago pero bueno,es un poco de información que no sobra saber,en este caso aprenderemos a usar una particion o archivo como memoria swap en Android.

No funciona en todos los dispositivos,ya que depende del kernel que usemos.

Para saber si funciona vamos a realizar este tutorial primero:

Nota : Necesitas tener el movil rooteado y de preferencia una Room como CyanogenMod

Tutorial para saber si nuestro equipo puede usar swap.

1.Descarga Busybox

BusyBox trae muchos programas de Unix(linea de comandos) que normalmente usan los programas root de Android,asi que puede que lo tengas ya instalado,pero si no no esta de mas instalarlo y ademas de que se necesita para este tutorial:

Google Play

Instalamos y abrimos luego le damos instalar en /system/xbin/.


2.Instalamos MemoryInfo & Swapfile Check.

MemoryInfo & Swapfile Check esta hecha para hacer test para "aumentar la ram" asi que nos funciona para saber si podemos usar swap.


Instalamos:

Google Play

Abrimos y le damos al botón de abajo,al que esta abajo de swap


Elegimos nuestra SD Card


Si no nos da error podemos usar swap,pero si nos avisa que no es compatible nuestro kernel,pues no pueden continuar con el tutorial.

Tutorial usar swap

Para usar swap tenemos varias opciones:

1.Swapper 2


Con esta app es todo automatico,tan solo instalamos:

Google Play

Abrimos

Y le damos On



Esto nos crea un archivo de swap y lo activa(necesita BusyBox),en opciones podemos elegir que inicie al inicio y el tamaño de la swap.

2.2.Particion:

En las tarjetas SD al igual que en los HDD o pendrives podemos crear particiones,en este caso podemos crear una particion swap de nuestra SD,para ello podemos hacer dos cosas:

Has un backup de tus datos de la SD.

2.2.1.Con Pc

Conectamos la SD a nuestra Pc, y abrimos nuestro programa para particiones,en mi caso estoy usando Linux y uso gparted,en WIndows existe Partition Magic(de pago) o otros programa gratuitos.

Abrimos la memoria SD, en Linux es /dev/sd{b,c,d}

Peden ver en la terminal tecleando sudo fdisk -l (es el que sale hasta abajo)

Y en Windows es  G:F:,etc (Pueden ver en el explorador de archivos)




Le vamos a dar desmontar y redimencionar (a la partición Fat32) luego elegimos el tamaño(a lo mucho 300mb recomiendo) le damos clic derecho nueva:


Y en sistema de archivos elegimos linux-swap

Le damos aceptar y aplicar,nos debe quedar asi:


Ahora reiniciamos el telefono con la memoria SD adentro y debe reconocer la swap automáticamente.

2.2.2.Con el mismo telefono,desde el recovery

El mismo telefono nos ofrece la capacidad de particionar nuestra SD,desde el Recovery.

Para eso ponemos nuestro telefeno en modo recovey.

Esto depende de cada telefono,googlen como poner en recovery.

Si tienen una Rom como CM pueden ponerlo desde ahi,solo oprimen el boton de apagar y le dan Reiniciar luego dira modo recovery,cuando prenda iniciara el Recovery.

Ya en modo recovery le damos:

Particion sdcard

Luego 

Patition SD

Nos da a elegir el tamaño de la Swap

Luego el tamaño de otra particion en ext2,que sirve para las apps(luego explicare eso[si no es que lo sabes])

Esperamos y reiniciamos,cuando reiniciemos debe reconocer la swap automaticamente.

Bueno pues eso es todo,un poco tedioso pero así es android,mejor hay que usar iOS :P(broma).

Saludos :D

Leer más...

viernes, 26 de abril de 2013

Como crear accesos directos en Gnome 3.8

Este tutorial es muy sencillo y esta hecho para los nuevos usuarios de Linux,ya que no es muy sencillo crear un acceso directo en Gnome 3.8 como en Windows,bueno si es facil pero el problema es saber como y este tutorial esta hecho basado en lo que me menciono @Linus Sector en esta entrada ya que esa forma funciona también en gnome clasic/shell 3.8 :D

Tutorial:

Abrimos una terminal y tecleamos

nautilus /usr/share/applications/ & exit

Eso no sabre la el explorador de archivos(nautilus) en la carpeta de la aplicaciones.



Ahora elegimos el programa que queremos en como accesos directo,le damos clic derecho copiar a 



Y elegimos escritorio,eso es todo:





Leer más...

jueves, 25 de abril de 2013

1 millon de visitas :D

Pues nada Tiempo de Tux llego a 1,000,000 de visitas



Y un millos de Gracias a todos por su visita :D

Un poco de información:

El sitio comenzó a finales del 2011(no recuerdo el mes) pero aun no tiene ni dos años,las estadísticas que me da blogger son por la paginas vistas no por las visitas(como en wordpress) aun así según los datos que me da google(herramientas para webmasters) traducidas a las estadísticas de wordpress(por ejemplo) llevaría como 700,000 visitas, ya que la mayoría de las personas o robots que vistan la pagina solo visitan 1 por visita :(,pero en fin son visitas y por lo menos en esa cifra ya llego a un millón(aunque sean paginas vistas).

El sitio va para abajo y eso lo se,este sitio ha estado a "full", 10,000 a 15,000 paginas vistas al dia,(lo que seria como 8,000/7,000 de wordpress[dependiendo cuantas paginas vea el visitante]) pero ya no,a lo mucho llega a 1,800 paginas vistas al día,esto es fácil de saber por que es y lo he dicho anteriormente:

La mezcla de temas en un solo sitio,afecta de manera brutal a un sitio en el SEO,google o los motores piensan(están programados) que Linux el iPhone y Unix son cosas distintas(y si,pero no) ambos son tecnología software, informática,etc esto lo que ocasiona es que el posicionamiento se lo de a sitios especializados en el tema,sitios con nombres como(no existen o se si existen[es un ejemplo]) usolinux,miiphone,tutorialesunix,etc al tener el tema especializado(inclusive en el dominio) le dejan el posicionamiento a ese tipo de sitios,bueno eso es lo que pasa al mezclar varias tematicas en una sola,ademas de la inaceptacion de los "fanboys" de X sistema.

Yo lo se y lo puedo arreglar,pero eso seria la destrucción del sitio como es ahora, tendría que volver a lo de antes y yo prometí ir aumentando la dificultad de los temas y construir un sitio con temática estable:

Sistemas Linux:

Mint -> Ubuntu -> Debian -> Arch -> Slackware -> Gentoo

Ademas de Fedora/openSUSE/Backtrack/etc

Scripting:

Bash -> Python -> Perl

Otros sistemas:

Unix/iOS/Android/BSD


Y lo he cumplido,pero por eso mismo han bajado las visitas,es por mucho, mas buscado:

Como sacar fotos con mi iPhone

Que

Buffer Overflow Perl Unix


O

Crear distribución basada en Gentoo

Estoy en una ambivalencia y es que lo que era este sitio era para ayudar a otros usuarios sea del sistema que fuera(incluso había tutoriales de Windows/Symbian/OS X) pero poco ha poco ha ido cambiando y se tienen que tomar decisiones:

Hacer un sitio con temas estables y únicos,sistemas de alguna forma son de la familia Unix, y cada vez tener menos visitas(pero de calidad[que comentan,se expresan,etc])

O

Tener un sitio de muchos temas con miles de visitas al día,(pero fantasmas)


Yo me decidí por la primera solo,que me llama la atención que ya la han visto cientos de miles de personas que buscan lo que escribo,ya que es el 80% del trafico(google). Se que le podría dejar este trabajo a personas con muchos mas conocimientos en esto(ingenieros,programadores,etc) pero bueno este sitio no tiene como objetivo llegar a poner tutoriales de escribir en lenguaje de maquina,solo de el uso diario y problemas comunes de sistemas tipo o de familia Unix.

Pues eso es todo,en lo personal nunca me he presentado y no lo haré,ya que como dije esto para mi es un juego/hobby y no vale la pena presentarme.

Saludos y de nuevo Gracias :D
Leer más...

miércoles, 24 de abril de 2013

Como instalar Burg en Archlinux

Burg es muchas cosas para empezar es grub alrevez :

echo "grub" | perl -ne 'chomp;print scalar reverse . "\n";'
Bueno eso es burg,grub al revez ,ademas de eso burg es un cargador de arranque con el cual podemos lanzar varios sistemas operativos como grub o Lilo o syslinux, pero a diferencia de grub, Burg es un cargador modo gráfico como el de OSX(Boot Camp apple):

En mi caso Burg queda así:



Nona: Salen tres Arch porque son varias versiones del kernel.

Otro buen motivo de instalar Burg en Archlinux es que no da el error de locales de grub 2,asi que queda bien sin error y elegante :D.

Tutorial

1.Instalamos yaourt

Primero editamos el archivo de configuración de pacman:

En terminal

sudo nano /etc/pacman.conf

Y añadimos:

Para 32 bit:


[archlinuxfr]
SigLevel = Optional TrustAll
Server = http://repo.archlinux.fr/i686



Para 64 bit:



[archlinuxfr]
SigLevel = Optional TrustAll
Server = http://repo.archlinux.fr/x86_64


Guardamos y salimos:

ctrl + o

ctrl + x

Instalamos :

sudo pacman -Sy yaourt 
Ahora instalamos Burg:

Para Bios:

yaourt -S burg-bios-bzr
Para Efi:

No lo he probado(no suso efi)

yaourt -S burg-efi-x86_64-bzr

Nota: Se tarda un rato ya que compila burg y algunas dependencias.

Ahora instamos los temas:

yaourt -S burg-themes burg-themes-extras

Ahora instalamos Burg en el MBR:

sudo burg-install /dev/sda --no-floppy

Con eso ya tenemos instalado Burg en vez de Grub,ahora debemos crear un archivo de configuración:

sudo burg-mkconfig -o /boot/burg/burg.cfg
Y listo :D

Solo nos falta configurar el tema y tamaño de la pantalla:

Abrimos dos terminales:

En la primera vemos la calidad de nuestra pantalla(si no la sabemos):

xrandr -q | grep --color current
En mi caso es una netbook 1024x600


En la segunda terminal editamos la configuracion:

sudo nano /boot/burg/burg.cfg

Buscamos la variable set gfxmode y lo cambiamos por el tamaño de nuestra pantalla:

Por ejemplo:


set gfxmode=1024x600

Ahora en la primera terminal listamos los temas:

ls /boot/burg/themes
Y en la segunda terminal buscamos la variable set theme_name y le ponemos el nombre del tema.

Por ejemplo:

La primera captura es un tema que se llama coffee y queda así:

set theme_name=coffee

A mi en especial me gusto el tema minimal:




Podemos probar con burg-emu


Si no nos sale como este(como debe) algo anda mal y no apagen porque si no se mueve o no podemos elegir nada,asi saldra en el sistema real y no podremos iniciar(todos los sistemas) y sera un problema asi que hasta que lo veamos así,no reiniciemos,a mi me paso y solucione con una nueva generación de configuración:

sudo burg-mkconfig -o /boot/burg/burg.cfg




Si a la hora del arranque se ve borroso,es porque nuestra pantalla no es compatible,podemos presiona F3 y vemos las resoluciones,elegimos la mejor y configuramos con esa el archivo de configuración:

También lo podemos ver mas a detalle y eliminar la carga de otros kernels(para que no haya tantos iconos),ya que en caso es realmente así:



sudo nano  /boot/burg/burg.cfg


Eso es todo :D

Fuente : wiki.archlinux.org/index.php/BURG
Leer más...

lunes, 22 de abril de 2013

Expresiones regulares con python tutorial (1/2)

En python existe un modulo llamado re,el cual nos permite realizar regex sobre variables de nuestro script como en muchos otros lenguajes de programación,en python no es la excepción y podemos hacer regex facilmente :D.

Este tutorial lo dividire en dos partes ya que hay varias cuestiones a tratar,pero primero que nada que son las expresiones regulares o regex o patrón:


Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón "H(a|ä|ae)ndel". La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.
En informática, las expresiones regulares proveen una manera muy flexible de buscar o reconocer cadenas de texto.

Mas info es.wikipedia.org

Eso dice wikipedia,en mi opinión las expresiones regulares son la forma mas potente y sencilla de buscar texto,existe en muchos lenguajes de programación y también se aplica en lo que es las wildcards de Unix,es algo rara sus sintaxis pero asi debe de ser,ya que por ejemplo le pedimos que busque un texto que comience con H que tenga 2 numeros en medio de la cadena,que no le importe el demas contenido pero que termine en o,suena complicado ordenare eso a la maquina y es complicado,con o sin expresiones regulares,ya que sin expresiones regulares tendriamos que usar infinidad de condicionales anidadas sobre bucles anidados que recorran cada valor de las cadenas por separado :O

Así que hay que dar gracias que existen las regex :D

Tutorial:

Si se preguntan si se puede hacer el ejemplo que dije:

Algo como esto:

Hola 03 Mundo

En regex para buscar esa cadena hacemos esto:

"^H.*\d{2}.*o$"
Se supone que para el final de este tutorial debes entender eso.

Bien en primer lugar debemos importar el modulo re al principio de nuestro script o modulo como sea que le digas:

import re

Abajo del shebang y si nos gusta o necesitamos usar codificación, también abajo de la codificación:

Ahora como sabemos(o si no sabemos) python usa el punto (.) para llamar funciones de los modulos,el modulo re tiene varias funciones pero en esta ocasion nos concentraremos en search(buscar):

re.search()
Adentro de search() le pasamos los parámetros a la función del modulo:


re.search("izquierda","derecha")


en la izquierda tenemos la sintaxis de nuestra expresion regular, y en la derecha la cadena de texto a la cual le vamos a aplicar el comparador de cadena(re.search):

#!/usr/bin/env python3

import re

cadena = "Hola 03 Mundo"

if re.search("^H.*\d{2}.*o$", cadena):
    print ("True")
else:
    print ("False")



En este caso trabajamos con operadores booleanos,si la expresión encuentra lo que busca, es True:


if re.search("^H.*\d{2}.*o$", cadena):

Si no es False,bueno en realidad si no encuentra nada regresa None,pero como usamos un estructura de si o no es 1 o 0 True or False,aunque si gustamos podemos hacer esto:

#!/usr/bin/env python3

import re

cadena = "Hola 03 Mund"

if re.search("^H.*\d{2}.*o$", cadena):
    print ("True")
elif re.search("^H.*\d{2}.*o$", cadena) == None:
    print ("None")
else:
    print ("False")

Esto hará que el 1 y 0 sea if y elif y else sea otra cosa.

re.search no nos sirve solo como comprobador aunque nos funciona muy bien para hacer switching,en un tutorial pasado mostre un sencillo juego de piedra paperl o tijera  en el use un algoritmo sencillo para la eleccion del numero de juegos el cual es asi:

while True:
   n_juegos = input("Numero de juegos : ")
   try:
      int(n_juegos)
      break
   except:
      print("(numeros); ")
      continue


Con regex el algoritmo queda asi y funciona igual:


while True:
   n_juegos = input("Numero de juegos : ")
   if not re.search("\D",n_juegos):
      break
   else:
      print("(numeros); ")
      continue

Como ven se pueden hacer algunas cosas o mejor dicho se pueden hacer las mismas cosas de muchas maneras,en este caso si use re,les dejo el script completo:

Enlace

Bien,entonces porque no use re desde antes?

No fue porque no sabia de su existencia,ni porque no sepa usar expresiones regulares de hecho los perleros somos maestros en las regex ;).Fue porque hay que saber programar y tener un codigo limpio,en ese caso eso se resolvia con un simple try,except y no era necesario llamar un modulo a facilitarnos el trabajo,pero bueno eso depende de nuestro modo de programar:

Izquierda
Izquierda

Como ven la sintaxis de la regex esta a la izquierda,las regex se basan en simbolos especiales los cuales son:

^

Que quiere decir principio de una cadena:

Por ejemplo si buscamos la H en Hola que inicie al principio

re.search("^H","Hola"):
Si no usamos ^ buscara en toda la cadena:

re.search("H","Otro Hola"):

Y en ambos casos es verdadero.

El lado contrario de esto es el símbolo:

$

Este simbolo busca en el final de la cadena:


re.search("H$","Otro Hola"):

En este caso regresa None,ya que seria True si buscáramos a.

Tambien existe el que seria el comodin Unix * (después) el cual busca caracteres después de otro,en este caso para que re de python de el mismo resultado que Unix necesita estar * seguido de un (.) que quiere decir un caracter,por ejemplo:

re.search("...o","Otro Hola"):
Aquí da True porque cada punto es una letra:

O punto (.) 1 caracter de la regex

t punto (.) 2 caracter de la regex

r punto (.) 3 caracter de la regex

o o 4 caracter de la regex

Otro ejemplo:

re.search("..o","Otro Hola"):
Da None porque esta buscando la o donde esta la r.

En el caso de * busca lo que sigue o lo siguiente,antes o despues,sin importar el numero de caracteres:

re.search(".*o","Otro Hola"):

Da True y no es necesario colocal el numero exacto de caracteres,muy util si o estuviera el la posición 1000000 de un texto.

Al igual que en Unix se puede al reves:

re.search("o.*","Otro Hola"):
También da True porque también encuentra la "o" de derecha a izquierda.

Otro simbolo que usaremos en las regex es la (\) este simbolo seguido de una letra en particular quiere decir muchas cosas,por ejemplo en el algoritmo que mostré arriba,en Pseudocódigo es:

si(afirmación) no hay letras en la entrada de la respuesta

Ahora ese algoritmo codificado a python luce así:


if not re.search("\D",respuesta):
Asi que con \D estamos buscando no letras solo numeros,el Pseudocodigo original(texto plano) es:

Pide un numero de juegos, mientras no sea un digito el numero de juegos vuelve a pedir el numero,cuando el numero sea un digito vamos a juegar

Y eso luce asi codificado a python:

while True:
   n_juegos = input("Numero de juegos : ")
   if not re.search("\D",n_juegos):
      break
   else:
      print("(numeros); ")
      continue


En la solución use una negacion lógica porque si usaba una afirmación no daba el resultado que necesitaba,ya que para buscar digitos se usa este simbolo \d solo que tambien recibe las letras,por ejemplo si escribimos:


1ytextoalotontoperousamosunnumeroenmedio


Da True ya que la funcion search busca un numero o una coincidencia en toda la cadena,para que pudiera usar una afirmación tendría que usar la función

match de re

re.match()

Ya que match busca que toda la cadena sea la coincidencia se hubiera podido hacer de esta manera el algoritmo/solucion:


while True:
   n_juegos = input("Numero de juegos : ")
   if re.match("\d",n_juegos):
      break
   else:
      print("(numeros); ")
      continue


Y funciona completamente igual :D

Después vemos match,ahora estos son los caracteres mas importantes:


\d # Se usa para dígitos

\D # Se usa para no digitos

\s # Se usa para espacios en blanco

\S # Se usa para no espacios en blanco espacios

\t # Cualquier tabulador

\w # Cualquier caracter alfanumérico(no símbolos).

\W # No caracteres alfanuméricos (solo simbolos)


De alguna manera el primer algoritmo que deje podria dar problemas por los espacios,asi que podríamos decir:

Que sea un numero y que no tenga espacios



Ya que el usuario podria poner algo como

22 22

Y ese espacio haria que diera errores,asi que se podria hacer esto

if not re.search("\D",n_juegos) and not re.search("\s",n_juegos):

Pero python nos pone todo fácil y ya no es necesario,pero es un ejemplo que puedes llegar a utilizar en otro caso.

Por ultimo en esta parte veremos las llaves {} 


Las llaves se usan para definir un numero de veces que queremos que aparezca algo:


\d{2} digito dos veces
\d{2,4} digitos de dos a cinco veces
\d{4,} digitos cuatro veces o mas

\d{1,3}    digitos de 1 a tres veces
\d{,4}      cuatro digitos o menos

De momento eso es todo,en la próxima parte veremos como compilar nuestro propia variable para usarla como regex y el resto de los simbolos :D.

Leer más...

Como usar gnome 3.8 modo clasico en Archlinux

Hace algo de tiempo que salio Gnome 3.8 para desarrolladores para que estos la pongan en su distribucion,en algunas ya ha llegado como en openSUSE,pero en Arch no :(

Bueno en el ultimo pacman -Syu que hice no me salia en las repos estables,solo en las testing.

Asi que hoy por hoy 23/04/2013 debemos activar las repos testing para poder usar gnome 3.8,si ya hace mucho de esta fecha es posible que ya este en los repos oficiales.

De todas formas aunque sea testing no me ha dado problemas(algunos menores) pero bueno vale la pena (en mi opinión) a comparación de 3.4 o 3.6.

Tutorial

Activamos las repos testing:

En terminal

nano /etc/pacman.conf
Buscamos



#[testing]
#Include = /etc/pacman.d/mirrorlist

Y les quitamos el gato (#) ahora salvamos y salimos

ctr + o

ctrl + x

Actualizamos las repos y el sistema:

Si tenemos instalado gnome shell 3.6 o 3.4

sudo pacman -Syu

Si no tenemos gnome(no tenemos nada o LXDE,etc):


sudo pacman -Syu gnome
Eso nos instala Gnome Shell 3.8

Ahora instalamos el modo clasico

sudo pacman -S extra/gnome-shell-extensions

Eso es todo,elegimos desde el login manager Gnome Clasic


Un video :D



La verdad este Entorno es una maravilla,yo que soy usuario de Gnome la versión 3.6 me había decepcionado un poco porque donde la uso es una netbook y no estaba optimizada,pero esta version en modo clásico me va perfecto.

Y no les digo mas,prueben ustedes mismos :D

Leer más...

domingo, 21 de abril de 2013

Como poner en español gnome shell opensuse 12.x



openSUSE es la distribución simple mas me gusta,osea para tareas normales ver videos,internet,escribir documentos,etc ya que trae todo bien configurado y no se traba tanto y tiene tantos errores como Ubuntu,si es que tiene o que lo son,como en este caso,instale openSUSE 12.2 con Gnome Shell 3.4 y no venia en español traía configuraciones por defecto en español pero no todo el sistema,esto me habia pasado en Fedora pero se soluciona desde la configuración de Gnome,en este caso openSUSE no trae esa opción :(.

Pero trae Yast y desde ahí se arregla todo fácilmente en modo clic (en serio todo),sin tener que usar consola ni nada.

Tutorial

1.Abre Configuración del sistema(Config Settings)

Ve a Yast



Nos pide la contraseña de root,por la configuración de openSUSE la contraseña de root es la de root no la de nuestro usuario.



Ya en Yast entramos a  Languaje:





Si les paso igual que ami,estará en Español ?

Si esta en español ,vamos a opciones pero si no cliqueamos donde dice el idioma y buscamos español luego le damos en opciones:


En configuración de localización elegimos nuestro locale,en mi caso es_M

Por ultimo le damos aceptar y aceptar,esto nos instalar los idiomas del sistema y programas como firefox,libreoffice y otros especiales.



Luego cerramos sesión y nos logeamos de nuevo y listo :D

Leer más...

sábado, 20 de abril de 2013

Mostrar menu crear documentos nautilus 3.6



Hace mucho que no usaba nautilus para crear documentos,lo hacia directamente desde los programas dedicados a esto,como Vim,Gedit,Libre Office,nano,etc pero apenas hoy me encuentro conque nautilus no trae un menu de crear documento,a mucho que salio esta version,creo que si lo habia visto en la primera revision que hize cuando salio para Archlinux pero no le habia tomado importancia hasta que lo necesite :\.

Y bueno es sencillo obtener este elemento del menu:

Nautilus guarda en su carpeta o mejor dicho en tu carpeta Home/Plantillas (~) las plantillas para crear nuevos documentos,basados en una plantilla desde .txt o documentos vacíos hasta cuerpos de algoritmos en algún lenguaje de programación para la escritura de un programa/script,en mi caso los que mas uso son:

Lua .lua

Perl .pl

Python .py

Javascript .js

Bash .sh

Documento en blanco

Así que para añadir un documento abrimos terminal y escribimos:

cd ~/Plantillas && printf "Ahora estas en la carpeta plantillas : " && pwd

Con eso entramos a la carpeta de plantillas

Para crear un documento(que saldra en el menu) escribimos:

Por ejemplo para crear un .txt

echo "" > "Archivo txt.txt"

Esto nos crea una plantilla vacia con extension .txt

Ahora para crear un documento en blanco que seria igual que un .txt pero sin extensión seria asi:

echo "" > "Documento en Blanco"

Esto también se puede hacer así:

touch "Documento en Blanco"

Ahora por ejemplo para crear una plantilla para python con su extensión y hashbang usamos:

printf '#!'"`which python`\n\n" > "Script en Python.py"

Eso luce un poco raro pero asi lo hacemos los unixeros :D,ahora un modo sencillo es solo crear el documento en blanco y luego abrimos nautilus en plantillas:

nautilus ./

Y damos clic derecho -> crear nuevo -> Documento en Blanco




Le ponemos el nombre y la extensión si le queremos añadir un cuerpo de plantilla o simplemente el hashbang como a python solo le damos doble clic y nos abre el editor y luego añadimos y guardamos,facil :D como en windows :\ pero facil :D.


Leer más...

jueves, 18 de abril de 2013

Como conectarse a varias pc por ssh y hacer que hagan lo mismo

Ese titulo es muy coloquial,en términos mas "profecionales" es algo asi como,agrupar entrada estándar(stdin) a multiconexion ssh,bien el punto de este tutorial es que aveces por trabajo o por andar "jugando" como es mi caso nos conectamos a varios host,sean pc locales de nuestra red local o servers a nivel web,pero el hecho es que algunas veces necesitamos que todas hagan lo mismo y al mismo tiempo,para eso es este tutorial para hacer que nuestros host a los cuales estamos conectados por ssh hagan lo mismo desde la entrada estandar(al escribir solo en una cosa),para ello yo uso y recomendare dos herramientas:

1.Terminator y openSSH:

Instalamos:

Ubuntu:

sudo apt-get install terminator

Gentoo:

sudo emerge -av terminator

Arch:

sudo pacman -S terminator


Terminator es una consola(emulador de terminal) con el cual podemos agrupar las ordenes de un cierto grupo o de todas las terminales divididas,solo basta con dividir la ventana en 4 o los host que nosotros queramos:



Luego escribimos en cada una la conexion ssh:

Por ejemplo en una:

ssh root@192.161.1.13

En otra


ssh root@192.161.1.11

etc

Luego entramos con la contraseña y ahora lo que hacemos es dar clic en el menu de la izquierda y le damos clic a:

Retransmitir a todos
Ahora lo que se escriba en una terminal se escribira en otra y tendremos una ejecución exactamente igual,pero ojo mas bien es un stdin exactamente igual,la aceptación de la orden y stdout depende de la conexión a Internet que poses.



2. La segunda opcion es cssh(clusterssh):

Clusterssh me gusta mucho porque usa Perl para muchas cosas entre ellas el cliente stdin que esta programado en Tk,por lo cual aparte de los sistemas Unix podemos usar clusterssh en Windows:

Instalamos

Solo lo he usado en Gentoo:

sudo emerge clusterssh
No se si en Arch,Ubuntu,etc sea igual clustersshcssh con su administrador de paquetes.

Ahora solo abrimos una terminal, y escribimos:


cssh root@192.161.1.13 root@192.161.1.12 root@192.161.1.11 etc

Y nos abre terminales miniatura con cada uno de los host,ademas del cliente donde si escribimos mandara todas las ordenes a todas las terminales y host's:


Video de ejemplo



Asi se ve en mas servers:



Las opciones de cssh son las mismas de ssh (en cuanto a conexion),asi que depende de como tengas configurado el ssh se usara cssh(puertos,credenciales,etc)

Leer más...

miércoles, 17 de abril de 2013

Clases y objetos python 3 parte (1/4)

Comenzamos con las clases y objetos :D,como bien decía a uno de los lectores del blog,aprendiendo a programar desde Unix(shell de Linux,FreeBSD,Mac,etc) podemos entender mas fácilmente o fácilmente la documentación de modulos de python,como gtk(pygtk),sys,os,re,PyQt4,etc,lo unico que pasa es que aun no están listos todos los tutoriales o por lo menos los fundamentales,en el cual algo de lo fundamental es saber trabajar y manejar objetos creados por clases, así que como es un tema un tanto largo dividiré este en cuatro partes,y esta es la primera.

Primero que nada necesitamos conocimiento basico para esto,asi que si no tienes ni idea de funciones,bucles y tipos de datos hecha un vistaso a los otros tutoriales:


Enlace

Primero que nada debemos saber que las clases son metodos de construcción para crear objetos,yo no explico mucho ya que voy directo a la practica pero hay que estar informado:

Python nos brinda la OOP:

La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos.

En la programación orientada a objetos, una clase es una construcción que se utiliza como un modelo (o plantilla) para crear objetos de ese tipo. El modelo describe el estado y el comportamiento que todos los objetos de la clase comparten. Un objeto de una determinada clase se denomina una instancia de la clase. La clase que contiene (y se utilizó para crear) esa instancia se puede considerar como del tipo de ese objeto. Por ejemplo, una instancia del objeto de la clase "Persona" sería del tipo "Persona".

Un ejemplo de instancia en un lenguaje de programación visual, sería tomar o arrastrar un objeto de la barra de herramientas o de la lista de librerías y colocarlo en el escritorio o escenario de trabajo (estamos creando una instancia de ese objeto, una copia). Si arrastramos 10 botones al entorno visual de trabajo, estamos creando una instancia del botón original, si a cada botón le cambiamos el nombre, tendremos 10 botones que heredan las mismas propiedades y métodos del objeto original. Tenemos como resultado que con un solo botón hicimos 10 y nuestro archivo pesara como si tuviese uno solo.

Una clase por lo general representa un sustantivo, como una persona, lugar o (posiblemente bastante abstracta) cosa - es el modelo de un concepto dentro de un programa de computadora. Fundamentalmente, encapsula el estado y el comportamiento del concepto que representa. Encapsula el estado a través de marcadores de datos llamados atributos (o variables miembro o variables de instancia), y encapsula el comportamiento a través de secciones de código reutilizables llamados métodos.

En la programación orientada a objetos, un método es una subrutina/función asociada exclusivamente a una clase (llamados métodos de clase o métodos estáticos) o a un objeto (llamados métodos de instancia).

Más técnicamente, una clase es un conjunto coherente que consiste en un tipo particular de metadatos. Una clase tiene una interfaz y una estructura. La interfaz describe cómo interactuar con la clase y sus instancias con métodos, mientras que la estructura describe cómo los datos se dividen en atributos dentro de una instancia.

Fuente Enlace

Bien,como dice arriba las clases heredan datos de otras clases,en esta entrada no vamos a hablar de herencia ni de todas sus capacidades,solo de como usar y definir una clase normal:

Las clases se definen con la palabra especial class,seguida del nombre de la clase y la herencia entre parentesis,en este caso no heredaremos nada,asi que podemos dejar los paréntesis en blanco o usar la palabra especial object:

Así se define una clase

class Miclase(object):

Y como en python,el algoritmo o el cuerpo del script/programa/exploit/etc debe ir identado:

class Miclase(object):
        # Algoritmo

Las funciones dentro de las clases se llaman métodos,y también tienen un rango de alcance similar al que habíamos comentado en las funciones def,local,global,etc.

En los metodos,siempre se les pasa por lo menos un argumento,self,este argumento lo que hace es que podamos usar todos los datos que se encuentran dentro de la clase desde metodos,para que estos no sean locales y invisibles ante otros métodos de la misma clase,asi definimos una función dentro de una clase(método):

def metodo(self):
Los métodos siguen teniendo todas las funciones de las funciones def,por ejemplo pasar mas argumentos o definiros desde el mismo:

def metodo(self,x,y, z = 1):

También las funciones return,print,etc(ver tutoriales de funciones)


Como bien dije,necesitamos saber el alcance de nuestros datos que están adentro de la clase,ya que existen datos locales para la clase,vistos para toda la clase:

class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 

También tenemos las variables locales de los metodos:


class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo
También las variable globales:

z = 0  # Variable global vista en todo el programa

class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo


Y por ultimo podemos pasar todas las variables,locales,locales de locales(metodos) o globales al uso de la función,con la palabra especial self

Por ejemplo un mal ejemplo:

#!/usr/bin/env python3

z = 0  # Variable global vista en todo el programa

class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo
         def llamada(self):
                print (y)

objeto = Miclase() # En un momento vemos que es esto
objeto.llamada() # Y esto

Ahora ejecutamos y como vemos da error en la linea 10 que es donde se llama a y:



Nota: si les da otro tipo de error es por la identacion(no hagan copy and paste) o arreglen la identacion.

Como vemos da un error de variable global,ya que python en el primer lugar que busca es en las variables globales, entonces esto se pudo haber resuelto definiendo y como global:

Asi:


#!/usr/bin/env python3


z = 0  # Variable global vista en todo el programa
y = 1 # Variable global
class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo
         def llamada(self):
                print (y)

objeto = Miclase() # En un momento vemos que es esto
objeto.llamada() # Y esto

O tambien python buscaria en las variables locales del metodo,asi que tambien podriamos solucionar ese error definiendo una variable local llama y:

Asi

#!/usr/bin/env python3

z = 0  # Variable global vista en todo el programa
class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo
         def llamada(self):
                y = 1 # Variable local

                print (y)

objeto = Miclase() # En un momento vemos que es esto
objeto.llamada() # Y esto

Y vean:


Pueden pensar que también podemos definir la variable como una local de clase:

#!/usr/bin/env python3

z = 0  # Variable global vista en todo el programa
class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         y = 1 # Local de clase
         def metodo(self):
               y = 2 # Variable local vista solo por este metodo
         def llamada(self):
                print (y)

objeto = Miclase() # En un momento vemos que es esto
objeto.llamada() # Y esto

Pero no :(

Porque python busca las variables en las funciones o en las variables,globales,para poder usar esa variable de clase local debemos usar la palabra especial self:


#!/usr/bin/env python3

z = 0  # Variable global vista en todo el programa
class Miclase(object):
         var = 1 # Variable local vista por toda la clase,
                      # pero no por todo el programa 
         y = 1 # Local de clase
         def metodo(self):
               y = 2 # Variable local vista solo por este método
         def llamada(self):
                print (self.y)

objeto = Miclase() # En un momento vemos que es esto
objeto.llamada() # Y esto

Y ahí esta la magia de self,bueno no y no es nada del otro mundo,poder usar esa variable con tan solo poner :

self.variable_de_clase
La magia esta en que podemos usar cualquier variable de la clase o metodo usando self,por ejemplo podemos definir una variable local de metodo y llamarlo,asi:

def metodo1(self);
      y = 1
      print (y)


Pero si en otro método queremos llamar esa variable,va a dar error de variable global:


#!/usr/bin/env python3

class Miclase(object):
    def metodo1(self):
        y = 1
        print (y)
    def metodo2(self):
        print (y) # Error :(

objeto = Miclase() # En un momento vemos que es esto 
objeto.metodo2() # Y esto


Como dije para eso usamos self,pero ahora desde la definición:

#!/usr/bin/env python3

class Miclase(object):
    def metodo1(self):
        self.y = 1 # Definimos una variable de rango self
        print (self.y)
    def metodo2(self):
        print (self.y) # Error aun

objeto = Miclase() # En un momento vemos que es esto 
objeto.metodo2() # Y esto

Las definicones de rango self,son variables locales de clase,por lo cual son visibles en toda la clase,siempre y cuando lleven self,en este caso sigue dando error,porque ?

Porque no hemos construido el objeto y aunque ya se definió la variable y en rango self,aun no la creamos si solo llamamos a metodo2:

Esto se puede arreglar de dos formas,llamando el metodo1 primero:

#!/usr/bin/env python3

class Miclase(object):
    def metodo1(self):
        self.y = 1 # Definimos una variable de rango self
        print (self.y)
    def metodo2(self):
        print (self.y) # Error aun

objeto = Miclase() # En un momento vemos que es esto 
objeto.metodo1() # Y esto
objeto.metodo2() # Y esto

Con esto python guarda en la memoria de la clase la variable de rango self y la podemos llamar desde otra:

Pero esto muchas veces es incomodo y algunas veces mala practica, así que lo que podemos hacer es construir(llamar),los dos metodos desde la misma clase con el metodo constructor __init__() el constructor __init__() ademas de que es el constructor del objeto,es el que le pasa los argumetos desde el script principal,ya que si creian que se pasaban los argumetos desde la clase:

class Miclase(argumeto1,argumeto2,etc):

Pues no,eso se usa para otra cosa que veremos mas adelante,desde __init__() se pasan los argumentos:

class Miclase(object):
         def __init__(self,argumento1,argumeto2):

Estos argumentos se los pasaremos a la hora de instanciar la clase,osea a la hora de crear el objeto:

objeto = Miclase()
 Y aquí justamente le pasamos los argumentos:

#!/usr/bin/env python3

class Miclase(object):
    def __init__(self,x,y):
        print ("%s %s!!!" %(x,y))

objeto = Miclase("Hola","Mundo")




Cabe mencionar que __init__() es el método principal de una clase,por la cual al instaciar no es necesario,llamarla así:

objeto = Miclase()

objeto.__init__()

Solo con usar


objeto = Miclase()

Usamos este método especial.

Asi que el ejemplo de arriba usando un constructor queda asi;

#!/usr/bin/env python3

class Miclase(object):
    def metodo1(self):
        self.y = 1 # Definimos una variable de rango self
        print (self.y)
    def metodo2(self):
        print (self.y) # Ya no hay Error
    def __init__(self): # Construimos la clase
        self.metodo1()
        self.metodo2()

objeto = Miclase() # Creamos el objeto


Aun así sigue teniendo el mismo problema,tiene que llamar los dos metodos para usar uno del otro :(

Si no queremos hacer esto,lo mejor es no usar clases y usar funciones.

En ocasiones,ya que podemos definir las variables como clase local o usar funciones anidadas,o mejor dicho metodos anidados:


#!/usr/bin/env python3

class Miclase(object):
    def metodo1(self):
        self.y = 1 # Definimos una variable de rango self
        return self.y # Devolvemos el valor para usarlo en el futuro
    def metodo2(self):
        print (self.metodo1()) # Llamos un metodo desde otro
       # Ya no hay Error

objeto = Miclase() # Creamos el objeto
objeto.metodo2() # Esta instancia llamara los dos métodos

O también con varibles de clase local como veíamos arriba o variables locales de tipo rango construcción


#!/usr/bin/env python3

class Miclase(object):
    def metodo2(self):
        print (self.metodo1) # Llamos un metodo desde otro
       # Ya no hay Error
   def __init__(self):
       self.y = 1 #Para esto son los constructores

objeto = Miclase() # Creamos el objeto y se llama al constructor
# Que crea la variable
objeto.metodo2() # Esta instancia llamara los dos métodos

pero no esto no demuestra el poder de las clases y de la OPP,ya que eso se puede hacer con funciones def, fácilmente,las clases son para crear objetos y así es como funcionan:

Supongamos que tenemos varias mascotas,las cuales requieren cuidados,limpiar sus gracias,darles de comer,etc lo que se nos ocurra,de ejemplo esas dos cosas,esas mascotas en python las podemos tratar como un objeto para administrarlas:

Ejemplo

Ese ejemplo es solo la idea pero podemos imaginar un poco:

Ejemplo

De momento es todo,luego podremos hacer algo mas interesante pero esa es la introducción.

Leer más...