domingo, 25 de noviembre de 2012

Procesadores desde 1995 hasta 2009

Una de los componentes claves de un ordenador es el microprocesador que lleva, y al encontrar un viejo procesador AMD me ha parecido curioso compararlo con el procesador, también de AMD, que uso ahora.
Además explicaré mas o menos lo que significan algunos parametros para que cuando veamos la publicidad de algún procesador entender lo que vemos
El procesador antiguo es un Am5x86 que se vendió desde 1995 hasta 1999 y el moderno es un Phenom II 955 X4 Black edition que se empezaron a comercializar a principios de 2009 y aun están en venta.

Características técnicas:



Am5x86-P75
Phenom II X4 955
Velocidad de reloj
133 Mhz
3,2 Ghz
Nº de núcleos
1
4
Juego de instrucciones
x86
x86, x86-64, MMX, SSE, SSE2, SSE3, SSE4a
Memoria cache L1
16 KB
64KB para datos + 64KB para instrucciones
Memoria cache L2
Depende de la placa base
512KB por cada núcleo (2MB)
Memoria cache L3
No tiene
6MB
 
Lo primero es ver que de un núcleo pasamos a 4, lo que quiere decir que de realizar una sola operación aritmética (Sumas, restas, multiplicaciones, etc) podemos hacer 4 a la vez.
Un dato interesante es ver la velocidad de reloj, de 133 Mhz a 3,2 Ghz lo que se traduce en que pasamos de ejecutar 133 millones de operaciones básicas (Operaciones aritmeticas, movimiento de un dato, etc) por segundo a 3200 millones de operaciones básicas por segundo. Y esto multiplicado por los 4 núcleos da un total de 14800 millones de operaciones básicas por segundo. Necesitariamos unos 111 Am5x86 para igualar al Phenom. (Aviso, no podemos usar unicamente la velocidad de reloj como dato definitivo para decir que un procesador es mejor que otro).

La ampliación del juego de instrucciones es un dato de interes ya que vemos que el del Phenom incluye el del Am5x86 y algunos juegos de instrucciones más, esto quiere decir que un programa escrito para el procesador antiguo deberia de funcionar en el moderno. Ya que el Phenom conoce las instrucciones  del juego x86 y las puede ejecutar.

Por ultimo tenemos la memoria cache, que es la memoria rápida del procesador y mejora mucho el rendimiento de un procesador. Como vemos este tipo de memoria ha tenido una gran expansión, y de tener 16KB a tener 8Mb y un poco más.


sábado, 24 de noviembre de 2012

Probamos Firefox OS

Aunque parece que el mercado de los smartphone en cuanto a software se refiere esta dominado por Apple con IOS, por Google con Android y en menor medida Microsoft con Windows Phone, están empezando a desarrollarse nuevos sistemas operactivos para estos dispositivos, como es el caso de Firefox OS o de Sailfish OS desarrollado por Jolla.

Aunque aún se encuentra en fases tempranas de su desarrollo, podemos instalar en nuestro ordenador, como un complemento de Firefox, un pequeño simulador que podemos descargar desde este enlace.
Firefox OS esta basado en los estandares de la Web, HTML, CSS y Javascript. Para sus desarrolladores esto es un punto importante ya que así pueden crear un sistema 100% abierto, al contrario que por ejemplo IOS que es 100% cerrado.
A veces el simualdor deja de funcionar correctamente y presenta algunos errores que podemos ir viendo si activamos la opción "Console"

Cuando iniciamos el simulador nos sale esta pantalla:
(En mi opinión bastante mejorable)
Desde aqui podemos movernos por los distintos menus como lo hariamos con cualquier teléfono actual
Podemos ver las opciones que tiene aunque muchas aun no funcionan en este simulador,  pero son las normales en estos dispositivos, administración de redes, personalización y estado del dispositivo,teclados, etc.
Firefox OS cuenta con su propio MarketPlace, del que podemos bajarnos algunas apps y probarlas, como la de twitter por ejemplo.
 La app de twitter en principio funciona bien y permite enviar tweets.

