Historias
Slashboxes
Comentarios
 

Login Barrapunto

Login

[ Crear nueva cuenta ]

SEEDHVB (12751)

SEEDHVB
  (email no mostrado públicam.)
http://www.vernis.com.ar/

Down Kill Up Publicidad

Bitácora de SEEDHVB (12751)

Domingo, 11 de Julio 2010

Recuperando el inicio con Grub.

02:25h.
Consultorio GNU/Linux
Recuperando el inicio con Grub. Supongamos que un día iniciamos la PC y al seleccionar Ubuntu, en lugar de eso nos aparece el prompt de grub:

grub:

Plan A:

Forma abreviada, que si funciona simplifica todo.

Lo primero es encontrar cual es la partición con Linux (Debian o Ubuntu):

grub> find /boot/grub/stage1 <ENTER>

Y grub responde:
(hd0,0)

O sea, que mi partición de Ubuntu es (hd0,0)

Y escribo:

grub> root (hd0,0) <ENTER>

Una vez que le dije a grub cual es mi partición con Ubuntu reinstalo grub en el MBR[1]:

[1] Master Boot Record: Registro Principal de Arranque.

grub> setup (hd0) <ENTER>

Y esto casi siempre es (hd0), porque generalmente se instala en el primer disco. Si alguien tiene otra configuración diferente, sabrá que hacer.

Aparecen una serie de mensajes, ver imagen, y reiniciamos el sistema:

grub> reboot <ENTER>

Si todo salio bien, al elegir Linux (Ubuntu/Debian) se iniciara el sistema operativo, sino pasamos al plan B.


Plan B

Bueno, lo primero que tenemos que hacer es setear la partición donde esta Linux, el directorio raíz.

La foma basica del comando es:

grub> root (hd0,0) <ENTER>

Si en el Plan A pudieron setear correctamente el directorio raíz, entonces puden avanzar al siguiente paso.

En el Plan A usamos la instrucción find para encontrar la partición de Linux, podemos volver a intentarlo, pero con otro archivo

grub> find /etc/fstab <ENTER>

Y grub responde:
(hd0,0)

O sea, que mi partición de Ubuntu es (hd0,0)

Y escribo:

grub> root (hd0,0) <ENTER>

Esto le dice a grub que nos vamos a parar en el primer disco rígido ("hd0") en su primera partición ("0").

Si esto falla estamos a tientas, y vamos a tener que empezar a pensar.

En general si Linux comparte sistema operativo se instala en la primera partición lógica de una partición extendida, esto es:

grub> root (hd0,4) <ENTER>

La primera partición lógica de una partición extendida de un disco rígido es normal es la quinta (5), pero ponemos 4 porque grub cuenta desde 0.

Ahora bien, el disco rígido es el primero ("hd0") y unico si solo tiene un disco rígido. Pero bien podría estar en el segundo disco rígido. Entonces el comando sería:

Primera partición lógica de una partición extendida (mi Debian):

grub> root (hd1,4) <ENTER>

ó bien, si Linux esta solo en la primera partición maestra:

grub> root (hd1,0) <ENTER>

Si se equivoca, no se preocupe, grub da un mensaje de error, y ahí uno se da cuenta que tiene que cambiar el disco rígido o la partición.

Una vez que grub acepto el comando y no da error, quiere decir que se apunto la partición raíz a un lugar valido, lo que no quiere decir correcto.

Para saber si se esta en el lugar correcto basta seguir adelante:

grub> kernel /boot/vm<TAB>

Ahí aparece la lista de kernels instalados, si no aparece nada, es porque se elegió mal la partición, pierdes el turno, vuelves a la sección anterior ;-)

Normalmente el kernel en uso es el que tiene la numeración mayor. La numeración se lee de izquierda a derecha.

Por ejemplo, en mi Debian tengo dos kernels:

/boot/vmlinuz-2.6.26-1-686 Más antiguo.
/boot/vmlinuz-2.6.26-2-686 Más moderno. Inicio con este.

La primera parte de la linea del kernel quedaría:

grub> kernel /boot/vmlinuz-2.6.26-2-686 ro

El "ro" que se agrega es de Readly Only, solo lectura.

Pero ahí no termina esta linea, hay que decirle a grub cual es el dispositivo linux que es root.

Si el disco es IDE se usa la raíz "hd" si es SATA o SCSI se usa "sd". Luego sigue una letra que es el número del disco, si el disco en grub es "0" en dev va a ser "a", si en grub es "1" en dev es "b" y así sucesivamente.

(hd0,0) es /dev/hda1 ó /dev/sda1
(hd0,4) es /dev/hda5 ó /dev/sda5
(hd1,0) es /dev/hdb1 ó /dev/sda1 ó /dev/sdb1
(hd1,4) es /dev/hdb5 ó /dev/sda5 ó /dev/sdb5

¿Porqué si es el segundo disco puede tener tantas combinaciones diferentes? El tema es que los dispositivos se nombran por el controlador. Entonces si se tiene un disco IDE y uno SATA los dos van a ser el primer dispositivo para ese controlador.

¿Porqué el segundo disco no puede ser el primer IDE? Si puede ser, pero generalmente no lo es?

En el caso de mi Debian, la linea quedaría así.

grub> kernel /boot/vmlinuz-2.6.26-2-686 ro root=/dev/sda5 <ENTER>

Porque el directorio raíz esta en la primera partición lógica del primer disco SATA. Y en este caso este disco no tiene particiones maestras. Si lo configure yo a mano, por eso esta raro.

Si se equivoca en el dev grub no avisa, cuando intente iniciar, sencillamente se va a detener todo y no va a continuar el inicio cuando linux intente encontrar la partición raíz.

Entonces no puede apagar la maquina así como así, tiene que usar las teclas mágicas:

1. Alt+PetSis+R esperas 5 segundos [1]
2. Alt+PetSis+E esperas 5 segundos
3. Alt+PetSis+I esperas 5 segundos
4. Alt+PetSis+S esperas 5 segundos
5. Alt+PetSis+U esperas 5 segundos
6. Alt+PetSis+B esperas 5 segundos

[1] Decir mentalmente: 1021, 1022, 1023, 1024, 1025.

Estas teclas son muy útiles en caso que un fallo de hardware ponga el sistema inestable.

De lo anterior no se entera hasta que se sigue adelante.

Tiene que decirle a grub el disco virtual de arranque para el kernel.

Bueno, lo configuramos de la siguiente forma:

grub> initrd /boot/initrd<TAB>

En mi Debian tengo los siguientes discos virtuales de arranque:
/boot/initrd.img-2.6.26-1-686 /boot/initrd.img-2.6.26-2-686
/boot/initrd.img-2.6.26-1-686.bak /boot/initrd.img-2.6.26-2-686.bak

Como se dará cuenta, se llaman casi igual que el kernel, y los que terminan en bak son backups, así que mi linea quedaría:

grub> initrd /boot/initrd.img-2.6.26-2-686 <ENTER>

Y por último nos falta decirle a grub, que le diga a linux que intente salir por las suyas [2]:

grub> boot <ENTER>

[2] Ese es el significado de boot, viene de boot strap (tiras/correas de las botas). Lo que a su vez viene de un dicho del lejano oeste de los EE.UU. donde si alguien se quedaba solo empantanado en el barro tenía que salir por las suyas tirando él mismo de las tiras de sus botas (boot straps).

Esto también puede fallar, y nos lleva al Plan C.

Plan C:

Super Grub Disk: http://www.supergrubdisk.org/
Recuperar GRUB: http://www.guia-ubuntu.org/index.php?title=Recuper ar_GRUB

Espero que esta entrada le sirva a alguien.

Comentarios y experiencias de vida con GRUB son bienvenidos.
Lunes, 06 de Octubre 2008

Haciendo crucigramas

06:32h.
Programación
El 3 de octubre Marga (Margarita Manterola) público un crucigrama hecho con Python [1].

[1] http://blogs.lug.fi.uba.ar/marga?title=cruzamiento &more=1&c=1&tb=1&pb=1

Hace algún tiempo yo había tenido la necesidad de hacer crucigramas por razones didácticas. Y busque alguna aplicación que me permitiera hacer los crucigramas en forma automática.

En aquel entonces, lo mejor que encontré fue ujpuzz [2]. Que aunque decía que entregaba una salida compatible con TeX, esta salida no era valida para mi versión de LaTeX. Sin embargo, escribí un pequeño script en Python que permitía utilizar los cruces de palabras generados por ujpuzz y usarlos para obtener una salida que si funcionara con mi LaTeX.

[2] http://www.gtoal.com/wordgames/gatekeeper/ujpuzz.c .

