Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(git): merge main into dev #1061

Open
wants to merge 9 commits into
base: dev
Choose a base branch
from
2 changes: 1 addition & 1 deletion content/posts/intuicao-e-aleatoriedade.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: 'Intuição e aleatoriedade'
date: '2023-07-03T20:44:29.545Z'
description: 'Trecho do livro "O Andar do Bêbado" em que o autor conta sobre a passagem de Daniel Kahneman como instrutor de um grupo de instrutores de voo e suas observações acerca do fenômeno estatístico "Regressão à Média"'
category: 'Article'
tags: 'intuição,aleatoriedade,estatística,probabilidade'
tags: 'intuição,aleatoriedade,estatística,probabilidade,filosofia'
author: 'mateusfg7'
status: 'published'
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,3 +494,72 @@ DROP FUNCTION nome_da_funcao;
```sql
DROP FUNCTION getNumeroFilmes;
```

# Gatilhos (`TRIGGER`)

_Triggers_ são objetos do banco de dados que, relacionados a certa tabela, permitem a realização de processamentos em consequência de uma dererminada ação sobre a tabela.

As _triggers_ são uma forma de automatizar certas ações com base em eventos ocorridos. Podem ser executadas **antes** `BEFORE{:sql}` ou **depois** `AFTER{:sql}` de uma operação de **inserção** `INSERT{:sql}`, **atualização** `UPDATE{:sql}` ou **exclusão** `DELETE{:sql}` de registros.

Em aplicações que utilizam banco de dados, que ações sejam disparadas em resposta como consequência de outras, realizando operações de cálculo, validação e, em geral, surtindo alterações na base de dados **automaticamente**.

**VANTAGENS**:
- Parte do processo que seria executado pela aplicação (sistema/software) passa para o banco de dados, poupando recursos da máquina cliente.
- Facilita a manutenção, sem que seja necessário alterar o código da aplicação.

**SINTAXE**:

```sql
CREATE TRIGGER <Nome do gatilho>
<Momento> <Evento> ON nome_da_tabela
FOR EACH ROW EXECUTE FUNCTION <Funcao>;
```

**Momento** aqui se refere a quando a trigger será executada, podendo ser `BEFORE{:sql}` (antes) ou `AFTER{:sql}` (depois) de um evento. O **evento** é a operação que dispara a trigger, podendo ser `INSERT{:sql}` (inserção), `UPDATE{:sql}` (atualização) ou `DELETE{:sql}` (deleção).

