GOW

GOW

domingo, 2 de agosto de 2026

HELLO

 










TypeScript is JavaScript with syntax for types.

 

What is TypeScript?

TypeScript é uma linguagem de programação de código aberto, desenvolvida pela Microsoft, que funciona como um superconjunto (superset) do JavaScript Sua principal função é adicionar tipagem estática opcional e recursos avançados de programação orientada a objetos, como classes, interfaces e enums, ao ecossistema JavaScript. 

O código TypeScript não é executado diretamente nos navegadores; ele é transpilado (convertido) para JavaScript puro pela ferramenta tsc, garantindo compatibilidade total com qualquer ambiente que suporte JS, como navegadores, Node.js ou Deno. 

Principais Características e Benefícios

  • Detecção de Erros: Permite identificar erros de sintaxe e lógica durante o desenvolvimento (compilação), e não apenas em tempo de execução, aumentando a segurança do código. 

  • Produtividade: Oferece melhores ferramentas de autocompletar (IntelliSense) e refatoração em editores de código como VS Code e WebStorm. 

  • Manutenibilidade: Facilita a criação de aplicações web complexas e escaláveis, tornando o código mais legível e fácil de manter por equipes grandes. 

  • Compatibilidade: Todo código JavaScript válido é também código TypeScript válido, permitindo integração gradual em projetos existentes. 

Diferença para JavaScript

Enquanto o JavaScript possui tipagem dinâmica (as variáveis definem seus tipos em tempo de execução), o TypeScript impõe tipagem estática, onde os tipos são definidos explicitamente ou inferidos pelo compilador antes da execução. 

Exemplo prático da diferença:

// TypeScript
const user = {
  firstName: "Angela",
  lastName: "Davis"
};

console.log(user.name); // Erro: Property 'name' does not exist on type...

No JavaScript, o código acima não geraria erro no editor, falhando apenas na execução. No TypeScript, o erro é detectado imediatamente pela ferramenta.



JavaScript and More

TypeScript adds additional syntax to JavaScript to support a tighter integration with your editor. Catch errors early in your editor.

A Result You Can Trust

TypeScript code converts to JavaScript, which runs anywhere JavaScript runs: In a browser, on Node.js, Deno, Bun and in your apps.

Safety at Scale

TypeScript understands JavaScript and uses type inference to give you great tooling without additional code.

A Partilha dos 35 Camelos

 Júlio César de Mello e Souza (1895-1974), pseudônimo de Malba Tahan, foi um professor, educador, pedagogo, conferencista, matemático e escritor do modernismo brasileiro. Seu gosto por literatura e em particular pela arte de contar histórias remonta aos seus primeiros anos. No livro O Homem que Calculava [1], ele narra o interessante problema da partilha da herança de 35 camelos. Essa história é baseada em um conto de origem desconhecida que também serviu de inspiração para Ian Stewart, na página 23 do seu Almanaque das Curiosidades Matemáticas, criar um conto chamado História Para Cão Dormir.

A Partilha dos 35 Camelos

Beremiz Samir, o Homem que Calculava, viajando na garupa de um camelo junto com seu amigo, se deparam com três pessoas discutindo ao lado de um lote de camelos. O motivo da discórdia era a partilha dos camelos, deixados como herança aos três irmãos. O pai, antes de falecer, determinou como seria a divisão dos 35 camelos:

  • O filho mais velho ficaria com a metade.
  • O filho do meio ficaria com a terça parte.
  • O filho caçula ficaria com a nona parte.

20150626114355282067a

A metade, a terça e a nona partes de 35 não incorrem em um valor exato – não faz sentido dividir um camelo. Beremiz, com o apoio do seu amigo, propôs resolver o problema adicionando seu próprio camelo para totalizar 36. Dessa forma, a divisão proposta pelo pai seria respeitada:

  • O filho mais velho ficaria com a metade de 36: 18.
  • O filho do meio ficaria com a terça parte de 36: 12.
  • O filho caçula ficaria com a nona parte de 36: 4.

Note que a soma totaliza 34 e não 36. O algebrista convenceu os irmãos de que com essa divisão eles obteriam lucro, pois na partilha de 35 camelos:

  • O filho mais velho ficaria com 17 e pouco.
  • O filho do meio ficaria com 11 e pouco.
  • O filho caçula ficaria com 3 e pouco.

Como gratidão pela solução do problema, os irmãos entregaram 2 camelos ao inteligente Beremiz. Agora, ele e seu amigo poderiam seguir viagem juntos, mas cada um em seu camelo. Agora vamos entender o artifício utilizado por Beremiz para permitir a álgebra com valores inteiros.

A Solução do Homem que Calculava