Hasta ahora no había publicado el código de este script, porque es feo. Pero dado que Marga público el código de su script [3,4], y pude hacer que este exporte fácilmente para mi propio script, decido publicar aquí tanto la pequeña modificación al script de Marga, como mi propio script, por sí le es de utilidad a alguien.

[3] http://blogs.lug.fi.uba.ar/marga/?p=183&more=1&c=1 &tb=1&pb=1#more183
[4] http://www.marga.com.ar/~marga/crucigrama.py

La siguiente función debe ser agregada al código del script de Marga, yo lo puse después de "imprimir_tablero", como verán es una modificación de esta función para guardar los cruces en un archivo en el disco.

Nota: ¿Alguien sabe donde puedo colgar archivos, y que no sea una molestía como RapidShare?

def exportar_a_LaTeX(tablero):
____posicion_maxima = 255
____lineas = []
____for linea in tablero:
________junto=''
________posicion = -1
________for letra in linea:
____________if letra!='*':
________________junto = junto + letra
____________else:
________________junto = junto + ' '
____________if letra!='*' and letra!=' ' and posicion<posicion_maxima:
________________posicio n_maxima = posicion
____________posicion+=1
________lineas. append(junto)
____fw=open('cruces.txt','w')
____ for linea in lineas:
________if not linea.isspace():
____________fw.write(linea[posic ion_maxima:]+u'\n')
____fw.close()

Mi script es:

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import sys
from Numeric import *

def EstaCercaDeUnaLetra(A,H,AM,HM,M):
____ECDUL=False
____## print 'A: ',A,'H: ',H,'AM: ',AM,'HM: ',HM,'M: ',M
____if A>0 and H>0 and M[A-1,H-1]==1:
________## print M[A-1,H-1]
________ECDUL=True
____elif H>0 and M[A,H-1]==1:
________## print M[A,H-1]
________ECDUL=True
____elif A<AM-1 and H>0 and M[A+1,H-1]==1:
________## print M[A+1,H-1]
________ECDUL=True
____elif A>0 and M[A-1,H]==1:
________## print M[A-1,H]
________ECDUL=True
____elif A<AM-1 and M[A+1,H]==1:
________ECDUL=True
____elif A>0 and H<HM-1 and M[A-1,H+1]==1:
________ECDUL=True
____elif H<HM-1 and M[A,H+1]==1:
________ECDUL=True
____elif A<AM-1 and H<HM-1 and M[A+1,H+1]==1:
________ECDUL=True
____return ECDUL

## Cargar Definiciones y Palabras
f=open(sys.argv[2], 'r')
Palabras=[]
Definiciones={}
CantidadPalabr as=0
for Linea in f.readlines():
____Linea=Linea.splitlines()[0]
_ ___Lugar=0
____Encontrado=0
____for Letra in Linea:
________if Letra==' ' and not Encontrado:
____________Encontrado=1
___________ _Palabras.append(Linea[0:Lugar])
____________Defi niciones[Linea[0:Lugar]]=Linea[Lugar+1:len(Linea)]
________Lugar+=1
____CantidadPalabras+=1
f.clo se
print 'Cantidad de Palabras: ',CantidadPalabras

## print Palabras
## print Definiciones

## Primera Pasada
f=open(sys.argv[1], 'r')
AnchoMaximo=0
AltoMaximo=0
PrimeroEspacio= True
for Linea in f.readlines():
____if PrimeroEspacio and Linea[0]!=' ':
________PrimeroEspacio=False
____LargoLinea=l en(Linea)-1
____if LargoLinea > AnchoMaximo:
________AnchoMaximo=LargoLinea
____ AltoMaximo+=1
f.close
if PrimeroEspacio:
____AnchoMaximo-=1
## AnchoMaximo+=1
print 'Ancho Maximo : ',AnchoMaximo
print 'Alto Maximo____: ',AltoMaximo
print 'Primero Espacio:',PrimeroEspacio

## Segunda Pasada
f=open(sys.argv[1], 'r')
Matriz=zeros((AnchoMaximo,AltoMaximo))
Alto =0
for Linea in f.readlines():
____## print Linea
____Ancho=0
____if PrimeroEspacio:
________Linea=Linea[1:len(Linea)- 1]
____for Letra in Linea:
________Matriz[Ancho,Alto]=Letra!=' '
________Ancho+=1
____Alto+=1
f.close

## print Matriz

## Preparar escritura
NuevoArchivo=sys.argv[1]+'.tex'
Archiv oSolucion=sys.argv[1]+'-sol.tex'
Espacio='|{}'
N egro='|*'
Terminacion='|.\n'
fw=open(NuevoArchiv o,'w')
fs=open(ArchivoSolucion,'w')
fw.write('\\ begin{Puzzle}{'+str(Ancho)+'}{'+str(Alto)+'}%\n')
fs.write('\\begin{Puzzle}{'+str(Ancho)+'}{'+str(A lto)+'}%\n')
fw.write('\Marco%\n')
fs.write('\Ma rco%\n')

## Tercera Pasada
f=open(sys.argv[1], 'r')
Alto=0
Numero=0
PalabrasHorizontales={}
P alabrasVerticales={}
PalabraColumna={}
NumeroCol umnas={}
Columnas=[]
Horizontales=[]
Verticales =[]
for Linea in f.readlines():
____Ancho=0
____Linea=Linea[0:len (Linea)-1]
____if len(Linea)<=AnchoMaximo:
________for i in range(len(Linea),AnchoMaximo+1):
____________Line a=Linea+' '
____if PrimeroEspacio:
________Linea=Linea[1:len(Linea)] +' '
____EsPalabraHorizontal=0
____EsPalabraVertica l=0
____for Letra in Linea:
________if Letra!=' ':
____________NumeroYa=0
____________if (Ancho>0 and Matriz[Ancho-1,Alto]==0 and Ancho<AnchoMaximo-1 and Matriz[Ancho+1,Alto]==1) or (Ancho==0 and Matriz[Ancho+1,Alto]==1):
________________## print 'H: ',Ancho,Alto,': ',Matriz[Ancho,Alto],': ',Matriz[Ancho-1,Alto],': ',Letra,': ' ,Linea
________________Numero+=1
_______________ _NumeroYa=1
________________EsPalabraHorizontal=1
________________PalabraHorizontal=''
__________ ______NumeroPalabraHorizontal=Numero
____________ if (Alto>0 and Matriz[Ancho,Alto-1]==0 and Alto<AltoMaximo-1 and Matriz[Ancho,Alto+1]==1) or (Alto==0 and Matriz[Ancho,Alto+1]==1):
________________if not NumeroYa:
____________________Numero+=1
________ ____________NumeroYa=1
________________NumeroColu mnas[Ancho]=Numero
________________Columnas.appen d(Ancho)
________________PalabraColumna[Ancho]=''
________________## print 'V: ',Ancho,Alto,': ',Matriz[Ancho,Alto],': ',Matriz[Ancho-1,Alto],': ',Letra,': ' ,Linea,Numero
____________if EsPalabraHorizontal:
________________PalabraHoriz ontal=PalabraHorizontal+Letra
____________if Ancho in Columnas:
________________PalabraColumna[Ancho]=P alabraColumna[Ancho]+Letra
____________## Escribir
____________LetraAEscribir='|'
________ ____if NumeroYa:
________________LetraAEscribir=LetraAEs cribir+'['+str(Numero)+']'+'[gf]'
____________if Letra!='-' and Letra!='_':
________________LetraAEscribir=LetraA Escribir+Letra
____________elif Letra=='-':
________________LetraAEscribir='\G{}| *\N{}'
____________elif Letra=='_':
________________LetraAEscribir='\E{}| *\N{}'
____________fw.write(LetraAEscribir)
____ ________fs.write(LetraAEscribir)
________else:
_ ___________if Ancho<AnchoMaximo:
________________## print EstaCercaDeUnaLetra(Ancho,Alto,AnchoMaximo,AltoMax imo,Matriz)
________________if EstaCercaDeUnaLetra(Ancho,Alto,AnchoMaximo,AltoMax imo,Matriz):
____________________fw.write(Negro)
________________else:
____________________fw.wri te(Espacio)
________________fs.write(Espacio)
__ __________if EsPalabraHorizontal:
________________PalabrasHori zontales[NumeroPalabraHorizontal]=PalabraHorizonta l
________________Horizontales.append(NumeroPalab raHorizontal)
________________## print PalabraHorizontal
________________EsPalabraHorizo ntal=0
____________if Ancho in Columnas:
________________PalabrasVerticales[Nume roColumnas[Ancho]]=PalabraColumna[Ancho]
________ ________Verticales.append(NumeroColumnas[Ancho])
________________del PalabraColumna[Ancho]
________________Columnas.re move(Ancho)
________Ancho+=1
____fw.write(Termin acion)
____fs.write(Terminacion)
____Alto+=1
f. close
## Guardar Ultimas Verticales