Mas antes de criarmos a _trigger_ de fato, precisamos criar a função que será executada pela _trigger_. Aqui, reaproveitaremos o conteúdo passado no tópico anterior sobre [Funções](#funções-functions), introduzindo alguns conceitos novos.

Primeiro vamos pegar uma função a ser executada pela _trigger_ em um `UPDATE{:sql}`, e explicar os elementos que a compõem.

Exemplo de uma function que possui os elementos OLD e NEW:

```sql /atualizar_preco()/
CREATE OR REPLACE FUNCTION atualizar_preco()
RETURNS TRIGGER
LANGUAGE plpgsql AS
$$
BEGIN
IF NEW.preco <> OLD.preco THEN
INSERT INTO HISTORICO_PRECO (codigo_produto, preco_antigo, preco_novo)
VALUES (NEW.codigo_produto, OLD.preco, NEW.preco);
END IF;
RETURN NEW;
END;
$$;

CREATE TRIGGER trigger_atualizar_preco
BEFORE UPDATE ON PRODUTO
FOR EACH ROW EXECUTE FUNCTION atualizar_preco();
```

Essa é uma função que será executada antes de uma atualização na tabela **`PRODUTO`**. O que ela faz é verificar se o preço novo é diferente do preço antigo, e se for, insere um registro no histórico de preços.

**Elementos**:
- **`OLD`**: refere-se ao valor antigo da linha que está sendo atualizada.
- **`NEW`**: refere-se ao valor novo da linha que está sendo atualizada.
- **`RETURN NEW`**: é necessário para que a atualização seja efetivada.
- **`IF NEW.preco <> OLD.preco THEN`**: é uma condição que verifica se o preço novo é diferente do preço antigo. Se for, é feito um registro no histórico de preços.
- **`INSERT INTO HISTORICO_PRECO`**: é a instrução que insere o registro no histórico de preços.

## Excluindo TRIGGERS

Para exclusão de _triggers_, basta fazer:
```sql
DROP TRIGGER nome_da_trigger;
```


# Fontes

- Slides das aulas do professor Gabriel Ribeiro Diniz.
- [Trigger.md](https://github.com/GuiLhermeoliveiraf/GTI-FAPAM/blob/main/2%C2%B0%20Per%C3%ADodo/Banco%20de%20Dados%202/Trigger.md) por [Guilherme Guimarães Oliveira](https://github.com/GuiLhermeoliveiraf)
21 changes: 21 additions & 0 deletions content/til/2024_11_04-escalabilidade_vertical_x_horizontal.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
title: 'Escalabilidade Vertical x Horizontal'
description: 'Diferença de sistemas que escalam verticalmente e horizontalmente'
date: '2024-11-04'
tags: [escalabilidade,infra,sistemas,performance]
---

Sistemas que **escalam verticalmente** são aqueles que crescem em capacidade **adicionando mais recursos** ao **mesmo** servidor.
Sistemas que **escalam horizontalmente** são aqueles que crescem em capacidade adicionando **mais servidores** ao sistema.

<img src="assets/scalability-light.png" className="on-light" />
<img src="assets/scalability-dark.png" className="on-dark" />

Sistemas que escalam verticalmente possuem um limite de capacidade, pois a quantidade de recursos que um único servidor pode ter é limitada. Já os sistemas que escalam horizontalmente são mais flexíveis, pois podem crescer de forma quase ilimitada, já que podemos adicionar mais servidores em paralelo para dividirem a carga de recursos.

<img src="assets/vertical-horizontal-scalability-dark.png" className="on-dark" />
<img src="assets/vertical-horizontal-scalability-light.png" className="on-light" />

Um exemplo de sistema que escala verticalmente é um servidor de banco de dados relacional (PostgreSQL, MySQL, MariaDB, SQL Server...), onde se quisermos aumentar a capacidade de processamento, memória ou armazenamento, precisamos adicionar mais recursos ao mesmo servidor.

Em paralelo temos os bancos NoSQL, como o Cassandra, MongoDB, Couchbase, que são sistemas que escalam horizontalmente, pois podemos adicionar mais servidores ao cluster para aumentar a capacidade de armazenamento e processamento, dividindo a carga de consumo de recursos pelo sistema entre os servidores do cluster.
31 changes: 31 additions & 0 deletions content/til/2024_11_23-fazendo_a_pergunta_da_maneira_correta.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
title: 'Fazendo a pergunta da maneira correta'
description: ''
date: '2024-11-23'
tags: [anedota,padre,pergunta,filosofia]
---


> Um seminarista pergunta ao padre:
>
> _\- Padre, eu posso fumar enquanto rezo?_
>
> O padre quase dá um safanão no jovem e responde rispidamente que ele deveria prestar atenção exclusivamente à oração.
>
> No dia seguinte, um outro seminarista um pouco mais safo, vira para o mesmo padre e faz a pergunta:
>
> _\- Padre, eu posso rezar enquanto fumo?_
>
> O padre respondeu:
>
> _\- Pode e deve meu filho, é importante direcionarmos nossas orações a Deus a todo momento, mesmo nos de distração._

_Anedota de um trecho do filme "Dois Papas"_

A resposta vai depender de como você faz a pergunta. Se trada de um efeito de viés cognitivo chamado "Efeito do Enquadramento" (_Framing Effect_). Tendemos a optar por uma alternativa ou outra, a depender de como elas são apresentadas.

É melhor dizer que algo tem 70% de chance de dar certo, ou 30% de chance de dar errado? Trata-se da mesma coisa, mas as pessoas olharão positivamente pra uma coisa, e negativamente pra outra.

Quanto você está do lado argumentativo, meça sempre as palavras. Tenha em mente que as pessoas reagirão à forma dos seus argumentos.

E quanto você estiver na posição de juiz de um cenário, certifique-se de que você não esta sendo manipulado.
52 changes: 52 additions & 0 deletions content/til/2025_01_28-redirect_http_codes.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
title: 'Redirect HTTP codes'
description: 'Difference between type of redirect HTTP codes'
date: '2025-01-28'
tags: [http,redirect,web,code,redirect,cloud,rfc]
---

<img src="assets/redirects-tree-dark.png" className="on-dark" />
<img src="assets/redirects-tree-light.png" className="on-light" />

<br/>
<br/>

## 301: Permanent redirect

**The URL is old, and should be replaced**. Browsers will cache this, the method will change to GET, as per RFC 7231:

> For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent requests.

**Example**: _URL move from `/register-form.html` to `signup-form.html`._

## 302: Temporary redirect

**Only use for HTTP/1.0 clients**. This status code should not change the method, but browsers did it anyway. The RFC says:

> Many pre-HTTP/1.1 user agents do not understand [303]. When interoperability which such clients is a concern, the 302 status code may be used instead, since most user agents react to a 302 response as described here for 303.

Of course, some clients may implement it according to the spec, so if interoperability with such ancient clients is not a real concern, **303 is better for consistent results**.

## 303: Temporary redirect (change method)

The 303 status code is a temporary redirect that changes the method to GET.

**Example**: _If the browser send a request to `POST /register.php`, then now load `GET /signup.php`_

## 307: Temporary redirect (keep method)

The 307 status code is a temporary redirect that keeps the original status code, repeating requets identically.

**Example**: _If the browsers sent a `POST /register.php` request, then this tells it to redo the `POST /signup.php`._

## 308: Parmanent redirect (keep method)

Where 307 is the "no method change" counterpart of 303, this 308 status code is the "no method change" counterpart of 301.

---

**Refs:**
- https://stackoverflow.com/a/55008140
- https://www.rfc-editor.org/rfc/rfc2616#section-10.3.3
- https://www.rfc-editor.org/rfc/rfc7238
- https://github.com/Fyrd/caniuse/issues/1830#issuecomment-233700576
Binary file added content/til/assets/redirects-tree-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/til/assets/redirects-tree-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/til/assets/scalability-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/til/assets/scalability-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions src/app/_components/grid/cards/stack-icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ import {
CloudflareIcon,
FigmaIcon,
DockerIcon,
FastApiIcon
FastApiIcon,
DjangoIcon
} from '~/components/icons'

export type IconItem = {
Expand Down Expand Up @@ -62,6 +63,6 @@ export const stackLines: StackLine = {
{ title: 'Google Cloud', icon: GoogleCloudIcon, color: '#4285F4' },
{ title: 'Vercel', icon: VercelIcon, color: '#000000' },
{ title: 'Cloudflare', icon: CloudflareIcon, color: '#F38020' },
{ title: 'FastAPI', icon: FastApiIcon, color: '#009688' }
{ title: 'Django', icon: DjangoIcon, color: '#092E20' }
]
}
26 changes: 20 additions & 6 deletions src/app/about/sections/knowledge/knowledge-categories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ import {
GitpodIcon,
VimIcon,
GlpiIcon,
AngularIcon
AngularIcon,
DjangoIcon,
SpringIcon
} from '~/components/icons'

type IconType = (props: SVGProps<SVGSVGElement>) => JSX.Element
Expand Down Expand Up @@ -123,7 +125,7 @@ export const knowledgeCategories: {
title: 'Java',
icon: JavaIcon,
color: '#f89820',
status: 'learning'
status: 'god'
},
{
title: 'C++',
Expand All @@ -135,7 +137,7 @@ export const knowledgeCategories: {
title: 'SQL',
icon: SQLIcon,
color: '#003B57',
status: 'learning'
status: 'god'
}
]
},
Expand Down Expand Up @@ -180,7 +182,7 @@ export const knowledgeCategories: {
},
{
title: 'Angular',
status: 'learning',
status: 'bad',
icon: AngularIcon,
color: '#c3002f'
},
Expand Down Expand Up @@ -267,10 +269,22 @@ export const knowledgeCategories: {
color: '#E10098',
status: 'bad'
},
{
title: 'Django',
icon: DjangoIcon,
color: '#092E20',
status: 'god'
},
{
title: 'FastAPI',
icon: FastApiIcon,
color: '#049688',
status: 'bad'
},
{
title: 'Spring Boot',
icon: SpringIcon,
color: '#77bc1f',
status: 'learning'
}
]
Expand Down Expand Up @@ -368,7 +382,7 @@ export const knowledgeCategories: {
},
{
title: 'PostgreSQL',
status: 'learning',
status: 'god',
icon: PostgreSQLIcon,
color: '#336791'
}
Expand Down Expand Up @@ -415,7 +429,7 @@ export const knowledgeCategories: {
},
{
title: 'Vim',
status: 'god',
status: 'stack',
icon: VimIcon,
color: '#019833'
},
Expand Down
11 changes: 9 additions & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Metadata, Viewport } from 'next'
import Script from 'next/script'
import { Inter, Caveat } from 'next/font/google'
import { Inter, Caveat, Crimson_Text } from 'next/font/google'

