miércoles, 18 de enero de 2023

Error instalando Corel en MAC

Hola de nuevo, 

Al pasarme a MAC e instalar Corel 2020 con su licencia, aparentemente iba todo genial: success!

Pero al ejecutarlo me salía este error una y otra vez:

termination reason: namespace dyld, code 4 

symbol missing symbol not found: (__zn6icu_6610unicodesetd1ev) 

Referenced from: '/Library/Corel/*/Common.bundle/Contents/MacOS/crlutf.dylib' 

Expected in: '/Library/Corel/*/Icu.bundle/Contents/Macos/


Pues bien, para instalarlo bien te tienes que ir a la terminal y buscar este path:

/Library/Preferences/Corel/Downloads/


Allí encontrarás una serie de carpetas (en mi caso había tres). 


Probé con la primera e instalé desde la terminal el .pkg


Si haces ls sale esto:


/Library/Preferences/Corel/Downloads/1588577846119> ls


CDGS2020U1.pkg dim_params.xml


Para instalar el paquete, ejecuta esto otro:


sudo installer -pkg CDGS2020U1.pkg -target /


A mí me funcionó y ya estoy feliz con mi Corel :)

Espero que le pueda servir a alguien más. 

¡Hasta otra!




miércoles, 8 de junio de 2022

CSS rotos al instalar Drupal 9.3.15




Problema: 

Al instalar Drupal 9.3.15 en el hosting que tengo contratado todo iba ok, pero cuando el proceso de instalación terminaba, no cargaba los css.

Pruebas:

Monté un localhost en mi máquina para ver si a lo mejor no había descargado bien el Drupal. Y se instalaba perfectamente, los css cargaban y todo estaba listo para empezar a montar la web. El problema entonces era del hosting. 

Solución: 

Tras llamar al soporte técnico de mi hosting (que son unos máquinas) me dijeron que había que ir a html/sites/default/files/.htaccess y eliminar la línea que habilita multiviews en la web, lo cual no es compatible con el servicio de hosting compartido. Tras eliminar del fichero la línea que habilita esta funcionalidad, la web ya carga correctamente.


jueves, 7 de noviembre de 2019

Se inaugura La Peineta



La Peineta es un espacio donde dejar tu equipaje mientras sigues disfrutando de Granada. 

Allí también te asesoran sobre las actividades de ocio en la ciudad. 

Y si te quedas sin batería estás de suerte porque también alquilan baterías portátiles. 

Disponen de WiFi gratis, te invitan a un café mientras se carga tu móvil y te explican qué se cuece en Granada. 

Si estás turisteando por Granada, no se me ocurre mejor sitio para ir. www.lapeineta.es.

viernes, 29 de diciembre de 2017

PyQt5: getting two pixel coordinates of an image from two mouse clicks

Me ha costado un poco resolver esto, espero que le sirva a alguien más.

A ver, la idea era mostrar una imagen en una interfaz gráfica de PyQt5 (GUI para los amigos) y seleccionar dos píxeles de la misma haciendo clic con el ratón sobre ellos. 

Encontré este código aquí:

self.image = QLabel()
self.image.setPixmap(QPixmap("C:\\myImg.jpg"))
self.image.setObjectName("image")
self.image.mousePressEvent = self.getPos

def getPos(self , event):
    x = event.pos().x()
    y = event.pos().y() 
Pero yo necesito almacenar dos clicks, no uno, porque quiero usar estos valores de las coordenadas para recortar la imagen. Estos valores, (x1, y1) y (x2, y2), los muestro en sus respectivos textEdit de la GUI.

self.image = QLabel()
self.image.setPixmap(QPixmap("C:\\myImg.jpg"))
self.image.setObjectName("image")
self.image.mousePressEvent = self.getPos