for Ancho in Columnas:
________PalabrasVerticales[NumeroColumn as[Ancho]]=PalabraColumna[Ancho]
________Vertical es.append(NumeroColumnas[Ancho])
fw.write('\\end{ Puzzle}%\n\n')
fs.write('\\end{Puzzle}%\n\n')
## print PalabrasHorizontales
## print PalabrasVerticales
## print Horizontales
## print Verticales

## Horizontales
fw.write('\\begin{PuzzleClues}{\\tex tbf{Horizontales: }}%\n')
fs.write('\\begin{PuzzleClues}{\\textbf{H orizontales: }}%\n')
## print "Horizontales: ",Horizontales
for i in Horizontales:
____## print "i:",i
____## print "i:",i
____fw.write('\\Clue{'+str(i)+'}{'+Palabra sHorizontales[i]+'}{'+Definiciones[PalabrasHorizon tales[i]]+'}%\n')
____fs.write('\\Clue{'+str(i)+' }{'+PalabrasHorizontales[i]+'}{'+Definiciones[Pala brasHorizontales[i]]+'}%\n')
fw.write('\\end{Puzz leClues}%\n')
fs.write('\\end{PuzzleClues}%\n')

## Verticales
Verticales.sort()
fw.write('\\begin{P uzzleClues}{\\textbf{Verticales: }}%\n')
fs.write('\\begin{PuzzleClues}{\\textbf{V erticales: }}%\n')
for i in Verticales:
____fw.write('\\Clue{'+str(i)+'}{'+Pa labrasVerticales[i]+'}{'+Definiciones[PalabrasVert icales[i]]+'}%\n')
____fs.write('\\Clue{'+str(i)+ '}{'+PalabrasVerticales[i]+'}{'+Definiciones[Palab rasVerticales[i]]+'}%\n')
fw.write('\\end{PuzzleC lues}%\n')
fs.write('\\end{PuzzleClues}%\n')

f w.close
fs.close

Además se necesita de una plantilla de LaTeX:

%
% basico.tex:
% basico (La)TeX
% Sergio Dami&#225;n Vernis (Octubre-2006)
% Versi&#243;n: v1.0
%
%%% * CLASE DE DOCUMENTO Y PAQUETES =================================
%%% ** General -------------------------------------------------- ----
%\documentclass[12pt,landscape]{article}____ % Habitual
\documentclass[11pt]{article}____ % Habitual
%\documentclass[a4paper,10pt]{scrartcl} % Usando el paquete
________________________________________ % koma-script: mejor
________________________________________ % preparado para
________________________________________ % documentos europeos.
\usepackage[english,spanish]{babel}
%% % ** Margenes de la p&#225;gina ----------------------------------------
%\usepac kage[top=0.95cm,bottom=0.95cm,left=2cm,right=2cm]{ geometry}
\usepackage[top=2cm,bottom=2cm,left=1.2 5cm,right=2.75cm]{geometry}
%%% ** Fuentes -------------------------------------------------- ----
\usepackage{lmodern}____________________ % Fuentes type1 basadas en
________________________________________ % CM que incluyen letras
________________________________________ % acentuadas: resuelve
________________________________________ % problemas en los pdf.
\usepackage[latin1]{inputenc}
\usepackage[T 1]{fontenc}
\usepackage{pifont}__________________ __ % Fuente para adornos
%%% ** Encabezados --------------------------------------------------
\usepackage{fancyhdr}
%%% ** Entornos verbatim --------------------------------------------
\use package{fancyvrb}
\usepackage{alltt}

%%% ** Bibliografia -------------------------------------------------
\usepackage[nottoc]{tocbibind}____________% No incluye TOC en TOC
\usepackage[longnamesfirst]{natbib}____ % Nombres largos primero
%%% ** Indices -------------------------------------------------- ----
%\usepackage{makeidx}____________________ % Indice de Materias
%%% ** Varios -------------------------------------------------- -----
\usepackage{longtable}____________________% Tablas Largas
\usepackage{color}________________________ % Color
\usepackage{texnames}____________________ % Procesado de nombres
________________________________________ % como BibTeX
%%% ** Salida pdf con hipervinculos ---------------------------------
%\usepackage{pd flscape}____________________% modo apaisado: mejor que
________________________________________ % lscape, en salidas pdf.
%\usepackage[pdftex]{graphicx, hyperref} % V&#237;nculos y gr&#225;ficos
___________________________________ _____ % en salida pdf.
\usepackage[pdftex,urlbordercolor=0 0 0,linkbordercolor=0 0 0,citebordercolor=0 0 0]{hyperref}
\usepackage[pdftex]{graphicx}
\usep ackage{epic}
\usepackage{rotating}
\usepackage{s oul} % \ul{texto subrayado equilibrado}
\usepackage{textcomp} % \textquotesingle ' Apostrofo sin inclinaci&#243;n
\usepackage{latexsym}
\usepacka ge{amsmath}
\usepackage{amssymb}