Como el producto estrella de Mozilla es el navegador Firefox, es este mismo navegador el que trae Firefox OS. 

 Aun no esta pulido al 100% ya que por ejemplo con la web de google o youtube adapta la pantalla a un smartphone, pero con este blog no.

Aunque a grandes rasgos ofrece lo mismo que la competencia, aplicaciones para música, redes sociales, navegador, fotos, etc y la interfaz es tambien parecida a lo ya visto, esperemos que en futuras versiones mejores muchas cosas, ya que lo que podemos ver es una versión alfa, y que finalmente Firefox OS funcione de manera fluida en dispositivos reales.


lunes, 19 de noviembre de 2012

Windows - Habilitar puerto IR para usar mandos a distancia para PC

Si nuestro ordenador cuenta con un puerto infrarojo para que usemos mandos a distancia y el ordenador no parece responder al mando aquí muestro una posible solución.

Debemos abrir el registro de windows (Pulsamos Inicio y buscamos regedit)

Una vez abierto buscamos esta carpeta "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HidIr\Remotes\745a17a0-74d3-11d0-b6fe-00a0c90f57da"

Lo primero es buscar el registro EnableDebounce y ver que tenga de valor 1, vereis una cosa asi 0x0000001 (1). El 1 significa que lo teneis habilitado, si pone (0) lo teneis desactivado. Para activarlo si es necesario le dais click derecho al registro y le dais a modificar valor para ponerle un 1.

El siguiente y ultimo registro que hay que mirar es el CodeSetNum0, este registro puede tener un valor de 0 a 8.

De 1 a 8 significa que codificais un mando en particular con uno de los valores anteriores, de forma que el PC solo responderá a ese mando en concreto, si poneis un 0 responderá a cualquier mando.

Para asignar un valor en particular hay que mantener pulsado el botón del menu DVD y luego pulsar un número del 1 al 8 durante 5 segundos, luego poneis ese mismo número en el valor del registro y guardais.

Si no tiene números o teneis varios mandos poned 0 en el registro.

Si no teneis el registro creadlo, click derecho --> nuevo --> Valor DWORD (32 bits), con nombre CodeSetNum0, valor el que querais de los anteriores y guardar.



Una vez hecho esto buscad estos registros:

-CodeSetNum1

-CodeSetNum2

-CodeSetNum3

    

Y si los teneis eliminadlos.

Una vez hecho todo reiniciad el equipo y tendreis los mandos funcionando correctamente.

sábado, 17 de noviembre de 2012

Programación - Programas de practica

Hoy muestro la solución de uno de los problemas de practica de la web codechef.com, titulado Closind the Tweets.
Aqui el enunciado:

Little kids, Jack and Evan like playing their favorite game Glass-and-Stone. Today they want to play something new and came across Twitter on their father's laptop.
They saw it for the first time but were already getting bored to see a bunch of sentences having at most 140 characters each. The only thing they liked to play with it is, closing and opening tweets.
There are N tweets on the page and each tweet can be opened by clicking on it, to see some statistics related to that tweet. Initially all the tweets are closed. Clicking on an open tweet closes it and clicking on a closed tweet opens it. There is also a button to close all the open tweets. Given a sequence of K clicks by Jack, Evan has to guess the total number of open tweets just after each click. Please help Evan in this game. 

Código:
#include &ltcstdlib>
#include &ltiostream>
#include &ltstdio.h>
#include &ltcstring>
#include &ltmath.h>
using namespace std;

inline void fastRead_string(string *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a="";
     while (c>33)
     {
         *a+=c;
         c=getchar();
     }
}
inline void fastRead(int *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a=0;
     while (c>33)
     {
         *a=*a*10+c-'0';
         c=getchar();
     }
}
int main(int argc, char *argv[])
{
    int N,K;
    fastRead(&N);
    fastRead(&K);
    int tweets[N];
    memset(tweets, 0, sizeof(tweets));
    int click_tweet;
    int tweet_open=0;
    string read;
    for(int i=0; i<K; i++){
        fastRead_string(&read);
        if(read[read.length()-1] == 'L'){
            memset(tweets, 0, sizeof(tweets));
            printf("0\n");
            tweet_open=0;
        }else{
            fastRead(&click_tweet);
            if(tweets[click_tweet-1] == 1){
                tweets[click_tweet-1] = 0;
                tweet_open--;
                }else{
                    tweets[click_tweet-1] = 1;
                    tweet_open++;
                }
                printf("%d\n",tweet_open); 
        }
    }

    return EXIT_SUCCESS;
}



