Mais um blog inútil.

Outubro 13, 2017

Novo Speedtester da NOS

Filed under: Drama,Fail,Windows — falso @ 22:49

Ora viva,

Eu recentemente tenho tido vários problemas com as internets da NOS à noite, e isso tem me feito andar a fazer diversos telefonemas a reclamar e a ser sempre obrigado a correr o speedtester deles.

Até há poucos dias era uma cena normal.js que funcionava na maioria dos browsers, e uma applet JEWVA para o IE com extra faggotry. Mas agora decidiram INOVAR, e quando se inicia o teste, força o download de um .exe que supostamente tens que correr para fazer o speedtest, se não tiveres Windoze, azarito, não tens direito a te queixares com problemas de internets.

Bem, um .exe vindo da NOS não me parece uma boa ideia, então primeiro decidi enviar o executável para o virustotal para fazer scans, e o resultado foi:

Achei estranho como é normal, e ainda mais estranho eles não terem visto isto antes. Bora la então tentar ver o que isto faz. Vi que o executável era .NET portanto fui procurar um .NET decompiler, usei o ILSpy e vi o seguinte:

Achei que aquela string era um argumento para qualquer coisa Windoze based devido aos /qqcoisa, então googlando pela string achei este artigo, que explica que isto é usado para correr uma aplicação e apaga-la quando ela termina.

Passando para o MainForm, vi o seguinte:

Que mostra que tem outro executável embutido nele, extrai-o e executa, reparei também que no site da NOS, cada utilizador que faz download do speedtest, o ficheiro tem um nome diferente, chama-se "xperienceApp_XXXXXXXXXXXXXXXXXXXXX.exe" sendo o X diferente para cada utilizador ou cada IP da NOS que faz download do ficheiro, ainda não entendi bem isso, mas pelo que entendi esse ID é que depois é utilizado quando se faz o upload do resultado dos testes, portanto deve ser possível aldrabar isto :-P

Fui então tentar sacar os executaveis embutidos, e lembrei-me logo do binwalk, o resultado é o seguinte:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)
...
507768        0x7BF78         Microsoft executable, portable (PE)
...
887308        0xD8A0C         Microsoft executable, portable (PE)
...

Mandei um binwalk -D 'microsoft:exe' xperienceApp_XXX.exe e passei ter mais dois executáveis gulosos. Então siga aprender a usar o radare2 só para dar numa de elite!

O primeiro executável, nas strings tem referencias ao curl, portanto faz requests para algum lado :-)

Depois fui cuscar o main, como vi antes, parece ir buscar um id, que pelos vistos é um ticket number ao NOME do executável, não ponho o dissassembly todo porque são mil linhas:

push str.xperienceApp       ; 0x457728 ; "xperienceApp"
...
push 0x457738               ; "_"
...
push 0x457740               ; ".exe"
...
push 0x456c68               ; "_"
...
push str.Ticket_Number:__s_n ; 0x456c6c ; "Ticket Number: %s\n"
...
push str.Wrong_Application_Name__Please_download_the_application_again__n ; 0x456c80 ; "Wrong Application Name (Please download the application again)\n"

Mais para baixo também tem umas strings gulosas:

push 0x456e50               ; "Kanguru.exe"
...
push 0x456e5c               ; "UIMain.exe"
...
push 0x456e68               ; "Optimus Kanguru.exe"
...
push 0x456e7c               ; "MphoneTools.exe"
...
push 0x456e8c               ; "AT+CIMI\r"
...
push 0x456edc               ; "AT+CGSN\r"
...
push str.IMEI               ; 0x456e98 ; "IMEI"
...
push str.Exception_when_try_to_open_COM_Port_n ; 0x456ee8 ; "Exception when try to open COM Port\n"

Diria que estão a procurar se esses executáveis estão a correr, que são clientes de modems 3G, e a ligar-se ao modem, a sacar a rede a que está ligada, o serial number e o IMEI, vai-se la entender porque é que o speedtest precisa disto tudo :-)

Mais para baixo, faz downloads em modo sequencial e paralelo via curl, e envia os dados para um servidor, por HTTP, porque HTTPS é coisa do futuro. E não tem mais nada.