A solução do problema se encontra no próprio livro [1]. Feita a divisão como desejado pelo pai:

  • Irmão mais velho: 35 / 2 = 17,5 = 17 + 1/2
  • Irmão do meio: 35 / 3 = 11,666… = 11 + 2/3
  • Irmão mais novo: 35 / 9 = 3,888… = 3 + 8/9
x = (17 + 1/2) + (11 + 2/3) + (3 + 8/9)
x = 33 + 1/8

Como o total de camelos é 35, após a divisão, sobra 1 camelo mais 17/18 de camelo. 17/18 é o resultado da soma daquilo que falta para completar uma unidade na parte fracionária da divisão:

x = 1/2 + 1/3 + 1/9
x = 17/18

Note que a soma das frações não resultou em um número inteiro. Beremiz pensou em distribuir a diferença (1/18) ao acumulado de cada irmão para “inteirar” os valores, mas ainda assim sobraria 1 camelo:

x = (17 + 1/2 + 1/2) + (11 + 2/3 + 1/3) + (3 + 8/9 + 1/9)
x = 18 + 12 + 4
x = 34

Nesse ponto, o problema já estava resolvido, pois era esperado que sobrasse um camelo. Sabendo disso, Beremiz modificou o problema para que a divisão original resultasse valores inteiros e ainda obter algum lucro: ele passou a considerar a divisão de 36 camelos e não 35 para passar a impressão de que os irmãos estavam obtendo algum lucro com a divisão proposta pelo algebrista.

O artifício da adição para obtenção de divisões inteiras pode ser utilizado, por exemplo, para os números 17, 35, 53 e 71, mas as adições, assim como as sobras, seriam diferentes para cada número – para 18 sobra 1, para 36 sobram 2 e assim por diante.

Conclusão

Se você tem um conhecimento específico ou uma habilidade rara, é justo ganhar dinheiro com isso. Os matemáticos sentem prazer ao solucionar problemas, mas eles também precisam viver.

GOOD MORNING MOTH3RF*CK3R





PROGRAMADOR RAIZ

 


segunda-feira, 1 de junho de 2026

PEOPLE = SHIT


 

Criando um Web Crawler com jsoup

 O Crawler é um software que faz uma varredura sistemática e mais ou menos ampla na Internet em busca de informações relevantes como textos, endereços de e-mail e links que são utilizados para encontrar outras páginas iterativamente de acordo com regras bem definidas. O processo realizar pelo crawler é chamado de crawling.

Também conhecido como Spider ou Bot, esse software é a base dos motores de busca devido à sua capacidade de indexar sites. Para facilitar o trabalho dos crawlers e tornar a indexação das páginas mais rápida, o site deve possuir alguns artefatos:

sitemap.xml: lista das páginas do site, que pode ser utilizada para que o crawler saiba de antemão que páginas existem para indexar;

robots.txt: regras de acesso que impedem o crawler de indexar certas páginas;

tag meta robots: através do valores “noindex” ou “nofollow”, a página avisa ao crawler que ele não deve, respectivamente, indexá-la e nem seguir os links contidos nela;

rel=”nofollow”: indica ao crawler que aquele link não deve ser seguido.

Um Crawler deve respeitar as regras impostas pelo site visitado, deve evitar visitar as páginas com muita frequência e também deve ser robusto para evitar spider traps e outros comportamento maliciosos. Outros bons atributos de um crawler são a distribuição em máquinas diferentes, escalabilidade, continuidade e priorização baseada na qualidade da página.

Os motores de busca em particular utilizam os crawlers para baixar o conteúdo das páginas de Internet e possibilitar um pós processamento, o que diminui o tempo de resposta para busca daquelas páginas. Crawlers também podem ser utilizados validar o HTML e para verificar se não há links quebrados na página em processo automatizado.

Um Crawler segue o seguinte processo:

1. Obter uma URL da fronteira (esse conceito será explicado na próxima seção)
2. Baixar o código HTML
3. Parsear o HTML para extrair links e outras URLs
4. Verificar se a URL e/ou o conteúdo já foi analisado anteriormente. Se não foi, indexar.
5. Confirmar, para cada URL extraída, se ela permite ser verificada com relação à frequência, às regras do robots.txt e outras restrições

Fronteira

Um conceito fundamental dos crawlers é a fronteira. A fronteira define o comportamento do crawler ao visitar uma página, como prioridade, ordem, profundidade, etc.

A fronteira deve ser inicializada com URLs que serão denominadas seeds (sementes). Para cada página visitada, o crawler perguntará para a fronteira que páginas devem ser visitadas à seguir. A fronteira é informada de todo o conteúdo baixado pelo crawler de forma contínua até que a condição de parada seja atingida. Como a fronteira é uma camada de abstração, sua implementação pode ter várias tipos diferentes de persistência de acordo com a necessidade do negócio.

