Author Archives: oscar - Page 2

Three useful or not… Java functions

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int heavy_decimal_count(int a, int b) {
    int result = 0;
    Hashtable<string, Double> range = new Hashtable<string, Double>();
 
    char[] number;
    double avg;
    for (int i = a; i < = b; i++) {
        number = String.valueOf(i).toCharArray();
 
        avg = 0.0;
	for(int j = 0; j < number.length; j++) {
	    avg += Integer.parseInt(String.valueOf(number[j]));
	}
 
        avg /= number.length;
	if (avg >= 7.25)
	    result++;
 
        range.put(String.copyValueOf(number), Double.valueOf(avg));
    }
 
    return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int dominator(int[] A) {
    int result = -1;
 
    Hashtable<string, Double> occurrence;
    Hashtable<integer, Hashtable<string, Double>> indexes = new Hashtable<integer, Hashtable<string, Double>>();
 
    for (int i = 0; i < A.length; i++) {
        if (indexes.containsKey(Integer.valueOf(A[i]))) {
            occurrence = indexes.get(Integer.valueOf(A[i]));
            occurrence.put("OCCURRENCES", occurrence.get("OCCURRENCES").doubleValue() + 1);
            occurrence.put("DOMINATOR", (occurrence.get("OCCURRENCES").doubleValue() + 1) / A.length);
            occurrence.put("LASTINDEX", Double.valueOf(i));
        } else {
            occurrence = new Hashtable<string, Double>();
            occurrence.put("OCCURRENCES", 1.0);
            occurrence.put("DOMINATOR", 1.0 / A.length);
            occurrence.put("LASTINDEX", Double.valueOf(i));
        }
        indexes.put(Integer.valueOf(A[i]), occurrence);
    }
 
    Iterator<hashtable<string, Double>> it = indexes.values().iterator();
    while (it.hasNext()) {
        occurrence = it.next();
	if (occurrence.get("DOMINATOR").doubleValue() > 0.5) {
            result = occurrence.get("LASTINDEX").intValue();
        }
    }
 
    return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int amplitude(int[] A) {
    int result = -1;
    int newVal = 0;
 
    for (int i = 0; i < A.length ; i++) {
        for (int j = 0; j < A.length; j++) {
            if (j == i)
                continue;
            newVal = Math.abs(A[i] - A[j]);
            if (newVal > result)
                result = newVal;
        }
    }
 
    return result;
}

Programador horario con Arduino

¡Hola a tod@s!

Últimamente estoy inmerso en un proyecto con Arduino. El proyecto en cuestión trata el diseño y programación de un controlador para la Pecera del Quinto. Uno de los primeros escollos a resolver es el programador horario y para ello he hecho la siguiente función. La función between(..) permite saber si la hora actual (o cualquier otra) está entre dos horas diferentes, además permite incluir una hora final en el siguiente día (ver ejemplo).

Código de la función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 * Between is a method to check if current time is between two different times (initial time and final time). This method supports a 'final time' in the next day.
 * @param currHour integer (0-23) with the current hour.
 * @param currMinute integer (0-59) with the current minute.
 * @param initHour integer (0-23) with the initial hour.
 * @param initHour integer (0-59) with the initial minute.
 * @param finalHour integer (0-23) with the final hour.
 * @param finalMinute integer (0-59) with the final minute.
 * @return true if the current hour is between the two times (initial and final)
 * @author Oscar Sanchez Montaner (OSanchezMon)
 */
public static boolean between(int currHour, int currMinute, int initHour, int initMinute, int finalHour, int finalMinute) {
    boolean result = false;
 
    // Converting times to minutes.
    int  on = initHour  * 60 +  initMinute;
    int now = currHour  * 60 +  currMinute;
    int off = finalHour * 60 + finalMinute;
 
    // If final time is in the next day...
    if (finalHour < initHour) { // ... must first check if current time is above 12AM (24)...
        if (now > off) {
	    now += 1440; // ... if it is above; increase it 1440 minutes.
	}
	off += 1440; // Final time (for the next day) is always increased 1440 minutes.
    }
    // Development information.
    if (DEBUG_ON) {
        Serial.print("On: "); Serial.print(on); Serial.print(", Now: ");
        Serial.print(now); Serial.print(", Off: "); Serial.println(off);
    }
    // Check if current time is between initial and final time.
    if (now >= on && now < off) {
        result = true;
    }
 
    return result;
}

En el siguiente ejemplo se quiere saber si la hora actual está comprendida entre las 23:10 y las 10:10 (de la mañana siguiente).

Ejemplo de utilización:

1
2
3
4
5
6
7
if (between(hora_actual, minuto_actual, 23, 10, 10, 10)) {
    if (!relay02On) {
      digitalWrite(relay02Pin, HIGH);
      relay02On = true;
      logger("Relay 02 enabled.");
    }
}

Resultados de diferentes casos de prueba:

1
2
3
4
5
6
between(9, 0, 23, 10,  8, 59)); // On: 1390, Now: 1980, Off: 1979 -> false
between(9, 0, 23, 10,  9,  0)); // On: 1390, Now:  540, Off: 1980 -> false
between(9, 0, 23, 10,  9,  1)); // On: 1390, Now:  540, Off: 1981 -> false
between(9, 0, 10, 10,  8, 59)); // On:  610, Now: 1980, Off: 1979 -> false
between(9, 0,  8, 10,  9,  1)); // On:  490, Now:  540, Off:  541 ->  true
between(9, 0,  8, 10,  8, 11)); // On:  490, Now:  540, Off:  491 -> false