La solución tarda 0.03 segundos, quedando la 144 de 335, podría quedar mejor de entregarlo antes ya que los programas se ordenan por el tiempo que tardan y si hay empates el ultimo en subirse queda al final.

jueves, 15 de noviembre de 2012

Seguridad - Como detectar posibles correos fraudulentos

A raíz de un tweet de la policía nacional (@policia), en el que explicaban que un determinado tipo de correo electrónico es potencialmente un correo que esconde algún tipo de software malintencionado, he decido hacer una pequeña entrada donde explicar este tipo de correos y otros que nos puedan llegar a nuestro correo.
Primero veamos si el remitente es alguien que conocemos.
El primer caso es que señaló en twitter la policia, si nos llega un correo de este estilo escrito en inglés:

Hi, ok, no problem! 
(Enlace) 
Mon, 16 Jan 2012 1:40:51
"One-eighth of an inch equals one foot." (c) Rumaldo websiteinin

O este:


Dear Sir, 
(Enlace)
 Mon, 16 Jan 2012 1:41:14

 "But young Edison was cited to trial, for gross neglect of duty, by the general manager." (c) ASHLEY wha7a785

 O incluso en español:

Hola


Me quede impresionado ayer y

deberías leer mi mensaje en la página de abajo. He utilizado esta página a propósito para mandártelo para asegurarme de que sólo nosotros somos capaces de verlo.


La página está aquí: (Enlace)


¿Puedes contestar por favor?
 
Y como estos muchos más ejemplos, podemos detectar que son falsos si el remitente no suele escribir así al contactar con nosotros o directemente no conoce el idioma en el que recibimos el mensaje, en este caso inglés, o de conocerlo no lo utilizaría para mandarnos un mensaje.Por supuesto el enlace que nos pone que yo he omitido, lleva a algún tipo de software malintencionado.
Si nos llegan mensajes de este tipo y no sabemos quien es el remitente mejor no abrir el enlace ya que puede ser una cuenta que se dedica a enviar correo spam.

Correos remitidos supuestamente por bancos o por otras empresas o sitios donde tenemos cuentas:

Antes de ver estos correos quiero explicar una cosa, vamos a ver de que se compone una dirección de email.
En pocas palabras una dirección ejemplo@direccion.es se divide en nombre de usuario (ejemplo) y dominio (direccion.es).
Por esto si queremos ver el correo de una cuenta ejemplo@gmail.com nos vamos a la web www.gmail.com
Una vez dicho esto si vemos que un correo supuestamente de nuestro banco:

Le informamos que con el objetivo de brindarle un mejor servicio, hemos iniciado
un amplio proceso de actualización de datos de nuestros clientes.
Banco XY considera que es muy importante contar con la información
actualizada de sus clientes.

Para actualizar sus datos, solo es necesario que usted llene y nos entregue
un formulario a través de nuestro sistema en linea haciendo clic en el
siguiente enlace:


(Enlace con texto legítimo)



Le recordamos que el sistema en linea de Banco XY para su mayor seguridad
controla intentos fallidos de ingreso a nuestro sistema. De exceder el numero
máximo de intentos permitidos le sera bloqueada el acceso.

Departamento de Servicios
Banco XY 2012.


©
Banco XY  2012
Banco XY - 2012