Exemplo com jsoup

O jsoup é uma biblioteca que fornece uma API para baixar, extrair e manipular dados da Internet. Adicione a dependência abaixo ao seu projeto:

1
2
3
4
5
<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
    <version>1.10.2</version>
</dependency>

Vamos fazer um exemplo simples que baixa o conteúdo de uma página e exibe no console o título de todas as URLs encontradas na página:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class BasicWebCrawler {
   private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) "
    + "AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1";
   private HashSet<String> links;
   private List<Article> articles;
   private List<String> frontiers;
     
   class Article{
      String title;
      String url;
      public Article(String title, String url) {
         this.title = title;
         this.url = url;
      }
   }
     
   public BasicWebCrawler() {
      links = new HashSet<>();
      articles = new ArrayList<>();
      frontiers = new ArrayList<>();
   }
 
   public void addFrontier(String fronteira) {
      frontiers.add(fronteira);
   }
     
   public void crowl(int depth) {
      frontiers.forEach(url -> {
         crowlPageLinks(url, depth);
      });
      crowlArticles();
   }
     
   private void crowlPageLinks(String url, int depth) {
      if ((!links.contains(url) && (0 < depth) && !url.trim().isEmpty())) {
         try {
            links.add(url);
            Document document = Jsoup.connect(url).userAgent(USER_AGENT).get();
            Elements linksOnPage = document.select("a[href]");
            for (Element page : linksOnPage) {
               crowlPageLinks(page.attr("abs:href"), --depth);
            }
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
 
   private void crowlArticles() {
      links.forEach(url -> {
         Document document;
         try {
            document = Jsoup.connect(url).userAgent(USER_AGENT).get();
            Elements elementLinks = document.select("a[href]");
            for (Element element : elementLinks) {
               Article article = new Article(element.text(), element.attr("abs:href"));
               articles.add(article);
            }
         } catch (IOException e) {
            e.printStackTrace();
         }
      });
   }
 
   public void print() {
      articles.forEach(a -> {
         System.out.println("> Título: " + a.title);
         System.out.println(">    URL: " + a.url + "\n");
      });
   }
 
   public static void main(String[] args) {
      BasicWebCrawler bwc = new BasicWebCrawler();
      bwc.addFrontier("https://atitudereflexiva.wordpress.com/");
      bwc.crowl(1);
      bwc.print();
   }
}

Adicionei uma fronteira, uma profundidade e tomei alguns cuidados para não visitar a mesma URL mais de uma vez. Como a profundidade está configurada como 1, não estou seguindo os links coletados na primeira página visitada, que no caso é a própria fronteira. Sendo assim, nesse caso, a verificação de página visitada não seria necessária, porém, se você quiser aumentar a profundidade e para permitir que seu crwaling vá mais longe, essa verificação é necessária. Se você quiser aplicar alguma restrição baseada em elementos presentes na página, basta filtrar os elementos do documento baixado. Supondo que a restrição se aplica aos elementos contidos em “p”:

1
String pagina = document.select("p").html();

Note que configuramos o USER_AGENT antes de acionar o crawler. Isso é necessário para nos precavermos da possível confusão que os http servers fazem quando são visitados por crawlers. Forçando o agente, impedimos que o servidor envie uma versão da página formatada para dispositivos móveis.

Sobre a Legalidade do Crawling

O crawling não é uma atividade ilegal, mas isso não significa que você possa baixar o site que quiser. Essa atividade tem uma conotação negativa por causa da forma de acesso e da possibilidade de uso malicioso das informações coletadas:

1. Informações privadas ou importantes
2. Não respeitar os termos de serviço do site
3. Forma abusiva de fazer requisições, o que pode causar problemas nos servidores das paáginas

Muitos sites bloqueiam explicitamente quaisquer tipo de extração automatizada de informações via o arquivo robots.txt. Se o robots.txt estiver assim:

1
2
User-agent: *
Disallow:

Você pode fazer o crawling de todas as páginas do site. Porém, se o robots.txt estiver assim:

1
2
User-agent: *
Disallow: /

Você não poderá fazer o crawling de nenhuma página. Seguem algumas sugestões para um crawling ético:

1. Faça o crawling discretamente, mas antes cheque o arquivo robots.txt
2. Seja conservador evite fazer muitas requisições seguidas às informações para não causar sobrecarga ou negação de serviço (DoS)
3. Use o dado com sabedoria para aumentar o crescimento do seu negócio. Não faça uma cópia do dado que sirva apenas para replicação em outro lugar
4. Entre em contato com o proprietário do site antes de começar o crawling
5. Não repasse as informações coletadas. Se for um dado valioso, mantenha-o seguro.