Where are my site-packages stored?

The location depends on the operating system, to find out try to execute the following code:

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

Cheers!

Cómo utilizar JOIN en sentencias UPDATE o DELETE.

Una práctica muy recomendable antes de lanzar una sentencia UPDATE o DELETE sobre un subconjunto de tuplas, es probar a realizar la proyección, afinando las condiciones de restricción para el subconjunto (mediante una sentencia WHERE). Cuando nos encontramos ante una condiciones sencillas, reutilizar la misma clausula WHERE es trivial. Pero qué sucede cuando queremos utilizar funciones de composición (JOIN) para restringir el conjunto de datos.

Ejemplo para UPDATE, donde se puede ver como se han utilizado varios JOINs en el bloque de referencia a la table (table_reference en el manual de MySql):

UPDATE table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category SET T1.readed = 0 WHERE T1.type = 'X' AND T1.category  = 'A';

Ejemplo para DELETE. En este caso después del DELETE hay que especificar la tabla o tablas (multi-delete):

DELETE T2 FROM table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category WHERE T1.type = 'X' AND T1.category  = 'A';

Espero que estos ejemplos os sirvan de ayuda.

NOTA: Todos los ejemplos se han ejecutado en un servidor MySql version 5.1.

Actualización

Ejemplo para MS SQL 2005:

UPDATE table1 SET T1.readed = 0 FROM table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category  WHERE T1.type = 'X' AND T1.category  = 'A';

Zope and Apache HTTP Server working as reverse proxy

I folks,

If you want to create an scenario with a Zope working as production web site and other/s Zope working as application server, probably you are looking for the way to configure Apache as reverse proxy between the front row (web site and content) and the rear row (web applications). In this case, working with Zope makes the configuration be easier because it has a product (VirtualHostMonster) that does part of the work; “A Virtual Host Monster’s only job is to change the URLs which your Zope objects generate. This allows you to customize the URLs that are displayed within your Zope application, allowing an object to have a different URL when accessed in a different way“. This is very useful because in other way we should use a third-party module called ProxyHtml. mod_proxy_html is used to rewrite HTML code, specially links. But in our case, we only need to use the rewrite module (mod_rewrite) and the proxy module (mod_proxy).

Let’e get to work:

To redirect an application from a public server to a private server (private server does not need to has an Apache running) we should add the following code in the virtual host configuration file (/etc/apache2/vhosts.d/myhost.conf).

