creada la primer entrada
This commit is contained in:
commit
95432e80f0
34
.gitignore
vendored
Normal file
34
.gitignore
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
# Hugo and Blowfish
|
||||
public/
|
||||
resources/
|
||||
exampleSite/resources/
|
||||
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
#others
|
||||
node_modules
|
||||
.hugo_build.lock
|
||||
|
||||
# OS generated files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
.idea
|
||||
.Ulysses-Group.plist
|
||||
.Ulysses-Settings.plist
|
||||
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
[submodule "themes/blowfish"]
|
||||
path = themes/blowfish
|
||||
url = https://github.com/nunocoracao/blowfish.git
|
||||
branch = main
|
||||
69
config/_default/hugo.toml
Normal file
69
config/_default/hugo.toml
Normal file
@ -0,0 +1,69 @@
|
||||
# -- Site Configuration --
|
||||
# Refer to the theme docs for more details about each of these parameters.
|
||||
# https://blowfish.page/docs/getting-started/
|
||||
|
||||
theme = "blowfish"
|
||||
baseURL = "https://ghostpacket.org/"
|
||||
defaultContentLanguage = "es"
|
||||
|
||||
pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
|
||||
|
||||
enableRobotsTXT = true
|
||||
summaryLength = 0
|
||||
|
||||
buildDrafts = false
|
||||
buildFuture = false
|
||||
|
||||
enableEmoji = true
|
||||
|
||||
# googleAnalytics = "G-XXXXXXXXX"
|
||||
|
||||
[pagination]
|
||||
pagerSize = 100
|
||||
|
||||
[imaging]
|
||||
anchor = 'Center'
|
||||
|
||||
[taxonomies]
|
||||
tag = "tags"
|
||||
categoria = "categorias"
|
||||
autor = "autores"
|
||||
series = "series"
|
||||
|
||||
[sitemap]
|
||||
changefreq = 'daily'
|
||||
filename = 'sitemap.xml'
|
||||
priority = 0.5
|
||||
|
||||
[outputs]
|
||||
home = ["HTML", "RSS", "JSON"]
|
||||
|
||||
[related]
|
||||
threshold = 0
|
||||
toLower = false
|
||||
|
||||
[[related.indices]]
|
||||
name = "tags"
|
||||
weight = 100
|
||||
|
||||
[[related.indices]]
|
||||
name = "categories"
|
||||
weight = 100
|
||||
|
||||
[[related.indices]]
|
||||
name = "series"
|
||||
weight = 50
|
||||
|
||||
[[related.indices]]
|
||||
name = "authors"
|
||||
weight = 20
|
||||
|
||||
[[related.indices]]
|
||||
name = "date"
|
||||
weight = 10
|
||||
|
||||
[[related.indices]]
|
||||
applyFilter = false
|
||||
name = 'fragmentrefs'
|
||||
type = 'fragments'
|
||||
weight = 10
|
||||
76
config/_default/languages.es.toml
Normal file
76
config/_default/languages.es.toml
Normal file
@ -0,0 +1,76 @@
|
||||
disabled = false
|
||||
languageCode = "es"
|
||||
languageName = "Español"
|
||||
weight = 1
|
||||
title = "GhostPacket"
|
||||
|
||||
[params]
|
||||
displayName = "ES"
|
||||
isoCode = "es"
|
||||
rtl = false
|
||||
dateFormat = "January 2 2006"
|
||||
# logo = "img/logo.png"
|
||||
# secondaryLogo = "img/secondary-logo.png"
|
||||
description = "Programación, política, hacktivismo y física"
|
||||
copyright = "Todo el contenido de esta página está licenciado bajo CC-BY-SA 4.0 a menos que se indique lo contrario"
|
||||
|
||||
[params.author]
|
||||
name = "Ghostie"
|
||||
email = "ghostie@ghostpacket.org"
|
||||
# image = "img/blowfish_logo.png"
|
||||
# imageQuality = 96
|
||||
# headline = "I'm only human"
|
||||
bio = "Estudiante de física de la Universidad de Antioquia, amante de la programación de bajo nivel, buscando la excusa perfecta para poder quemarlo todo... pero unidxs, y de la mano siempre."
|
||||
links = [
|
||||
{ email = "mailto:ghostie@ghostpacket.org" },
|
||||
# { link = "https://link-to-some-website.com/" },
|
||||
# { amazon = "https://www.amazon.com/hz/wishlist/ls/wishlist-id" },
|
||||
# { apple = "https://www.apple.com" },
|
||||
# { blogger = "https://username.blogspot.com/" },
|
||||
# { bluesky = "https://bsky.app/profile/username" },
|
||||
# { codepen = "https://codepen.io/username" },
|
||||
# { dev = "https://dev.to/username" },
|
||||
# { discord = "https://discord.gg/invitecode" },
|
||||
# { dribbble = "https://dribbble.com/username" },
|
||||
# { facebook = "https://facebook.com/username" },
|
||||
# { flickr = "https://www.flickr.com/photos/username/" },
|
||||
# { foursquare = "https://foursquare.com/username" },
|
||||
{ github = "https://git.ghostpacket.org/ghostie" },
|
||||
# { gitlab = "https://gitlab.com/username" },
|
||||
# { google = "https://www.google.com/" },
|
||||
# { hashnode = "https://username.hashnode.dev" },
|
||||
# { instagram = "https://instagram.com/username" },
|
||||
# { itch-io = "https://username.itch.io" },
|
||||
# { keybase = "https://keybase.io/username" },
|
||||
# { keyoxide = "https://keyoxide.org/URI" },
|
||||
# { kickstarter = "https://www.kickstarter.com/profile/username" },
|
||||
# { lastfm = "https://lastfm.com/user/username" },
|
||||
# { linkedin = "https://linkedin.com/in/username" },
|
||||
{ mastodon = "https://social.ghostpacket.org/@ghostie" },
|
||||
{ matrix = "https://matrix.to/#/@ghostie:matrix.ghostpacket.org" },
|
||||
# { medium = "https://medium.com/username" },
|
||||
# { microsoft = "https://www.microsoft.com/" },
|
||||
# { orcid = "https://orcid.org/userid" },
|
||||
# { patreon = "https://www.patreon.com/username" },
|
||||
# { pinterest = "https://pinterest.com/username" },
|
||||
# { reddit = "https://reddit.com/user/username" },
|
||||
# { researchgate = "https://www.researchgate.net/profile/username" },
|
||||
# { signal = "https://signal.me/#eu/userid" },
|
||||
# { slack = "https://workspace.url/team/userid" },
|
||||
# { snapchat = "https://snapchat.com/add/username" },
|
||||
# { soundcloud = "https://soundcloud.com/username" },
|
||||
# { spotify = "https://open.spotify.com/user/userid" },
|
||||
# { stack-overflow = "https://stackoverflow.com/users/userid/username" },
|
||||
# { steam = "https://steamcommunity.com/profiles/userid" },
|
||||
# { telegram = "https://t.me/username" },
|
||||
# { threads = "https://www.threads.net/@username" },
|
||||
# { tiktok = "https://tiktok.com/@username" },
|
||||
# { tumblr = "https://username.tumblr.com" },
|
||||
# { twitch = "https://twitch.tv/username" },
|
||||
# { twitter = "https://twitter.com/username" },
|
||||
# { x-twitter = "https://twitter.com/username" },
|
||||
# { whatsapp = "https://wa.me/phone-number" },
|
||||
# { youtube = "https://youtube.com/username" },
|
||||
# { ko-fi = "https://ko-fi.com/username" },
|
||||
# { codeberg = "https://codeberg.org/username"},
|
||||
]
|
||||
20
config/_default/markup.toml
Normal file
20
config/_default/markup.toml
Normal file
@ -0,0 +1,20 @@
|
||||
# -- Markup --
|
||||
# These settings are required for the theme to function.
|
||||
|
||||
[goldmark]
|
||||
[goldmark.renderer]
|
||||
unsafe = true
|
||||
|
||||
[goldmark.extensions]
|
||||
[goldmark.extensions.passthrough]
|
||||
enable = true
|
||||
[goldmark.extensions.passthrough.delimiters]
|
||||
block = [['\[', '\]'], ['$$', '$$']]
|
||||
inline = [['\(', '\)']]
|
||||
|
||||
[highlight]
|
||||
noClasses = false
|
||||
|
||||
[tableOfContents]
|
||||
startLevel = 2
|
||||
endLevel = 4
|
||||
74
config/_default/menus.es.toml
Normal file
74
config/_default/menus.es.toml
Normal file
@ -0,0 +1,74 @@
|
||||
# -- Main Menu --
|
||||
# The main menu is displayed in the header at the top of the page.
|
||||
# Acceptable parameters are name, pageRef, page, url, title, weight.
|
||||
#
|
||||
# The simplest menu configuration is to provide:
|
||||
# name = The name to be displayed for this menu link
|
||||
# pageRef = The identifier of the page or section to link to
|
||||
#
|
||||
# By default the menu is ordered alphabetically. This can be
|
||||
# overridden by providing a weight value. The menu will then be
|
||||
# ordered by weight from lowest to highest.
|
||||
|
||||
[[main]]
|
||||
name = "Programación"
|
||||
pageRef = "programacion"
|
||||
weight = 10
|
||||
|
||||
[[main]]
|
||||
name = "No consumas X"
|
||||
pageRef = "noconsumas"
|
||||
weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "Parent"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "example sub-menu 1"
|
||||
# parent = "Parent"
|
||||
# pageRef = "posts"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "example sub-menu 2"
|
||||
# parent = "Parent"
|
||||
# pageRef = "posts"
|
||||
# weight = 20
|
||||
|
||||
#[[subnavigation]]
|
||||
# name = "An interesting topic"
|
||||
# pageRef = "tags/interesting-topic"
|
||||
# weight = 10
|
||||
|
||||
#[[subnavigation]]
|
||||
# name = "My Awesome Category"
|
||||
# pre = "github"
|
||||
# pageRef = "categories/awesome"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "Categories"
|
||||
# pageRef = "categories"
|
||||
# weight = 20
|
||||
|
||||
#[[main]]
|
||||
# name = "Tags"
|
||||
# pageRef = "tags"
|
||||
# weight = 30
|
||||
|
||||
|
||||
# -- Footer Menu --
|
||||
# The footer menu is displayed at the bottom of the page, just before
|
||||
# the copyright notice. Configure as per the main menu above.
|
||||
|
||||
|
||||
# [[footer]]
|
||||
# name = "Tags"
|
||||
# pageRef = "tags"
|
||||
# weight = 10
|
||||
|
||||
# [[footer]]
|
||||
# name = "Categories"
|
||||
# pageRef = "categories"
|
||||
# weight = 20
|
||||
177
config/_default/params.toml
Normal file
177
config/_default/params.toml
Normal file
@ -0,0 +1,177 @@
|
||||
# -- Theme Options --
|
||||
# These options control how the theme functions and allow you to
|
||||
# customise the display of your website.
|
||||
#
|
||||
# Refer to the theme docs for more details about each of these parameters.
|
||||
# https://blowfish.page/docs/configuration/#theme-parameters
|
||||
|
||||
colorScheme = "congo"
|
||||
defaultAppearance = "light" # valid options: light or dark
|
||||
autoSwitchAppearance = true
|
||||
|
||||
enableA11y = true
|
||||
enableSearch = true
|
||||
enableCodeCopy = true
|
||||
|
||||
replyByEmail = false
|
||||
|
||||
# mainSections = ["section1", "section2"]
|
||||
# robots = ""
|
||||
|
||||
disableImageOptimization = false
|
||||
disableImageOptimizationMD = false
|
||||
disableTextInHeader = false
|
||||
# backgroundImageWidth = 1200
|
||||
|
||||
defaultBackgroundImage = "https://i.imgur.com/hR5wSzc.jpegṕ"
|
||||
# defaultFeaturedImage = "IMAGE.jpg" # used as default for featured images in all articles
|
||||
# defaultSocialImage = "/android-chrome-512x512.png" # used as default for social media sharing (Open Graph and Twitter)
|
||||
|
||||
highlightCurrentMenuArea = true
|
||||
smartTOC = true
|
||||
# smartTOCHideUnfocusedChildren = true
|
||||
|
||||
fingerprintAlgorithm = "sha512" # Valid values are "sha512" (default), "sha384", "sha256"
|
||||
|
||||
giteaDefaultServer = "https://git.ghostpacket.org"
|
||||
forgejoDefaultServer = "https://v11.next.forgejo.org"
|
||||
|
||||
[header]
|
||||
layout = "fixed" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur
|
||||
|
||||
[footer]
|
||||
showMenu = true
|
||||
showCopyright = true
|
||||
showThemeAttribution = true
|
||||
showAppearanceSwitcher = true
|
||||
showScrollToTop = true
|
||||
|
||||
[homepage]
|
||||
layout = "background" # valid options: page, profile, hero, card, background, custom
|
||||
#homepageImage = "IMAGE.jpg" # used in: hero, and card
|
||||
showRecent = false
|
||||
showRecentItems = 10
|
||||
showMoreLink = false
|
||||
showMoreLinkDest = "/posts/"
|
||||
cardView = false
|
||||
cardViewScreenWidth = false
|
||||
layoutBackgroundBlur = true # only used when layout equals background
|
||||
disableHeroImageFilter = false # only used when layout equals hero
|
||||
|
||||
[article]
|
||||
showDate = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showDateOnlyInArticle = false
|
||||
showDateUpdated = true
|
||||
showAuthor = true
|
||||
showAuthorBottom = true
|
||||
showHero = false
|
||||
# heroStyle = "basic" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = false
|
||||
showDraftLabel = true
|
||||
showEdit = false
|
||||
# editURL = "https://github.com/username/repo/"
|
||||
editAppendPath = true
|
||||
seriesOpened = false
|
||||
showHeadingAnchors = true
|
||||
showPagination = true
|
||||
invertPagination = false
|
||||
showReadingTime = true
|
||||
showTableOfContents = true
|
||||
showRelatedContent = false
|
||||
# relatedContentLimit = 3
|
||||
showTaxonomies = false # use showTaxonomies OR showCategoryOnly, not both
|
||||
showCategoryOnly = false # use showTaxonomies OR showCategoryOnly, not both
|
||||
showAuthorsBadges = false
|
||||
showWordCount = true
|
||||
sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram", "line"]
|
||||
showZenMode = false
|
||||
|
||||
[list]
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
layoutBackgroundBlur = true # only used when heroStyle equals background or thumbAndBackground
|
||||
layoutBackgroundHeaderSpace = true # only used when heroStyle equals background
|
||||
showBreadcrumbs = false
|
||||
showSummary = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = false
|
||||
showCards = false
|
||||
orderByWeight = false
|
||||
groupByYear = true
|
||||
cardView = false
|
||||
cardViewScreenWidth = false
|
||||
constrainItemsWidth = false
|
||||
|
||||
[sitemap]
|
||||
excludedKinds = ["taxonomy", "term"]
|
||||
|
||||
[taxonomy]
|
||||
showTermCount = true
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
showBreadcrumbs = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = false
|
||||
cardView = false
|
||||
|
||||
[term]
|
||||
showHero = false
|
||||
# heroStyle = "background" # valid options: basic, big, background, thumbAndBackground
|
||||
showBreadcrumbs = true
|
||||
showViews = false
|
||||
showLikes = false
|
||||
showTableOfContents = true
|
||||
groupByYear = true
|
||||
cardView = false
|
||||
cardViewScreenWidth = false
|
||||
|
||||
[firebase]
|
||||
# apiKey = "XXXXXX"
|
||||
# authDomain = "XXXXXX"
|
||||
# projectId = "XXXXXX"
|
||||
# storageBucket = "XXXXXX"
|
||||
# messagingSenderId = "XXXXXX"
|
||||
# appId = "XXXXXX"
|
||||
# measurementId = "XXXXXX"
|
||||
|
||||
[fathomAnalytics]
|
||||
# site = "ABC12345"
|
||||
# domain = "llama.yoursite.com"
|
||||
|
||||
[umamiAnalytics]
|
||||
# websiteid = "ABC12345"
|
||||
# domain = "llama.yoursite.com"
|
||||
# dataDomains = "yoursite.com,yoursite2.com"
|
||||
# scriptName = ""
|
||||
# enableTrackEvent = true
|
||||
|
||||
[selineAnalytics]
|
||||
# token = "XXXXXX"
|
||||
# enableTrackEvent = true
|
||||
|
||||
[buymeacoffee]
|
||||
# identifier = ""
|
||||
# globalWidget = true
|
||||
# globalWidgetMessage = "Hello"
|
||||
# globalWidgetColor = "#FFDD00"
|
||||
# globalWidgetPosition = "Right"
|
||||
|
||||
[verification]
|
||||
# google = ""
|
||||
# bing = ""
|
||||
# pinterest = ""
|
||||
# yandex = ""
|
||||
# fediverse = ""
|
||||
|
||||
[rssnext]
|
||||
# feedId = ""
|
||||
# userId = ""
|
||||
|
||||
[advertisement]
|
||||
# adsense = ""
|
||||
9
content/_index.org
Normal file
9
content/_index.org
Normal file
@ -0,0 +1,9 @@
|
||||
#+title: Inicio
|
||||
#+description: Inicio de la página de GhostPacket
|
||||
|
||||
¡Hola a todxs y bienvenidxs a GhostPacket!
|
||||
|
||||
En esta página escribiré principalmente sobre política, programación, física y
|
||||
algo de ciberseguridad. Espero que sea útil para todxs ustedes.
|
||||
|
||||
¡Porque el conocimiento debe ser libre!
|
||||
7
content/noconsumas/_index.org
Normal file
7
content/noconsumas/_index.org
Normal file
@ -0,0 +1,7 @@
|
||||
#+title: ¿Por qué no consumir X?
|
||||
#+description: Una sección donde hablo por qué boicoteo ciertas compañías, y una invitación abierta a todx aquellx que quiera unirse.
|
||||
|
||||
Las siguientes son marcas/productos que he dejado de consumir por razones que
|
||||
podrán encontradar detalladas y documentadas en cada una de las entradas. Lxs
|
||||
invito a cada unx de ustedes que se unan a este lucha, que nuestras comodidades
|
||||
no cuesten los derechos de muchxs.
|
||||
BIN
content/noconsumas/cocacola/featured.jpg
Normal file
BIN
content/noconsumas/cocacola/featured.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
124
content/noconsumas/cocacola/index.org
Normal file
124
content/noconsumas/cocacola/index.org
Normal file
@ -0,0 +1,124 @@
|
||||
#+title: ¿Por qué no consumir productos de Coca-Cola?
|
||||
#+description: Razones por las que evito consumir productos de Coca-Cola
|
||||
#+summary: Coca-Cola es una compañía podrida, que debe su riqueza a la explotación de recursos naturales, explotación laboral, y se ha visto envuelta en casos de persecusión sindical, secuestros, torturas, asesinato y vínculos con grupos paramilitares. Todo eso en varios países de Latinoamérica
|
||||
#+categorias[]: noconsumas
|
||||
#+date: 2025-09-25T23:51:49+0000
|
||||
#+LAST_MODIFIED: 2025-09-26T00:36:59+0000
|
||||
|
||||
Las siguientes son razones por las que evito consumir productos de
|
||||
Coca-Cola. Para empezar, Coca-Cola es una compañía podrida, que debe su riqueza
|
||||
a la explotación de recursos naturales, explotación laboral, y se ha visto
|
||||
envuelta en casos de persecusión sindical, secuestros, torturas, asesinato y
|
||||
vínculos con grupos paramilitares. Todo eso en varios países de Latinoamérica.
|
||||
|
||||
* Crímenes y Abusos en América Latina
|
||||
|
||||
** Colombia
|
||||
|
||||
Coca-Cola en Colombia ha tenido varias víctimas, algunas de ellas son Isidro Segundo Gil (asesinado el 5 de diciembre de 1996), Adolfo de Jesús Múnera, entre otros[fn:1].
|
||||
|
||||
En Colombia, Coca-Cola ha estado presente en casos de asesinatos, amenazas y
|
||||
desplazamientos de sindicalistas de SINALTRAINAL (Sindicato Nacional del Sistema
|
||||
Agroalimentario de Colombia) por parte de paramilitares[fn:1] [fn:2] [fn:3].
|
||||
|
||||
** Guatemala
|
||||
|
||||
En Guatemala Coca-Cola también ha sido protagonista de varios asesinatos,
|
||||
algunos como el de Pedro Quevedo (asesinado el 12 de diciembre de 1978), Manuel
|
||||
López Balán (5 de abril de 1979), Manuel Antonio Moscoso (24 de enero de 1979),
|
||||
etc [fn:4].
|
||||
|
||||
En Guatemala, al igual que en Colombia, y la mayoría de países, han habido campañas de terror contra sindicalistas. Esto dio lugar a asesinatos, amenazas, secuestros, y represión militar[fn:5]
|
||||
|
||||
** Nicaragua
|
||||
|
||||
En 2005, el sindicato único de trabajadores de Coca-Cola denunció despidos
|
||||
ilegales, amenazas, y negación al derecho de sindicalizarse por parte de
|
||||
PANAMCO [fn:3].
|
||||
|
||||
** México
|
||||
|
||||
En México, Coca-Cola ha realizado evasión fiscal masiva mediante empresas
|
||||
fantasma como SIAAGSA[fn:6] [fn:8], ha negado el reparto de utilidades (PTU) a
|
||||
empleados[fn:7], y entre muchos otros casos expuestos aquí[fn:8].
|
||||
|
||||
** Panamá
|
||||
|
||||
En 2003, Coca-Cola fue multada por $300.000 dólares por contaminar el río
|
||||
Matasnillo y la bahía de Panamá con tinte rojo usado en la producción de jugos[fn:9].
|
||||
|
||||
* Vínculos con Israel y Crímenes en Palestina
|
||||
|
||||
Coca-Cola opera en el asentamiento ilegal de Atarot (Cisjordania) mediante su
|
||||
franquicia Central Beverage Company [fn:10]. En cuanto a esto, la Corte
|
||||
Internacional de Justicia[fn:11] declaró en 2024 que estos asentamientos son ilegales y constituyen crímenes de guerra.
|
||||
|
||||
* Contaminación Ambiental Masiva
|
||||
|
||||
Coca-Cola es uno de los mayores contaminantes de plástico del planeta[fn:12]. Se
|
||||
estima que anualmente producen aproximadamente 110 mil millones de botellas de
|
||||
plástico, la mayoría de un solo uso[fn:13].
|
||||
|
||||
* Marcas de The Coca-Cola Company
|
||||
|
||||
Las siguientes son algunas de las marcas de The Coca-Cola Company:
|
||||
|
||||
- Coca-Cola
|
||||
- Sprite
|
||||
- Fanta
|
||||
- Powerade
|
||||
- Dasani
|
||||
- Schweppes
|
||||
- Del Valle
|
||||
- Monster
|
||||
- Fuze Tea
|
||||
- Quatro
|
||||
|
||||
* Footnotes
|
||||
|
||||
[fn:13] Wikipedia. (s. f.). /The Coca-Cola Company/. En /Wikipedia, la enciclopedia
|
||||
libre/. Recuperado de [[https://es.wikipedia.org/wiki/The_Coca-Cola_Company]].
|
||||
|
||||
[fn:12] Morales, Y. (2025, 26 de marzo). /Coca-Cola es el mayor contaminante del mundo de residuos plásticos en los océanos. El Economista./ Recuperado de [[https://www.eleconomista.com.mx/empresas/coca-cola-mayor-contaminante-mundo-residuos-plasticos-oceanos-20250326-752107.html]]
|
||||
|
||||
[fn:11] Noticias ONU. (2024, 19 de julio). /Corte Internacional de Justicia,
|
||||
Israel, Gaza, virus del Oropouche... Las noticias del viernes/. Recuperado de
|
||||
[[https://news.un.org/es/story/2024/07/1531371]]
|
||||
|
||||
[fn:10] Who Profits. (s. f.). /The Central Bottling Company (Coca-Cola
|
||||
Israel)/. Recuperado de
|
||||
[[https://www.whoprofits.org/companies/company/4081?the-central-bottling-company-cbc-coca-cola-israel]]
|
||||
|
||||
[fn:9] La Vanguardia. (2003, 8 de mayo). /Panamá multa a dos multinacionales de
|
||||
EE.UU. por contaminación ambiental/. Recuperado de
|
||||
[[https://www.lavanguardia.com/vida/20030508/51262774050/panama-multa-a-dos-multinacionales-de-ee-uu-por-contaminacion-ambiental.html]]
|
||||
|
||||
[fn:8] Killer Coke. (s. f.) /Coke's Crimes in Mexico/. Recuperado de
|
||||
[[https://killercoke.org/crimes_mexico.php]]
|
||||
|
||||
[fn:7] Reyes, F. (2019, 25 de junio). /Ciudad de México: trabajadores de Coca
|
||||
Cola levantan paros en cinco plantas distribuidoras./ La Izquierda Diario - Mundo
|
||||
Obrero México. Recuperado de
|
||||
[[https://www.laizquierdadiario.com/Ciudad-de-Mexico-trabajadores-de-Coca-Cola-levantan-paros-en-cinco-plantas-distribuidoras]]
|
||||
|
||||
[fn:6] Proceso. (2009, 22 de agosto) . /Ante ilegalidades de Coca-Cola, el
|
||||
silencio./ Recuperado de
|
||||
[[https://www.proceso.com.mx/nacional/2009/8/22/ante-ilegalidades-de-coca-cola-el-silencio-18104.html]].
|
||||
|
||||
[fn:5] Comisión Interamericana de Derechos Humanos. (1980-1981). /Informe Anual:
|
||||
Guatemala, caso 4425/. Recuperado de
|
||||
[[https://www.cidh.oas.org/annualrep/80.81sp/Guatemala4425.htm]].
|
||||
|
||||
[fn:4] Killer Coke. (s. f.). /Coke's crimes in Guatemala/. Recuperado de
|
||||
[[https://killercoke.org/crimes_guatemala.php?utm_source=chatgpt.com]].
|
||||
|
||||
[fn:3] Monasterio Martín, M. (2007, 26 de abril). /Coca-Cola es así: Abusos
|
||||
laborales, atentados ecológicos y persecusión sindical/. OMAL - Observatorio de
|
||||
Multinacionales en América Latina. [[https://omal.info/spip.php?article3995]]
|
||||
|
||||
[fn:2] CETIM. (2014, 6 de junio). /Violaciones de derechos humanos por parte de
|
||||
Coca Cola en Colombia./ Recuperado de
|
||||
[[https://www.cetim.ch/violaciones-de-derechos-humanos-por-parte-de-coca-cola-en-colombia/][https://www.cetim.ch/violaciones-de-derechos-humanos-por-parte-de-coca-cola-en-colombia/]]
|
||||
|
||||
[fn:1] Killer Coke. (s. f.). /Coke's Crimes in Colombia. Recuperado de
|
||||
[[https://killercoke.org/crimes_colombia.php][https://killercoke.org/crimes_colombia.php]]./
|
||||
BIN
content/programacion/2025/09/emulador-chip8/featured.png
Normal file
BIN
content/programacion/2025/09/emulador-chip8/featured.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 440 B |
191
content/programacion/2025/09/emulador-chip8/index.org
Normal file
191
content/programacion/2025/09/emulador-chip8/index.org
Normal file
@ -0,0 +1,191 @@
|
||||
#+title: ¿Cómo escribir un emulador de Chip8 con C?
|
||||
#+description: Una breve entrada de como iniciar en el desarrollo de emuladores con C
|
||||
#+summary: Una pequeña guía para iniciar en el desarrollo de emuladores utilizando C como lenguaje de programación, y el Chip8 como proyecto a implementar.
|
||||
#+categorias[]: C Programación
|
||||
#+date: 2025-09-19T02:31:01+0000
|
||||
#+draft: true
|
||||
#+LAST_MODIFIED: 2025-09-25T23:44:38+0000
|
||||
|
||||
¡Hola a todxs!
|
||||
|
||||
En esta entrada vamos a ver como podemos escribir un emulador del chip8 en C.
|
||||
Tengan en cuenta que esta va a ser solo una guía enumerando los pasos,
|
||||
mostrando formas en que se podría hacer la implementación, pero mejorar ese
|
||||
código, finalizarlo e incluso construir otros proyectos sobre el (como un
|
||||
ensamblador, debugger y desensamblador) serían muy buenas cosas que estudiar
|
||||
después.
|
||||
|
||||
* El Chip8
|
||||
|
||||
El Chip8 es un lenguaje de programación desarrollado a mitad de los 70s por
|
||||
Joseph Weisbecker. Chip8 fue diseñado para ser más fácil de programar y usar menos memoria que otros lenguajes de la época, como BASIC.
|
||||
|
||||
Algunas aplicaciones hechas en Chip8 incluyen juegos originales, demos, y
|
||||
recreaciones de juegos populares de otros sistemas.
|
||||
|
||||
Hacer una implementación de Chip8 no es tan complicado, y es el lugar perfecto
|
||||
para iniciar a desarrollar emuladores, ya que su set de instrucciones es
|
||||
reducido, y es bastante fácil de implementar.
|
||||
|
||||
Primero, vamos sobre los detalles técnicos de como funciona Chip8, antes de
|
||||
empezar a pensar en la implementación para que así sepamos qué estamos
|
||||
haciendo, y por qué.
|
||||
|
||||
{{< alert "circle-info" >}}
|
||||
*[[http://devernay.free.fr/hacks/chip8/C8TECH10.HTM][Aquí]]* podrás encontrar una especificación completa del Chip8.
|
||||
{{< /alert >}}
|
||||
|
||||
** Memoria
|
||||
|
||||
El Chip8 tiene 4095 bytes de memoria, que pueden ser representados de la
|
||||
siguiente forma:
|
||||
|
||||
#+begin_src artist
|
||||
+-----------------------+
|
||||
| | 0xFFF - Fin de la memoria
|
||||
+-----------------------+
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| 0x200/0xFFF |
|
||||
| Datos del |
|
||||
| programa |
|
||||
| |
|
||||
+-----------------------+ 0x200 - Inicio programas Chip8
|
||||
| |
|
||||
| 0x00/0x1FF |
|
||||
| Reservado |
|
||||
| |
|
||||
+-----------------------+ 0x00 - Inicio de la RAM
|
||||
#+end_src
|
||||
|
||||
La dirección ~0x00~ marca donde inicia la RAM, de la dirección ~0x00~ a la dirección
|
||||
~0x1ff~ (511 bytes) hay un espacio reservado para el Chip8 donde almacena - por
|
||||
ejemplo - el set de caracteres por defecto (vamos a ver esto a profundidad más
|
||||
adelante). Todos los programas del chip8 se cargan en la dirección de memoria
|
||||
~0x200~, y tienen desde ~0x200~ a ~0xfff~ para almacenar todas sus instrucciones y
|
||||
sprites (ya también pasamos a esto).
|
||||
|
||||
El stack del Chip8 es un array de 16 valores diferentes de 16 bits cada uno,
|
||||
estos se utilizan para almacenar las direcciones a las que el chip8 debería
|
||||
volver de una subrutina, lo que quiere decir, que tenemos un nivel máximo de
|
||||
encadenamiento de 16 subrutinas. En otras palabras, cada que llamemos una
|
||||
subrutina, se va a crear una entrada en el stack, y al ser terminada su
|
||||
ejecicion será removida del stack, volviendo al punto de ejecución anterior.
|
||||
|
||||
El stack es una estructura de datos tipo LIFO (Last In, First Out), lo que
|
||||
significa que el último elemento, será siempre el primero en ser removido.
|
||||
|
||||
** Set de caracteres
|
||||
|
||||
El Chip8 viene con varios sprites por defecto, estos los llamamos /set de
|
||||
caracteres/. Estos son un grupo de sprites representando los digitos desde el 0
|
||||
hasta la F. Son de 5 bytes (sprites de 8x5) y están almacenados en el área reservada del chip8 (0x00 - 0x1ff).
|
||||
|
||||
Los siguientes, son ejemplos de estos caracteres:
|
||||
|
||||
#+begin_src text
|
||||
+----+--------+----+ +----+--------+----+
|
||||
|"0" |Binary |Hex | |"1" |Binary |Hex |
|
||||
+----+--------+----| +----+--------+----+
|
||||
|****|11110000|0xF0| | 1 |00100000|0x20|
|
||||
|* *|10010000|0x90| | 11 |01100000|0x60|
|
||||
|* *|10010000|0x90| | 1 |00100000|0x20|
|
||||
|* *|10010000|0x90| | 1 |00100000|0x20|
|
||||
|****|11110000|0xF0| | 111|01110000|0x70|
|
||||
+----+--------+----+ +----+--------+----+
|
||||
#+end_src
|
||||
|
||||
** Registros
|
||||
|
||||
El Chip8 tiene 16 registros que pueden almacenar valores de hasta 8 bits, es
|
||||
decir, pueden almacenar un byte de información. Los registros son los
|
||||
siguientes:
|
||||
|
||||
| Registros | | | | |
|
||||
|-----------+----+----+----+----|
|
||||
| | V0 | V1 | V2 | V3 |
|
||||
| | V4 | V4 | V6 | V7 |
|
||||
| | V8 | V9 | VA | VB |
|
||||
| | VC | VD | VE | VF |
|
||||
|
||||
Es importante tener en cuenta que el registro ~VF~ no debe ser utilizado por un programa, ya que algunas instrucciones hacen uso de este registro, pero los otros 15 registros pueden ser utilizados sin problema.
|
||||
|
||||
El Chip8 también tiene algunos registros extra:
|
||||
- *I:* Usado para almacenar direcciones de memoria.
|
||||
- *PC:* Apunta a la dirección de la instrucción que se está ejecutando
|
||||
actualmente. Todas las instrucciones del Chip8 son de 2 bytes, por lo que este
|
||||
registro debe ser incrementado por 2 cada vez que una instrucción es
|
||||
ejecutada.
|
||||
- *SP:* Stack pointer, apunta a la ubicación del stack.
|
||||
- *ST (Sound Timer):* Este registro le permite al Chip8 reproducir el sonido de un
|
||||
beep, ese sonido se ejecutará cuando este registro sea diferente de 0, va a
|
||||
estar decreciendo a una velocidad de 70Hz. Si este registro es igual a 0, no
|
||||
se reproducirá ningún sonido.
|
||||
- *DT (Delay Timer):* Este registro se usa cuando queremos parar la ejecución de
|
||||
un programa. Funciona similar a el *Sound Timer*, ya que cuando este registro es
|
||||
diferente de cero, la ejecución del Chip8 se va a poner en pausa, y el valor
|
||||
de este registro disminuirá a una velocidad de 60Hz. Cuando este timer sea 0
|
||||
de nuevo, la ejecución del programa será resumida.
|
||||
|
||||
** La Pantalla
|
||||
|
||||
La resolución del Chip8 es 64x32 pixeles, y es monocromático, lo que quiere
|
||||
decir que solo puede mostrar blanco y negro, estos valores pueden ser
|
||||
representados como booleanos, 0 para negro, 1 para blanco. Cuando dibujamos en
|
||||
la pantalla estamos dibujando sprites, no pixeles individuales. Si un sprite se
|
||||
mueve hacia un borde de la pantalla y excede la resolución de esta, será envíado
|
||||
al lado opuesto de la pantalla. Los sprites pueden tener un máxico de 8 bits de
|
||||
ancho, y 15 de alto.
|
||||
|
||||
|
||||
** El teclado
|
||||
|
||||
El teclado del Chip8 solamente tiene 16 teclas: los números del 0 a la F:
|
||||
|
||||
| 1 | 2 | 3 | C |
|
||||
| 4 | 5 | 6 | D |
|
||||
| 7 | 8 | 9 | E |
|
||||
| A | 0 | B | F |
|
||||
|
||||
** Instrucciones
|
||||
|
||||
El set de instrucciones del Chip8 es demasiado reducido, ya que solamente tiene
|
||||
36 instrucciones. Hay instrucciones para realizar operaciones matemáticas,
|
||||
dibujar, y manipular registros.
|
||||
|
||||
* La Implementación
|
||||
|
||||
Vamos a tomar como referencia este código:
|
||||
|
||||
{{< gitea server="https://git.ghostpacket.org" repo="ghostie/Chip8Suite" >}}
|
||||
|
||||
** La estructura del Chip8
|
||||
|
||||
El núcleo del emulador es una estructura llamada ~struct chip8~ definida en
|
||||
~include/chip8~. Esa estructura es muy simple, luce de la siguiente forma:
|
||||
|
||||
#+begin_src C
|
||||
struct chip8
|
||||
{
|
||||
struct chip8_memory memory;
|
||||
struct chip8_registers registers;
|
||||
struct chip8_stack stack;
|
||||
struct chip8_keyboard keyboard;
|
||||
struct chip8_screen screen;
|
||||
};
|
||||
#+end_src
|
||||
|
||||
Esa estructura contiene todos los elementos que se mencionaron anteriormente, la
|
||||
memoria, los registros, el stack, el teclado y la pantalla.
|
||||
|
||||
La estructura ~chip8_memory~ definida en ~include/mem.h~ es solo una estructura que
|
||||
contiene una variable de 4095 bytes definida ~unsigned char memory~, y tiene
|
||||
algunas funciones para modificar valores en cierto índica, para obtener algún
|
||||
valores, y para obtener un short (dos bytes) en cierto índice.
|
||||
|
||||
La estructura ~chip8_registers~ definida en ~include/registers.h~, contiene los
|
||||
registros que se mencionaron anteriormente, es un array de ~unsigned char~ llamado
|
||||
V con un tamaño de 16 elementos, al igual que algunos otros ~unsigned char~ para
|
||||
el delay timer, sound timer, y stack pointer. Otros registros como el *I* y el *PC*
|
||||
son de tipo ~unsigned short~.
|
||||
5
content/programacion/_index.org
Normal file
5
content/programacion/_index.org
Normal file
@ -0,0 +1,5 @@
|
||||
#+title: Programación
|
||||
#+description: Blog de GhostPacket
|
||||
|
||||
Los siguientes son todos los posts que están disponibles en GhostPacket sobre
|
||||
programación:
|
||||
1
themes/blowfish
Submodule
1
themes/blowfish
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 3e652b3749f3f46b26258662599649d10dba2708
|
||||
Loading…
x
Reference in New Issue
Block a user