Ignorar ficheros y directorios en SVN

Crea un fichero de texto donde indicas los ficheros y carpetas que quieres que SVN no tenga en cuenta cuando compara el respositorio. (ignore.txt)

.classpath
.project
target
bin
build

ahora establecemos la propiedad ignore mediante fichero

svn propset svn:ignore -F ignore.txt directorioproyectoquequieresignorar

Una vez establecida la propiedad podemos borrar el fichero.

Patron observer en un comando JONIC desde Bean

En la estructura de JONIC, no podemos crear el comando que extienda de Observable (porque ya extiende de ResultCommand), por lo que creamos una clase interna que si lo haga.

 

public class ConsultaMasivaCMD extends ResultCommand<List>

public PorcentajeMasivoObservable myobs = new PorcentajeMasivoObservable();

public class PorcentajeMasivoObservable extends Observable
{
private int porcentaje = 0;
public int getPorcentaje()
{
return porcentaje;
}
public void setPorcentaje(int porcentaje)
{
this.porcentaje=porcentaje;
setChanged();
notifyObservers();
}

}

 

Y dentro de nuestro comando en el runcommand:

@Override
public ResultCommand<List<Resultado>> runCommand() throws Exception {

      for (int i = 0; i <=array.size() - 1; i++) {

          ... 
          myobs.setPorcentaje(porcentaje);
      }

}

Ahora que ya tenemos la clase observable nos vamos al bean:

public class ConsultaFicherosBean extends RequestAbstractBean implements Serializable, Observer {

private ConsultaMasivaCMD.PorcentajeMasivoObservable pmo =null;

private Integer progress;

public String acConsultar() {

ConsultaMasivaCMD cmd = (ConsultaMasivaCMD)createCommand(ConsultaMasivaCMD.class);
cmd.setObj(this);
pmo=cmd.myobs;
pmo.addObserver(this);
cmd = (ConsultaMasivaCMD) runCommand(cmd);
if (cmd != null && cmd.getResult() != null)
result.addAll(cmd.getResult());

return "donde sea";
}

@Override
public void update(Observable o, Object arg) {
if (o==pmo){
progress=pmo.getPorcentaje();
}

}

En el xhtml ponemos una barra de progreso con un poll para indicar el estado del progreso.

<h:form id="dataForm">

<p:commandButton id="viewButton" value="Enviar Petición"
action="#{consultaFicherosBean.acConsultar}"

onclick="PF('pb').start();PF('poll').start();"
onstart="PF('dlg').show()"
oncomplete="PF('dlg').hide();PF('pb').cancel();PF('poll').stop();"
update=":dataForm :prg"

icon="ui-icon-pin-s" />

</h:form>

<p:dialog widgetVar="dlg"
appendTo="@(body)"
modal="true"
width="400"
height="100"
header="Progreso"
draggable="false"
closable="false"
closeOnEscape="false"
resizable="false"
minimizable="false">
<h:form id="prg">