def getPos(self , event):
        self.vx.append(event.pos().x())         ## vx is a list of x coordinates
        self.vy.append(event.pos().y())         ## vy is a list of y coordinates

        if len(self.vx)<2:                      ## if we only click once, we only set (x1, y1)  
            self.x1.setText(str(self.vx[0]))    ## x1 is a textEdit where we will display the first element of the list vx
            self.y1.setText(str(self.vy[0]))    ## y1 is a textEdit where we will display the first element of the list vy
        elif len(self.vx)%2==0:                 ## if we click an even number of times, we will set both (x1, y1) and (x2, y2)
            self.x1.setText(str(self.vx[-2]))   ## We get the last two values from the lists vx and vy
            self.y1.setText(str(self.vy[-2]))
            self.x2.setText(str(self.vx[-1]))
            self.y2.setText(str(self.vy[-1]))
        else:                                   ## if we click an odd number of times, we will set (x1, y1) and leave blank (x2, y2)
            self.x1.setText(str(self.vx[-1]))
            self.y1.setText(str(self.vy[-1]))
            self.x2.setText(" ")
            self.y2.setText(" ")

Así que lo que hice fue almacenar las coordenadas en una lista, de manera que me quedo siempre con los dos últimos valores. 
¡Saludos!

martes, 19 de julio de 2016

Compilar imágenes .eps en WinEdt

¡Hola a todos!

Después de un día entero intentando compilar un archivo LaTeX con WinEdt 9.1 sin éxito, por fin lo he conseguido.

El caso es que yo tenía inicialmente todas las figuras en pdf, y compilaba perfectamente con pdflatex. Pero los de la revista donde intento publicar solo permiten figuras en tiff, jpg o eps. De manera que exporté todas las figuras pdf a eps y no había manera de compilar.

Solución:

Cambiar pdflatex por latex: latex - bibtex - latex - latex (todos sabemos lo tedioso que es esto)

Después pasar DVI-PS (en la barra de herramientas)

A continuación PS-PDF (también en la barra de herramientas)



Y listo.

viernes, 5 de septiembre de 2014

Mi ubuntu 14.04 va muy lento en VirtualBox

Hola a todos,

He estado una semana siguiendo tutoriales que prometían mejorar el rendimiento de mi ubuntu instalado en VirtualBox sin éxito.

He aquí la solución:

Mira primero si tienes habilitado el unity 3D (lo más seguro es que no). Para ello teclea en el terminal:

sudo /usr/lib/nux/unity_support_test -p

Mira la última línea y si es que no, es que no.

Cierra la máquina virtual y te vas al administrador de Oracle VirtualBox (la ventana que te queda abierta una vez cierras la de ubuntu).

Te vas a pantalla y allí pones la memoria de vídeo al máximo (128MB en mi caso) y habilitas la aceleración 3D.

Abres ubuntu de nuevo y vuelves a teclear en la terminal esto:

 sudo /usr/lib/nux/unity_support_test -p

Te debería aparecer algo así: 

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       yes

Espero que le sirva a alguien más. Con lo fácil que era y ¡lo que me ha costado!

Saludos.


viernes, 6 de junio de 2014

Mover dos motores paso a paso con Matlab y Arduino por el puerto serie

Como me ha costado bastante comunicarme por el puerto serie desde Matlab a Arduino UNO y viceversa, lo comparto por si a alguien más le sirve.

La idea es configurar mi Arduino para que mueva dos motores paso a paso. Estos motores llevan además una tarjeta EasyDriver para controlar la etapa de potencia. Los motores en mi caso están conectados a dos rotadores, que llevan un limit switch cada uno para chequear el paso por 0º en cada vuelta. Un tornillo fijo pisará ese limit switch cada vez que pase por 0º.

DC 5V Deceleration Stepper Motor Module


EasyDriver V4.4 Stepper Motor Driver Board for Arduino (Works with Official Arduino Boards)


La función de Matlab es arduino(motor, pasos, reset).

motor:    puede ser 1 o 2, en función del motor que queramos mover
pasos:    número de pasos que queremos avanzar.
reset:     puede ser 0 o 1. 

Si reset está a 1, movemos el motor que le hayamos indicado hasta que toque el limit switch.
Si reset está a 0, movemos el motor los pasos que le hemos indicado.