Si vemos la dirección del remitente es un tanto extraña, por ejemplo servicios-bancoXY@www4.dominio1.domino2.net.es o simillares, es un correo que es fraudulento, de hecho los clientes de correos marcan este tipo de mensajes como potencialmente fraudulentos. Si recibimos mensajes de una web o empresa en la que tenemos alguna cuenta lo más normal es recibir un mensaje donde el dominio es la misma dirección que la dirección web de la empresa.
Además estos mensajes que son más sofisticados tienen enlaces que aparentemente son validos, con esto quiero decir que aunque el texto del enlace parezca real el enlace no lo es, esto se hace usando código HTML o al crear enlaces con los editores que te permiten editar el texto del enlace y hacer un enlace www.wikipedia.org y que en realidad se direccione a la web de Google.

Con esto mismo nosotros podemos ser nuestro propio filtro para detectar correo no deseado, aunque existen herramientas como Spam filter que dan unos resultados bastante fiables en cuanto a detección y eliminación de correo basura.

Por último quiero recordar que una empresa o una web NUNCA nos van a pedir nuestra contraseña.

lunes, 12 de noviembre de 2012

Programación - Codechef November Challenge 2012

Ha terminado el concurso de diciembre, y aquí dejo la solución a uno de los problemas planteados:

Coin Flip

El enunciado es este:


Little Elephant was fond of inventing new games. After a lot of research, Little Elephant came to know that most of the animals in the forest were showing less interest to play the multi-player games.Little Elephant had started to invent single player games, and succeeded in inventing the new single player game named COIN FLIP.
In this game the player will use N coins numbered from 1 to N, and all the coins will be facing in "Same direction" (Either Head or Tail),which will be decided by the player before starting of the game.
The player needs to play N rounds.In the k-th round the player will flip the face of the all coins whose number is less than or equal to k. That is, the face of coin i will be reversed, from Head to Tail, or, from Tail to Head, for ik.
Elephant needs to guess the total number of coins showing a particular face after playing N rounds. Elephant really becomes quite fond of this game COIN FLIP, so Elephant plays G times. Please help the Elephant to find out the answer.

Podeis encontrar el enunciado completo aqui: Enunciado

La solución que he propuesto es la siguiente:
#include &ltcstdlib>
#include &ltstdio.h>
#include &ltcstdio>
using namespace std;

inline void fastRead(int *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a=0;
     while (c>33)
     {
         *a=*a*10+c-'0';
         c=getchar();
     }
}
    
int main(int argc, char *argv[])
{
    int T, G;
    fastRead(&T);
    for(int k=0; k<T; k++){
    fastRead(&G);
    int games[G][3]; 
    for(int i=0; i<G;i++){
        for(int j=0; j<3;j++){
        fastRead(&games[i][j]);
    }
        if(games[i][1]%2 == 0){ 
                printf("%d\n", games[i][1]/2);
        }else{
            if(games[i][0] == games[i][2]){ 
               printf("%d\n", games[i][1]/2);
            }else{printf("%d\n", (games[i][1]/2)+1);}
        }

}  
}

    return 0;
}


Esta solución ha quedado la 129 de 2192 soluciones correctas. En comparación con la mejor solución, yo tengo una peor I/O, y aunque los dos nos hemos dado cuenta de que la clave era la comparación de los números de la entrada, el otro programador se ahorra una comparación que yo si hago, que posiblemente no sea necesaria. Para practicar de cara al concurso de diciembre intentaré hacer algunas practicas que hay en la web y las subire si salen bien.

sábado, 10 de noviembre de 2012

Windows - Cambios de volumen por dispositivo USB

Si os pasa que cuando conectais un dispositivo USB al PC el volumen de ciertos programas baja, Windows media, Itunes, flash player, etc, aqui está la solución.

-Accedemos a Panel de control > Sonido.
-En la nueva ventana, seleccionamos "Comunicaciones"
-Y marcamos la opción "No hacer nada"

De está forma no nos volverá a modificar el volumen

martes, 6 de noviembre de 2012

Programación - Lectura de ficheros en Java

Seguimos con el tema de la entrada/salida, esta vez con lectura de ficheros en Java.
Este pequeño trozo de código se encarga de leer un fichero que contenga números separados por uno o varios caracteres: 1,2,3 ó 4 5 6 ó 7@8@9 ó 1asd4asd7asd9 y genera un array con los números leidos