Seguindo para o próximo, cuscando as strings, também usa o curl, porque raio é preciso outro programa?

string=\pcdiag_tempFile.txt
string=wmic os get freephysicalmemory
string=%s > %s%s
string=wmic os get caption
string= nicconfig where IPEnabled=True get Caption /format:table
string=netsh wlan show interfaces
string= PROCESS get name / Format:table
string=wmic /output:%s%s %s
string=netsh advfirewall show allprofiles state
string=wmic NIC where NetEnabled=true get Name, Speed | find "%s"
string=results_content: %s \n
string=PC Results Sended\n

(SENDED LOL)

Pelo que vi no dissassembly deste, tem as mesmas funcionalidades do anterior, mas tem uma parte EXTRA chamada "PC_Diagnostic" que cria um ficheiro temporário, e corre uma carrada de comandos do Windoze, manda o output para la, e provavelmente depois envia esse ficheiro para o servidor deles, novamente por http.

* Vê a lista dos processos que estão a correr;
* Corre o wmic para obter montes de informações do PC e dos interfaces de rede;
* Apaga a KEY "ProxyBypass" no registry em HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP e em "HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP";
* Le o "HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\APP PATHS\CMD.EXE" que contem uma lista de apps instaladas;

Bem, para poder reclamar sem correr esta sida no meu PC, decidi sacar uma VM com o Windoze, e testar isto lá.

Pelos vistos analisar o executável no virustotal foi o que chegou para ficar blacklisted no Windoze Defender. Que LOLocausto. Então siga desactivar o Windoze Defender para poder correr isto numa VM para poder ligar para la a reclamar que tenho a net lixada...

Após estar ali um tempo a engonhar, a app saiu, o browser ficou à espera, e acabou por dar esse erro.

O pessoal que só usa Linux ou OSX deve também estar fascinado com esta mudança, não consigo entender como em 2017, onde existem mil ferramentas em JS pro browser, fds... o speedtest.net usa js e html5 e funciona bem, não entendo como pareceu bem na cabeça de alguém obrigar as pessoas a sacar um executável para correr.

Entendo que queiram sacar essas informações ao utilizador NORMIE para ajudar a diagnosticar problemas que possam não estar relacionados com o serviço deles, mas ao menos separavam isso numa ferramenta diferente, não punham isso no speedtest.
E também convinha fazerem isto de uma forma menos SHADY porque esconder executáveis dentro de outro executável é logo meio caminho andado para bater com os dentes no anti vírus.

Sinceramente agora nem sei o que fazer, porque nem consigo correr o speedtest para reclamar do serviço, portanto decidi vir blogar sobre isso.

Edit: Pelos vistos eles já adicionaram o tester antigo novamente ao site, portanto já não devo pelo menos ser obrigado a correr isto :-)

Edit2: Já rolaram cabeças em algum lado, e o teste já não está online, já voltou o antigo a ser o default.

Março 22, 2015

uSched

Filed under: Coding,Linux — thread @ 1:26

Caros blolistas,

Venho aqui apresentar uma inutilidade que recentemente saiu da pasta Lixo/ para o GitHub e que tem sofrido desde então alguns commits que tentam tornar a coisa um pouco mais útil, dentro dos limites da inutilidade.

Falo-vos do uSched: http://www.usched.org

Para quem não tem acompanhado o #C da PTnet e se deparar com tal coisa, a tendencia será fazer scroll de cima abaixo no site e fechar assim que o footer é atingido... No entanto, venho chamar a vossa atenção para algumas coisas em que isto "até pode dar jeito".

A ideia não é substituir o 'cron', nem mesmo o 'at', mas sim ter uma ferramenta que permita agendar a execução de comandos via command-line, ou integrar tais agendamentos noutras aplicações que necessitem de o fazer por as mais variadissimas razões, já que o uSched nos oferece uma serie de bindings para as mais variadas linguagens que por aí andam (excepto Perl... Ruby... por favor... :P... vá... serão suportadas em breve também, não comecem já a chorar).