%%% * CONFIGURACIONES, ENTORNOS Y COMANDOS ==========================
%%% ** Configuracion del paquete hyperref ---------------------------
\hypersetup{
breaklinks = true,
colorlinks = false, % true,
pdftitle = {Crucigrama},
pdfauthor = {Sergio Dami&#225;n Vernis},
pdfsubject = {Palabras Cruzadas},
pdfkeywords = {Palabras Cruzadas},
pdfborder = 0 0 0,
pdfstartpage = 1}
%%% ** Macros para definir estructuras logicas ----------------------
\newcommand{\Code}[1]{{\sm all\texttt{#1}}}________ % Codigo `inline'.
\newcommand{\SCode}[1]{{\footnotesize\t exttt{#1}}} % Codigo `inline'
________________________________________ ____________% peque&#241;o.
\newcommand{\Prog}[1]{{\upshape\tex tsf{#1}}}________% Nombres de
______________________________________________ ______% programas.
______________________________________ ______________% y paquetes.
\DefineVerbatimEnvironment%____________ ____________ % Bloques de codigo.
{CodeBlock}{Verbatim}
{fontsize=\small}
\DefineVerbatimEnvironment%____ ____________________ % Bloques de codigo
{SCodeBlock}{Verbatim}____________________________ % pequeno.
{fontsize=\footnotesize}
\newenvironment{CodeEx}{ %________________________ % Bloques de codigo.
\begin{alltt}\small}{\end{alltt}}________ ________ % con instrucciones
___________________________________ _________________% procesables.
\newcommand{\Email}[1]{%
\href{mail to:#1?Subject=[basico]}{email: \texttt{#1}}}
\newenvironment{License}{\begin{quo tation}\sffamily}{\end{quotation}}
%%% ** Abreviaturas -------------------------------------------------
\definecolor{Mygrey}{gray}{0.50}
\newcommand{\Tu x}[1]{{\Code{\textcolor{Mygrey}{#1}}}}
\newcomman d{\SVerb}{\small\verb}
\newcommand{\BS}{\textback slash}

% Definiciones
% Puntuaci&#243;n en bibliograf&#237;a
\bibpunct[:]{\char40}{\char41}{ ,}{}{;}
% Relajaci&#243;n de reglas de composici&#243;n
\sloppy
% Desactivar ~ para la &#209;=~N
\deactivatetilden
% Espaciado tipo Espa&#241;ol - Frances
%\frenchspacing

% Crucigramas
%\usepackage[numbered,nocenter,small] {cwpuzzle}
\usepackage[numbered,small]{cwpuzzle}
% El tama&#241;o tambi&#233;n esta influenciado por el tama&#241;o de la letra en
% \documentclass[10pt]{article}

%%% * CUERPO DEL DOCUMENTO ==========================================
%%% ** -------------------------------------------------- ----
\begin{document}
\pagestyle{empty}
% Comun
\newcommand{\Marco}{}
\definecolor{griscla ro}{gray}{.9} % Color Cuadrado Negro
\definecolor{gray}{gray}{1} % Color primer Cuadrado de Palabras. 1=Blanco, 0=Gris
\newcommand{\N}{\renewcommand{\PuzzleBlack Box}{\textcolor{grisclaro}{\rule{\PuzzleUnitlength }{\PuzzleUnitlength}}}}
\newcommand{\E}{\renewcom mand{\PuzzleBlackBox}{\raisebox{-3ex}{\textvisible space{}}}}
\newcommand{\G}{\renewcommand{\PuzzleB lackBox}{--}}
\N{}
\PuzzleDefineColorCell{g}{gra y}
% Diferenciado
% ************ Solucion *************
% \PuzzleSolution
% ************ Solucion *************
\xdef\CrucigramaNormal{normal} % Crucigrama Normal
\makeatletter \ifx\Puzzle@TYPE\CrucigramaNormal \makeatother
\include{cruces.txt}
\else
\include{cruces.txt-sol}
\fi
\end{document}

También es necesario tener instalado el paquete cwpuzzle de LaTeX en su última versión. La que viene con Debian Lenny aún esta desactualizada.

Mi script recibe como parámetros dos archivos, uno con los cruces de palabras y otro con las palabras y las definiciones.

Los cruces de palabras es la salida del script de Marga hecho por mi función exportar_a_LaTeX.

El archivo de palabras y definiciones debe tener las palabras en mayúsculas, una por línea, cada una seguida por la definición, y separadas de las palabras por solo un espacio:

RECONSTRUCTIVA Relativa a la reconstrucción.
SUPERIORA Mujer que dirige una congregación religiosa.
DESAHUCIO Acción y efecto de deshauciar.
REFUGIADOS Hombres que se han encontrado refugio en otro país.
EDUCACION Formación acadámica de las personas.
COMIQUEA Representa comedias caseras.
MORDISQUEAR Morder de manera repetida pero con poca fuerza.
ADULTERIOS Infidelidades, deslealtades.
ESQUILAMOS Sacamos la lana de las ovejas.
EUFONIA Efecto acústico agradable, producido por una buena combinación de sílabas.
ESCUALIDOS Que está muy flaco.
SARDONICE Originario de Cerdeña.
HIPOTENUSA Lado opuesto al ángulo recto en un triángulo rectángulo.
SEUDONIMA Escritora que oculta su nombre verdadero con uno falso.
ESCUALIDO Extremadamente pobre.
QUEJILLOSAS Mujer que se queja demasiado.
HUMILLADERO Lugar devoto, marcado con una imagen o cruz, a la entrada de los pueblos o junto a los caminos.
FEUDALISMOS Sistemas de gobierno basados en un señor feudal y sus vasallos.
ESTUDIALO Aprendelo, entendelo, memorizalo.
GUIONAJE Oficio del guía que conduce y enseña el camino.
EUFORIAS Estados de alegría y optimismo.

El script de Marga toma las palabras de un archivo llamado 5vocales.txt que debe contener las palabras, una por línea, en mayúsculas.

Las palabras del crucigrama deben estar en mayúsculas y sin acentos.

Saludos.

Sergio.

Actualización: Se agregaron los links a la entrada del blog de Marga donde incluyó un link al código, y a varios textos interesantes sobre crucigramas. Así como, el link directo al código para los crucigramas.
Viernes, 05 de Septiembre 2008

OOo2JPG: El Camino de OpenOffice a JPG y la Imprenta

12:34h.
OpenOffice.org
En el blog de Muammar [1] comenta sus desventuras al intentar exportar un archivo de OpenOffice a JPG, para llevar a la imprenta [2].

[1] http://muammar.me/blog/

[2] http://muammar.me/blog/index.php?url=archives/267- Mal-dia.html

Debido a que la solución al problema no es obvia, he decidido ponerla aquí, con la esperanza de que sirva a alguien.

Si alguien prueba esta solución y funciona, tan bien en la realidad, como en el ambiente virtual de una PC con Debian, le agradecería me lo hiciera saber.

Y la solución consiste en exportar la página como PDF con el botón de la barra de herramientas.

Luego se abre el PDF con El Gimp. Y se abre un cuadro de dialogo de importación en el que se deben completar los siguientes campos:

Resolución: 300 (o la que te pidan en la imprenta).

Anchura: el ancho del papel, en milímetros, en el caso de Muammar eran 800mm.

Altura: el alto o largo del papel, en milímetros, en el caso de Muammar eran 1200mm.

Una vez abierto se vuelve a guardar como JPG, y listo, no es necesario nada más.

Nota: Al exportar ajusten la calidad en 100, para que no haya perdidas.
Gracias Inconexo (http://barrapunto.com/~Inconexo/) por tu comentario.

Para comprobar los resultados, hay que cerrar el archivo actual, y abrir el JPG, y podrá verse que los datos son los correctos en:

Barra de Herramientas de la imagen en El GIMP -> Ver -> "Ventana de Información".

Otra alternativa aportada por Ed Hunter (http://barrapunto.com/~Ed+Hunter/) es usar Ghostscript:

El comando para el ejemplo presentado aquí sería así:

gs -sDEVICE=jpeg -r300x300 -dNOPAUSE -sOutputFile=fichero.jpg test.pdf

Sin embargo, en este caso, desconosco la compresión que usa gs por defecto, y la calidad con la que guarda la imagen.

Parece que OpenOffice tiene problemas al exportar un documento completo como imagen directamente.

Saludos.

SEEDHVB.

PD: Varios comentarios critican el formato JPG para llevar a la imprenta. El problema es que ese es el formato que le han pedido a Muammar. Él es de Venezuela, y no sé como serán las imprentas por allí.

Por aquí, por Argentina, no estamos mucho mejor, el uso de programas propietarios sin el pago de las licencias de uso es algo más que habitual. Y los dueños y empleados de las "imprentas" exigen con el mayor descaro que le lleven los archivos hechos con Adobe Ilustrator, Quarck Express, Corel Draw o Macromedia FreeHand. Y siempre con problemas de que "Si lo hicistes en el Windows, pero como yo tengo Mac se ve diferente" y cosas por el estilo que me comenta una Diseñadora Gráfica amiga.

Y si uno lleva un PDF 1.4 estándar, la imprenta se queja, de que no es el PDF que ellos usan y bla bla bla.

Por eso en muchos lugares piden las cosas a imprimir con formatos de imagen que ellos suponen estándares, EMHO sería mejor usar PNG. Pero habría que ver si los programas comerciales, como el Adobe Photoshop, respetan los estándares.

Por otro lado, el problema de Muammar no se solucionaba usando Scribus, probé hacer lo mismo con ese programa, y obtuve los mismos resultados. Problemas en la relación entre los píxeles horizontales y verticales. Que se producen por mezclar medidas computacionales, el sistema métrico decimal y las medidas imperiales anglosajonas.

Entiendo que los profesionales usen un programa del nivel de Scribus, pero si a un estudiante, para preparar su tesis le sirve el OpenOffice, no veo inconveniente en usarlo. De hecho, se ahorra en aprender una nueva herramienta desde cero, con los problemas que eso conlleva.

Y OpenOffice tiene más formatos de exportación que Scribus, y hasta donde yo vi, los dos son igual de habilidosos y tienen los mismos problemas al exportar a JPG directamente.


PD2: Para mi sorpresa, me encuentro con que Muammar a publicado un post en el cual justifica su posición para usar Software Libre y Software Propietario [3].

[3] http://muammar.me/blog/index.php?/archives/269-Lim itaciones.-Cosas-de-la-vida,-no.html

Lo raro de esto, es que no lo dice un bloguero perdido en la red, lo dice alguien que figura en Debian Planet en Español[4].

[4] http://planeta.debian.net/

Y para colmo, ha bloqueado los comentarios a esa entrada.

Es obvio que esta actitud esta relacionada con mis comentarios a una entrada suya anterior [2]. Hay gente que no soporta la crítica con argumentos.

PD3: Muammar a respondido en su blog que la no activación de los comentarios fue un error involuntario. Y me ha dado la posibilidad de contestar.

Le contestado en la misma entrada en la que he venido contestando [2].
Martes, 23 de Octubre 2007

¿Por que falla el psicoanálisis? - Gerardo Primero

04:55h.
Ciencia
¿Qué es el psicoanálisis?

Por: Gerardo Primero.

Según Freud, el psicoanálisis es:

1. Un método de investigación.
2. Una forma de tratamiento.
3. Una teoría.

El método de investigación consiste en la asociación libre y la interpretación, aplicados a fenómenos como los olvidos, fallidos, sueños y síntomas. La persona debe decir todo lo que se le ocurra, y la interpretación del analista intenta descubrir un significado oculto que habría sido la causa de ese fenómeno.
La forma de tratamiento consiste en aplicar el método interpretativo para descubrir los motivos inconscientes, en base al supuesto de que la interpretación correcta tiene efectos benéficos sobre el paciente.
La teoría está compuesta por diversos conceptos e hipótesis. El principal es el concepto de "inconsciente freudiano" y el mecanismo de represión y retorno de lo reprimido: es la hipótesis de que ciertos pensamientos son expulsados de la conciencia (represión), y pasan al inconsciente, pero siguen produciendo efectos en forma simbólica (retorno de lo reprimido) en fenómenos como los sueños, fallidos y síntomas. Se postula que el método interpretativo recorre el camino inverso (del retorno simbólico al motivo inconsciente que lo causó). Otros conceptos psicoanalíticos son el complejo de edipo, la envidia del pene, las fases de la sexualidad (oral, anal, fálica y genital), las instancias psíquicas (yo ello y superyó), las pulsiones.

Fallas en el método interpretativo

1. El problema de no considerar las hipótesis rivales. El analista no suele percibir los conceptos freudianos como conjeturas sino como hechos innegables, pero en realidad son hipótesis, y es necesario comparar sus méritos con los de las hipótesis rivales. La evidencia apoya una hipótesis sólo si permite eliminar las hipótesis rivales que tengan igual o mayor plausibilidad (Grünbaum).

2. Crear significados no es descubrir causas. Wittgenstein propone el siguiente contraejemplo: si tiro objetos sobre la mesa y hago asociaciones, también voy a encontrar interpretaciones coherentes, pero no serán las causas de la ubicación de cada objeto. Descubrir causas requiere un testeo en donde se manipulen sistemáticamente los eventos. El método interpretativo no hace tal manipulación sino que genera significados nuevos y los supone causales. La interpretación se basa en relaciones semánticas o fonéticas, y es tan versátil que permite encontrar siempre casos confirmatorios.

3. El problema del sesgo confirmatorio. Se tiende a prestar más atención a los datos favorables a las propias creencias, y a ignorar los datos contrarios. El analista descarta las asociaciones contrarias a su teoría como "resistencias", e induce asociaciones consistentes con su teoría mediante preguntas tendenciosas. Gracias al sesgo confirmatorio, cada autor confirma sus propios prejuicios teóricos: la sexualidad y la muerte en Freud, los anhelos de espiritualidad en Jung, las fantasías de pechos y penes en Melanie Klein, los juegos de palabras en Lacan.

4. El problema de la sugestión. La sugestión es la influencia del analista sobre el paciente, mediante preguntas tendenciosas y gestos de aprobación o desaprobación. ¿Cómo sabemos si el analista hace interpretaciones correctas o si sólo persuade exitosamente a su paciente con interpretaciones erróneas? Aún si el paciente se convence, la interpretación puede ser incorrecta, y aún siendo incorrecta, puede tener efectos. Dado que los estudios de caso no controlan este problema, el psicoanálisis aún no ha demostrado ser más que una sugestión.

Fallas en la teoría

1. Problema de la pretensión de verdad en ausencia de evidencia. Las revisiones de estudios (Eysenck, Erwin, Rachman y Wilson, Van Rillaer, Holmes) muestran que no hay evidencias a favor de ninguna de las hipótesis específicamente freudianas. Hay teorías psicoanalíticas más recientes, pero tampoco hay evidencia a favor de ellas.

2. Inconsciente freudiano y represión. No hay evidencia a favor de estos conceptos, fundamentales para la teoría psicoanalítica. Sí hay evidencia de conductas que la persona no detecta y de causas que la persona ignora. La autoobservación tiene límites, y usualmente se desconocen los factores que controlan la conducta. El concepto de inconsciente que recibe apoyo empírico no es el freudiano, sino el que corresponde a otras teorías no psicoanalíticas.

3. Complejo de Edipo, y conceptos relacionados, como la sexualidad, la muerte, la castración y la envidia del pene. En principio, Freud definió al Complejo de Edipo como el deseo sexual hacia el progenitor del sexo opuesto, y el deseo de muerte del progenitor del mismo sexo (percibido como un rival). Su período central ocurriría entre los 3 y 5 años. Freud lo consideraba universal, y en base a este concepto intentaba explicar el origen de la moral, las neurosis y las características de género, entre otras cosas.

a) Ausencia de evidencia:
Para formular la tesis del Edipo, Freud no observó a los niños, sino que especuló a partir de los recuerdos de los pacientes adultos, cuando una metodología de observación directa es preferible a la especulación en base a recuerdos. La evidencia de la psicología infantil muestra que pueden existir diversos grados de afecto y rivalidad, pero normalmente no existen ni deseos sexuales ni deseos de muerte. El aprendizaje moral es un proceso de socialización gradual que no sólo incluye a los padres sino también a los pares y a la comunidad. La socialización de género proviene del trato diferente que se asigna a niños y niñas, que promueve ciertas conductas esperadas según el sexo. Las tesis freudianas de la inferioridad moral de la mujer y de la envidia del pene no son más que el reflejo de la ideología sexista de su época.

b) Falacia de ambigüedad:
Las hipótesis tienen una doble existencia, hay un sentido literal para hacer afirmaciones rotundas y llamativas, y un sentido amplio y metafórico que evita la refutación. El complejo de Edipo en sentido literal es un deseo incestuoso y un deseo de muerte, mientras que en sentido amplio es un conjunto de conceptos, tales como amor, odio, celos y rivalidad, que permiten describir cualquier relación humana, o también se lo define como una estructura triangular entre el niño, el objeto de deseo y el portador de la ley. El falo designa al pene, o a todo aquello que se desea (por eso, cualquier deseo puede confirmar la amenaza de castración o la envidia del pene). La homosexualidad es el deseo sexual en sentido estricto, o cualquier relación amistosa entre individuos del mismo sexo. Siempre puede decirse que "el psicoanálisis es otra cosa".

c) Apelación a lo latente:
Es la estrategia de considerar que si un hecho parece contradecir la teoría, en realidad "encubre" otro hecho más profundo que la apoya. Freud interpreta las pesadillas donde muere un ser querido (aparentemente contrarias a su teoría) como la satisfacción de un deseo inconsciente de que esa persona fallezca, o como un autocastigo por otro deseo inconsciente. Cuando Juanito muestra afecto al padre y hostilidad a la madre, Freud interpreta su afecto al padre como formación reactiva a la hostilidad inconsciente, y la hostilidad a la madre como defensa para ocultar su deseo sexual. Cuando un niño sueña con la muerte de su padre, Freud interpreta un deseo de muerte, y cuando sueña con la muerte de la madre interpreta un autocastigo por desear la muerte del padre. Si bien la teoría puede ser falsable en principio, en la práctica es infalsable debido a este mecanismo.

d) Pseudoexplicaciones:
El analista pretende explicar una conducta dándole un nuevo nombre. Por ejemplo, no hay otra evidencia de un superyó débil o fuerte que sus mismos efectos. En una explicación científica, en cambio, se relacionan dos o más observaciones independientes. Las instancias psíquicas (yo, ello, superyó) y el Edipo en su sentido amplio son sólo metáforas, no se trata de teorías explicativas sino de formas de describir, pero su apariencia lleva a no investigar las causas reales.

4. Fallas en la justificación del tratamiento

1. Problemas de la observación clínica (Grünbaum). La observación clínica no constituye evidencia probatoria, porque no permite eliminar las hipótesis rivales. Un caso confirmatorio no es una evidencia: un curandero también podría mencionar muchas experiencias confirmatorias, pero esas experiencias podrían ser explicadas mediante hipótesis rivales. Lo mismo ocurre con las experiencias confirmatorias que encuentra un analista. ¿Cómo sabemos si el tratamiento es mejor o peor que su ausencia, o que un tratamiento alternativo? Sabemos que las mejorías pueden explicarse por el paso del tiempo, por el efecto placebo, o por factores inespecíficos como la empatía o la atención. ¿Cómo sabemos que, si hay alguna mejoría, es a causa del tratamiento, y no debido al mero paso del tiempo, o al efecto placebo? ¿Cómo sabemos si la mejoría es temporaria o duradera? ¿Cómo sabemos si la evaluación de la mejoría es correcta o está sesgada? No hay estudios rigurosos de porcentajes de éxitos y fracasos del psicoanálisis, en relación a tratamientos alternativos y a la ausencia de tratamiento.

2. Los resultados de Freud no apoyan la eficacia. Cuando existen datos posteriores, esos datos indican que los pacientes conservaron sus síntomas (Emmy von N, Dora, hombre de los Lobos).

3. Apelación a la resistencia. Es un subtipo de falacia ad hominem. Si el paciente no acepta la interpretación, el analista lo considera una resistencia, y a menudo le asigna valor confirmatorio. Los analistas utilizan la misma estrategia para desechar las críticas, acusando a la exigencia de evidencia controlada (pensamiento crítico) como "la forma moderna de la resistencia". En "Resistencias al Psicoanálisis" (1925) Freud desestima las objeciones al considerarlas causadas por una hostilidad latente hacia el psicoanálisis.

4. El problema de las remisiones espontáneas: Eysenck calculó que 2/3 de pacientes tienen mejoría espontánea después de 2 años. En cálculos posteriores, se considera que esa proporción puede variar según el tipo de trastorno y la presencia de factores no específicos (ayuda por parte de un médico, profesor, cura, etc.). Este problema es aún más grave considerando la extensa duración de los tratamientos psicoanalíticos.

5. Desinterés por los resultados. Los analistas suelen desestimar la remoción del síntoma en busca de un supuesto cambio profundo, pero no hay evidencia de que logren ni una cosa ni la otra. Los tratamientos son largos y costosos, y no hay razones para considerarlos preferibles a otros tratamientos que sí poseen evidencia de resultados.

6. Sesgo confirmatorio en la evaluación de resultados: el analista tiende a considerar que si el paciente mejora es gracias a la teoría, y si no mejora es por sus resistencias. Cuando Freud (en 1937) enumera posibles explicaciones de los fracasos, sólo toma en cuenta variables del paciente (necesidad de castigo, fuerza de los traumas, fijación libidinal), y en ningún momento evalúa la posibilidad de fallas en el tratamiento. La hipótesis rival obvia, que el psicoanálisis no ha eliminado, es que los fracasos se deben a rasgos del tratamiento (la dependencia respecto al analista, las fallas del método interpretativo), y que las mejorías pueden explicarse por factores ajenos al tratamiento (remisión espontánea, efecto placebo, factores inespecíficos). En esos casos de mejoría, el paciente y el analista pueden caer en la falacia cum hoc, que consiste en atribuir las mejorías al tratamiento, sólo porque ocurren en forma simultánea.

5) ¿Por qué, a pesar de esas fallas, tiene tanta difusión?

En la Argentina, muchos consideran sinónimos los términos "psicoanalista" y "psicólogo". Aún hoy, la Universidad de Buenos Aires es hegemónicamente psicoanalítica. En EEUU, un 40% de terapeutas sigue utilizando la interpretación de sueños.

1. Desconocimiento de hipótesis rivales. El psicoanálisis se sostiene gracias a la falta de información del público respecto a la psicología científica. En la Universidad de Buenos Aires, se escatima la formación en otras teorías rivales.

2. Divulgación atractiva. Los estudios de caso pueden leerse como una búsqueda detectivesca para develar las profundidades de la mente. Del mismo modo que ocurre en otras pseudociencias, un testimonio anecdótico suele ser más persuasivo que un estudio estadístico. La fascinación por revelar sentidos ocultos es uno de los rasgos que comparte con muchas otras prácticas interpretativas (astrología, oniromancia, lectura de la borra del té).

3. Culto a la persona (Freud, Lacan). Ocurre cuando la adhesión se basa más en la confianza en el proponente que en la evaluación de los méritos de la tesis. Un fenómeno llamativo es la aceptación de una tesis antes de su comprensión (como suele ocurrir con frases de Lacan que no tienen interpretación consensuada, como la de que "el inconsciente se estructura como un lenguaje"). El culto a la persona se manifiesta en falacias de autoridad, y se refuerza por ciertos mitos históricos (el mito del precursor original y el mito del mártir de la verdad).

4. El mismo sistema de creencias contiene falacias que logran inmunizarlo de las críticas. Ya vimos algunos ejemplos: apelación a lo latente, apelación a las resistencias, falacias de ambigüedad, falacias de autoridad. Otros casos son las falacias ad hominem ("para criticar hay haberse analizado", "exigir evidencia es ser positivista"), falacias non sequitur ("la hostilidad de tanta gente demuestra que es cierto", "la duración del tratamiento demuestra que es más profundo"), la reversión de la carga de la prueba ("son los críticos los que deben demostrar la falsedad de la teoría y la ineficacia del tratamiento").

5. En resumen, en el psicoanálisis lo valioso no es nuevo y lo nuevo no es valioso. Lo propiamente psicoanalítico carece de valor científico. Si la razón es, como dice Russell, el intento de averiguar la verdad en lugar del intento de probar que lo que deseamos es cierto, entonces las fallas del psicoanálisis son ejemplos de fallas en la racionalidad. Esta es una cuestión incluso más básica que la cuestión de la cientificidad: ¿hay buenas razones para adoptar el psicoanálisis como método de investigación, como tratamiento o como teoría?

Gerardo Primero.
http://ansiedadyvinculos.com.ar/
Fuente: http://machinasapiens.blogspot.com/2007/10/por-que -falla-el-psicoanlisis-gerardo.html

La teoría freudiana esta muerta:
http://socrates.berkeley.edu/~kihlstrm/freuddead.h tm

ALGUNAS CRITICAS AL PSICOANÁLISIS:
http://ansiedadyvinculos.com.ar/psicoanalisis.htm

Nota: Este blog pertenece al Psicólogo Cognitivo-Comportamental Sergio Vernis.
Jueves, 04 de Octubre 2007

Instalando el controlador nVidia para amd64

12:16h.
X Window
Instalando el controlador nVidia para amd64

ADVERTENCIA:

En principio debo aclarar que este workarround es únicamente necesario para personas que:

1.- Tengan un procesador AMD 64 con al menos dos núcleos y que,

2.- No hayan podido instalar los controladores para las tarjetas gráficas de nVidia de ultima generación.-

Si tiene un procesador de AMD 64 de un solo núcleo, lo recomendable es usar un kernel 32 bits, con los que el controlador de nVidia no tiene problemas [1].

[1] http://www.nvnews.net/vbulletin/showthread.php?t=7 7079

Procedimiento:

El siguiente procedimiento fue realizado con éxito en un Debian GNU/Linux 4.0 (Etch).

Kernel: linux-image-2.6.18-5-amd64

Para instalar este kernel:

# apt-get install linux-image-2.6.18-5-amd64 linux-image-amd64 linux-image-2.6-amd64 linux-headers-2.6.18-5-amd64
Es necesario preparar el kernel para compilar los módulos, para ello:

# apt-get install module-assistant
 
# m-a prepare
Lo segundo que debe hacer es conseguir las dos versiones de los controladores de nVidia:

amd64: NVIDIA-Linux-x86_64-100.14.19-pkg2.run

http://www.nvidia.com/object/linux_display_amd64_1 00.14.19.html

x86: NVIDIA-Linux-x86-100.14.19-pkg1.run

http://www.nvidia.com/object/linux_display_ia32_10 0.14.19.html

Copian estos dos archivos en un directorio al que solo tenga acceso el usuario root, por ejemplo, /root/nVidia.

Luego extraen los archivos de la siguiente manera

~/nVidia# ./NVIDIA-Linux-x86_64-100.14.19-pkg2.run -x
 
~/nVidia# ./NVIDIA-Linux-x86-100.14.19-pkg1.run -x
Esto crea dos subdirectorios en el directorio nVidia, en este ejemplo, que contienen los archivos de los controladores y el modulo listos para instalar.

Luego nos movemos al directorio /sbin, que es un directorio de ejecución exclusiva del usuario root.

~/nVidia# cd /sbin/
Y creamos el siguiente archivo

/sbin# vim nvidia.sh
Y copiamos y pegamos lo siguiente:

#!/bin/dash
 
# Primero nos aseguramos de detener el servidor X
/etc/init.d/gdm stop > /dev/null 2>&1
 
# Nos pasamos al primer directorio, el de los controladores de 32 bits.
cd /root/nVidia/NVIDIA-Linux-x86-100.14.19-pkg1
 
# Indicamos al instalador que instale todo, excepto el modulo del kernel
./nvidia-installer --no-kernel-module -qaNs > /dev/null 2>&1
 
# Cambiamos al directorio de los controladores de 64 bits
cd /root/nVidia/NVIDIA-Linux-x86_64-100.14.19-pkg2
   
  # Indicamos al instalador que solo instale el modulo del Kernel
./nvidia-installer -KqaNs > /dev/null 2>&1
 
# Levantamos el modulo del Kernel en memoria
modprobe nvidia
 
# Iniciamos el Servidor X
/etc/init.d/gdm start > /dev/null 2>&1
 
# Disfrutamos de nuestros dos procesadores y de la aceleracion de video 3D
Para más información sobre las opciones de los controladores nVidia:

~/nVidia# ./NVIDIA-Linux-x86-100.14.19-pkg1.run -A
Y desde una consola de texto ejecutan el script:

# /sbin/nvidia.sh
Y si aún no configuraron el servidor X (/etc/X11/xorg) manualmente, ejecutan

# nvidia-xconfig
La primera vez que hagan esto, deberán reiniciar las Xs, porque estaban las configuraciones viejas. Para ello, desde una consola de texto:
 

# /etc/init.d/gdm restart
Obviamente, también pueden configurar las Xs manualmente antes de correr nvidia.sh por primera vez. Pero si ya saben hacer eso, no necesito explicarlo :-)

Es probable que con esto sea suficiente, pero tal vez no.

En caso que al reiniciar sus maquinas vean que ya no funcionan la X, entonces deben agregar una linea a sus archivos /etc/crontab:

# vi /etc/crontab
La linea es la siguiente:

@reboot root /sbin/nvidia.sh
Esto inicia el script de configuración del controlador de nVidia cada vez que reinician la maquina, esto agrega alrededor de 1 minuto más al inicio de la maquina, pero es la única forma en que me funcionan los controladores.

Recuerden que luego de la ultima linea de crontab debe haber al menos una linea en blanco. O por lo menos así era hasta hace un tiempo atrás.

También deben quitar a gdm, kdm o xdm del inicio, para acelerar el proceso y evitar efectos indeseables. Un efecto indeseable, es que la ventana gráfica puede quedar en Ctrl+Alt+F8 en lugar de Ctrl+Alt+F7.

Para quitar gdm del inicio automático, por ejemplo, hacemos:

# update-rc.d -f gdm remove
En caso que nos arrepintamos de haber quitado gdm del inicio, hacemos:

# update-rc.d -f gdm defaults
Espero que esta receta les sea de utilidad.

Saludos cordiales

Sergio
Psicólogo Cognitivo-Comportamental
Viernes, 18 de Agosto 2006

Manejo de espacios en scripts de Bash

03:29h.
Tecnología
Esta entrada es breve, hace un tiempo que vengo lideando con los espacios en los nombres de archivo y directorio.

La mejor solución que encontre es

#! /bin/bash
IFS=$'\n'
for cadauno in $(ls -1)
do
echo $cadauno
done

Otras soluciones pueden encontrarse en:

handling_filenames_with_spaces_in_bash

La que yo uso la saque de:

linuxquestions


ACTUALIZACIÓN: Hoy mismo a la noche

Bien, LPR nos da una solución mejor y más simple a este problema:

No sé qué tienen de malo las comillas dobles

for cadauno in *; do echo "$cadauno"; done
--
Sólo poniéndolo todo al revés conseguiremos ponernos de pie.
Muchas gracias LPR.
Miércoles, 19 de Abril 2006

¿Existe SL para la Administración de Consorcios?

01:20h.
Consultorio GNU/Linux
Bueno, mi primera pregunta a Pregunta a /. no solo no ha sido publicada, sino que en una nota de tapa donde pude hacer referencia a la misma, no ha recibido respuesta.

Así que he decidido insistir en mi bitácora, haciendo referencia a todos los posts anteriores. Y también al único comentario.

Este es el envío original que hice para Pregunta a /. y que aparece nombrado en esta noticia:

Quisiera saber si alguien conoce algún Software Libre y/u Open Source, preferentemente en LAMP (Linux, Apache, MySQL, PHP), para la administración de consorcios (Condo, Condominium en inglés).

Mi padre es un maestro mayor de obras próximo a jubilarse y como con la jubilación (pensión) seguramente no le alcanzara para vivir normalmente, esta pensando en montarse su propio microemprendimiento de administración de consorcios. Él ya se ha apuntado en un curso para aprender al menos lo básico e indispensable: requisitos, leyes, disposiciones, etc. Y me preguntó si existía algún programa que le pudiera ser de utilidad para automatizar alguna de esas tareas, y que le permitan llevar un seguimiento del negocio (sueldos, proveedores, etc.).

Como todo lo relacionado a la administración varía mucho de país en país, nosotros estamos en Argentina, se me ocurrió que lo mejor era un software libre que me permita adaptarlo.

He investigado bastante, y por el momento solo he encontrado software propietario, aunque mucho del cual se entrega como Freeware, como el WinMaster, y en general son para Windows. Supongo que se les puede pedir personalización a los creadores de ese soft, pero mi padre no puede darse el lujo de pagarlo, además de la consiguiente perdida de libertad.

Desde ya muchas gracias a todos por sus comentarios.
Mi pregunta no esta dirigida a cualquier software que se pueda obtener gratuitamente (free as beer), sino al software libre (free as freedom). Freeware ya encontré, lo que busco es la libertad de poder personalizar el soft a las necesidades de mi padre, y no quiero empezar a "reinventar la rueda" nuevamente, si es que alguien ya invento esta "rueda" especifica en Software Libre.

Gracias a Pobrecito hablador por la pagina sobre alternativas gratuitas y libres, la cual ya he agregado a mis favoritos. También esta Alternativas Libres
He recibido la sugerencia en el siguiente post de DanielSan de explorar algún software de administración y modificarlo para las necesidades de mi padre:

Si no hay mucha diferencia entre las cuentas de una organización convencional (una empresa, una asociación, etc.) y un "consorcio", deberías empezar por buscar software de administración libre, no algo adaptado exclusivamente a "consorcios".

No sé si se diferenciarán mucho o poco, pero si realmente una aplicación así le va a solucionar la vida, entonces quizá tenga que pagar a alguien para que le modifique una aplicación libre de gestión.

Los programas relacionados con leyes suelen cambiar mucho, por tanto el programa debería ser muy flexible y tener siempre a alguien que le haga los cambios que necesite.
Mi respuesta a ese post fue:

Gracias por la idea.

Aunque de hecho ya la había evaluado, y obviamente lo tendré en cuenta por sí no encuentro algo ya especifico.

Lo que me sorprende es la variedad y cantidad de software privativo que existe para esto y la, hasta ahora, total ausencia de software libre.

Y si, tienes razón, deberemos considerar entre apañarnos nosotros solos o contratar a alguien. En principio me inclino por lo primero, ya hice algunos programas para el trabajo de tasador de mi padre, hace mucho tiempo, en Clipper, y Visual Basic for Applications. Todo muy chapusero en la época del DOS, cuando recién empezaba Windows.

Hoy es evidente que deberé ver alguna solución cliente servidor, y me inclino por PHP en una solución LAMP, y hay varios proyectos que podrían servirme para no empezar todo desde cero.
Bueno para finalizar este resumen comento que me encuentro pensando en implementar la aplicación por mi mismo, y que veré si lo puedo hacer. Afortunadamente mi padre piensa con tiempo, y su jubilación no esta tan próxima, aunque si ya le correspondería por ley. Pero por esta ultima razón, le puede llegar antes de lo que él quiere, o sea en cualquier momento.

Update:

marce hizo un interesante comentario que me parece oportuno citar:

SQL-ledger es un programa de contabilidad con interfaz web. Tal vez te sea útil.
Otra opción, algo vilipendiada en /. es Facturalux, que ya tiene aspiraciones a erp.
SQL-Ledger era totalmente desconocida por mí, así que muchas gracias por el aporte.

Facturalux es una opción, al igual que el tal vez no tan conocido Galopin.

Algo que me preocupa especialmente hacer modulos para aplicaciones existentes es el mantenimiento posterior en sintonia con la upstream.
Martes, 14 de Marzo 2006

"Trucho": El nacimiento de una palabra

01:22h.
Español
Trucho es un argentinismo para indicar "ilegal", "fraudulento", "falsificado", pero la palabra trucha originalmente en el lunfardo (slang del río de la plata) significaba "cara", "rostro".

La palabra nace con el nuevo sentido en la Argentina en los años 80. Alrededor de 1986 se emite un ciclo radial llamado "Radio Bangkok" conducido por Lalo Mir.

Durante esa época hay una crisis ecologica en la cuenta de los Ríos Parana, Uruguay y del Plata que provoca una gran mortandad de peces, muchos de esos peces eran Truchas, este pez es muy apreciado en la pesca deportiva, y la muerte de muchos ejemplares de esta especie perjudican a la industria turística de varias provincias litoraleñas.

La contaminación fue provocada por empresas inescrupulosas y por funcionarios sospechados de recibir comisiones ilegales para no controlar a las empresas.

En ese contexto, Lalo Mir dice que los funcionarios deben dar la "trucha" ("cara"), y sino eran unos "truchos". No paso mucho tiempo hasta que el uso se generalizo, y hoy en dia ya aparece en los titulares de uno de los diarios de mayor circulación de Buenos Aires.

Update

Mi padre acota:

Hola Sergio, no recordaba el origen, que grande Lalo Mir, bueno pero hay un pequeño problema, en ninguno de los Ríos mencionados viven truchas, estas generalmente viven en ríos y arroyos de zonas de montaña, donde el agua es correntosa y muy oxigenada.

Es mas, en los criaderos de truchas, el agua corre permanentemente simulando a esos arroyos y es filtrada prolijamente, única forma en que se pueden criar, hace mucho tiempo en Pilar existía un criadero llamado La Trucha Real.

De hecho y no se bien porqué me parece conocer otro origen para esa palabra, si la FAT del rígido logra encontrarla te la envío.

Sin embargo, buscando encuentro que existe mas de una especie de trucha aunque parace ser que la mayoria vive por lo general en aguas claras de arroyos.

Igualemente, esto no invalida el comentario, ya que aunque no hubieran muerto truchas, no quiere decir que Lalo Mir no haya hecho el juego de palabras.
Domingo, 26 de Febrero 2006

Me caí de la cama (una actualización)

05:03h.
Bitácoras
Ayer sábado 25 de febrero, pude devolver la billetera. Willis, tal su sobrenombre, feliz de no tener que tramitar nuevos documentos.

La billetera se le cayo mientras cruzaba corriendo una avenida cuando paseaba unos perros. Uno de ellos Atos le había obligado a acelerar el paso, y ahí fue cuando perdió los documento. No se dio cuenta hasta que llego a una plaza bastante lejos de donde encontré la billetera.
Miércoles, 22 de Febrero 2006

Ver mensaje HTML desde Sylpheed en tu Browser sin Claws

11:25h.
Correo electrónico
Si usas Sylpheed clasico y quieres ver los mails HTML que te llegan con imagenes y todo en tu navegador favorito, este es tu script.

Si usas Sylpheed-Claws hay un plug-in para ver tus mensajes HTML con Dillo dentro de la propia ventana de Sylpheed-Claws.

#!/bin/bash

################################################## #########################
#
# Autor: Sergio Vernis
# Email: svernis (at) gmail (dot) com
# Fecha/Date: 2 de Junio de 2005 (2005-VI-02)
#
# Texto en castellano abajo / Text in spanish below
#
# Utility:
#
# You can use this script to view sylpheed mail in html format in a Web
# Browser.
#
# Explanation:
#
# This script must be executed from Sypheed. To do this, you must include
# a call in Sylpheed actions menu. Go to "Configuration" and "Actions".
#
# You write in "Menu Name" the script name in action menu, "View as HTML".
# And put in "Command line" something like:
# "~/ScriptFullPath/sylpheed2html %f". And press "add" buton.
#
# If you use Sylpheed-Claws, you must use something like:
# "~/.sylpheed-claws/sylpheed2html %f ~/.sylpheed-claws"
#
# You must have your browser correctly configured in Sylpheed. See
# Sylpheed documentation for this. You configure this in:
# Configuration menu -> Common, and select tab "Others". In Web
# Browser put your favorite web browser.
#
# Something like:
#
# galeon -n %s
# firefox %s
# opera -remote 'openURL(%s,new-page)'
# mozilla %s
#
# Depends:
#
# "sylpheed", "mhoarc", "awk", "echo", "grep" and "zenity".
#
# Explicación:
#
# Este script debe ejecutarse desde sylpheed. Para lo cual debe estar
# incluido en el menú "Acciones" de sylpheed. Para ello debe ir al menú
# "Configuración" y seleccionar "Acciones".
#
# En "Nombre de menú" ponga el nombre con el que identificara al script,
# por ejemplo "Ver mail como HTML" y en "Línea de orden" coloque un texto
# del tipo "/home/TuUsuario/DondeEsteElScript/sylpheed2html %f" sin
# incluir las comillas (p.e. "~/.sylpheed-2.0/sylpheed2html %f"). Y haga
# clic en añadir.
#
# También puede especificar el directorio de sylpheed como segundo
# parametro. P.e.: "~/.sylpheed-claws/sylpheed2html %f ~/.sylpheed-claws".
#
# Para ejecutar el script simplemente haga clic en "Herramientas",
# elija la opción "Acciones" y seleccione el script por el nombre que le
# dio en el paso anterior, por ejemplo, "Ver mail como HTML".
#
# Para su correcto funcionamiento requiere que este configurado el navegador
# web en sylpheed. Para ello debe debe ir al menú "Configuración"
# y seleccionar "Preferencias comunes". Elija la pestaña "Otras". Y en el
# campo "Navegador web" complete con el nombre de su navegador favorito
# seguido de %s
#
# Ejemplos:
#
# galeon -n %s
# firefox %
# opera -remote 'openURL(%s,new-page)'
# mozilla %s
#
# En mozilla y firefox si uso -remote no me abre ningún navegador si no hay
# ninguno activo.
#
# Utilidad:
#
# Este script era una necesidad que tenía hace tiempo, mis amigos me envían
# cada tanto mails en HTML los cuales a mi me gustaría ver como tales. Durante
# algún tiempo use el comando mhoarc en la línea de comandos, pero esto era
# engorroso, por lo que lo hacia en forma muy esporádica.
#
# Afortunadamente me dí cuenta que es posible agregar extensiones a sylpheed,
# y cree este script para automatizar la tarea.
#
# El primer script era muy básico, y no se ejecutaba bien si el navegador,
# Opera en mi caso, no estaba abierto con anticipación. Cuando subsane esto
# me propuse hacerlo tan genérico que cualquiera pudiera usarlo. No estoy
# seguro de si el script cumple este ultimo objetivo, por lo que agradezco
# cualquier comentario y reporte de bug.
#
# Por ultimo, quiero comentar que este script es una razón mas para no dejar
# sylpheed. Es el mejor programa de correo que conozco, y con este script
# ya ni pienso en cambiar por otro. ¿Que cliente de correo puede guardar
# 500MB de mail sin siquiera mosquearse? ¿Que si se corta la energía no
# se pierdan todos tus correos porque un gran mailbox quedo corrupto? ¿Que
# siga tan bien los hilos de conversación en las listas de correo?
#
# Okey, hay otros clientes de correos muy ventajosos, carpetas virtuales,
# y que permiten escribir mails en html. Pero por el momento esas cosas
# no logran compensar en lo más mínimo las ventajas que me ofrece sylpheed.
#
# Dependencias:
#
# Requiere de "sylpheed", "mhoarc", "awk", "echo", "grep" y "zenity".
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
################################################## #########################

# Comprueba que exista el archivo a ver como html
if [ ! -f "${1}" ]; then
      zenity --error --title="sylpheed2html" --text="sylpheed2html\n\nNo se encontro ${1}\nCould not find ${1}"
      exit
fi

# Si se paso un segundo parametro es el directorio de sylpheed
if [ -n "${2}" ]; then
      syldir="${2}"
else
      syldir="${HOME}/.sylpheed-2.0"
fi

# Cambiar al directorio de sylpheed
if [ -d ${syldir} ]; then
      # Cambia al directorio de sylpheed
      cd ${syldir}
      if [ ! -f sylpheedrc ]; then
            zenity --error --title="sylpheed2html" --text="sylpheed2html\n\nNo se encontro ${syldir}/sylpheedrc\nCould not find ${syldir}/sylpheedrc"
            exit
      fi
      if [ -d tmp.html ]; then
            # Ahora al temporario de html
            cd tmp.html
      else
            # Si no existe el temporario de html lo crea
            mkdir tmp.html
            cd tmp.html
      fi
else
      zenity --error --title="sylpheed2html" --text="No se encontro ${syldir}\nCould not find ${syldir}"
      exit
fi

# Elimina los archivos temporales anteriores
rm * 2>/dev/null

# Transformar el mail en html
# y las imagenes se guardan en el directorio actual
mhonarc -single "$1" > sylpheed2html.html

# Se guarda la ubicación absoluta del archivo
url="file://""${PWD}""/sylpheed2html.html"

# Se optiene el comando para ver paginas web del propio sylpheedrc
# primero se optiene la línea la orden
cero=$(cat ../sylpheedrc | grep uri_open_command | awk -F = '{ print $2 }')

# segundo se separa la mitad antes del %s
uno=$(echo $cero | awk -F %s '{ print $1 }')

# por ultimo se separa la mitad despues del %s
dos=$(echo $cero | awk -F %s '{ print $2 }')

# Se unen todas las partes
cmd="${uno}""${url}""${dos}"" 2>/dev/null &"

# Crea el script necesario para ver el mail en HTML
# Escribe el tipo del archivo, ejecutable de sh
echo "#!/bin/sh" > go2url

# Escribe un comentario explicando que es el archivo
echo "# Este es un script creado por sylpheed2html para ver un mail como HTML" >> go2url
echo "# This is a script made by sylpheed2html for view a mail in HTML format" >> go2url

# Guarda el comando construido
echo $cmd >> go2url

# Le da permisos de ejecución
chmod u+x go2url

# Se ejecuta el script para ver el mail en HTML ./go2url 2>/dev/null &