El código es el que sigue:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;


 public static  int[] leer(String a, String d){
 BufferedReader br = null;
 int[] vector = {};
 String[] partes = null;
 try {

  String sCurrentLine;
  
  String delimiter = d;
  br = new BufferedReader(new FileReader(a));

  while ((sCurrentLine = br.readLine()) != null) {
   partes = sCurrentLine.split(delimiter);
   int[] aux2 = new int[vector.length];
   System.arraycopy(vector, 0, aux2, 0, vector.length);
   vector = new int[partes.length+aux2.length];
   int [] aux = new int[partes.length];
   for(int i=0; i< partes.length; i++){
    aux[i] = Integer.parseInt(partes[i]);
   }
   System.arraycopy(aux2, 0, vector, 0, aux2.length);
   System.arraycopy(aux, 0, vector, aux2.length, aux.length);
  }

 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  try {
   if (br != null)br.close();
  } catch (IOException ex) {
   ex.printStackTrace();
  }
 } 
 return vector; 
}
 
 
Para que funcione le debeis de pasar la ruta al fichero que vais a leer, y entre comillas la cadeda delimitadora ";", "asd", etc.
Edit:Se ha modificado el código para que lea el fichero entero y no solo la última línea en caso de tener varias líneas con números.

lunes, 5 de noviembre de 2012

La despedida de Messenger

Los correos que vaticinaban la muerte de Messenger hoy tienen razón.
Hoy se ha anunciado que Microsoft eliminará su servicio de mensajeria instantánea en favor de Skype.



Aunque esto no está confirmado por parte de Microsoft, la integración de Skype, propiedad de Microsoft desde mayo del 2011. dentro de Windows 8 hace que las funciones que realiza Messenger queden cubiertas por Skype. 
Esta eliminación de Messenger puede ser debida, además de lo anterior, a que su número de usuarios ha descendido debido a la aparición de maneras alternativas para chatear como el Chat de Facebook o Whatsapp, la existencia de numerosas cuentas que se utilizaban con fines fraudulentos o la poca respuesta obtenida por messenger en su integración en la consola de Microsoft Xbox 360.


domingo, 4 de noviembre de 2012

Programación - Fast I/O

Para los que participen en concursos de programación con límite de tiempo les voy a dar un pequeño código que les puede ser útil.

Es código que vale para C/C++ y mejora la lectura de datos desde entrada estandar.

Si estamos en C++ lo normal es usar "cin" y en C "scanf". Pues existe una forma de hacer esa lectura aun más rápido, que es usar estos trozos de código:

Nota: Cuando aparece &lt, equivale a <

Para leer números enteros:
inline void fastRead(int *a){
     register char c=0;
     while (c &lt 33) c=getchar();
     *a=0;
     while (c>33)
     {
         *a=*a*10+c-'0';
         c=getchar();
     }
}

Como me han hecho falta para algunos problemas, he creado versiones de este mismo código para leer char, strings y demás, aquí las dejo:
Para leer un char:
inline void fastRead_char(char *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a=c;
}

Para leer un int seguido de un char que no se quiere tener en cuenta (Ej. 12$, 90%, etc):
inline void fastRead_int(int *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a=0;
     while (c> 47 && c &lt 58)
     {
         *a=*a*10+c-'0';
         c=getchar();
     }
}

Para leer un string (C++):
inline void fastRead_string(string *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a="";
     while (c>33)
     {
         *a+=c;
         c=getchar();
     }
}

Para leer un string que contenga espacios (C++) (Ej. Hola mundo, en el anterior solo guardaria "Hola")
inline void fastRead_string2(string *a){
     register char c=0;
     while (c&lt33) c=getchar();
     *a="";
     while (c>31)
     {
         *a+=c;
         c=getchar();
     }
}

Estos códigos se pueden mejorar utilizando getchar_unlocked() en vez de getchar(), probadlo ya que a mi me dice que no encuentra "getchar_unlocked()"