Indo agora de encontro a alguns exemplos práticos, imaginem que se pretende obter raw data de partições de 30 em 30 segundos:

 $ usc run 'df >> /tmp/df.out' now then every 30 seconds

Claro está que isto também poderia ser feito com um simples while e um sleep na propria shell... mas envolveria muito mais que isso, pois teria que existir a preocupação de: E se a máquina rebootar? (toca a criar um script pra colocar, por exemplo, no rc.local), E se eu quiser que isto pare em determinada hora ou dia ou ano? Algo que se pode resolver com:

 $ usc run 'df >> /tmp/df.out' now then every 30 seconds until to date 2015-04-15

Então e se pretender fazer tal coisa numa máquina remota?

 $ usc -H remote.example.com -U username run 'df >> /tmp/df.out' now then every 30 seconds
 Password:
 $

E dizem-me voces: "E porque não usar SSH?"
Bom... seria uma boa solução no caso de command-line requests... mas se o uSched não suportasse client/server nativamente, seria um problema quando quisessemos integrar tais pedidos remotos em aplicações que façam uso da sua client library... ou seja:

  $usc = new Usched();
  
  $usc->SetHostname("remote.example.com");
  $usc->SetPort("7600");
  $usc->SetUsername("username");
  $usc->SetPassword("password");

  $usc->Request("run 'wget http://myapp.com/run_this_every_day.php' on time 01:00:00 then every 1 day");

As opções inúteis são infinitas, até mesmo criar uma avorezinha over time poderia ser uma boa intuilidade. Todos os dias veriamos o crescimento da mesma!

Bom, sem querer extender muito mais este post, recomendo-vos que dêm uma vista de olhos (com olhos de ver) na home page e github do projecto e caso tenham ideias e/ou queiram contribuir com algo, ficarei muito grato.

Saudações a todos.

Fevereiro 13, 2015

Arvorezinha em R

Filed under: Arvorezinha,Coding — joli @ 12:03

Viva,

Para celebrarem o Carnaval em força, e também porque me deram acesso ;) resolvi trazer-vos uma implementação da arvorezinha em R.
Para quem não sabe, e deixando de lado pormenores técnicos que não interessam nem ao menino jesus, R foi criado por um Cavalheiro no cu do mundo. Sim, na Nova Zelândia!

Apraz-me dizer que R é aprovada pelo RMS, pelo que o seu uso não interfere com a liberdade das pessoas.

Sem mais delonga deixem-me brindar-vos com a minha implementação.

littletree <- function(len) {
  for(i in 1:len) {
    y <- rep(' ',len-i)            
    z <- paste(c(y, rep('*',(2*i)-1)), sep="", collapse = "")
    print(z)       
  }
  
  lll <- (len * 2) - 1;
  empty <- ifelse(len %% 2 == 0, (lll/4)+1, (lll/4))
  stern <- ifelse(len %% 2 == 0, (lll/2), (lll/2)+1)
  for(x in 1:as.integer(len/2)) {
    y <- rep(' ', empty)
    z <- paste(c(y, rep('#',stern)), sep="", collapse = "")
    print(z)
  }    
}

Como ver uma arvorezinha?

  • Instalar o R (O, pois refiro-me ao ambiente e não à linguagem de programação)
  • Fazer source da função.
  • Executar a função (mais…)

Janeiro 20, 2015

Arvorezinha 2.0 em JavaScript