  <p:poll interval="1"
  widgetVar="poll"
  autoStart="false"
  async="true"
  update=":prg"
  immediate="true"/>

<!-- progressbar-->
<p:progressBar widgetVar="pb"
ajax="true"
value="#{consultaFicherosBean.progress}"
labelTemplate="{value}%"
styleClass="animated"
global="false">
</p:progressBar>
</h:form>
</p:dialog>

Con esto el comando avisa en cada iteración del porcentaje, el Bean se entera y actualiza su variable de progreso y la página mediante el poll y la barra de progreso puede informar al usuario de como va la tarea.

Corregir fallo prestashop 1.7 carousel

Una vez que he instalado prestashop 1.7 y accedo a la tienda veo que el componente carousel que viene con el tema por defecto no tiene enlace

Aunque en la parte de administración veo que si que está definido:

 

Para arreglarlo es necesario modificar el fichero:

themes/classic/modules/ps_imageslider/views/templates/hook/slider.tpl

Añadiendo el elemento a, dentro de figure:

Una vez hecho, es necesario vaciar la caché para que podamos ver el resultado:

 

 

 

 

Pensando en cambiar de hosting

Será porque hoy es sábado y voy bien de tiempo con mis proyectos que tengo a medias, pero hoy me apetece escribir una entrada mas larga.

Llevo tiempo con mi pagina web en 1and1, y creo que es el momento de pensar si es el mejor hosting en el que puedo tener no solo el blog, sino todas las paginas correspondientes a mis aplicaciones móviles, tanto de IOS como de Android, ademas de aquellas necesarias para el correcto funcionamiento de varias aplicaciones que he desarrollado a lo largo de los años.

Ultimamente he desarrollado varias aplicaciones como Datercam para Android ( ya existía para IOS) que permite poner información como la fecha, la hora, las coordenadas gps y la ubicación ( obtenida mediante google ) a las fotos, para que no olvides cuando y donde hiciste una foto.

O mi ultima aplicación Emojime publicada hace 3 días, que permite coger una foto, bien sea de la cámara o del carrete, detectar las caras y cargar emoticonos de forma aleatoria, lo que permite “jugar” a encontrar la combinación de caras que mejor se adapte a la foto, una vez tienes el resultado puedes compartirla o guardarla.

Pero volviendo al tema con el que empece, últimamente he tenido problemas con mi pagina en 1and1, momentos en los que no puede acceder, errores internos del servidor ( que luego no dan mas información ) o simplemente que la velocidad no es la deseada.

A eso se junta que hace tiempo me cambiaron la tarifa de forma unilateral, después de 8 años con ellos ya no podían mantenerme el contrato que tenia con ellos, y me pasaban a uno superior ofreciendo cosas que no necesito y con ello un aumento de precio considerable.

Otro de los motivos por los que tengo que pensar en cambiar de hosting es que me gustaría que tuviera acceso a la base de datos de forma nativa mediante host y puerto, mientras que ahora solo puedo acceder mediante phpmyadmin una vez que me he logueado en el panel de control, lo que relentiza bastante el trabajo con base de datos.

Hace unos días que encontré un articulo  donde hablaban de tres hosting baratos y exponían una serie de pruebas que habian hecho para valorar cual era la mejor, los tres candidatos eran: Webempresa, Raiola y Sered, y las pruebas que realizaban eran: benchmark, velocidad de renderización, estabilidad del servidor o load impact entre otros.

Aquí me pilla de novato, pues no tenia ni idea de en que consistían muchas de las pruebas que se realizaban, pero me ha servido para aprender mas acerca de los pasos necesarios para que tu web esté en un hosting capaz de soportar cargas sin que el usuario se vea afectado. Es mas creo que estas pruebas pueden ser aplicadas en mi puesto de trabajo y se lo comentaré a la gente de sistemas para organizar un plan de actuación.

Aunque en el articulo si mostraban un ganador, como en casi todas las comparativas  cada una de ellas destacaba en algún punto por lo que el resultado no era fácil de determinar.

Como en el articulo no hablaban de si el acceso a base de datos era con phpmyadmin o si por el contrario permitían acceso directo no me queda mas remedio que preguntarlo directamente, recurro a llamar por teléfono y quedo a la espera, en unos segundos me atiende un empleado muy amable que me responde a mi gran duda, y la respuesta es afirmativa, CPANEL permite habilitar conexión externa con la base de datos, por lo que acaba de convencerme para tomarlo como claro candidato a ser mi proximo hosting, a ver si el proximo post ya está ahí alojado.

 

 

Modificaciones sobre boton flotante

Partiendo del componente FabOptions

Añadiendo en la clase FabOptions.java el método:

public void changeColorbackground(int color){
Drawable d = mBackground.getBackground();
d = DrawableCompat.wrap(d);
DrawableCompat.setTint(d.mutate(), color);

}
public void changeColor(int color){
mFab.setBackgroundTintList(new ColorStateList(new int[][]{new int[]{0}}, new int[]{color}));

}

y llamandolo pasandole el color:

fabOptions.changeColorBackground((getResources().getColor(R.color.verde));

Podemos obtener resultados como:

Y para cambiar el color del boton principal:

fabOptions.changeColor((getResources().getColor(R.color.verde2));

Ordenar columnas datatable jquery

Hay determinadas columnas que no se ordenan bien de manera nativa utilizando jquery.datatable.js
Por ejemplo las fechas

Las fechas en español no se ordenan bien, para ello tenemos que indicarle un valor con la fecha en formato americano de manera que no se vea pero que le sirva para ordenar:

Donde lo importante es poner un elemento <span style=”display:none”>valor util para ordenar</span> que en el caso de las fechas es con el formato americano.

 

Redirigir trafico de un dominio viejo a uno nuevo

Vamos a utilizar htaccess para que cualquier dirección del viejo dominio apunte al nuevo

RewriteEngine on
RewriteCond %{HTTP_HOST} ^viejodominio.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.viejodominio.com [NC]
RewriteRule ^(.*)$ http://www.nuevodominio.com [L,R=301,NC]

Si en el nuevo dominio la estructura es la misma que en el viejo, podemos hacer que la mantenga cambiando la ultima linea

RewriteRule ^(.*)$ http://www.nuevodominio.com/$1 [L,R=301,NC]

Y como bonus en el nuevo dominio vamos a hacer que cualquier dirección que no exista (Error 404) nos lleve a la pagina principal

ErrorDocument 404 /index.php

proteger un fichero php mediante usuario y clave

Para proteger un archivo vamos a utilizar .htaccess


AuthName "Acceso restringido"
AuthType Basic
AuthUserFile  /ruta/absoluta/fichero/.htpasswd
require valid-user

para ello tenemos que crear un fichero de claves .htpasswd

prueba:$apr1$sw7c8otq$YXGtq/vVLMc3jl4yOPCGt.

Lo podemos hacer desde esta pagina enlace

Y en el fichero htaccess tenemos que poner la ruta absoluta del servidor al archivo htpasswd, para ello podemos utilizar el codigo PHP siguiente:

$dir = dirname(__FILE__);
echo "Full path to this dir: " . $dir . "";

Poner borde a un botón android

Función para poner borde a un botón de manera programática, creado en una clase de utilidades.

 

public class Util {

public static void bordecolorboton(Button b,int color,int radio){
  if (b!=null){
    GradientDrawable gd = new GradientDrawable();
    if (color!=0){
      gd.setColor(color); 
    }
    gd.setCornerRadius(radio);
    gd.setStroke(1, 0xFF000000);
    b.setBackground(gd);
  }
}
}

Luego en el método onCreate, podemos llamar a la función pasandole el botón

  btcolor1 = (Button)popupView.findViewById(R.id.btcolor1);
  btcolor1.setOnClickListener(new ImageButton.OnClickListener(){
      @Override public void onClick(View v) {
          //que haga lo que tenga que hacer.....
      }
  });
 //pone un borde negro de 1 px y color de fondo definido en el fichero de colores	   
 Util.bordecolorboton(btcolor1,Color.parseColor(getResources().getString(R.string.color1)),10);