sábado, 3 de noviembre de 2012

¿Concursos de informática?

Esta entrada va a tratar sobre los concursos de informática, en estos concursos se participia resolviendo problemas, de programación, de inteligencia artificial, de hacking, etc.

Se pueden encontrar concursos de muchos niveles de dificultad, no hace falta ser experto. Y como todo concurso la mayoria tiene un premio, muchas veces económico de hasta 10,000$ los más grandes.

Pueden ser un punto de partida para los aficionados a la programación de resolver cosas con un cierto nivel de complejidad. Ya que no es solo resolver el problema, ya que muchas veces hay límite en el tiempo de respuesta o se nos van a dar unos datos de entrada muy grandes y el programa no debe fallar.

Para los interesados dejo los enlaces, avisaré por twitter de los nuevos concursos o fechas.


Programación
Codechef (Concursos mensuales) http://www.codechef.com/
Google Code Jam http://code.google.com/codejam
Challenge24 http://ch24.org/
Programacion en matlab http://www.mathworks.com/matlabcentral/contest/
Tuenti Contest https://contest.tuenti.net/
Inteligencia Artificial
AI Challenge http://aichallenge.org/
Mario AI Championship http://www.marioai.org/
Ms Pac-Man vs Ghosts League http://www.pacman-vs-ghosts.net/
Hacking
Facebook Hacker Cup https://www.facebook.com/hackercup/

También compartiré los trucos que me encuentre que puedan ser utiles para los concursos.
Saludos y si os animais no olvideos contar como habeis quedado

jueves, 1 de noviembre de 2012

Testeo de fuente de alimentación - Prueba del clip

Cuando un ordenador deja de funcionar la lista de sospechosos, y puede llegar a ser muy larga. Frente a esto, podemos intentar descubrir la culpable.

En este caso vamos a hacer una prueba por la que podemos asegurar la inocencia o culpabilidad de nuestra fuente de alimentación en el problema que nos ocupa.

Para esta prueba vamos a necesitar tres cosas:
Fuente de alimentación
Un clip
Un ventilador (Opcional)













Una vez tenemos todo, lo primero es coger el clip y ponerlo en forma de U, como el la foto que está un poco más arriba.

AVISO: Desconectar la fuente de la pared antes de empezar a tocar, a ver si al final vamos a tener más disgustos.

Ahora sacamos la fuente de la caja, para más comodidad, o por lo menos desconectar todos los cables que salen de ella.

Buscad el conector de 24 pines, tiene esta pinta.


De todos estos cables nos fijamos en el cable verde, no hay perdida pues solo hay uno de este color.
Ahora buscamos el clip en forma de U y lo ponemos de forma que conectamos el cable verde con uno de los cables negros, no importa cual. Nos queda tal que así.


Hacemos esto ya que el cable verde es la señal "PS_ON", que usa la placa base para decirle a la fuente que se ponga en marcha cuando presionamos el botón de encendido de nuestro PC. Los cables negros son tierra.
Si tenemos el ventilador, un ventilador con conexión MOLEX de 4 pines (Se conecta entre la fuente y un dispositivo como un disco duro, o directamente a la fuente) lo conectamos a la fuente.


Ahora nos aseguramos de que la fuente tiene su interruptor en la posición de apagado. Con la O (Off) presionada.


Ahora conectamos el cable a la pared y a la fuente, después presionamos el interruptor de la fuente de alimentación.


Una vez hecho esto la fuente deberia de empezar a funcionar si no tiene ningún problema. Si no funciona o lo hace de manera irregular debemos ir pensando en cambiar de fuente o tramitar la garantía.

Los problemas que nos pueden hacer sosopechar de la fuente, son aquellos problemas relacionados con la falta de energía, que el PC no encienda o que encienda pero que a los pocos segundos se apague, que ante una situacion de carga para el PC como puede ser jugar, o renderizar un video grande, etc. 
Como estos problemas pueden tener su origen en varios puntos, con este test podemos ver si la fuente de alimentación es la causante del problema.

Un saludo y hasta la siguiente entrada.