Ayer me llama mi novia diciendo, que ha visto en las noticias un bug en la playstation 3 y ha provado su consola (la gorda), y esta afectada. OMG!
El bug consiste en que en el algún momento entre el 28 de febrero y 1 de marzo todas las ps3 del mundo petaron. Es curioso que no importe la región, esto indica que es un bug del reloj interno que va con GMT +0.
Ayer sobre las 23:00 ya salimos del 29 bisiesto virtual en el que estaban todos los relojes internos del mundo y era muy posible que se arreglara el solo, sin parchear nada. Y así ha sido, las consolas han vuelto a funcionar hoy, simplemente corrigiendo el día.
El reloj interno es una marca de tiempo que se utiliza para cuando por ejemplo compras contenido DRM, como peliculas durante 24 horas. Se graba la marca de tiempo del reloj interno y se suma un offset de 24 horas, independientemente de la región. Sino se hiciera asi, podríamos quedarnos la película más de 24 de horas si estuvieramos retrasando el reloj continuamente.
Yo pienso que precisamente por eso, no se ha permitido conectar a PSN, además de por todas las incoherencias en logros, principalmente por evitar comprar contenido DRM en sistemas bugeados.
Le dejo a Sony una mini práctica que hice en primero para mostrar el calendario de cualquier año (>=1) o para para mostrar el mes actual:
program Actividad3; { Actividad 3 por Ricardo Marmolejo García 1º Ingienería Técnica Informática de Gestión } uses crt,dos; const ANCHO_COL = 4; var eleccion:integer; que_ano:integer; eleccion_str:string; que_ano_str:string; error:integer; { Funciones utilizadas en actividades anteriores: pintar_marco() mostrar_texto_centrado() pintar_creditos() } procedure pintar_marco(x1,y1,ancho,alto:byte); var x,y:byte; x2,y2:byte; const DOBLE_BARRA_VERTICAL=186; DOBLE_BARRA_HORIZONTAL=205; ESQUINA_SUPERIOR_IZQUIERDA=201; ESQUINA_SUPERIOR_DERECHA=187; ESQUINA_INFERIOR_IZQUIERDA=200; ESQUINA_INFERIOR_DERECHA=188; begin x2 := x1 + ancho; y2 := y1 + alto; for x := (x1+1) to (x2-1) do begin gotoxy(x,y1); write(chr(DOBLE_BARRA_HORIZONTAL)); gotoxy(x,y2); write(chr(DOBLE_BARRA_HORIZONTAL)); end; for y := (y1+1) to (y2-1) do begin gotoxy(x1,y); write(chr(DOBLE_BARRA_VERTICAL)); gotoxy(x2,y); write(chr(DOBLE_BARRA_VERTICAL)); end; gotoxy(x1,y1); write(chr(ESQUINA_SUPERIOR_IZQUIERDA)); gotoxy(x2,y1); write(chr(ESQUINA_SUPERIOR_DERECHA)); gotoxy(x1,y2); write(chr(ESQUINA_INFERIOR_IZQUIERDA)); gotoxy(x2,y2); write(chr(ESQUINA_INFERIOR_DERECHA)); end; procedure mostrar_texto_centrado(texto:string;altura:byte); var centro_pantalla,centro_texto:byte; const ANCHO_PANTALLA = 80; begin centro_pantalla := ANCHO_PANTALLA DIV 2; centro_texto := length(texto) DIV 2; gotoxy(centro_pantalla - centro_texto , altura); write(texto); end; procedure pintar_creditos(); begin textcolor(8); mostrar_texto_centrado('ACTIVIDAD 3',23); mostrar_texto_centrado(CONCAT('por Ricardo Marmolejo Garc',chr(161),'a - 2006'),24); textcolor(15); end; //////////////////////////////////////////////////////////////////////////////// function esBisiesto(ano:integer):boolean; { ENTRADA: año que queremos evaluar SALIDA: booleana OBJETIVO: Nos dice si un año es bisiesto o no } begin esBisiesto := (ano MOD 4 = 0) AND ((ano MOD 100 <> 0) OR (ano MOD 400 = 0)); end; function getLimiteDeEsteMes(mes:byte;ano:integer):byte; { ENTRADA: mes y ano SALIDA: Nos devuelve el número del último dia del mes OBJETIVO: Nos permite obtener el límite de cada mes } begin case mes of 1:getLimiteDeEsteMes := 31; 2:if(esBisiesto(ano)) then getLimiteDeEsteMes := 29 else getLimiteDeEsteMes := 28; 3:getLimiteDeEsteMes := 31; 4:getLimiteDeEsteMes := 30; 5:getLimiteDeEsteMes := 31; 6:getLimiteDeEsteMes := 30; 7:getLimiteDeEsteMes := 31; 8:getLimiteDeEsteMes := 31; 9:getLimiteDeEsteMes := 30; 10:getLimiteDeEsteMes := 31; 11:getLimiteDeEsteMes := 30; 12:getLimiteDeEsteMes := 31; end; end; procedure parchear_diasemana(VAR diasemana:WORD); { ENTRADA: dia de la semana OBJETIVO: si es domingo cambia el 0 a 7 quedando definido de 1-7 } begin if(diasemana = 0) then diasemana := 7; end; function imprimir_un_mes(INICIO,FIN,diasemana,mes:byte):byte; { ENTRADA: INICIO -----> inicio por el que comienza el mes , lo lógico es que sea 1 o el dia actual FIN --------> fin para el mes , suele venir dado por getLimiteDeEsteMes() diasemana --> dia de la semana del 1-7 en que comienza el mes mes --------> del 1-12 mes que se va a imprimir SALIDA: dia de la semana del siguiente mes , con esto si llamamos reiteradas veces a esta función encadenamos los meses y lo que hacemos es imprimir un calendario OBJETIVO: imprimir un mes } var i:byte; nombre_mes:string; ano_actual,mes_actual,dia_actual,diasemana_actual:word; function getNombreMes(mes:byte):string; { ENTRADA: mes del 1 al 12 SALIDA: Nombre en String del mes OBJETIVO: Crea una relación del número del mes con su nombre } begin case mes of 1:getNombreMes := 'Enero'; 2:getNombreMes := 'Febrero'; 3:getNombreMes := 'Marzo'; 4:getNombreMes := 'Abril'; 5:getNombreMes := 'Mayo'; 6:getNombreMes := 'Junio'; 7:getNombreMes := 'Julio'; 8:getNombreMes := 'Agosto'; 9:getNombreMes := 'Septiembre'; 10:getNombreMes := 'Octubre'; 11:getNombreMes := 'Noviembre'; 12:getNombreMes := 'Diciembre'; end; end; procedure mostrar_cabezera_de_un_mes(titulo_del_mes:string); { ENTRADA: Entregamos el String del mes OBJETIVO: Nos muestra una cabezera del mes } begin writeln; writeln; textcolor(14); writeln(UPCASE(titulo_del_mes):ANCHO_COL*5); textcolor(7); writeln; write(' L M X J V S'); textcolor(12); writeln(' D'); textcolor(15); writeln; end; procedure tabular_en_funcion_del_dia_de_la_semana(diasemana:byte); { ENTRADA: dia de la semana OBJETIVO: Nos tabula los meses para que cuadren los dias de la semana si empezamos en 1 (lunes) hay 0 tabulaciones si empezamos en 2 (martes) hay 1 tabulaciones si empezamos en 3 (miercoles) hay 2 tabulaciones si empezamos en 4 (jueves) hay 3 tabulaciones ... si empezamos en n hay (n-1) tabulaciones } var i:byte; begin for i:=1 to diasemana-1 do write('':ANCHO_COL); end; begin GetDate(ano_actual,mes_actual,dia_actual,diasemana_actual); parchear_diasemana(diasemana_actual); nombre_mes := getNombreMes(mes); mostrar_cabezera_de_un_mes(nombre_mes); tabular_en_funcion_del_dia_de_la_semana(diasemana); for i:=INICIO to FIN do begin textcolor(15); // aqui no miro año , asi que puede ocurrir que coloree el dia de un año que tenga el mismo dia de la semana if(i = dia_actual) AND (mes = mes_actual) AND (diasemana = diasemana_actual) then textcolor(10) else if(diasemana = 7) then textcolor(12); write(i:ANCHO_COL); if(diasemana = 7) then begin writeln; diasemana := 1; end else diasemana := succ(diasemana); end; imprimir_un_mes := diasemana; end; procedure imprimir_calendario(que_ano:integer); { ENTRADA: Año del calendario que quieres ver OBJETIVO: Mostrar el calendario } var i:byte; diasemana:byte; function CalcularPrimerDiaDeLaSemanaDeUnAno(ano:integer):byte; { Esta función me ha costado pensarlo y no se si esta bien , he supuesto lo siguiente : He observado que el 1 de enero del 2005 es Sabado(6) , el 1 de enero del 2006 es domingo (7), el 1 de enero del 2007 es lunes (1) , el 1 de enero del 2008(bisiesto) es miercoles(3) (se ha saltado el martes) de aqui deduzco una función recursiva. Supongo que el año 1 empieze en lunes ,(realmente empeze con 2006) El año 2 se define: si el año anterior a 2 es bisiesto entonces El año 2 sera el año anterior a 2 + 2 sino (no es bisiesto) El año sera el año anterior + 1 Para reiniciar al llegar a domindo uso MOD 7 Con esto consigo esta sucesión : 1 , 2 , 3 , 4 , 6 , 7 , 1 , 2 , 4 , 5 , 6 , 7 , 2 , 3 ... Consigo definir todos los dias de la semana de los unos de eneros del año 1 en adelante ENTRADA: año SALIDA: dia de la semana del año introducido OBJETIVO: Al imprimir el calendario de un año , para definir este año solo necesito saber el dia de la semana del 1 de enero } begin if (ano <= 1) then CalcularPrimerDiaDeLaSemanaDeUnAno := 1 else if(esBisiesto(ano-1)) then CalcularPrimerDiaDeLaSemanaDeUnAno := CalcularPrimerDiaDeLaSemanaDeUnAno(ano-1) + 2 else CalcularPrimerDiaDeLaSemanaDeUnAno := CalcularPrimerDiaDeLaSemanaDeUnAno(ano-1) + 1; if CalcularPrimerDiaDeLaSemanaDeUnAno > 7 then CalcularPrimerDiaDeLaSemanaDeUnAno := CalcularPrimerDiaDeLaSemanaDeUnAno MOD 7; end; procedure imprimir_cabezera_calendario(); { OBJETIVO : Imprime un Titulo en color , indicando el AÑO } begin writeln; textcolor(10); writeln(' A',chr(164),'o ',que_ano); textcolor(15); end; begin diasemana := CalcularPrimerDiaDeLaSemanaDeUnAno(que_ano); imprimir_cabezera_calendario(); for i:= 1 to 12 do diasemana := imprimir_un_mes(1,getLimiteDeEsteMes(i,que_ano),diasemana,i); end; procedure imprimir_desde_HOY_hasta_el_proximo_mes(); { OBJETIVO: Imprime un periodo aproximado de un mes , exactamente desde el dia X del mes actual hasta el dia X del siguiente mes } var ano,mes,dia,diasemana:word; function getProximoMes(mes:integer):byte; { ENTRADA : Mes de referencia SALIDA : Siguiente mes respecto al mes de referencia OBJETIVO : Saber el proximo mes } begin if(mes = 12) then getProximoMes := 1 else if(mes > 12) then getProximoMes := mes MOD 12 else getProximoMes := mes+1; end; begin GetDate(ano,mes,dia,diasemana); parchear_diasemana(diasemana); // imprimo el actual mes diasemana := imprimir_un_mes(dia, getLimiteDeEsteMes(mes,ano) , diasemana , mes ); // imprimo el proximo mes , sabiendo el dia de la semana que me devolvio la anterior imprimir_un_mes(1 , dia , diasemana , getProximoMes(mes)); end; begin repeat clrscr; textcolor(15); pintar_marco(10,5,60,15); gotoxy(15,8); writeln('1 . Imprimir un MES desde hoy hasta el proximo mes'); gotoxy(15,10); writeln('2 . Imprimir un calendario'); gotoxy(15,12); writeln('3 . Salir'); pintar_creditos(); gotoxy(15,16); write('Elije una opcion [1-3] : '); readln(eleccion_str); val(eleccion_str,eleccion,error); clrscr; case eleccion of 1: begin imprimir_desde_HOY_hasta_el_proximo_mes(); readkey; end; 2: begin writeln('Calendario del a',chr(164),'o ? (mayor o igual que a',chr(164),'o 1) : '); readln(que_ano_str); val(que_ano_str,que_ano,error); if(error = 1) OR (que_ano < 1) then que_ano := 1; clrscr; imprimir_calendario(que_ano); writeln;writeln; readkey; end; 3://salir else begin mostrar_texto_centrado('Opcion incorrecta',10); readkey; end; end; until(eleccion = 3); end.
Deja una respuesta