import { config } from 'global-config'
import { Header } from './_components/header'
Expand Down Expand Up @@ -78,6 +78,13 @@ const dancingScript = Caveat({
display: 'swap'
})

const crimsonText = Crimson_Text({
subsets: ['latin'],
weight: ['400', '600', '700'],
variable: '--font-crimson-text',
display: 'block'
})

export default function RootLayout({
children
}: {
Expand All @@ -93,7 +100,7 @@ export default function RootLayout({
/>
</head>
<body
className={`scroll-smooth ${inter.variable} ${dancingScript.variable}`}
className={`scroll-smooth ${inter.variable} ${dancingScript.variable} ${crimsonText.variable}`}
>
<Providers>
<div className="relative">
Expand Down
2 changes: 2 additions & 0 deletions src/components/icons/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,5 @@ export { CodespacesIcon } from './svgs/codespaces'
export { VimIcon } from './svgs/vim'
export { GlpiIcon } from './svgs/glpi'
export { AngularIcon } from './svgs/angular'
export { DjangoIcon } from './svgs/django'
export { SpringIcon } from './svgs/spring'
16 changes: 16 additions & 0 deletions src/components/icons/svgs/django.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { SVGProps } from 'react'

export function DjangoIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg width="1em" height="1em" viewBox="0 0 128 128" {...props}>
<path
d="M59.448 0h20.93v96.88c-10.737 2.04-18.62 2.855-27.181 2.855-25.551-.001-38.87-11.551-38.87-33.705 0-21.338 14.135-35.2 36.015-35.2 3.398 0 5.98.272 9.106 1.087zm0 48.765c-2.446-.815-4.485-1.086-7.067-1.086-10.6 0-16.717 6.523-16.717 17.939 0 11.145 5.845 17.26 16.582 17.26 2.309 0 4.212-.136 7.202-.542z"
fill="#092E20"
></path>
<path
d="M113.672 32.321V80.84c0 16.717-1.224 24.735-4.893 31.666-3.398 6.661-7.883 10.873-17.124 15.494l-19.435-9.241c9.242-4.35 13.726-8.153 16.58-14 2.99-5.979 3.943-12.91 3.943-31.122V32.321zM92.742.111h20.93v21.474h-20.93z"
fill="#092E20"
></path>
</svg>
)
}
12 changes: 12 additions & 0 deletions src/components/icons/svgs/spring.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { SVGProps } from 'react'

export function SpringIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg width="1em" height="1em" viewBox="0 0 128 128" {...props}>
<path
d="M116.452 6.643a59.104 59.104 0 01-6.837 12.136A64.249 64.249 0 0064.205-.026C28.984-.026 0 28.982 0 64.242a64.316 64.316 0 0019.945 46.562l2.368 2.1a64.22 64.22 0 0041.358 15.122c33.487 0 61.637-26.24 64.021-59.683 1.751-16.371-3.051-37.077-11.24-61.7zM29.067 111.17a5.5 5.5 0 01-4.269 2.034c-3.018 0-5.487-2.484-5.487-5.502 0-3.017 2.485-5.501 5.487-5.501 1.25 0 2.485.433 3.452 1.234 2.351 1.9 2.718 5.384.817 7.735zm87.119-19.238c-15.843 21.122-49.68 14.003-71.376 15.02 0 0-3.852.234-7.721.867 0 0 1.45-.617 3.335-1.334 15.226-5.301 22.43-6.335 31.685-11.086 17.427-8.869 34.654-28.274 38.24-48.463-6.637 19.422-26.75 36.11-45.077 42.895-12.557 4.635-35.238 9.136-35.238 9.136l-.917-.484c-15.442-7.518-15.91-40.977 12.157-51.78 12.291-4.735 24.048-2.134 37.323-5.302 14.175-3.367 30.568-14.004 37.238-27.874 7.471 22.19 16.46 56.932.35 78.405z"
fill="#77bc1f"
></path>
</svg>
)
}
2 changes: 1 addition & 1 deletion src/components/title.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export function Title({ text, description, ...props }: Props) {
<div className="flex flex-col items-center md:items-start">
<h1
{...props}
className="w-fit bg-gradient-to-br from-neutral-900 via-neutral-900/90 to-neutral-900/70 bg-clip-text text-4xl font-semibold text-transparent dark:from-neutral-300 dark:via-neutral-300/90 dark:to-neutral-300/70"
className="h-fit w-fit bg-gradient-to-br from-neutral-900 via-neutral-900/90 to-neutral-900/70 bg-clip-text text-4xl font-semibold leading-tight text-transparent dark:from-neutral-300 dark:via-neutral-300/90 dark:to-neutral-300/70"
>
{text}
</h1>
Expand Down
7 changes: 4 additions & 3 deletions src/styles/components.css
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,12 @@

blockquote {
@apply relative my-3 w-max max-w-full overflow-hidden px-4 py-1;
@apply border-l border-l-neutral-900 dark:border-l-neutral-100;
@apply italic text-black/80 dark:text-white/70;
@apply border-l border-l-neutral-900/50 dark:border-l-neutral-100/50;
@apply font-serif text-lg leading-tight text-black/80 dark:text-white/70;
@apply bg-neutral-50 dark:bg-neutral-1000;

p {
@apply m-0;
@apply m-0 mb-3 last:mb-0;
}

.icon {
Expand Down
3 changes: 2 additions & 1 deletion tailwind.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ const config: Config = {
20: '20deg'
},
fontFamily: {
sans: 'var(--font-inter)',
sens: 'var(--font-inter)',
serif: 'var(--font-crimson-text)',
handwrite: 'var(--font-caveat)'
},
colors: {
Expand Down
Loading