RewriteRule ^/Intranet/Apps/app1(.*) http://private.com:8080/VirtualHostBase/http/<strong>%{HTTP_HOST}</strong>:80/DOM/VirtualHostRoot/Intranet/Apps/app1/$1 [L,P]
ProxyPassReverse / http://private.com:8080/VirtualHostBase/http/<strong>%{HTTP_HOST}</strong>:80/DOM/VirtualHostRoot/

Note than in the second part of both rules the URL is compliant with the VHM requirements. First we found the rewrite and redirection to the private server (http://private.com:8080/VirtualHostBase/) and after the /http/ we find the host (here I use the Apache’s variale HTTP_HOST) where the VirtualHostMonster will do the reverse proxy. %{HTTP_HOST} is an Apache’s variable, and we can use it here or directly the name of the public server.

And this is all 🙂 If you have any other experience or comment please don’t hesitate to comment here!

Fallo de seguridad en Twitter

Ahora mismo podemos leer en el blog de Twitter:

We’ve identified and are patching a XSS attack; as always, please message @safety if you have info regarding such an exploit. We expect the patch to be fully rolled out shortly and will update again when it is.

Hace un rato he podido ver varios tweets con código en lugar de texto, al estilo:

http://t.co/@"onmouseover="document.getElementById('status').value='RT X';$('.status-update-form').submit();"class="modal-overlay"/

Esperaremos a que los señores de Twitter arreglen el agujerillo de seguridad que alguien a descubierto!

Tetris y C ofuscado

Desde Bitelia podemos leer que “detrás” de Micro Tetris podemos encontrar las 19 líneas

long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i&lt;264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12&lt;1)printf("33[%d;%dH",(I=i)/12,i%12*2+28);printf(
"33[%dm  "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C&gt;1?atoi(V[1]):2);for(a=C&gt;2?V[2]:"jkl pq";i;i--)*n++=i&lt;
25||i%12&lt;2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("33[H33[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c&lt;0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j&lt;252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("33[H33[J33[0m%dn",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("33[H33[J33[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop 23;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %sn",w,l,getlogin());pclose(d);}

que en su día valieran para ganar el concurso de código C ofuscado. Según la publicación el código es perfectamente compilable y funciona correctamente.

Demuestran cómo interceptar llamadas GSM (2G) con una estación base casera

Armado con un equipamiento con un coste de 1.500 dólares compuesto por un ordenador, unas antenas y software libre, hizo que 30 teléfonos se conectaran a su sistema, y registró (y grabó) un total de 17 llamadas, tras deshabilitar el cifrado en la red.

Leer el post entero en BandaAncha: http://bandaancha.eu/articulo/7400/demuestran-interceptar-llamadas-gsm-estacion-base-casera

De vuelta a la senda

“Caminante, son tus huellas
el camino y nada más;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante no hay camino
sino estelas en la mar.”

Antonio Machado (1875 – 1939)

Vivir sin Facebook

Qué utilidad tiene una red social: ¿Tener 1.000 amigos? ¿Colgar 500 fotos?… Seguro que alguien le encuentra la utilidad, pero yo a día de hoy no la he encontrado. Si quiero hacer microblogging utilizo mi cuenta de Twitter, en lugar de cambiar mi estado para decir tonterías o suscribirme a grupos sin sentido. Si quiero tomar una cerveza con un amig@, cojo el teléfono e intento quedar sin enviar una invitación a un evento. Si quiero colgar fotos utilizo Flickr o Picassa, o monto una cena en casa para aburrir a mis amig@s – con fotos – mientras tomamos una cervezas y nos reímos. Si quiero mantener el contacto con colegas de profesión/estudios pues que mejor que LinkedIn. Y si tengo amig@s a 2.000 kilómetros y quiero saber de ell@s pues les envío una postal, una carta o les llamo por VoIP – Skype, etc -.

Con todo esto, hace unos meses desactive todas las notificaciones que genera Facebook para tener un poco de silencio. Y hoy he dicho adiós a “mis amig@s” en Facebook y he empezado el trámite, que concluirá en 14 días, para eliminar mi cuenta/perfil de Facebook.

Otro dato curioso es que las personas con las que más me relaciono, son las personas con las que menos contacto tengo por medio de una red social.