%Funciona con motor_matlab.ino
function arduino(motor, pasos, reset)
ports=instrfind();
if ~isempty(ports)
    fclose(ports);
end
s = serial('COM4');
set(s,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(s,'StopBits',1); % se configura bit de parada a uno
set(s,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(s,'Parity','none'); % se configura sin paridad
set(s,'Terminator','CR/LF');% ìcî caracter con que finaliza el envÌo

flushoutput(s); % Limpiamos el buffer
flushinput(s); % Limpiamos el buffer

fopen(s);

pasos_aux=dec2bin(pasos,16);
pasos_hi=bin2dec(pasos_aux(1:8));
pasos_lo=bin2dec(pasos_aux(9:16));

mat=[motor pasos_hi pasos_lo reset];

c=fscanf(s); % Limpio el buffer

fwrite(s, mat, 'uint8', 'sync');

pasos_2 = fscanf(s,'%s');

LS1='0';
LS2='0';
i=1;

if reset==0
    
    while i<=pasos
        LS1 = fscanf(s,'%s');
        LS2 = fscanf(s,'%s');
        cont= fscanf(s,'%s');
        
        str= [LS1 '   ' LS2 '   ' cont];
        
        disp(str);
        i=i+1;
    end
    
elseif motor==1
    while LS1=='0'
        LS1 = fscanf(s,'%s');
        LS2 = fscanf(s,'%s');
        cont= fscanf(s,'%s');
        
        str= [LS1 '   ' LS2 '   ' cont];
        
        disp(str);
        i=i+1;
    end
    
elseif motor==2
        while LS2=='0'
        LS1 = fscanf(s,'%s');
        LS2 = fscanf(s,'%s');
        cont= fscanf(s,'%s');
        
        str= [LS1 '   ' LS2 '   ' cont];
        
        disp(str);
        i=i+1;
    end
    
end
fclose(s);


 y el sketch en Arduino es este:


//---------------------------------------------------------------------
// motor_matlab.ino
//---------------------------------------------------------------------
//Sketch de arduino 1 para mover el motor 1 o el 2 los pasos que se le 
// indiquen o bien resetear el motor indicado
//---------------------------------------------------------------------
// Inicialización de pines
int dirpin1 = 3;   // Motor 1: dirección y pasos
int steppin1 = 2;  

int dirpin2 = 5;  // Motor 2: dirección y pasos
int steppin2 = 4;  

//limit switch
int PW01 = 11;
int PW02 = 12;

int PW1 = 8;
int PW2 = 9;

int SW1 = 10;
int SW2 = 13;

// Variables:
int motor = 0;
int motor_s = 0;         
int pasos_hi = 0; 
int pasos_lo = 0; 
int pasos;
int reset = 0;
int reset_s = 0;

int buttonState1=0;
int buttonState2=0;

int contador=0;
int i=0;

String myStr_hi;
String myStr_lo;
String myStr;
String motor_str;
String reset_str;

void setup()
{
  Serial.begin(9600);
  
  //PaP
  pinMode(dirpin1, OUTPUT);
  pinMode(steppin1, OUTPUT);
  pinMode(dirpin2, OUTPUT);
  pinMode(steppin2, OUTPUT);

  //limit switch
  pinMode(PW1, OUTPUT);      
  pinMode(PW2, OUTPUT);      
  pinMode(PW01, OUTPUT);
  pinMode(PW02, OUTPUT);
  pinMode(SW1, INPUT);  
  pinMode(SW2, INPUT);
     
  digitalWrite(PW1, HIGH); // Tienen que estar a 5V  
  digitalWrite(PW2, HIGH);
  digitalWrite(PW01, LOW); // Tienen que estar a 0V
  digitalWrite(PW02, LOW); 
  
  digitalWrite(dirpin1, HIGH);     // Dirección del PaP
  delay(100);
  digitalWrite(dirpin2, HIGH);     // Dirección del PaP
  delay(100);
 
}

void loop()
{
        if (Serial.available() > 0) 
        {
  // lee los 4 bytes entrantes: [motor pasos_hi pasos_lo reset]
   motor = Serial.read();
                delay(100);
                
                pasos_hi = Serial.read();
                delay(100);

                pasos_lo = Serial.read(); 
                delay(100);
                
                reset = Serial.read(); 
                delay(100);
          
                Serial.flush();
                delay(1);
           
                // Paso los bytes de decimal a binario
                
                myStr_hi = dec2bin8(pasos_hi);
                myStr_lo = dec2bin8(pasos_lo);
                
                // Concateno el byte superior con el inferior
                
                myStr = myStr_hi + myStr_lo;
                
                // paso la cadena de binario a decimal
                
                pasos=bin2dec(myStr,16);
                
                Serial.println(pasos, DEC);
                  if (motor==1)
                   {
                      if (reset==1){
                        
                           do {
                             digitalWrite(steppin1, LOW);  // Inicia el PaP
                             digitalWrite(steppin1, HIGH); 
                             delayMicroseconds(200); 
                             buttonState1 = digitalRead(SW1); // Mira el limit switch 1
                             delay(1);
                             buttonState2 = digitalRead(SW2); // Mira el limit switch 2
                             delay(1);
                             i++;
                             Serial.println(buttonState1);
                             delay(1);
                             Serial.println(buttonState2);
                             delay(1);
                             Serial.println(i);
                           }
                           while (buttonState1 == 0); 
                            
                      }
                      

                      else{
                          do{
                        
                             digitalWrite(steppin1, LOW);  
                             digitalWrite(steppin1, HIGH); 
                             delayMicroseconds(200); 
                             buttonState1 = digitalRead(SW1);
                             delay(1);
                             buttonState2 = digitalRead(SW2);
                             delay(1);
                             i++;
                             Serial.println(buttonState1);
                             delay(1);
                             Serial.println(buttonState2);
                             delay(1);
                             Serial.println(i);
                      
                           }while (i<pasos);
                        
                      
                       }
                   
                   }

                   else
                   {
                      if (reset==1){
                        
                           do {
                             digitalWrite(steppin2, LOW);  
                             digitalWrite(steppin2, HIGH); 
                             delayMicroseconds(200); 
                             buttonState1 = digitalRead(SW1);
                             delay(1);
                             buttonState2 = digitalRead(SW2);
                             delay(1);
                             i++;
                             Serial.println(buttonState1);
                             delay(1);
                             Serial.println(buttonState2);
                             delay(1);
                             Serial.println(i);                           
                           }while (buttonState2 == 0); 
                          
                      
                      }
                      else{
                          do{
                        
                             digitalWrite(steppin2, LOW);  
                             digitalWrite(steppin2, HIGH); 
                             delayMicroseconds(200);
                             buttonState1 = digitalRead(SW1);
                             delay(1);
                             buttonState2 = digitalRead(SW2);
                             delay(1);
                             i++;
                             Serial.println(buttonState1);
                             delay(1);
                             Serial.println(buttonState2);
                             delay(1);
                             Serial.println(i);                     
                          }while (i<pasos);
                      }
                    }
                   
        } 
}
// Para pasar de decimal a binario de 8 bits en arduino uno
String dec2bin8(int myNum)
{

  int zeros = 8 - String(myNum,BIN).length();
  String myStr;
  for (int i=0; i<zeros; i++) {
    myStr = myStr + "0";
  }
  myStr = myStr + String(myNum,BIN);         

  delay(1000);
  
  return myStr;
}
// Para pasar de binario a decimal
int bin2dec(String orig, int tam){
  int result = 0;
  for (int i=0;i<tam;i++){
    result = result*2;
    result += (orig[i]-48);
    //Serial.println(i);
    //Serial.println(result);
    
  }
  return result;
}



Ya sabéis, primero cargáis el sketch de Arduino y lo compiláis. Después, solo tenéis que ejecutar el script de Matlab. 

Y nada más, espero que os sirva para jugar con vuestros arduinos.

¡Hasta otra!