Filed under: Arvorezinha,Coding,Uncategorized — neofreak @ 18:06
                    _..._
 Tired of using  .-'     '-.  Are you still using
 different cli  /     _    _\  that incoherent, bug
 ent and serv  /':.  (o)  /__)  ridden, insecure mess
 er languages /':. .,_    |  | that is PHP?
 on all your |': ; /  \   /_/
 web         /  ;  `"`"    }  Would you like to use a
 projects?  ; ':.,         {  modern, general-purpose,
           /      ;        }  web-scale, optimized,
 +-----------------------+ {  object-oriented, scalable,
 |      TESTEMONIALS     |`\  dependency-free, modular,
 | "I installed nodeJS.  |  ; agnostic, baked-in, light-
 | Five seconds of tink- |  | weight, component framework,
 | ering later I solved  |  ; responsive, event-driven,
 | world hunger, effectu |  | non-blocking i/o, efficent,
 | ated peace in the mid |  | perfect for data-intensive
 | dle east and started  |  / an,--.........,-time appli-
 | the first manned miss | ;  .'           -='.sy building
 | ion to jupiter while  |/  .\               'eautiful
 | holding a cigar in one|     \             .'pplications
 | hand and a death-ray  |\~"`_ \          .'gram like its
 | in the other."        ||   `  \      ..'rock out with
 +-----------------------+|  =="''\.==''your cock out
    ~ /; ;/=""      |`| |`|  `
    ~..==`     \\   |`| / /=="` Now You Can With Node.JS!
     ~` ~      /,\ / /= )")     The Cancer of Javascript
    ~ ~~         _')")          has just spread to servers!
    ~ ~   _,=~";`
    ~  =~"|;  ;|       Node.JSbird
     ~  ~ | ;  |       ===========
  ~ ~     |;|\ |    Available via NPM
          |/  \|

Não consigo deixar de nadar contra a corrente do blol/#c, que por norma odeia JavaScript e derivados. Trago-vos uma Arvorezinha 2.0 feita em JavaScript, que à boa moda deste blog, não acrescenta rigorosamente nada de interessante ou novo em relação às implementações anteriores. Podem corre-la na consola de qualquer browser, ou se quiserem crescer alguns centimetros de barba hipster, em node.js.

Futuramente farei algo com as funcionalidades do node, como por exemplo, um servidor de arvorezinhas à moda do phalic 100% RESTful.

var LittleTree = function(altura) {
    this.altura = altura;
}

LittleTree.prototype.makeTree = function() {

    var result = "";

    for (var i = 1; i <= this.altura; i++) {

        for (var j = 0; j < this.altura - i; j++) {
            result += " ";
        }

        for (var j = 1; j <= 2*i - 1; j++) {
            result += "*";
        }

        result += "\n";
    }

    return result;

}

LittleTree.prototype.makeTrunk = function() {

    var result = "";
    var lastLineWidth = this.altura * 2 - 1;

    if (this.altura % 2 > 0) {

        for (var i = 0; i <= (this.altura / 2); i++) {

            for (var j = 0; j <= lastLineWidth / 4 - 1; j++) {
                result += " ";
            }

            for (var j = 0; j <= lastLineWidth / 2; j++) {
                result += "#";
            }

            result += "\n";

        }

    } else {

        for (var i = 0; i <= (this.altura / 2); i++) {

            for (var j = 0; j <= lastLineWidth / 4; j++) {
                result += " ";
            }

            for (var j = 0; j <= lastLineWidth / 2 - 1; j++) {
                result += "x";
            }

            result += "\n";

        }

    }

    return result;
}

LittleTree.prototype.toString = function() {
    return this.altura + ":\n" + this.makeTree() + this.makeTrunk() + "\n";
}

var sizes = {
    1 : null,
    2 : null,
    3 : null,
    4 : null,
    5 : null,
    6 : null,
    10 : null,
    20 : null,
    40 : null,
};

for (size in sizes) {
    console.log(String(new LittleTree(size)));
}

Output:

1:
*
#


2:
 *
***
 x
 x


3:
  *
 ***
*****
 ###
 ###


4:
   *
  ***
 *****
*******
  xxx
  xxx
  xxx


5:
    *
   ***
  *****
 *******
*********
  #####
  #####
  #####


6:
     *
    ***
   *****
  *******
 *********
***********
   xxxxx
   xxxxx
   xxxxx
   xxxxx


10:
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
     xxxxxxxxx
     xxxxxxxxx
     xxxxxxxxx
     xxxxxxxxx
     xxxxxxxxx
     xxxxxxxxx


...

Update: Conforme prometido, fiz um serviço RESTful baseado neste script powered by node.js + express.io. Demorou 5 minutos a fazer, só com uma mão e enquanto mandava uma cagada, conforme prometido pelo passaroco ali acima.

Novembro 11, 2013

Arvorezinha v1 e v2 – Lisp

Filed under: Arvorezinha,Coding,Useless — falso @ 10:55

Ora viva amigos!

Tive uma submissão de arvorezinhas de um comparsa dos mirques, o _Lone_Wolf_ , ele presenteou-nos com as duas versões em Lisp.

v1

(defun arvorezinha (count) (loop for i from 1 to count do (princ(concatenate 'string (make-string i :initial-element #\*) (format t "~%" #\linefeed)))))

v2

(defun arvorezinha2 (height) (loop
    (loop for i from 1 to height do (princ(concatenate 'string (make-string (- height i -1) :initial-element #\ ) (make-string (- (* 2 i) 1) :initial-element #\*) (format t "~%" #\linefeed))))    
    (setf trunk (floor (/ (- (* height 2) 1) 2)))
    (loop for i from 1 to (/ height 2) do
      (if (/= (mod height 2) 0)
          (princ(concatenate 'string (make-string (+ (/ trunk 2) 1) :initial-element #\ ) (make-string (+ trunk 1) :initial-element #\#) (format t "~%" #\linefeed)))
          (princ(concatenate 'string (make-string (+ (ceiling (/ trunk 2)) 1) :initial-element #\ ) (make-string trunk :initial-element #\#) (format t "~%" #\linefeed)))
      )
    )
    (return '*****)
))

Pode-se experimentar o codigo aqui: http://www.compileonline.com/execute_lisp_online.php
Já agora, o que está aí são só funções pelo que estive a ver. Então para experimentar corre-se o seguinte:

;;v1
(arvorezinha 5)
;;v2
(arvorezinha2 5)

Outubro 2, 2013

Arvorezinha 2.0 em Oracle SQL

Filed under: Arvorezinha,Coding,Uncategorized — neofreak @ 16:54

Ora viva amiguinhos! Antes de mais gostava de vos saudar e agradecer por me acolherem no melhor blog inútil do mundo. Sinto-me como um ilustre convidado com as maiores honrarias, e planeio contribuir com mais postas de programação inútil (logo que seja natural e espontânea).

A minha primeira contribuição é para o projecto árvorezinha. Tenho para vós uma árvorezinha que respeita o RFC 2.0 (já existia uma 1.0) feita em Oracle SQL.

select * from (
 select 'a'||lpad(level, 5,'0') as linha,
  rpad(' ', &altura-level, ' ') || rpad('*', 2*level-1, '*') as arvorezinha
 from dual
 connect by level <= &altura
 union
 select 't'||lpad(level, 5,'0') as linha,
  rpad(' ', ((2*&altura-1)/4)+1, ' ')||rpad('#', (2*&altura-1)/2, '#')
 from dual
 where mod(&altura, 2) = 0
 connect by level <= (&altura/2)
 union
 select 't'||lpad(level, 5,'0') as linha,
  rpad(' ', ((2*&altura-1)/4), ' ')||rpad('#', (2*&altura-1)/2+1, '#')
 from dual
 where mod(&altura, 2) > 0
 connect by level <= (&altura/2)
) order by linha asc;

A implementação usa 3 queries: uma para desenhar o topo (*), e duas para desenhar o tronco (#) nos casos de termos uma arvorezinha de altura par e de altura ímpar.  Utiliza-se a função rpad para criar uma string com caracteres repetidos e foi só implementar as fórmulas presentes no programa-RFC no argumento length do rpad e na clausula connect by.

Para garantir a ordenação das linhas, criei uma segunda coluna 'linha'.

Aqui estão os magníficos resultados:

Infelizmente, não é compatível com MySQL porque a melhor base de dados livre não suporta a clausula connect by level :(

Junho 2, 2013

De onde tudo começou…

Filed under: Coding — falso @ 21:12

Ora viva!

Ultimamente tenho andado a fazer reverse engineering ao classico do Spectrum o Paradise Café, mas essa historia fica para mais para a frente, entretanto ontem andava ali de volta das minhas cassetes do Spectrum a ver o que tinha para la guardado, e lá no meio achei uma cassete que dizia "SUPER MEGA TAPE", e claro decidi investigar ;-)

Liguei a aparelhagem old school ao line in, e pus me a gravar a cena, ate conseguir uma qualidade fiável. E fiquei maravilhado com o que achei!

É uma "mix-tape" com vários jogos para o Spectrum que fiz para amigos. E em cada lado pus uma pequena "intro" com "INSTROCOES" (lol). Tudo feito com BASIC, e com altas truques que via na altura nas revistas para esconder as listagens e cenas do género. Isto foi feito quando era bues puto, e provavelmente foi daqui que veio o gosto pelas programações.

tape1
   0\{p0} POKE (PEEK 23635+256*PEEK 23636+1),0: REM                          \#017\#000\#017\#006OLHEM OUTRO MIRONE\#017\#007\#017\#000
   5\{p0} INK 0
  10\{p0} FOR a=0 TO 21
  20\{p0} LET b=RND*6
  30\{p0} PRINT AT a,0; INK b;"\::!!!!!!!!!!INSTROCOES!!!!!!!!!!\::": BEEP .01,a
  40\{b1p0} BEEP .01,a
  50\{p0} NEXT a
  60\{p0} PAUSE 0
  70\{p0} CLS 
  80\{p0} FOR a=0 TO 6
  90\{p0} PRINT AT 10,1; INK a;"INSTROCOES DA SUPER MEGA TAPE": PAUSE 5
 100\{p0} NEXT a
 110\{p0} PAUSE 0
 120\{p0} CLS 
 130\{p0} PRINT AT 0,0; INK 0;"\{p7}INSTROCOES DO";AT 0,15; INK 7; PAPER 0; FLASH 1; BRIGHT 1;"SUPER TROLLEY !!!"
 140\{p0} INK 0: PRINT AT 2,0;"\{p0p7p6}SUPER TROLLEY\{p7p7p7p7p7p7p6p4p3p2p1p1p2p3p4p5p6p7b0b1} um jogo com bons graficos(de porcaria).O jogo serve para a gente ir as compras..No primeiro nivel tem que se logo encher os barris de tracinhos(como este{-}).O segundo nivel ja' e' nas compras ,isso e que eu nao sei o que e' para fazer....": PRINT "\{p1p2p3p4p5p6p7b0b1}  Teclado redefenivel!!!"
 150\{p0} PRINT #0;"PULSA UMA TECLA PARA CONTINUAR!!"
 160\{p0} PAUSE 0
 170\{p0} INK 0: CLS 
 180 INK 0:\{p0} PRINT AT 0,0;"INSTROCOES DO";AT 0,15; INK 7; PAPER 0; FLASH 1; BRIGHT 1;"SKATE WARS !!!"
 190\{p0} PRINT AT 2,0;"\{p6}SKATE WARS\{p7p1p2p3p4p5p6p7b0b1} e' o desporto do futuro!A gente vamos jogar num estadio de gelo.Voces como sao estupidos nao vao chegar ao nivel 9..As teclas do Jugador 1 sao:X=ESQUERDA..C=DIREITA..J=CIMA..N=BAIXO..K=FOGO E SALTO..As teclas do jugador 2 sao:Z=ESQUERDA..X=DIREITA..K=CIMA..M=BAIXO..L=FOGO E SALTO"
 200 PRINT #0;"PULSE UMA TECLA PARA CONTINUAR!!"
 210 INK 0:\{b0b0b0p6p5p0} PAUSE 0
 220 INK 9: CLS 
 230 PRINT AT 0,0;"INSTROCOES DO";AT 0,15; INK 7; PAPER 0; FLASH 1; BRIGHT 1;"ARKANOID !!!"
 240 PRINT AT 2,0;"\{p6}ARKANOID\{p7p1p2p3p4p5p6p7b0b1} um jogo que e' para derrubar paredes, o jogo se eu me lembro tem 32 niveis,mas a partir do 30 sao bue dificeis como o caracas..As teclas sao:1=ESQUERDA..2=DIREITA..A S D F G H J K L=AMANDAR A BOLA.Aquelas letras todas sao para atirar a bola,mas a que da' mais jeito e' o {G}...\{p7p7p7p7p6p5p6p7p6p5p4p3p2p1p2p3p4p5p6p6p7b0}"
 250\{p0} PRINT #0;"PULSE UMA TECLA PARA CONTINUAR!!"
 260\{p0} PAUSE 0
 270 INK 0:\{p0} CLS 
 280\{p0} FOR a=0 TO 64
 290\{p0} BEEP .01,a
 300\{p0} NEXT a
 310\{p0} PRINT AT 10,8;"SUPER MEGA TAPE"
 320\{p0} PAUSE 0
 330\{p0} RANDOMIZE USR 0: PRINT USR 0: NEW 
1000 POKE PEEK 23635+256*PEEK 23636,1

  10 IF INKEY$="1" THEN GO TO 110
  20 IF INKEY$="2" THEN GO TO 140
  30 IF INKEY$="3" THEN GO TO 170
  40 GO TO 10
  50 RESTORE : PAPER 1: CLS : FLASH 0: BORDER 5: INPUT "": LET a$=" SUPER MEGA TAPE ": LET b$=a$
  60 INK 7: PLOT 0,0: DRAW 255,0: DRAW 0,175: DRAW -255,0: DRAW 0,-175
  70 PRINT AT 5,4;"INSTROCOES DO :"
  80 PAPER 5: INK 0: PRINT AT 6,4;"1=GREAT ESCAPE";AT 8,4;"2=CAVEMANIA";AT 10,4;"3=JUNGLE WARRIOR"
  90 FOR i=1 TO 26: PRINT #0; PAPER 6; BRIGHT 1;AT 1,7;b$: GO SUB 20: BEEP .0004,45: GO SUB 20: BEEP .0006,55: GO SUB 20: NEXT i
 100 GO TO 90
 110 INK 7: PAPER 0: BORDER 0: CLS 
 120 PRINT "GREAT ESCAPE-Um jogo fixe so que para mim custa muito a passar...": PRINT "Da para redefinir as teclas": PRINT "Cuidado com os guardas."
 130 PAUSE 0: CLS : GO TO 50
 140 INK 7: PAPER 0: BORDER 0: CLS 
 150 PRINT "CAVEMANIA-Um jogo bue facil como o caracas tem-se 99vidas,o jogo e' para apanhar ovos num ninho,e mete-los na nossa casa.": PRINT "Teclado redefenivel": PRINT "Cuidado com os vulcoes."
 160 PAUSE 0: CLS : GO TO 50
 170 INK 7: PAPER 0: BORDER 0: CLS 
 180 PRINT "JUNGLE WARRIOR-Um jogo que eu nao sei o que e' para fazer mas eu acho que e' para salvar o mulher que esta pendurada numa arvore.Quando a gente perdemos uma vida,a gente transforma-se em um anjinho.": PRINT "Teclado redefenivel.": PRINT "Cuidado com os fantasmas."
 190 PAUSE 0: CLS : GO TO 50

tape3
   1 BORDER 0: INK 0: PAPER 0: CLS 
  10 REM \#017\#007EI OLHEM OUTRO MIRONE\#017\#000
  20 REM \#017\#007ESTUPIDO COMO OS\#017\#000
  30 REM \#017\#007CAMELOS,ANDA CAMELO!!\#017\#000
  40 REM \#017\#007NAO VEZ UM BOI!!!\#017\#000
  50 REM \#017\#007ESPECIAL/////\#017\#000
  60 REM \#017\#007NAO BEZ UM VOI!!!\#017\#000
  70 REM \#017\#007SEUS BORRADAS\#017\#000
  80 REM \#017\#007SEUS CAGADAS\#017\#000
  90 REM \#017\#007DAQUI FALA\#017\#000
 100 REM \#017\#007O PEDRO\#017\#000
 110 REM \#017\#007DA\#017\#000
 120 REM \#017\#007SUPER MEGA TAPE\#017\#000

- Lado A - WAV - TZX
- Lado B - WAV - TZX
- Extra - WAV - TZX

Janeiro 27, 2013

Refeitórios da UNL no Google Calendar

Filed under: Coding,Serious Business — falso @ 4:07

Ora viva!
Após pedidos de muitas famílias venho desta vez blogar sobre algo útil!

Desde que fiz o post sobre a Cantina da FCT/UNL no Google Calendar já tive alguns pedidos para fazer o mesmo para outras escolas da UNL, então hoje decidi por mãos à obra e aqui vai o resultado.

Local Almoço Jantar
Faculdade de Ciências e Tecnologia | Refeitório Adicionar Adicionar
Faculdade de Ciências Médicas | Cafetaria Adicionar Adicionar
Faculdade de Ciências Sociais e Humanas | Refeitório Adicionar Adicionar
Faculdade de Ciências Sociais e Humanas | Snack Adicionar Adicionar
Residência Alfredo de Sousa | Refeitório Adicionar Adicionar

Os eventos nos calendários são inseridos todos os dias úteis às 4:30.
Já agora para quem não sabe, a grande utilidade destes calendários é que no Google Calendar existe uma opção para nos alertar de eventos através de uma SMS, então com essa funcionalidade pode-se meter a enviar uma SMS todos os dias a avisar o que é a comida na cantina.

Novembro 8, 2012

A Água

Filed under: lulz,Useless — sadik @ 22:58

Boas noites caros amigos das internets.

Venho por este meio, usar este lindo blol para publicar o seguinte poema do grande Bocage.

"A Água"
Meus senhores eu sou a água
que lava a cara, que lava os olhos
que lava a rata e os entrefolhos
que lava a nabiça e os agriões
que lava a piça e os colhões
que lava as damas e o que está vago
pois lava as mamas e por onde cago.

Meus senhores aqui está a água
que rega a salsa e o rabanete
que lava a língua a quem faz minete
que lava o chibo mesmo da raspa
tira o cheiro a bacalhau rasca
que bebe o homem, que bebe o cão
que lava a cona e o berbigão.

Meus senhores aqui está a água
que lava os olhos e os grelinhos
que lava a cona e os paninhos
que lava o sangue das grandes lutas
que lava sérias e lava putas
apaga o lume e o borralho
e que lava as guelras ao caralho

Meus senhores aqui está a água
que rega rosas e manjericos
que lava o bidé, que lava penicos
tira mau cheiro das algibeiras
dá de beber ás fressureiras
lava a tromba a qualquer fantoche e
lava a boca depois de um broche.

Junho 20, 2012

Blocos de endereçamento IP por país

Filed under: Coding,Useless — thread @ 6:46

Bom dia malta das inutilidades.

Venho aqui partilhar mais uma das minhas muitas inutilidades... um escripe em pitão inútil que faz a consulta online de ip address blocks atribuidos a um determinado pais e devolve uma lista dos mesmos.
No site onde faço o request, têm a versão csv disponivel também... mas isso não tem piada e não é inútil pois não poderia usar um html parser e a coisa ia ficar assim meia deslavada e desenquadrada no blol.

A sintaxe não poderia ser mais simples:

$ ./escripe.py acronimo

Eg:

$ ./escripe.py pt
(e receberão uma lista de blocos (um bloco por linha) no formato "from X to Y")

Cá vai:


#!/usr/bin/python

import sys
import httplib
import re
from HTMLParser import HTMLParser

raw_block_list = []

class ORHTMLParser(HTMLParser):
        def handle_data(self, data):
                pat = re.search(r"^((\d{1,3}\.){3,3}\d{1,3})$", data.strip(' '))

                if pat:
                        raw_block_list.append(pat.group(1))

if len(sys.argv) != 2:
        print "Usage: %s <country acronym>\nExamples:\n\t%s pt\n\t%s fr\n\t%s us" % (eval("sys.argv[0]," * 4))
        sys.exit(1)

try:
        rhost = httplib.HTTPConnection("www.nirsoft.net")
        rhost.request("GET", "/countryip/%s.html" % sys.argv[1])
        pbody = rhost.getresponse().read()
        rhost.close()
except:
        print "Ops..."
        sys.exit(1)

ORHTMLParser().feed(pbody)

paired_block_list = map(lambda start, end: (start, end), raw_block_list[0::2], raw_block_list[1::2])

for pair in paired_block_list:
        print "from", pair[0], "to", pair[1]

Saudações

« Posts anteriores
widgeon
widgeon
widgeon
widgeon