43 Commits
Author SHA1 Message Date
coja db60f55c73 [NoJS] reimplementing js features without the js 2026-08-10 16:19:59 +02:00
coja 904ed7e317 [Theme] fix persist pages 2026-08-09 06:53:25 +02:00
coja f6093d9876 [Fix] no more sudo for dev 2026-08-09 06:26:17 +02:00
coja 740a90536d [Fix] hamburger undefined 2026-08-09 06:08:56 +02:00
coja 26d1295006 [Fix] lang 2026-08-09 06:07:20 +02:00
coja 352709cec6 Revert "[Fix] no more sudo needed, runtime warn"
This reverts commit cc0127dbe3.
2026-08-09 06:02:28 +02:00
coja cc0127dbe3 [Fix] no more sudo needed, runtime warn 2026-08-09 05:49:52 +02:00
coja 2843f1763e [Lint] ran formated 2026-08-09 05:02:17 +02:00
coja d53aa42ecc [Makefile] lint and format 2026-08-09 05:01:59 +02:00
coja db0169f34b [Theme] light/dark persistance 2026-08-09 04:43:46 +02:00
coja b4a968d991 [Lang] fix persistance 2026-08-09 04:39:00 +02:00
coja a823f3a8bf [Services] pastebin 2026-08-09 04:14:56 +02:00
fram3d a3e9b61c5c added events for 08-2026 2026-07-29 00:50:30 +02:00
coja ec0b797f15 [Events] July update 2026-07-01 00:40:44 +02:00
coja e63f6a85be [Fix] typo and locations 2026-06-22 16:47:27 +02:00
coja 3906aef068 [Events] june update 2026-06-02 01:14:46 +02:00
coja 1210930ff9 [Event] june update 2026-06-01 23:20:47 +02:00
coja a212d2bece [Event] page, repetition cleanup 2026-06-01 00:49:01 +02:00
coja b34ed3c578 [Events] June partial 2026-06-01 00:47:23 +02:00
coja 7e7dbe1b49 [Events] fix and first event june 2026-06-01 00:35:27 +02:00
coja a58f5e4514 [Events] Loza lecture 2026-05-27 01:56:06 +02:00
hugo 15c0354eb3 Konferencija umesto filma 2026-05-15 22:36:19 +02:00
coja 2cf941f284 [Page] support remove monero 2026-05-05 14:26:44 +02:00
coja 9eca59f80f [Doc] csv check 2026-05-02 05:05:26 +02:00
coja c3ae746d83 [Doc] update 2026-05-02 04:49:06 +02:00
coja a66da9b2d5 [Page] statute update 2026-05-02 04:17:07 +02:00
coja e9147b34cb [Page] support monero wallet removed 2026-05-02 04:03:12 +02:00
coja 02c2dcc9fc [CSV] parsing csv with DictReader instead 2026-05-02 04:00:17 +02:00
coja 749574c8dc [Doc] cleanup 2026-05-02 03:58:58 +02:00
coja c40f101540 [JS] Wrapped everything to DOM Loaded 2026-05-02 03:56:03 +02:00
coja 5958bbc24f [Doc] readme update for makefile 2026-05-02 03:45:29 +02:00
coja d9c93d1182 [Makefile] init 2026-05-02 03:44:52 +02:00
coja d001d6b287 [Prep] location in new tab 2026-05-02 03:43:43 +02:00
coja 910f375c94 [Requirements] missing pkgs 2026-05-02 03:36:28 +02:00
coja 69b0e5b63a [Events] readability improvement, banner spacing 2026-05-02 03:16:51 +02:00
coja ec64147c6b [Events] spacing fix 2026-05-02 02:43:04 +02:00
coja b6cfef830a [Theme] dark/light theme fix 2026-05-02 02:37:39 +02:00
coja e3330ad1bd [Page] events 2026-05-02 02:13:59 +02:00
coja 6d31b3915b [Cleanup] libreoffice lock file 2026-05-02 02:13:48 +02:00
coja e18bf1899e [Fix] menu and theme switch 2026-05-02 01:50:28 +02:00
coja 9fc58a992e [Fix] lint and error fix 2026-05-02 00:46:38 +02:00
coja 6013ff7cc8 [Page] statute, voting members update 2026-05-02 00:34:48 +02:00
coja d1051be74b [JS] refactor 2026-05-01 23:27:36 +02:00
41 changed files with 1226 additions and 756 deletions
+8
View File
@@ -0,0 +1,8 @@
[tool.black]
line-length = 88
target-version = ['py312']
[tool.flake8]
max-line-length = 88
extend-ignore = "E203"
exclude = ".venv"
+1
View File
@@ -17,6 +17,7 @@ events.ical
.vscode/
events.html
events_archive.html
nginx.pid
!site/lif*
-1
View File
@@ -1 +0,0 @@
,user,localhost,03.05.2025 20:05,file:///home/user/.config/libreoffice/4;
+36
View File
@@ -0,0 +1,36 @@
.PHONY: build events dev stop help prep lint format
help:
@echo "Available commands:"
@echo " make prep - Create venv and install requirements"
@echo " make events - Update site from CSV (build pages + images)"
@echo " make dev - Start development server"
@echo " make stop - Stop development server"
@echo " make build - Full website build sequence"
@echo " make help - Show this help message"
prep:
python3 -m venv .venv
./.venv/bin/pip install --upgrade pip
./.venv/bin/pip install -r requirements.txt
build:
./.venv/bin/python atom_gen.py
./.venv/bin/python prep.py
./.venv/bin/python build_pages.py
events:
./.venv/bin/python build_pages.py
./.venv/bin/python image_poster.py
dev:
nginx -p . -c nginx.dev.conf
stop:
nginx -p . -c nginx.dev.conf -s stop
lint:
./.venv/bin/flake8 . --config .flake8 --exclude .venv
format:
./.venv/bin/black .
+22 -12
View File
@@ -1,40 +1,50 @@
# Decentrala
dmz.rs/decentrala.org website
[dmz.rs](https://dmz.rs/) / [decentrala.org](https://decentrala.org) website
## Setup
First, prepare the virtual environment and install dependencies:
```sh
make prep
```
## Build site
Run
To build the complete website:
```sh
python atom_gen.py
python prep.py
python build_pages.py
make build
```
Complete website will be contained in `site/`. You can copy this to server.
The complete website will be contained in `site/`. You can copy this to your server.
## Development server
To start a development server, first build site, then run (possibly with `sudo`)
To start a development server, first build the site, then run (possibly with `sudo`):
```sh
nginx -p . -c nginx.dev.conf
make dev
```
To stop it:
```sh
nginx -p . -s stop
make stop
```
## Events
To update events, update the `events.csv` then run commands
To update events, update `dogadjaji.csv` then run:
```sh
python build_pages.py # builds html out of csv
python image_poster.py # generates images for events
make events
```
For checking the csv data, suggestion is the [tennis pkg](https://github.com/gurgeous/tennis), with example command:
```sh
tennis -nt --zebra --color on --theme dark --tail 20 dogadjaji.csv
```
+21 -19
View File
@@ -11,7 +11,7 @@ import os
blogs_dir = os.fsencode("blog")
#def blogposts_list_gen():
# def blogposts_list_gen():
# output_list = []
# for file in os.listdir(blogs_dir):
# filename = os.fsdecode(file)
@@ -26,46 +26,48 @@ blogs_dir = os.fsencode("blog")
# output_list.append([author, title, time, content_html, full_path])
# return output_list
def events_list_gen():
output_list = []
events_file = open("dogadjaji.csv", "r")
for line in events_file.readlines():
date, time, location, title = line.split(", ")
author = "Decentrala"
content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs"
date, time, location, title = line.split(", ")
author = "Decentrala"
content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs"
output_list.append([author, title, content_html])
output_list.append([author, title, content_html])
events_file.close()
return output_list
def feedgen(blogs, events):
fg_blog = FeedGenerator()
fg_blog.id('http://dmz.rs/')
fg_blog.title('Decentrala Blog')
fg_blog.author( {'name':'Decentrala','email':'dmz@dmz.rs'} )
fg_blog.link( href='https://dmz.rs/atom_blog.xml', rel='self' )
fg_blog.id("http://dmz.rs/")
fg_blog.title("Decentrala Blog")
fg_blog.author({"name": "Decentrala", "email": "dmz@dmz.rs"})
fg_blog.link(href="https://dmz.rs/atom_blog.xml", rel="self")
fg_events = FeedGenerator()
fg_events.id('http://dmz.rs/')
fg_events.title('Decentrala Blog')
fg_events.author( {'name':'Decentrala','email':'dmz@dmz.rs'} )
fg_events.link( href='https://dmz.rs/atom_events.xml', rel='self' )
fg_events.id("http://dmz.rs/")
fg_events.title("Decentrala Blog")
fg_events.author({"name": "Decentrala", "email": "dmz@dmz.rs"})
fg_events.link(href="https://dmz.rs/atom_events.xml", rel="self")
for post in blogs:
fe_blogs = fg_blog.add_entry()
fe_blogs.id("https://dmz.rs/" + post[4][:-3] + ".html")
fe_blogs.author({'name': post[0]})
fe_blogs.author({"name": post[0]})
fe_blogs.title(post[1])
fe_blogs.updated(post[2])
fe_blogs.content(content=post[3], type='html')
fe_blogs.content(content=post[3], type="html")
for event in events:
fe_events = fg_events.add_entry()
fe_events.id("https://dmz.rs/pages/events.html")
fe_events.author({'name': event[0]})
fe_events.author({"name": event[0]})
fe_events.title(event[1])
fe_events.updated(datetime.datetime.now(datetime.timezone.utc))
fe_events.content(content=event[2], type='html')
fe_events.content(content=event[2], type="html")
fg_blog.atom_file('site/atom_blog.xml')
fg_events.atom_file('site/atom_events.xml')
fg_blog.atom_file("site/atom_blog.xml")
fg_events.atom_file("site/atom_events.xml")
+2 -2
View File
@@ -5,8 +5,8 @@ from markdown import markdown as to_markdown
blog = ""
with open('blogs/Lorem Ipsum.md','rt') as file:
with open("blogs/Lorem Ipsum.md", "rt") as file:
blog = file.read()
with open('blogs/Lorem Ipsum.html', 'wt') as file:
with open("blogs/Lorem Ipsum.html", "wt") as file:
file.write(to_markdown(blog))
+61 -24
View File
@@ -2,46 +2,83 @@
import os
PAGES = [
{'name': 'index', 'titleSR': 'Početna', 'titleEN': 'Home', 'style': 'home'},
{'name': 'account', 'titleSR': 'Nalog', 'titleEN': 'Account', 'style': 'account'},
{'name': 'about', 'titleSR': 'O nama', 'titleEN': 'About us', 'style': 'about'},
{'name': 'statute', 'titleSR': 'Statut', 'titleEN': 'Statute', 'style': 'statute'},
{'name': 'events', 'titleSR': 'Događaji', 'titleEN': 'Events', 'style': 'events'},
{'name': 'events_archive', 'titleSR': 'Arhiva događaja', 'titleEN': 'Events archive', 'style': 'events'},
{'name': 'services', 'titleSR': 'Servisi', 'titleEN': 'Services', 'style': 'services'},
{'name': 'webring', 'titleSR': 'Webring', 'titleEN': 'Webring', 'style': ''},
{'name': 'support', 'titleSR': 'Podrška', 'titleEN': 'Support', 'style': 'support'},
{'name': 'deconference', 'titleSR': 'Dekonferencija', 'titleEN': 'Deconference', 'style': 'deconference'},
{"name": "index", "titleSR": "Početna", "titleEN": "Home", "style": "home"},
{"name": "account", "titleSR": "Nalog", "titleEN": "Account", "style": "account"},
{"name": "about", "titleSR": "O nama", "titleEN": "About us", "style": "about"},
{"name": "statute", "titleSR": "Statut", "titleEN": "Statute", "style": "statute"},
{"name": "events", "titleSR": "Događaji", "titleEN": "Events", "style": "events"},
{
"name": "events_archive",
"titleSR": "Arhiva događaja",
"titleEN": "Events archive",
"style": "events",
},
{
"name": "services",
"titleSR": "Servisi",
"titleEN": "Services",
"style": "services",
},
{"name": "webring", "titleSR": "Webring", "titleEN": "Webring", "style": ""},
{"name": "support", "titleSR": "Podrška", "titleEN": "Support", "style": "support"},
{
"name": "deconference",
"titleSR": "Dekonferencija",
"titleEN": "Deconference",
"style": "deconference",
},
]
def buildPage(filename: str, pageTitle: str, pageHtml: str, pageStyle: str, template: str) -> str:
template = template.replace('<!--TITLE-->', pageTitle)
style = '' if not pageStyle else f'<link rel=\"stylesheet\" href=\"/styles/{pageStyle}.css\">'
template = template.replace('<!--ADDITIONAL_STYLE-->', style)
template = template.replace('PAGE_NAME', filename)
template = template.replace('<!--MAIN-->', pageHtml)
def buildPage(
filename: str, pageTitle: str, pageHtml: str, pageStyle: str, template: str, lang: str
) -> str:
template = template.replace("<!--TITLE-->", pageTitle)
style = (
""
if not pageStyle
else f'<link rel="stylesheet" href="/styles/{pageStyle}.css">'
)
template = template.replace("<!--ADDITIONAL_STYLE-->", style)
template = template.replace("PAGE_NAME", filename)
template = template.replace("<!--MAIN-->", pageHtml)
# Fix language switcher links
if lang == "en":
template = template.replace('href="/PAGE_NAME"', f'href="/en/{filename}"')
else:
template = template.replace('href="/en/PAGE_NAME"', f'href="/sr/{filename}"')
return template
def main():
os.makedirs('site/en/', exist_ok=True)
with open('template/page-en.html') as fTempEN, open('template/page-sr.html') as fTempSR:
os.makedirs("site/en/", exist_ok=True)
with open("template/page-en.html") as fTempEN, open(
"template/page-sr.html"
) as fTempSR:
templateSR = fTempSR.read()
templateEN = fTempEN.read()
for page in PAGES:
with open(f'pages/sr/{page["name"]}.html') as f:
pageHtml = "<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div>"
pageHtml += f.read()
html = buildPage(page['name'], page['titleSR'], pageHtml, page['style'], templateSR)
f = open(f'site/{page["name"]}.html', 'w')
html = buildPage(
page["name"], page["titleSR"], pageHtml, page["style"], templateSR, "sr"
)
f = open(f'site/{page["name"]}.html', "w")
f.write(html)
f.close()
with open(f'pages/en/{page["name"]}.html') as f:
pageHtml = "<div><img src='/img/students_bug.jpg' alt='Students found the bug' /></div>"
pageHtml = "<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Students found the bug' /></div>"
pageHtml += f.read()
html = buildPage(page['name'], page['titleEN'], pageHtml, page['style'], templateEN)
f = open(f'site/en/{page["name"]}.html', 'w')
html = buildPage(
page["name"], page["titleEN"], pageHtml, page["style"], templateEN, "en"
)
f = open(f'site/en/{page["name"]}.html', "w")
f.write(html)
f.close()
if __name__ == '__main__':
if __name__ == "__main__":
main()
+20 -2
View File
@@ -1,4 +1,4 @@
datum, vreme, lokacija, tema, tip, link, temaE
datum, vreme, lokacija, tema, tip, link, temaEN
20-12-2022, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Uvod u računarske mreže,,,
03-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Hackathon žurka, hack,,
16-01-2023, 19:00, DC Krov https://www.openstreetmap.org/node/10594728522, Privatnost na internetu, workshop,,
@@ -362,6 +362,24 @@ datum, vreme, lokacija, tema, tip, link, temaE
11-05-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Hardware hackathon,workshop,,Hardware hackathon
12-05-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606,OpenSCAD,lecture,,OpenSCAD
18-05-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,OverTheWire (Bandit),workshop,https://forum.dmz.rs/t/overthewire-bandit-1-14/1196,OverTheWire (Bandit)
19-05-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606,Film: The Seventh Seal (1957),movie,,Movie: The Seventh Seal (1957)
19-05-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606,The Strange Loop videos,lecture,https://www.thestrangeloop.com/index.html,The Strange Loop videos
25-05-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Reverse engineering,workshop,,Reverse engineering
26-05-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606,Film: TPB-AFK (2013),movie,,Movie: TPB-AFK (2013)
31-05-2026, 17:00, Drustveni centar Loza - Ivankovačka 21 https://www.openstreetmap.org/node/4013343518,Uvod u informacionu bezbednost,lecture,,Introduction to information security
01-06-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Sysadmin radionica,workshop,,Sysadmin workshop
02-06-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606,Software hackathon,workshop,,Software hackathon
07-06-2026, 10:00, KC Magacin - Marka Kraljevica 4 https://www.openstreetmap.org/#map=18/44.813246/20.453640, Zig Day,workshop,https://zig.day/europe/belgrade/1/,Zig Day
08-06-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Decentrala offline forum,workshop,,Decentrala offline forum
15-06-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,OverTheWire - Bandit CTF,workshop,,OverTheWire - Bandit CTF
16-06-2026, 18:00, Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606, OSM contributing,workshop,,OSM contributing
22-06-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,OverTheWire - Bandit CTF,workshop,,OverTheWire - Bandit CTF
29-06-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,LAN party,party,,LAN Party
06-07-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Linux ricing,lightning,,Linux ricing
13-07-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Hardware CTF/Logic analyzer,workshop,,Hardware CTF/Logic analyzer
20-07-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,T-shirt workshop,workshop,,T-shirt workshop
27-07-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Lightning talks,lightning,,Lightning talks
03-08-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Sysadmin radionica,workshop,,Sysadmin workshop
10-08-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,LAN party,party,,LAN Party
17-08-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Mail server - 1. deo,workshop,, Mail server - part 1
24-08-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Film: Primer (2004),movie,,Movie: Primer (2004)
31-08-2026, 19:00, Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876,Lightning talks,lightning,,Lightning talks
1 datum vreme lokacija tema tip link temaE temaEN
2 20-12-2022 19:00 DC Krov https://www.openstreetmap.org/node/10594728522 Uvod u računarske mreže
3 03-01-2023 19:00 DC Krov https://www.openstreetmap.org/node/10594728522 Hackathon žurka hack
4 16-01-2023 19:00 DC Krov https://www.openstreetmap.org/node/10594728522 Privatnost na internetu workshop
362 11-05-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Hardware hackathon workshop Hardware hackathon
363 12-05-2026 18:00 Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606 OpenSCAD lecture OpenSCAD
364 18-05-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 OverTheWire (Bandit) workshop https://forum.dmz.rs/t/overthewire-bandit-1-14/1196 OverTheWire (Bandit)
365 19-05-2026 18:00 Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606 Film: The Seventh Seal (1957) The Strange Loop videos movie lecture https://www.thestrangeloop.com/index.html Movie: The Seventh Seal (1957) The Strange Loop videos
366 25-05-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Reverse engineering workshop Reverse engineering
367 26-05-2026 18:00 Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606 Film: TPB-AFK (2013) movie Movie: TPB-AFK (2013)
368 31-05-2026 17:00 Drustveni centar Loza - Ivankovačka 21 https://www.openstreetmap.org/node/4013343518 Uvod u informacionu bezbednost lecture Introduction to information security
369 01-06-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Sysadmin radionica workshop Sysadmin workshop
370 02-06-2026 18:00 Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606 Software hackathon workshop Software hackathon
371 07-06-2026 10:00 KC Magacin - Marka Kraljevica 4 https://www.openstreetmap.org/#map=18/44.813246/20.453640 Zig Day workshop https://zig.day/europe/belgrade/1/ Zig Day
372 08-06-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Decentrala offline forum workshop Decentrala offline forum
373 15-06-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 OverTheWire - Bandit CTF workshop OverTheWire - Bandit CTF
374 16-06-2026 18:00 Matematički fakultet (Učionica JAG2) https://www.openstreetmap.org/node/3807078606 OSM contributing workshop OSM contributing
375 22-06-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 OverTheWire - Bandit CTF workshop OverTheWire - Bandit CTF
376 29-06-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 LAN party party LAN Party
377 06-07-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Linux ricing lightning Linux ricing
378 13-07-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Hardware CTF/Logic analyzer workshop Hardware CTF/Logic analyzer
379 20-07-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 T-shirt workshop workshop T-shirt workshop
380 27-07-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Lightning talks lightning Lightning talks
381 03-08-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Sysadmin radionica workshop Sysadmin workshop
382 10-08-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 LAN party party LAN Party
383 17-08-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Mail server - 1. deo workshop Mail server - part 1
384 24-08-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Film: Primer (2004) movie Movie: Primer (2004)
385 31-08-2026 19:00 Xecut - Jovana Ćirilova 15 - Local 3 https://www.openstreetmap.org/node/11749277876 Lightning talks lightning Lightning talks
+68 -37
View File
@@ -11,12 +11,36 @@ from cairosvg import svg2png
CURRENT_TIME = dt.date.today()
NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1)
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
DAYS_OF_WEEK_EN = ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUn")
DAYS_OF_WEEK_EN = ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN")
MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul",
"Avgust", "Septembar", "Oktobar", "Novembar", "Decembar")
MONTHS_EN = ("January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December")
MONTHS_SR = (
"Januar",
"Februar",
"Mart",
"April",
"Maj",
"Jun",
"Jul",
"Avgust",
"Septembar",
"Oktobar",
"Novembar",
"Decembar",
)
MONTHS_EN = (
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
)
HEADER_SR = "Plan za {}"
@@ -36,10 +60,15 @@ All events are always free
def parseArgs(parser):
"""
Parse all arguments and return the list of argument values
Parse all arguments and return the list of argument values
"""
parser.add_argument("month", metavar="MM",
help="two digit number representing the month for which to generate poster", default="empty", nargs="?")
parser.add_argument(
"month",
metavar="MM",
help="two digit number representing the month for which to generate poster",
default="empty",
nargs="?",
)
return parser.parse_args()
@@ -51,18 +80,19 @@ def load_events(csv_path: str, month: int) -> list[dict]:
next(csv_reader, None)
for event in csv_reader:
event_date = event[0]
event_date_parsed = dt.datetime.strptime(
event_date, "%d-%m-%Y").date()
event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
event_time = event[1]
event_title = event[3]
event_title_en = event[3]
if len(event) > 6:
event_title_en = event[6]
current_event = {"date": event_date_parsed,
"time": event_time,
"title": event_title.strip(),
"title_en": event_title_en.strip()}
current_event = {
"date": event_date_parsed,
"time": event_time,
"title": event_title.strip(),
"title_en": event_title_en.strip(),
}
if event_date_parsed >= month and event_date_parsed < monthafter:
events.append(current_event)
return events
@@ -71,8 +101,7 @@ def load_events(csv_path: str, month: int) -> list[dict]:
def drawMesh(draw, img, fg, bg, font, W, H):
def drawCircle(x, y):
r = 50
draw.ellipse((x - r, y - r, x + r, y+r),
fill=fg, outline=(0, 0, 0), width=0)
draw.ellipse((x - r, y - r, x + r, y + r), fill=fg, outline=(0, 0, 0), width=0)
LCX = 415 # logo center x
LCY = 4350 # logo center y
@@ -84,11 +113,15 @@ def drawMesh(draw, img, fg, bg, font, W, H):
drawCircle(LCX + d, LCY)
draw.line([(LCX - d, LCY), (LCX + d, LCY)], fill=fg, width=20, joint=None)
draw.line([(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY),
(LCX, LCY - d)], fill=fg, width=20, joint=None)
draw.text((LCX - 1.7*d, LCY + 1.5*d), "dmz.rs", font=font, fill=fg)
draw.line(
[(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY), (LCX, LCY - d)],
fill=fg,
width=20,
joint=None,
)
draw.text((LCX - 1.7 * d, LCY + 1.5 * d), "dmz.rs", font=font, fill=fg)
mesh_svg = svg2png(url='site/img/mesh-light.svg')
mesh_svg = svg2png(url="site/img/mesh-light.svg")
mesh_svg_bytes = io.BytesIO(mesh_svg)
mesh_img = Image.open(mesh_svg_bytes)
if bg == (0, 0, 0):
@@ -107,35 +140,32 @@ def drawMesh(draw, img, fg, bg, font, W, H):
def drawPoster(events, bg, fg, month: int, en: bool):
fontFacade = ImageFont.truetype('./site/font/Facade-Sud.woff', size=365)
fontIosevka = ImageFont.truetype(
'./site/font/iosevka-regular.woff', size=200)
fontIosevkaSmall = ImageFont.truetype(
'./site/font/iosevka-regular.woff', size=150)
fontFacade = ImageFont.truetype("./site/font/Facade-Sud.woff", size=365)
fontIosevka = ImageFont.truetype("./site/font/iosevka-regular.woff", size=200)
fontIosevkaSmall = ImageFont.truetype("./site/font/iosevka-regular.woff", size=150)
W = 3508
H = 4960
img = Image.new('RGB', (W, H), bg)
img = Image.new("RGB", (W, H), bg)
draw = ImageDraw.Draw(img)
drawMesh(draw, img, fg, bg, fontIosevka, W, H)
title = "DECENTRALA"
_, _, w, _ = draw.textbbox((0, 0), title, font=fontFacade)
draw.text(((W-w)/2, 165), title, font=fontFacade, fill=fg)
draw.text(((W - w) / 2, 165), title, font=fontFacade, fill=fg)
header = HEADER_EN if en else HEADER_SR
months = MONTHS_EN if en else MONTHS_SR
header = header.format(months[month.month - 1])
_, _, w, _ = draw.textbbox((0, 0), header, font=fontIosevka)
draw.text(((W-w)/2, 560), header, font=fontIosevka, fill=fg)
draw.text(((W - w) / 2, 560), header, font=fontIosevka, fill=fg)
height = 890
sub_header = SUBHEADER_EN if en else SUBHEADER_SR
draw.text((165, height), sub_header,
font=fontIosevkaSmall, fill=fg)
draw.text((165, height), sub_header, font=fontIosevkaSmall, fill=fg)
height += 800
# Write list of events to sperate text file as well
@@ -167,8 +197,7 @@ def drawPoster(events, bg, fg, month: int, en: bool):
def main():
# Parse arguments
parser = argparse.ArgumentParser(
description="Generate images of the poster")
parser = argparse.ArgumentParser(description="Generate images of the poster")
args = parseArgs(parser)
# Set month based on user input
@@ -176,22 +205,24 @@ def main():
if args.month.isdigit():
month = dt.date(CURRENT_TIME.year, int(args.month), 1)
elif args.month != "empty":
print("Month has to be specified as a number. I will use next month as the default")
print(
"Month has to be specified as a number. I will use next month as the default"
)
# Load events and draw a poseter
events = load_events("dogadjaji.csv", month)
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, False)
img.save('poster_dark.png')
img.save("poster_dark.png")
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, False)
img.save('poster_light.png')
img.save("poster_light.png")
img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, True)
img.save('poster_dark_en.png')
img.save("poster_dark_en.png")
img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, True)
img.save('poster_light_en.png')
img.save("poster_light_en.png")
if __name__ == "__main__":
+3
View File
@@ -1,9 +1,12 @@
# Start nginx in this directory with `nginx -p . -c nginx.conf`
# Stop nginx with `nginx -p . -s stop`
pid nginx.pid;
events {}
http {
# edit this for your system
types_hash_max_size 2048;
types_hash_bucket_size 128;
include /etc/nginx/mime.types;
+2 -2
View File
@@ -66,14 +66,14 @@
<a href="https://github.com/searxng/searxg/">SearXNG</a> instance used for
Web searching.
</td>
</tr>
</tr> -->
<tr>
<td><a href="https://pastebin.dmz.rs/">Pastebin</a></td>
<td>
<a href="https://privatebin.info/">PrivateBin</a> instance we use for
sharing text files
</td>
</tr> -->
</tr>
<tr>
<td><a href="ssh://soft.dmz.rs:2222/">Soft Serve</a></td>
<td>
+9 -7
View File
@@ -4,12 +4,14 @@
<p>
Decentrala is a community, united around the principles of decentralized technology and the spreading of knowledge. 
</p>
<label>Key values include:</label>
<ul>
<li>Equal access to technology</li>
<li>Free software</li>
<li>Privacy and security</li>
</ul>
<div class="values">
<label>Our key values include:</label>
<ul>
<li>Equal access to technology</li>
<li>Free and open source software</li>
<li>Privacy and security</li>
</ul>
</div>
<p> Donations are accepted only from individuals, with no conditions or obligations. </p>
<p> Only open-source services are hosted on the Decentrala infrastructure. </p>
<p> Parts of the statute can be defined immutable, and cannot be voted on. </p>
@@ -33,7 +35,7 @@
<p> An individual may withdraw from the union at any time, or may be expelled by a two-thirds majority of present members. </p
<p> If a member of a voting body is absent during three consecutive meetings, they are automatically excluded from the voting body. </p>
<p> A member can be re-admitted to the governing body according to the predefined procedure for adding new members, if they are present at that meeting. </p>
<p> The current members of the voting body are using pseudonyms climatechanged, malin, coja, bora, mad3v, wingaxe, nothke, txrpe, euffrat, netstat. </p>
<p> The current members of the voting body are using pseudonyms malin, coja, bora, mad3v, txrpe, euffrat, netstat.</p>
</div>
<h2>Meetings</h2>
+3 -3
View File
@@ -25,15 +25,15 @@
that way you joining the decetralization.
</p>
<p>
Also, we accept donations in bitcoin and monero to the following addresses:
Also, we accept donations in bitcoin on the following address:
</p>
<ul>
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
<li>
<!-- <li>
Monero:
<i
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
>
</li>
</li> -->
</ul>
</dd>
+2 -2
View File
@@ -68,14 +68,14 @@
<a href="https://github.com/searxng/searxng/">SearXNG</a> instanca koju
koristimo za pretraživanje Interneta. Zamena za Google.
</td>
</tr>
</tr>-->
<tr>
<td><a href="https://pastebin.dmz.rs/">Pastebin</a></td>
<td>
<a href="https://privatebin.info/">PrivateBin</a> instanca koju koristimo
za brzo deljenje tekstualnih fajlova
</td>
</tr>-->
</tr>
<tr>
<td><a href="ssh://soft.dmz.rs:2222/">Soft Serve</a></td>
<td>
+11 -4
View File
@@ -3,9 +3,16 @@
<div>
<p>
Decentrala je zajednica okupljena oko decentralizacije tehnologija i širenja
znanja. Decentralizacija uključuje ravnopravnost korišćenja tehnologije,
slobodnog softvera, privatnost i bezbednost.
znanja.
</p>
<div class="values">
<label> Decentralizacija uključuje: </label>
<ul>
<li>Ravnopravnost korišćenja tehnologije</li>
<li>Slobodan software otvorenog koda</li>
<li>Privatnost i bezbednost.</li>
</ul>
</div>
<p>
Na Decentralinoj arhitekturi hostuju se samo servisi koji su otvorenog koda
</p>
@@ -51,8 +58,8 @@
dodavanja novog clana, ako je prisutan na tom sastanku.
</p>
<p>
Trenutni članovi glasačkog tela su pod pseudonimom climatechanged,
malin, coja, bora, mad3v, wingaxe, nothke, txrpe, fl3ka, euffrat, netstat.
Trenutni članovi glasačkog tela su pod pseudonimom malin, coja, bora, mad3v,
txrpe, euffrat, netstat.
</p>
</div>
+3 -1
View File
@@ -24,14 +24,16 @@
Jednostavno koriscenje naseg softwera se takodje racuna kao doprinos, posto
bi se time pridruzili decentralizaciji.
</p>
<p>Takođe primamo donacije u bitcoinu i moneru na adresama:</p>
<p>Takođe primamo donacije u bitcoin na adresi:</p>
<ul>
<li>Bitcoin: <i>bc1qjhsfgq79wuzzv32yml9zglwzf9qcwfj3atuy74</i></li>
<!--
<li>
Monero:
<i
>8BESz45LnxrgCwZP32KieiN1D4LinCfsS1YjdFHfGXrVCmPs35167QsW1gd7qbff4UAtBbT6oWrkbfZnJm71HornVRiRZFS</i
>
</li>
-->
</ul>
</dd>
+30 -11
View File
@@ -7,10 +7,23 @@ EVENTS_CSV_PATH = "dogadjaji.csv"
CURRENT_TIME = dt.date.today()
NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1)
DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust",\
"Septembar", "Oktobar", "Novembar", "Decembar")
MONTHS_SR = (
"Januar",
"Februar",
"Mart",
"April",
"Maj",
"Jun",
"Jul",
"Avgust",
"Septembar",
"Oktobar",
"Novembar",
"Decembar",
)
def load_events(csv_path:str) -> list[dict]:
def load_events(csv_path: str) -> list[dict]:
events = []
with open(csv_path) as csv_file:
csv_reader = csv.reader(csv_file)
@@ -20,14 +33,17 @@ def load_events(csv_path:str) -> list[dict]:
event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
event_time = event[1]
event_title = event[3]
current_event = {"date":event_date_parsed,
"time":event_time,
"title":event_title.strip()}
current_event = {
"date": event_date_parsed,
"time": event_time,
"title": event_title.strip(),
}
if event_date_parsed >= NEXT_MONTH:
events.append(current_event)
return events
def render_table(events:list[dict])-> str:
def render_table(events: list[dict]) -> str:
html = ""
for event in events:
date = DAYS_OF_WEEK_SR[event["date"].weekday()]
@@ -36,12 +52,13 @@ def render_table(events:list[dict])-> str:
html += f"\t\t\t<tr> <td>{date}</td> <td>{day}.</td> <td>{title}</td> </tr>\n"
return html
def render_page(table: str) -> str:
head = "<head><meta charset=\"UTF-8\"><link rel=\"stylesheet\"\
href=\"styles/poster.css\"><head>"
head = '<head><meta charset="UTF-8"><link rel="stylesheet"\
href="styles/poster.css"><head>'
header = "<h1>DECENTRALA</h1>"
subheader = f"<h2>Plan za {MONTHS_SR[NEXT_MONTH.month - 1]}</h2>"
link = "<div id=link><img src=\"/img/logo-light.svg\"> dmz.rs</div>"
link = '<div id=link><img src="/img/logo-light.svg"> dmz.rs</div>'
p1 = "<p>Radionice počinju u <strong>19h</strong> u Društvenom centru Krov\
u <strong>Kraljice Marije 47</strong>.</p>"
p2 = "<p>Ulaz u zgradu je u prolazu pored Štark prodavnice slatkiša, odmah\
@@ -49,7 +66,8 @@ pored menjačnice. DC Krov je na poslednjem spratu.</p>"
footer = f"{p1}{p2}{link}"
return f"<html>{head}<body><main>{header}{subheader}\
<table>{table}</table>{footer}</main></body></html>"
def main():
events = load_events(EVENTS_CSV_PATH)
table = render_table(events)
@@ -58,5 +76,6 @@ def main():
f.write(page)
f.close()
if __name__ == "__main__":
main()
+69 -40
View File
@@ -5,6 +5,13 @@ from datetime import datetime
DAYS_SR = ["PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED"]
DAYS_EN = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
ICAL_LOCATION_ADDRESSES = {
"Xecut": "XECUT\\, Jovana Ćirilova 15\\, Local 3\\, Beograd\\, Serbia",
"Matematički fakultet (Učionica JAG2)": "Matematički fakultet (JAG2)\\, Vatroslava Jagića 5\\, Beograd\\, Serbia",
"Matematički fakultet (Učionica JAG3)": "Matematički fakultet (JAG3)\\, Vatroslava Jagića 5\\, Beograd\\, Serbia",
"Matematički fakultet (Učionica 153)": "Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia",
}
TYPES_DICT = {
"hack": ("hakaton", "hackathon"),
"lecture": ("predavanje", "lecture"),
@@ -18,48 +25,61 @@ TYPES_DICT = {
"party": ("zabava", "entertainment"),
}
def load_events(csv_path:str) -> list[dict]:
def load_events(csv_path: str) -> list[dict]:
events = []
with open(csv_path) as csv_file:
csv_reader = csv.reader(csv_file, skipinitialspace=True)
next(csv_reader, None)
with open(csv_path, encoding="utf-8") as csv_file:
csv_reader = csv.DictReader(csv_file, skipinitialspace=True)
for event in csv_reader:
event_date = event[0]
event_date = event["datum"]
event_date_parsed = datetime.strptime(event_date, "%d-%m-%Y").date()
event_time = event[1]
event_location = event[2]
event_title = event[3]
types = event[4].split()
try:
link = event[5]
except IndexError:
link = ""
current_event = {"date":event_date_parsed,
"time":event_time,
"location": event_location,
"title":event_title.strip(),
"types": types,
"link": link}
event_time = event["vreme"]
event_location = event["lokacija"]
event_title = event["tema"]
types = event["tip"].split()
link = event.get("link", "")
current_event = {
"date": event_date_parsed,
"time": event_time,
"location": event_location,
"title": event_title.strip(),
"types": types,
"link": link,
}
events.append(current_event)
return events
def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str:
events_html = []
for event in events:
title = event["title"]
location = event["location"]
date = event["date"]
date = dayNames[date.weekday()]+", "+str(date.day)+". "+str(date.month)+". "+str(date.year)+", "
time = event["time"]+"h"
date = (
dayNames[date.weekday()]
+ ", "
+ str(date.day)
+ ". "
+ str(date.month)
+ ". "
+ str(date.year)
+ ", "
)
time = event["time"] + "h"
event_html = []
event_html.append(f"<div class='date'>{date} {time}</div>")
if event["link"] != "":
event_html.append(f"<div class='title'><a href=\"{event['link']}\">{title}</a></div>")
event_html.append(
f"<div class='title'><a href=\"{event['link']}\">{title}</a></div>"
)
else:
event_html.append(f"<div class='title'>{title}</div>")
if "https://" in location:
place,link = location.split("https://")
event_html.append(f"<div class='place'><a href=\"https://{link}\">@{place.strip()}</a></div>")
place, link = location.split("https://")
event_html.append(
f"<div class='place'><a href=\"https://{link}\" target='_blank'>@{place.strip()}</a></div>"
)
else:
event_html.append(f"<div class='place'>@{location.strip()}</div>")
@@ -70,7 +90,7 @@ def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str
if typesNames.get(t) is not None:
types_list += typesNames.get(t)
if t != last_item:
types_list += ', '
types_list += ", "
else:
print(f"Unknown type {t}!")
types_list += "</div>"
@@ -80,6 +100,7 @@ def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str
events_html.append(f"\n<div class='event'>{event_html}</div>")
return events_html
def build_ical(events: list[dict]) -> str:
today = datetime.today().now()
# Header
@@ -95,8 +116,17 @@ def build_ical(events: list[dict]) -> str:
url = event["link"]
uid = str(date.month).zfill(2) + str(date.day).zfill(2) + time[:2]
date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2)
created = str(today.year) + str(today.month).zfill(2) + str(today.day).zfill(2) + "T" + str(today.hour).zfill(2) + str(today.minute).zfill(2) + str(today.second).zfill(2) + "Z"
date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2)
created = (
str(today.year)
+ str(today.month).zfill(2)
+ str(today.day).zfill(2)
+ "T"
+ str(today.hour).zfill(2)
+ str(today.minute).zfill(2)
+ str(today.second).zfill(2)
+ "Z"
)
date = date + "T" + time.replace(":", "") + "00"
event_template = ""
@@ -107,13 +137,12 @@ def build_ical(events: list[dict]) -> str:
event_template = event_template.replace("<!--DATE-->", date)
event_template = event_template.replace("<!--TITLE-->", title)
event_template = event_template.replace("<!--URL-->", url)
if location.startswith("DC Krov"):
event_template = event_template.replace("<!--LOCATION-->", "DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia")
elif location.startswith("Matematički fakultet (Učionica 153)"):
event_template = event_template.replace("<!--LOCATION-->", "Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia")
else:
event_template = event_template.replace("<!--LOCATION-->", location)
ical_location = location
for prefix, address in ICAL_LOCATION_ADDRESSES.items():
if location.startswith(prefix):
ical_location = address
break
event_template = event_template.replace("<!--LOCATION-->", ical_location)
events_ical += event_template
# Footer
@@ -121,13 +150,14 @@ def build_ical(events: list[dict]) -> str:
events_ical += file.read()
return events_ical
events = sorted(load_events("dogadjaji.csv"), key=lambda e: e["date"])
today = datetime.today().date()
past_events = list(filter(lambda e: e["date"] <= today, events))
past_events.reverse()
new_events = list(filter(lambda e: e["date"] >= today, events))
new_events = list(filter(lambda e: e["date"] >= today, events))
page_template = ""
@@ -142,7 +172,7 @@ for key, value_pair in TYPES_DICT.items():
# Build Serbian Events page
new_events_html = build_html(new_events, DAYS_SR, sr_types)
with open("template/events-sr.html", "r") as file:
page_template = ([line for line in file])
page_template = [line for line in file]
with open("pages/sr/events.html", "w") as file:
file.writelines(page_template + new_events_html)
@@ -150,7 +180,7 @@ with open("pages/sr/events.html", "w") as file:
# Build English Events page
new_events_html = build_html(new_events, DAYS_EN, en_types)
with open("template/events-en.html", "r") as file:
page_template = ([line for line in file])
page_template = [line for line in file]
with open("pages/en/events.html", "w") as file:
file.writelines(page_template + new_events_html)
@@ -158,7 +188,7 @@ with open("pages/en/events.html", "w") as file:
# Build Serbian Archive page
past_events_html = build_html(past_events, DAYS_SR, sr_types)
with open("template/events_archive-sr.html", "r") as file:
page_template = ([line for line in file])
page_template = [line for line in file]
with open("pages/sr/events_archive.html", "w") as file:
file.writelines(page_template + past_events_html)
@@ -166,7 +196,7 @@ with open("pages/sr/events_archive.html", "w") as file:
# Build English Archive page
past_events_html = build_html(past_events, DAYS_EN, en_types)
with open("template/events_archive-en.html", "r") as file:
page_template = ([line for line in file])
page_template = [line for line in file]
with open("pages/en/events_archive.html", "w") as file:
file.writelines(page_template + past_events_html)
@@ -176,4 +206,3 @@ new_events_ical = build_ical(new_events)
# Build ical
with open("site/events.ical", "w") as file:
file.write(build_ical(new_events))
+2
View File
@@ -2,3 +2,5 @@ cairosvg
markdown
freetype-py
python-dateutil
feedgen
pillow
-1
View File
@@ -6,7 +6,6 @@
<link rel="stylesheet" href="/styles/style.css">
<link rel="stylesheet" href="/styles/404.css">
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
<script src="/scripts/main.js" defer></script>
<title>404</title>
</head>
<body>
+57 -45
View File
@@ -1,11 +1,10 @@
<!DOCTYPE html>
<!doctype html>
<html lang="sr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!--
<pre>
<!-- <pre>
*@@*
*@@@@*
@@ -27,26 +26,29 @@
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
</pre>
-->
</pre> -->
<link rel="stylesheet" href="/styles/reset.css">
<link rel="stylesheet" href="/styles/style.css">
<link rel="stylesheet" href="/styles/deconference.css">
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
<script src="/scripts/main.js" defer></script>
<title>Dekonferencija Decentrala</title>
<link rel="alternate" hreflang="en" href="/en/deconference" />
</head>
<body>
<header>
<a id="logo" href="/"><img src="/img/logo-light.svg" alt="Logo"> Decentrala</a>
<button id="theme-switcher"></button>
<a class="lang" hreflang="en" href="/en/deconference">EN</a>
</header>
<main>
<div class="page-wrap">
<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div><h1>Dekonferencija</h1>
<link rel="stylesheet" href="/styles/reset.css" />
<link rel="stylesheet" href="/styles/style.css" />
<link rel="stylesheet" href="/styles/deconference.css">
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
<title>Dekonferencija Decentrala</title>
<link rel="alternate" hreflang="en" href="/en/deconference" />
</head>
<body>
<input type="checkbox" id="menu-toggle" />
<input type="checkbox" id="theme-toggle" />
<header>
<a id="logo" href="/">
<img src="/img/logo-light.svg" alt="Logo" />
Decentrala
</a>
<label for="theme-toggle" id="theme-switcher"></label>
<a class="lang" hreflang="en" href="/en/deconference">EN</a>
</header>
<main>
<div class="page-wrap">
<div class='cover-wrap'><img src='/img/students_bug.jpg' alt='Studenti su nasli bug' /></div><h1>Dekonferencija</h1>
<h2 id="program"><a href="#program">Program</a></h2>
<p>11:00 Otvaranje<p>
@@ -82,24 +84,34 @@
<p>Decentrala prihvata donacije isključivo od fizičkih lica.</p>
</div>
</main>
<footer>
<button id="sections-button" opened="false"><img src="/img/strelica-closed-light.svg" alt="OpenMenu"></button>
<nav>
<a href="/events">Događaji</a>
<a href="/services">Servisi</a>
<a href="/statute">Statut</a>
<a href="/about">O nama</>
<a class="account" href="/account">Nalog</a>
<a href="/support">Podrška</a>
</nav>
<span class="links">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img src="/img/cc-light.svg" alt="CreativeCommons"></a>
<a href="/webring"><img src="/img/w-light.svg" alt="Webring"></a>
<a href="https://gitea.dmz.rs/Decentrala/website"><img src="/img/git-light.svg" alt="SourceCode"></a>
<a href="https://balkan.fedive.rs/@decentrala"><img src="/img/mastodon-light.svg" alt="Mastodon"></a>
</span>
</footer>
</body>
</div>
</main>
<footer>
<label for="menu-toggle" class="hamburger">
<img src="/img/strelica-closed-light.svg" alt="Menu" />
</label>
<nav class="menu">
<a href="/events">Događaji</a>
<a href="/services">Servisi</a>
<a href="/statute">Statut</a>
<a href="/about">O nama</a>
<a class="account" href="/account">Nalog</a>
<a href="/support">Podrška</a>
</nav>
<span class="links">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
<img src="/img/cc-light.svg" alt="CreativeCommons" />
</a>
<a href="/webring">
<img src="/img/w-light.svg" alt="Webring" />
</a>
<a href="https://gitea.dmz.rs/Decentrala/website">
<img src="/img/git-light.svg" alt="SourceCode" />
</a>
<a href="https://balkan.fedive.rs/@decentrala">
<img src="/img/mastodon-light.svg" alt="Mastodon" />
</a>
</span>
</footer>
</body>
</html>
+227 -159
View File
@@ -1,207 +1,275 @@
<!DOCTYPE html>
<!doctype html>
<html lang="sr">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" />
<title>Linux Install Fest 2025</title>
<style>
@font-face {
font-family: "Iosevka";
src: url('/font/iosevka-regular.woff') format('woff');
}
@font-face {
font-family: "Iosevka";
src: url("/font/iosevka-regular.woff") format("woff");
}
@font-face {
font-family: "Lobster";
src: url('/font/Lobster-Regular.ttf') format('truetype');
}
@font-face {
font-family: "Lobster";
src: url("/font/Lobster-Regular.ttf") format("truetype");
}
body {
background-color: #082142;
color: #FFF;
body {
background-color: #082142;
color: #fff;
}
main {
padding: 1rem;
margin: 0 auto;
max-width: 1000px;
font-family: "Iosevka", Arial, Helvetica, sans-serif;
}
a,
a:visited,
a:hover {
color: #fff;
}
h1 {
font-family: "Lobster", sans-serif;
font-size: 5rem;
text-align: center;
}
h2 {
font-family: "Lobster", sans-serif;
font-size: 2rem;
}
p {
font-size: 1.1rem;
}
@media (max-width: 650px) {
h1 {
font-size: 4rem;
}
main {
padding: 1rem;
margin: 0 auto;
max-width: 1000px;
font-family: "Iosevka", Arial, Helvetica, sans-serif;
padding: 0.5rem;
}
}
a,
a:visited,
a:hover {
color: #FFF;
@media (max-width: 500px) {
main {
padding: 0.2rem;
}
h1 {
font-family: "Lobster", sans-serif;
font-size: 5rem;
text-align: center;
font-size: 3rem;
}
h2 {
font-family: "Lobster", sans-serif;
font-size: 2rem;
}
p {
font-size: 1.1rem;
}
@media (max-width: 650px) {
h1 {
font-size: 4rem;
}
main {
padding: 0.5rem;
}
}
@media (max-width: 500px) {
main {
padding: 0.2rem;
}
h1 {
font-size: 3rem;
}
h2 {
font-size: 1.5rem;
}
font-size: 1.5rem;
}
}
</style>
</head>
</head>
<body>
<body>
<main>
<h1>Linux Install Fest</h1>
<h1>Linux Install Fest</h1>
<h2>Gde i kad</h2>
<h2>Gde i kad</h2>
<p>Linux Install Fest će se održati 9. decembra 2025 godine u učionici JAG3 Matematičkog fakulteta, na adresi
<a href="https://www.openstreetmap.org/node/3807078606">Jagićeva 5, Beograd</a>. Ulazak u učionicu је moguć od 18h do 21h.</p>
<p>
Linux Install Fest će se održati 9. decembra 2025 godine u učionici JAG3
Matematičkog fakulteta, na adresi
<a href="https://www.openstreetmap.org/node/3807078606"
>Jagićeva 5, Beograd</a
>. Ulazak u učionicu је moguć od 18h do 21h.
</p>
<p>Jagićeva ulica se nalazi između stanice <a href="https://www.openstreetmap.org/node/6670711291"><em>Pijaca
Đeram</em></a> na kojoj staju tramvaji 5, 6, 7L
i 14, i
stanice <a href="https://www.openstreetmap.org/node/1693535022"><em>Crveni krst</em></a> na kojoj staju
autobusi 21 i 83, kao i trolebusi 19, 22 i 29.</p>
<p>
Jagićeva ulica se nalazi između stanice
<a href="https://www.openstreetmap.org/node/6670711291"
><em>Pijaca Đeram</em></a
>
na kojoj staju tramvaji 5, 6, 7L i 14, i stanice
<a href="https://www.openstreetmap.org/node/1693535022"
><em>Crveni krst</em></a
>
na kojoj staju autobusi 21 i 83, kao i trolebusi 19, 22 i 29.
</p>
<h2>Plan programa</h2>
<h2>Plan programa</h2>
<p>Cilj okupljanja je da zainteresovanima za Linux pomognemo pri instalaciji Linux operativnog sistema na
laptopove. Na događaju će biti prisutno više osoba koje imaju višegodišnje iskustvo u radu sa Linuxom. Pored
toga, u zavisnosti od zainteresovanosti prisutnih, mogu se održati i kratke obuke vezane za komandnu liniju,
git, web servise, C programiranje, itd...</p>
<p>
Cilj okupljanja je da zainteresovanima za Linux pomognemo pri
instalaciji Linux operativnog sistema na laptopove. Na događaju će biti
prisutno više osoba koje imaju višegodišnje iskustvo u radu sa Linuxom.
Pored toga, u zavisnosti od zainteresovanosti prisutnih, mogu se održati
i kratke obuke vezane za komandnu liniju, git, web servise, C
programiranje, itd...
</p>
<p>Nakon 21h, druženje možemo nastaviti u nekom od obližnjih lokala.</p>
<p>Nakon 21h, druženje možemo nastaviti u nekom od obližnjih lokala.</p>
<h2>Linux distribucije</h2>
<h2>Linux distribucije</h2>
<p>Linux je jezgro operativnog sistema, na koji se instaliraju drugi programi. Sve to zajedno čini određenu
<em>Linux distribuciju</em>. Postoji mnogo distribucija, ali mi preporučujemo one sa dugom tradicijom poput
sledećih:
</p>
<p>
Linux je jezgro operativnog sistema, na koji se instaliraju drugi
programi. Sve to zajedno čini određenu <em>Linux distribuciju</em>.
Postoji mnogo distribucija, ali mi preporučujemo one sa dugom tradicijom
poput sledećih:
</p>
<ul>
<li><strong>Debian</strong> distribucija je verovatno najprimerenija za Linux početnike. Poznati derivati
Debiana su <strong>Ubuntu</strong>, <strong>Mint</strong> i <strong>Zorin</strong>.
</li>
<li><strong>Fedora</strong> je takođe pogodna za Linux početnike. Razlikuje se od Debian
distribucije, po bržem izlasku novih verzija, što u praksi znači da korisnici imaju svežije
verzije programa.</li>
<li><strong>Arch</strong> je Linux distribucija koja dozvoljava korisniku da lako konfiguriše sve delove
sistema. Ova distribucija je namenjena osobama sa značajnim Linux iskustvom.</li>
</ul>
<ul>
<li>
<strong>Debian</strong> distribucija je verovatno najprimerenija za
Linux početnike. Poznati derivati Debiana su <strong>Ubuntu</strong>,
<strong>Mint</strong> i <strong>Zorin</strong>.
</li>
<li>
<strong>Fedora</strong> je takođe pogodna za Linux početnike.
Razlikuje se od Debian distribucije, po bržem izlasku novih verzija,
što u praksi znači da korisnici imaju svežije verzije programa.
</li>
<li>
<strong>Arch</strong> je Linux distribucija koja dozvoljava korisniku
da lako konfiguriše sve delove sistema. Ova distribucija je namenjena
osobama sa značajnim Linux iskustvom.
</li>
</ul>
<p>Ako ste početnik, i niste se odlučili koju distribuciju želite da instalirate, preporučujemo vam Fedoru ili Debian.
Bez obzira koju distribuciju posedujete, moći ćete da pokrenete sve programe namenjene za Linux.
</p>
<p>
Ako ste početnik, i niste se odlučili koju distribuciju želite da
instalirate, preporučujemo vam Fedoru ili Debian. Bez obzira koju
distribuciju posedujete, moći ćete da pokrenete sve programe namenjene
za Linux.
</p>
<h2>End of 10</h2>
<h2>End of 10</h2>
<p>Ovogodišnji Linux Install Fest, organizuje se u sklopu globalne <a href="https://endof10.org/">End of 10</a>
kampanje, koja promoviše Linux operativni sistem kao zamenu za Windows 10.</p>
<p>
Ovogodišnji Linux Install Fest, organizuje se u sklopu globalne
<a href="https://endof10.org/">End of 10</a> kampanje, koja promoviše
Linux operativni sistem kao zamenu za Windows 10.
</p>
<p>Već duže vreme Windows
operativni sistem postaje sve više neprijateljski prema korisnicima. Nasuprot tome,
mnoge Linux distribucije su maksimalno unapredile korisnički doživljaj, te danas
možemo tvrditi da Linux omogućava značajno ugodniji rad, bez obzira na korisnikovo tehničko znanje.</p>
<p>
Već duže vreme Windows operativni sistem postaje sve više neprijateljski
prema korisnicima. Nasuprot tome, mnoge Linux distribucije su maksimalno
unapredile korisnički doživljaj, te danas možemo tvrditi da Linux
omogućava značajno ugodniji rad, bez obzira na korisnikovo tehničko
znanje.
</p>
<p>Windows nameće korisnicima funkcionalnosti koje korisnici ne žele da koriste, kao što
su: cloud integracije, AI, reklame, obavezni nalozi, i slično. Ove
funkcionalnosti služe pre svega za povećanje Microsoftovog profita, a nemaju benefita za većinu krajnjih
korisnika. Takođe, osnovni programi poput kalendara, kalkulatora ili editora teksta, postali su spori
i puni bug-ova.
Sa beskorisnim funkcionalnostima, Windows svake godine postaje sve više zahtevan i
iziskuje kupovinu boljeg hardvera, što dovodi do povećanja elektronskog otpada. Nasuprot Windowsu, i
najnovije Linux distribucije rade veoma performantno na računarima starijim od deceniju.</p>
<p>
Windows nameće korisnicima funkcionalnosti koje korisnici ne žele da
koriste, kao što su: cloud integracije, AI, reklame, obavezni nalozi, i
slično. Ove funkcionalnosti služe pre svega za povećanje Microsoftovog
profita, a nemaju benefita za većinu krajnjih korisnika. Takođe, osnovni
programi poput kalendara, kalkulatora ili editora teksta, postali su
spori i puni bug-ova. Sa beskorisnim funkcionalnostima, Windows svake
godine postaje sve više zahtevan i iziskuje kupovinu boljeg hardvera,
što dovodi do povećanja elektronskog otpada. Nasuprot Windowsu, i
najnovije Linux distribucije rade veoma performantno na računarima
starijim od deceniju.
</p>
<p>Izbor operativnog sistema nije više samo tehnička odluka, već i ekološki stav.</p>
<p>
Izbor operativnog sistema nije više samo tehnička odluka, već i ekološki
stav.
</p>
<h2>Načini instalacije</h2>
<h2>Načini instalacije</h2>
<p>Linux možemo instalirati na tri načina:</p>
<p>Linux možemo instalirati na tri načina:</p>
<ol>
<li><strong>Unutar virtualne mašine na Windows-u</strong>. Na ovaj način korisnik zadržava svoj postojeći
operativni sistem i
podatke na njemu. Linux u virtualnoj mašini će biti značajno sporiji u odnosu na instalaciju bez
virtualizacije.
</li>
<li><strong>Pored postojećeg operativnog sistema</strong>. U slučaju da je moguće neku od vaših
particija umanjiti
(<em>partition shrink</em>), i osloboditi barem 10GB prostora, može se instalirati Linux operativni
sistem pored Windows-a. Prilikom pokretanja računara, korisnik će moći da bira da li želi da pokrene
Windows ili Linux. Pri ovakvoj instalaciji postoji određeni rizik da će neko od narednih ažuriranja
Windowsa resetovati podešavanja bootloader-a, nakon čega je potrebna mala intervencija da bi
Linux sistem bio ponovo dostupan.</li>
<ol>
<li>
<strong>Unutar virtualne mašine na Windows-u</strong>. Na ovaj način
korisnik zadržava svoj postojeći operativni sistem i podatke na njemu.
Linux u virtualnoj mašini će biti značajno sporiji u odnosu na
instalaciju bez virtualizacije.
</li>
<li>
<strong>Pored postojećeg operativnog sistema</strong>. U slučaju da je
moguće neku od vaših particija umanjiti (<em>partition shrink</em>), i
osloboditi barem 10GB prostora, može se instalirati Linux operativni
sistem pored Windows-a. Prilikom pokretanja računara, korisnik će moći
da bira da li želi da pokrene Windows ili Linux. Pri ovakvoj
instalaciji postoji određeni rizik da će neko od narednih ažuriranja
Windowsa resetovati podešavanja bootloader-a, nakon čega je potrebna
mala intervencija da bi Linux sistem bio ponovo dostupan.
</li>
<li><strong>Kompletnim uklanjanjem Windows sistema</strong>. Na mestu Windows particije,
biće postavljena nova particija sa Linux distribucijom. Dodatne particije koje postoje mogu, i ne moraju biti uklonjene.</li>
</ol>
<li>
<strong>Kompletnim uklanjanjem Windows sistema</strong>. Na mestu
Windows particije, biće postavljena nova particija sa Linux
distribucijom. Dodatne particije koje postoje mogu, i ne moraju biti
uklonjene.
</li>
</ol>
<h2>Pre dolaska</h2>
<h2>Pre dolaska</h2>
<p>Da bi instalacija bila efikasna, pre dolaska na Linux Instal Fest neophodno je da napravite <em>backup</em>
podataka sa sistemske particije ako se odlučujete za drugu ili treću opciju instalacije. Ako posedujete dve
particije (na primer, C i D), podatke sa sistemske particije (C:) koje želite da zadržite prebacite na nesistemsku particiju (D:).
Ako nemate dodatnu particiju, možete iskoristiti USB fleš. Obratite pažnju na datoteke unutar korisničkog direkotrijuma (<em>Desktop,
Downloads, Documents,...</em>), a iz pretraživača izvezite bookmarkove i lozinke.</p>
<p>
Da bi instalacija bila efikasna, pre dolaska na Linux Instal Fest
neophodno je da napravite <em>backup</em> podataka sa sistemske
particije ako se odlučujete za drugu ili treću opciju instalacije. Ako
posedujete dve particije (na primer, C i D), podatke sa sistemske
particije (C:) koje želite da zadržite prebacite na nesistemsku
particiju (D:). Ako nemate dodatnu particiju, možete iskoristiti USB
fleš. Obratite pažnju na datoteke unutar korisničkog direkotrijuma (<em
>Desktop, Downloads, Documents,...</em
>), a iz pretraživača izvezite bookmarkove i lozinke.
</p>
<p>Takođe, pre dolaska možete se upoznati sa izgledom i načinom funkcionisanja različitih Linux distubucija.
Neke Linux distribucije možete probati kroz pretraživač, bez bilo kakve instalacije, na sajtu
<a href="https://distrosea.com/">DistroSea</a> (ponekad je potrebno sačekati kratko vreme da se oslobode
resursi na sajtu). Imajte na umu da je operativni sistem na ovom sajtu višestruko sporiji od sistema koji je
instaliran na vašem računaru.
</p>
<p>
Takođe, pre dolaska možete se upoznati sa izgledom i načinom
funkcionisanja različitih Linux distubucija. Neke Linux distribucije
možete probati kroz pretraživač, bez bilo kakve instalacije, na sajtu
<a href="https://distrosea.com/">DistroSea</a> (ponekad je potrebno
sačekati kratko vreme da se oslobode resursi na sajtu). Imajte na umu da
je operativni sistem na ovom sajtu višestruko sporiji od sistema koji je
instaliran na vašem računaru.
</p>
<p>Pre dolaska napunite baterije loptopova. Obevezno ponesite i punjač.</p>
<p>
Pre dolaska napunite baterije loptopova. Obevezno ponesite i punjač.
</p>
<h2>Organizator</h2>
<h2>Organizator</h2>
<p>Organizator događaja je <a href="https://dmz.rs/">Decentrala</a> - grupa entuzijasta okupljena oko ideja
decentralizacije i slobodnog širenja znanja. Do sada smo organizovali više od <a
href="https://dmz.rs/events_archive">300 događaja</a>, a naredne događaje redovno najavljujemo na
stranici <a href="https://dmz.rs/events">Događaji</a>.
</p>
<p>
Organizator događaja je <a href="https://dmz.rs/">Decentrala</a> - grupa
entuzijasta okupljena oko ideja decentralizacije i slobodnog širenja
znanja. Do sada smo organizovali više od
<a href="https://dmz.rs/events_archive">300 događaja</a>, a naredne
događaje redovno najavljujemo na stranici
<a href="https://dmz.rs/events">Događaji</a>.
</p>
<p>U narednom periodu, na istoj lokaciji (učionica JAG3) biće održano još dva događaja za Linux početnike:</p>
<ul>
<li><strong>Utorak 16. decembar</strong> - Uvod u Linux komandnu liniju</li>
<li><strong>Utorak 23. decembar</strong> - Uvod u Git</li>
</ul>
<p>Događaji počinju od 18h.</p>
<h2>Ponovo</h2>
<p>Na Linux install fest možete doneti neispravne uređje: laptopove, telefone, desktop računare, monitore....
Mi ćemo ih tokom januara isporočuiti organizaciji <a href="https://ponovo.rs/">Ponovo</a> u Kikindi.
Ova organizacija će popraviti ove uređaje i time sprečiti uvećavanje elektronskog otpada.</p>
<p>
U narednom periodu, na istoj lokaciji (učionica JAG3) biće održano još
dva događaja za Linux početnike:
</p>
<ul>
<li>
<strong>Utorak 16. decembar</strong> - Uvod u Linux komandnu liniju
</li>
<li><strong>Utorak 23. decembar</strong> - Uvod u Git</li>
</ul>
<p>Događaji počinju od 18h.</p>
<h2>Ponovo</h2>
<p>
Na Linux install fest možete doneti neispravne uređje: laptopove,
telefone, desktop računare, monitore.... Mi ćemo ih tokom januara
isporočuiti organizaciji <a href="https://ponovo.rs/">Ponovo</a> u
Kikindi. Ova organizacija će popraviti ove uređaje i time sprečiti
uvećavanje elektronskog otpada.
</p>
</main>
</body>
</body>
</html>
</html>
+229 -111
View File
@@ -1,157 +1,275 @@
<!DOCTYPE html>
<!doctype html>
<html lang="sr">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" />
<title>Linux Install Fest 2025</title>
<style>
@font-face {
font-family: "Iosevka";
src: url('/font/iosevka-regular.woff') format('woff');
}
@font-face {
font-family: "Iosevka";
src: url("/font/iosevka-regular.woff") format("woff");
}
@font-face {
font-family: "Lobster";
src: url('/font/Lobster-Regular.ttf') format('truetype');
}
@font-face {
font-family: "Lobster";
src: url("/font/Lobster-Regular.ttf") format("truetype");
}
body {
background-color: #082142;
color: #FFF;
body {
background-color: #082142;
color: #fff;
}
main {
padding: 1rem;
margin: 0 auto;
max-width: 1000px;
font-family: "Iosevka", Arial, Helvetica, sans-serif;
}
a,
a:visited,
a:hover {
color: #fff;
}
h1 {
font-family: "Lobster", sans-serif;
font-size: 5rem;
text-align: center;
}
h2 {
font-family: "Lobster", sans-serif;
font-size: 2rem;
}
p {
font-size: 1.1rem;
}
@media (max-width: 650px) {
h1 {
font-size: 4rem;
}
main {
padding: 1rem;
margin: 0 auto;
max-width: 1000px;
font-family: "Iosevka", Arial, Helvetica, sans-serif;
padding: 0.5rem;
}
}
a,
a:visited,
a:hover {
color: #FFF;
@media (max-width: 500px) {
main {
padding: 0.2rem;
}
h1 {
font-family: "Lobster", sans-serif;
font-size: 5rem;
text-align: center;
font-size: 3rem;
}
h2 {
font-family: "Lobster", sans-serif;
font-size: 2rem;
}
p {
font-size: 1.1rem;
}
@media (max-width: 650px) {
h1 {
font-size: 4rem;
}
main {
padding: 0.5rem;
}
}
@media (max-width: 500px) {
main {
padding: 0.2rem;
}
h1 {
font-size: 3rem;
}
h2 {
font-size: 1.5rem;
}
font-size: 1.5rem;
}
}
</style>
</head>
</head>
<body>
<body>
<main>
<h1>Linux Install Fest</h1>
<h1>Linux Install Fest</h1>
<h2>Where and when</h2>
<h2>Where and when</h2>
<p>Linux Install Fest will be held on December 9, 2025 in the JAG3 classroom of the Faculty of Mathematics, at
<a href="https://www.openstreetmap.org/node/3807078606">Jagićeva 5, Belgrade</a>. Entry to the classroom is possible from 6 pm to 9 pm.</p>
<p>
Linux Install Fest will be held on December 9, 2025 in the JAG3
classroom of the Faculty of Mathematics, at
<a href="https://www.openstreetmap.org/node/3807078606"
>Jagićeva 5, Belgrade</a
>. Entry to the classroom is possible from 6 pm to 9 pm.
</p>
<p>Jagićeva street is located between the <a href="https://www.openstreetmap.org/node/6670711291"><em>Pijaca
Đeram</em></a> station where trams 5, 6, 7L and 14 stop, and the <a href="https://www.openstreetmap.org/node/1693535022"><em>Crveni krst</em></a> station where buses 21 and 83 stop, as well as trolleybuses 19, 22 and 29.</p>
<p>
Jagićeva street is located between the
<a href="https://www.openstreetmap.org/node/6670711291"
><em>Pijaca Đeram</em></a
>
station where trams 5, 6, 7L and 14 stop, and the
<a href="https://www.openstreetmap.org/node/1693535022"
><em>Crveni krst</em></a
>
station where buses 21 and 83 stop, as well as trolleybuses 19, 22 and
29.
</p>
<h2>Program schedule</h2>
<h2>Program schedule</h2>
<p>The goal of the gathering is to help interested install the Linux operating system on laptops. Several people with working Linux experience will be present at the event. In addition, depending on the interest of those present, short trainings related to the command line, git, web services, C programming, etc. can be held.</p>
<p>
The goal of the gathering is to help interested install the Linux
operating system on laptops. Several people with working Linux
experience will be present at the event. In addition, depending on the
interest of those present, short trainings related to the command line,
git, web services, C programming, etc. can be held.
</p>
<p>After 9 p.m., we can continue socializing in one of the nearby bars.</p>
<p>
After 9 p.m., we can continue socializing in one of the nearby bars.
</p>
<h2>Linux distributions</h2>
<h2>Linux distributions</h2>
<p>Linux is the core of the operating system, on which other programs are installed. All of these together make up a particular <em>Linux distribution</em>. There are many distributions, but we recommend the ones with a long tradition like the following:
</p>
<p>
Linux is the core of the operating system, on which other programs are
installed. All of these together make up a particular
<em>Linux distribution</em>. There are many distributions, but we
recommend the ones with a long tradition like the following:
</p>
<ul>
<li><strong>The Debian</strong> distribution is probably the most suitable for Linux beginners. Known derivatives of Debian are Ubuntu, Mint and Zorin.</li>
<li><strong>Fedora</strong> is also suitable for Linux beginners. It differs from the Debian distribution by the faster release of new versions, which in practice means that users have newer versions of the program.</li>
<li><strong>Arch</strong> is a Linux distribution that allows the user to easily configure all parts of the system. This distribution is intended for people with significant Linux experience.</li>
</ul>
<ul>
<li>
<strong>The Debian</strong> distribution is probably the most suitable
for Linux beginners. Known derivatives of Debian are Ubuntu, Mint and
Zorin.
</li>
<li>
<strong>Fedora</strong> is also suitable for Linux beginners. It
differs from the Debian distribution by the faster release of new
versions, which in practice means that users have newer versions of
the program.
</li>
<li>
<strong>Arch</strong> is a Linux distribution that allows the user to
easily configure all parts of the system. This distribution is
intended for people with significant Linux experience.
</li>
</ul>
<p>If you are a beginner and haven't decided which distribution you want to install, we recommend Fedora or Debian. Regardless of which distribution you have, you will be able to run all programs intended for Linux.</p>
<p>
If you are a beginner and haven't decided which distribution you want to
install, we recommend Fedora or Debian. Regardless of which distribution
you have, you will be able to run all programs intended for Linux.
</p>
<h2>End of 10</h2>
<h2>End of 10</h2>
<p>This year's Linux Install Fest is organized as part of the global <a href="https://endof10.org/">End of 10</a>
campaign, which promotes the Linux operating system as a replacement for Windows 10.</p>
<p>
This year's Linux Install Fest is organized as part of the global
<a href="https://endof10.org/">End of 10</a> campaign, which promotes
the Linux operating system as a replacement for Windows 10.
</p>
<p>For a long time now, the Windows operating system has become increasingly unfriendly to users. On the contrary, many Linux distributions have improved the user experience to the maximum, and today we can claim that Linux enables significantly more pleasant work, regardless of the user's technical knowledge.</p>
<p>
For a long time now, the Windows operating system has become
increasingly unfriendly to users. On the contrary, many Linux
distributions have improved the user experience to the maximum, and
today we can claim that Linux enables significantly more pleasant work,
regardless of the user's technical knowledge.
</p>
<p>Windows imposes on users functionalities that users do not want to use, such as: cloud integrations, AI, advertisements, mandatory accounts, and the like. These functionalities serve above all to increase Microsoft's profits, and have no benefit for most end users. Also, basic programs such as calendars, calculators or text editors have become slow and full of bugs. With useless functionalities, Windows becomes more demanding every year and requires the purchase of better hardware, leading to an increase in electronic waste. Unlike Windows, the latest Linux distributions work very well on computers that are more than a decade old.</p>
<p>
Windows imposes on users functionalities that users do not want to use,
such as: cloud integrations, AI, advertisements, mandatory accounts, and
the like. These functionalities serve above all to increase Microsoft's
profits, and have no benefit for most end users. Also, basic programs
such as calendars, calculators or text editors have become slow and full
of bugs. With useless functionalities, Windows becomes more demanding
every year and requires the purchase of better hardware, leading to an
increase in electronic waste. Unlike Windows, the latest Linux
distributions work very well on computers that are more than a decade
old.
</p>
<p>The choice of an operating system is no longer just a technical decision, but also an environmental attitude.</p>
<p>
The choice of an operating system is no longer just a technical
decision, but also an environmental attitude.
</p>
<h2>Installation methods</h2>
<h2>Installation methods</h2>
<p>We can install Linux in three ways:</p>
<p>We can install Linux in three ways:</p>
<ol>
<li><strong>Inside a virtual machine on Windows.</strong> In this way, the user retains his existing operating system and the data on it. Linux in a virtual machine will be significantly slower than an installation without virtualization.
</li>
<li><strong>In addition to the existing operating system.</strong> If it is possible to shrink one of your partitions and free up at least 10GB of space, you can install a Linux operating system in addition to Windows. When booting the computer, the user will be able to choose whether to boot Windows or Linux. With such an installation, there is a certain risk that one of the subsequent Windows updates will reset the bootloader settings, after which a small intervention is required to make the Linux system accessible again.</li>
<li><strong>By completely removing the Windows system.</strong> In place of the Windows partition, a new partition with the Linux distribution will be placed. Additional partitions that exist may or may not be removed.</li>
</ol>
<ol>
<li>
<strong>Inside a virtual machine on Windows.</strong> In this way, the
user retains his existing operating system and the data on it. Linux
in a virtual machine will be significantly slower than an installation
without virtualization.
</li>
<li>
<strong>In addition to the existing operating system.</strong> If it
is possible to shrink one of your partitions and free up at least 10GB
of space, you can install a Linux operating system in addition to
Windows. When booting the computer, the user will be able to choose
whether to boot Windows or Linux. With such an installation, there is
a certain risk that one of the subsequent Windows updates will reset
the bootloader settings, after which a small intervention is required
to make the Linux system accessible again.
</li>
<li>
<strong>By completely removing the Windows system.</strong> In place
of the Windows partition, a new partition with the Linux distribution
will be placed. Additional partitions that exist may or may not be
removed.
</li>
</ol>
<h2>Before arrival</h2>
<h2>Before arrival</h2>
<p>In order for the installation to be effective, before coming to the Linux Instal Fest, it is necessary to make a backup of the data from the system partition if you decide on the second or third installation option. If you have two partitions (for example, C and D), move the data from the system partition (C:) that you want to keep to the non-system partition (D:). If you don't have an additional partition, you can use a USB flash drive. Pay attention to the files inside the user directory (Desktop, Downloads, Documents,... ), and export bookmarks and passwords from the browser.</p>
<p>
In order for the installation to be effective, before coming to the
Linux Instal Fest, it is necessary to make a backup of the data from the
system partition if you decide on the second or third installation
option. If you have two partitions (for example, C and D), move the data
from the system partition (C:) that you want to keep to the non-system
partition (D:). If you don't have an additional partition, you can use a
USB flash drive. Pay attention to the files inside the user directory
(Desktop, Downloads, Documents,... ), and export bookmarks and passwords
from the browser.
</p>
<p>Also, before your arrival, you can familiarize yourself with the appearance and way of functioning of various Linux distributions. You can try some Linux distributions through the browser, without any installation, on the
<a href="https://distrosea.com/">DistroSea</a> website (sometimes it is necessary to wait a short time to free up resources on the site). Please note that the operating system on this site is many times slower than the system installed on your computer.
</p>
<p>
Also, before your arrival, you can familiarize yourself with the
appearance and way of functioning of various Linux distributions. You
can try some Linux distributions through the browser, without any
installation, on the
<a href="https://distrosea.com/">DistroSea</a> website (sometimes it is
necessary to wait a short time to free up resources on the site). Please
note that the operating system on this site is many times slower than
the system installed on your computer.
</p>
<h2>Organizer</h2>
<h2>Organizer</h2>
<p>The organizer of the event is <a href="https://dmz.rs/en/">Decentrala</a> - a group of enthusiasts gathered around the ideas of decentralization and free dissemination of knowledge. So far, we have organized more than <a
href="https://dmz.rs/en/events_archive">300 events</a>, and we regularly announce the next events on the <a href="https://dmz.rs/en/events">Events</a> page.
</p>
<p>
The organizer of the event is
<a href="https://dmz.rs/en/">Decentrala</a> - a group of enthusiasts
gathered around the ideas of decentralization and free dissemination of
knowledge. So far, we have organized more than
<a href="https://dmz.rs/en/events_archive">300 events</a>, and we
regularly announce the next events on the
<a href="https://dmz.rs/en/events">Events</a> page.
</p>
<p>In the following period, two more events for Linux beginners will be held at the same location (classroom JAG3):</p>
<ul>
<li><strong>Tuesday December 16</strong> - Introduction to the Linux command line</li>
<li><strong>Tuesday, December 23</strong> - Introduction to Git</li>
</ul>
<p>Events start at 6pm.</p>
<p>
In the following period, two more events for Linux beginners will be
held at the same location (classroom JAG3):
</p>
<ul>
<li>
<strong>Tuesday December 16</strong> - Introduction to the Linux
command line
</li>
<li><strong>Tuesday, December 23</strong> - Introduction to Git</li>
</ul>
<p>Events start at 6pm.</p>
<h2>Ponovo</h2>
<p>You can bring defective devices to the Linux install fest: laptops, phones, desktop computers, monitors... We will deliver them to the organization <a href="https://ponovo.rs/">Ponovo</a> in Kikinda during January. This organization will repair these devices and thereby prevent the increase of electronic waste.</p>
<h2>Ponovo</h2>
<p>
You can bring defective devices to the Linux install fest: laptops,
phones, desktop computers, monitors... We will deliver them to the
organization <a href="https://ponovo.rs/">Ponovo</a> in Kikinda during
January. This organization will repair these devices and thereby prevent
the increase of electronic waste.
</p>
</main>
</body>
</body>
</html>
</html>
-94
View File
@@ -1,94 +0,0 @@
const theme_switcher = document.getElementById("theme-switcher");
const imgs = document.getElementsByTagName("img");
const sections_button = document.getElementById("sections-button");
const sections_menu = document.getElementsByTagName("nav")[0];
const main = document.getElementsByTagName("main")[0];
let theme = window.localStorage.getItem("theme");
if (theme !== null) {
if (theme === "light") {
changeToLightTheme();
} else {
changeToDarkTheme();
}
} else {
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
changeToDarkTheme();
}
}
theme_switcher.addEventListener("click", () => {
const attribute = theme_switcher.getAttribute("title") ?? "off"
if (attribute.indexOf("off") !== -1) {
changeToDarkTheme();
} else {
changeToLightTheme();
}
});
function changeToDarkTheme() {
theme_switcher?.setAttribute("title", "turn the light on");
document.documentElement.style.setProperty("--border", "var(--dark-border)");
document.documentElement.style.setProperty("--text", "var(--dark-text)");
document.documentElement.style.setProperty("--bg", "var(--dark-bg)");
window.localStorage.setItem("theme", "dark");
for (let i = 0; i < imgs.length; i += 1) {
imgs[i].src = imgs[i].src.replace("-light", "-dark");
}
}
function changeToLightTheme() {
theme_switcher?.setAttribute("title", "turn the light off");
document.documentElement.style.setProperty("--border", "var(--light-border)");
document.documentElement.style.setProperty("--text", "var(--light-text)");
document.documentElement.style.setProperty("--bg", "var(--light-bg)");
window.localStorage.setItem("theme", "light");
for (let i = 0; i < imgs.length; i += 1) {
imgs[i].src = imgs[i].src.replace("-dark", "-light");
}
}
function closeMenu() {
sections_button.setAttribute("opened", "false");
sections_button.children[0].src = sections_button.children[0].src.replace(
"opened",
"closed",
);
sections_menu.style.display = "none";
}
function openMenu() {
sections_button.setAttribute("opened", "true");
sections_button.children[0].src = sections_button.children[0].src.replace(
"closed",
"opened",
);
sections_menu.style.display = "flex";
sections_menu.style.flexDirection = "column";
}
sections_button.addEventListener("click", () => {
if (sections_button.getAttribute("opened") === "false") {
openMenu();
} else {
closeMenu();
}
});
window.addEventListener("resize", () => {
if (sections_button.getAttribute("opened") === "true") {
closeMenu();
}
});
main.addEventListener("click", () => {
if (sections_button.getAttribute("opened") === "true") {
closeMenu();
}
});
+9 -8
View File
@@ -1,12 +1,13 @@
main {
max-width: fit-content;
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
margin: 0 auto;
max-width: fit-content;
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
margin: 0 auto;
}
main img {
width: min(70vw, 15rem);
}
width: min(70vw, 15rem);
}
+2 -1
View File
@@ -1,3 +1,4 @@
#mesh {
display: none;
}
}
+2 -1
View File
@@ -8,4 +8,5 @@ dt {
dd {
margin: 0 0 1rem 1rem;
}
}
+46 -32
View File
@@ -1,25 +1,30 @@
.description {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 40px;
}
.event {
display: flex;
flex-direction: row;
}
.event:hover {
border-bottom: 5px var(--hightlight) solid;
}
.event:hover > div {
padding-bottom: calc(0.5rem - 5px);
}
.event > div {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
white-space: nowrap;
&:hover {
border-bottom: 5px var(--hightlight) solid;
& > div {
padding-bottom: calc(0.5rem - 5px);
}
}
& > div {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
white-space: nowrap;
}
}
.date {
width: 250px;
font-size: 0.9em;
width: 220px;
font-size: 0.75em;
overflow-x: hidden;
white-space: nowrap;
}
@@ -27,38 +32,44 @@
.title {
border-left: 2px solid var(--border);
font-weight: bold;
padding-left: 1rem;
padding-left: 2rem;
padding-right: 0.5em;
}
.place {
font-size: 0.9em;
font-size: 0.7em;
opacity: 0.7;
&:before {
content: "-";
margin-right: 12px;
}
}
.types {
font-size: 0.9em;
font-size: 0.8em;
margin-left: auto;
font-style: italic;
letter-spacing: 2px;
font-weight: 900;
opacity: 0.7;
}
@media screen and (max-width: 1160px) {
.event {
flex-direction: column;
margin-bottom: 1rem;
margin-bottom: 2.2rem;
border-left: 3px solid var(--border);
}
.event > div {
padding: 0 0.5rem;
white-space: normal;
}
.event:hover {
border-bottom: none;
}
.event:hover > div {
padding-bottom: 0;
&:hover {
border-bottom: none;
border-left: 3px solid var(--hightlight);
& > div {
padding-bottom: 0;
}
}
& > div {
padding: 0 0.5rem;
white-space: normal;
}
}
.date {
@@ -68,6 +79,9 @@
.title {
border-left: none;
}
.place:before {
display: none;
}
.types {
margin-left: 0;
+2 -1
View File
@@ -8,4 +8,5 @@ dt {
dd {
margin: 0 0 1rem 1rem;
}
}
+37 -39
View File
@@ -1,76 +1,74 @@
html {
}
@font-face {
font-family: Facade;
src: url(../font/Facade-Sud.woff);
}
@font-face {
font-family: jetbrains-mono;
src: url(../font/JetBrainsMono-Regular.ttf);
font-family: Facade;
src: url(../font/Facade-Sud.woff);
}
html, body {
margin: 0;
padding: 0;
@font-face {
font-family: jetbrains-mono;
src: url(../font/JetBrainsMono-Regular.ttf);
}
html,
body {
margin: 0;
padding: 0;
}
main {
max-width: 1200px;
margin: auto;
font-family: 'jetbrains-mono';
padding: 2.3rem;
max-width: 1200px;
margin: auto;
font-family: "jetbrains-mono";
padding: 2.3rem;
}
h1 {
font-family: 'Facade';
text-align: center;
font-size: 5rem;
margin: 0rem;
font-family: "Facade";
text-align: center;
font-size: 5rem;
margin: 0rem;
}
h2 {
text-align: center;
margin-top: 0.0rem;
margin-bottom: 2rem;
font-size: 2rem;
text-align: center;
margin-top: 0rem;
margin-bottom: 2rem;
font-size: 2rem;
}
p {
font-size: 1.5rem;
font-size: 1.5rem;
}
table {
margin: 4rem 0;
margin: 4rem 0;
}
td {
font-size: 1.8rem;
padding-top: 0.5rem;
font-size: 1.8rem;
padding-top: 0.5rem;
}
td:first-child {
width: 3.5rem;
width: 3.5rem;
}
td:nth-child(2) {
padding-right: 1rem;
padding-right: 1rem;
}
#link {
margin-top: 4rem;
font-size: 3rem;
width: fit-content;
float: right;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 4rem;
font-size: 3rem;
width: fit-content;
float: right;
display: flex;
flex-direction: column;
align-items: center;
}
#link img {
width: 4rem;
width: 4rem;
}
+3 -2
View File
@@ -112,7 +112,7 @@ blockquote {
blockquote::before,
blockquote::after {
content: '';
content: "";
content: none;
}
@@ -146,4 +146,5 @@ h5,
h6 {
overflow-wrap: break-word;
hyphens: auto;
}
}
+12
View File
@@ -8,3 +8,15 @@ h2 {
p {
padding-bottom: 1.5rem;
}
.values {
margin-bottom: 1.5rem;
label {
display: block;
padding-bottom: 1rem;
}
ul > li {
padding-left: 1.5rem;
}
}
+102 -3
View File
@@ -11,6 +11,39 @@
--bg: var(--light-bg);
}
/* Theme toggle via checkbox hack */
#theme-toggle {
display: none;
}
/* Use :has() selector to detect checkbox state */
body:has(#theme-toggle:checked) {
--border: var(--dark-border);
--text: var(--dark-text);
--bg: var(--dark-bg);
}
body:has(#theme-toggle:checked) header #theme-switcher {
background: linear-gradient(
90deg,
var(--dark-border) 0%,
var(--dark-border) 50%,
var(--dark-bg) 51%,
var(--dark-bg) 100%
);
}
body:has(#theme-toggle:checked) header #theme-switcher:hover {
border-color: var(--hightlight);
background: linear-gradient(
90deg,
var(--hightlight) 0%,
var(--hightlight) 50%,
var(--dark-bg) 51%,
var(--dark-bg) 100%
);
}
@font-face {
font-family: "Iosevka";
src: url("/font/iosevka-regular.woff") format("woff");
@@ -117,6 +150,7 @@ a:visited {
var(--bg) 51%,
var(--bg) 100%
);
cursor: pointer;
}
#theme-switcher:hover {
@@ -130,6 +164,27 @@ a:visited {
);
}
#theme-toggle:checked ~ body header #theme-switcher {
background: linear-gradient(
90deg,
var(--dark-border) 0%,
var(--dark-border) 50%,
var(--dark-bg) 51%,
var(--dark-bg) 100%
);
}
#theme-toggle:checked ~ body header #theme-switcher:hover {
border-color: var(--hightlight);
background: linear-gradient(
90deg,
var(--hightlight) 0%,
var(--hightlight) 50%,
var(--dark-bg) 51%,
var(--dark-bg) 100%
);
}
.lang {
font-size: 2rem;
}
@@ -153,7 +208,7 @@ a:visited {
}
}
#sections-button {
.hamburger {
display: none;
}
@@ -186,7 +241,7 @@ button {
}
@media screen and (max-width: 1160px) {
nav {
nav.menu {
flex-direction: column;
border: 2px solid var(--border);
border-bottom: 0;
@@ -198,10 +253,54 @@ button {
align-items: center;
padding: 2rem 3rem;
display: none;
&.open {
display: flex;
flex-direction: column;
}
}
#sections-button {
.hamburger {
display: block !important;
cursor: pointer;
}
#menu-toggle {
display: none;
}
#menu-toggle:checked ~ footer .menu {
display: flex;
flex-direction: column;
}
#menu-toggle:checked ~ footer .hamburger {
position: relative;
}
#menu-toggle:checked ~ footer .hamburger::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url("/img/strelica-opened-light.svg");
background-repeat: no-repeat;
background-size: contain;
}
/* Show hamburger icon on mobile */
.hamburger {
cursor: pointer;
}
.hamburger img {
width: 1.5rem;
height: 1.5rem;
}
#menu-toggle:checked ~ footer .hamburger img {
opacity: 0;
}
}
+4 -7
View File
@@ -4,11 +4,8 @@ p {
li {
padding-left: 1.5rem;
i {
word-break: break-all;
font-size: 1rem;
}
}
li i {
word-break: break-all;
font-size: 1rem;
}
+17 -7
View File
@@ -1,8 +1,18 @@
<h1>Events</h1>
<p>
Following list contains all forthcoming events. Held events are listed in
<a href="/en/events_archive">archive</a>.
</p>
<br />
<p>We also provide <a href="https://dmz.rs/events.ical">ical file</a></p>
<br />
<div class="description">
<p>
Following list contains all forthcoming events. Held events are listed in
<a href="/en/events_archive">archive</a>.
</p>
<p>
Events are also available as an
<a href="https://dmz.rs/events.ical">ical</a> file.
</p>
<p>
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">
Short description
</a>
how to find a space
</p>
</div>
+17 -15
View File
@@ -1,16 +1,18 @@
<h1>Događaji</h1>
<p>
Naredna lista sadrži sve predstojeće događaje. Za listu održanih događaja
pogledaj <a href="/events_archive">arhivu</a>.
</p>
<br />
<p>
Događaje možeš učitati i sa
<a href="https://dmz.rs/events.ical">ical</a> datotekom.
</p>
<br />
<p>
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">Kratako uputstvo</a> kako pronaci prostor
</p>
<br />
<br />
<div class="description">
<p>
Naredna lista sadrži sve predstojeće događaje. Za listu održanih događaja
pogledaj <a href="/events_archive">arhivu</a>.
</p>
<p>
Događaje možeš učitati i sa
<a href="https://dmz.rs/events.ical">ical</a> datotekom.
</p>
<p>
<a href="https://wiki.dmz.rs/en/kako-pronaci-prostor" target="_blank">
Kratako uputstvo
</a>
kako pronaci prostor
</p>
</div>
+5 -1
View File
@@ -1,2 +1,6 @@
<h1>Events archive</h1>
<p>All events that we organized so far. You can find future events on <a href="/en/events">Events page</a></p><br>
<p>
All events that we organized so far. You can find future events on
<a href="/en/events">Events page</a>
</p>
<br />
+5 -1
View File
@@ -1,2 +1,6 @@
<h1>Arhiva događaja</h1>
<p>Svi događaji koje smo do sada organzivali. Predstojeće događaje možeš naći <a href="/events">ovde</a></p><br>
<p>
Svi događaji koje smo do sada organzivali. Predstojeće događaje možeš naći
<a href="/events">ovde</a>
</p>
<br />
+20 -16
View File
@@ -3,6 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<input type="checkbox" id="theme-toggle" />
<!-- <pre>
@@ -32,16 +33,17 @@
<link rel="stylesheet" href="/styles/style.css" />
<!--ADDITIONAL_STYLE-->
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
<script src="/scripts/main.js" defer></script>
<title><!--TITLE--> Decentrala</title>
<link rel="alternate" hreflang="sr" href="/PAGE_NAME" />
</head>
<body>
<input type="checkbox" id="theme-toggle" />
<input type="checkbox" id="menu-toggle" />
<header>
<a id="logo" href="/en/index">
<img src="/img/logo-light.svg" alt="Logo" /> Decentrala
</a>
<button id="theme-switcher"></button>
<label for="theme-toggle" id="theme-switcher"></label>
<a class="lang" hreflang="sr" href="/PAGE_NAME">SR</a>
</header>
<main>
@@ -50,10 +52,10 @@
</div>
</main>
<footer>
<button id="sections-button" opened="false">
<img src="/img/strelica-closed-light.svg" alt="OpenMenu" />
</button>
<nav>
<label for="menu-toggle" class="hamburger">
<img src="/img/strelica-closed-light.svg" alt="Menu" />
</label>
<nav class="menu">
<a href="/en/events">Events</a>
<a href="/en/services">Services</a>
<a href="/en/statute">Statute</a>
@@ -62,16 +64,18 @@
<a href="/en/support">Support</a>
</nav>
<span class="links">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"
><img src="/img/cc-light.svg" alt="CreativeCommons"
/></a>
<a href="/en/webring"><img src="/img/w-light.svg" alt="Webring" /></a>
<a href="https://gitea.dmz.rs/Decentrala/website"
><img src="/img/git-light.svg" alt="SourceCode"
/></a>
<a href="https://balkan.fedive.rs/@decentrala"
><img src="/img/mastodon-light.svg" alt="Mastodon"
/></a>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
<img src="/img/cc-light.svg" alt="CreativeCommons" />
</a>
<a href="/en/webring">
<img src="/img/w-light.svg" alt="Webring" />
</a>
<a href="https://gitea.dmz.rs/Decentrala/website">
<img src="/img/git-light.svg" alt="SourceCode" />
</a>
<a href="https://balkan.fedive.rs/@decentrala">
<img src="/img/mastodon-light.svg" alt="Mastodon" />
</a>
</span>
</footer>
</body>
+57 -45
View File
@@ -1,11 +1,10 @@
<!DOCTYPE html>
<!doctype html>
<html lang="sr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!--
<pre>
<!-- <pre>
*@@*
*@@@@*
@@ -27,44 +26,57 @@
| |_| | |__| |___| |___| |\ | | | | _ < / ___ \| |___ / ___ \
|____/|_____\____|_____|_| \_| |_| |_| \_\/_/ \_\_____/_/ \_\
</pre>
-->
</pre> -->
<link rel="stylesheet" href="/styles/reset.css">
<link rel="stylesheet" href="/styles/style.css">
<!--ADDITIONAL_STYLE-->
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
<script src="/scripts/main.js" defer></script>
<title><!--TITLE--> Decentrala</title>
<link rel="alternate" hreflang="en" href="/en/PAGE_NAME" />
</head>
<body>
<header>
<a id="logo" href="/"><img src="/img/logo-light.svg" alt="Logo"> Decentrala</a>
<button id="theme-switcher"></button>
<a class="lang" hreflang="en" href="/en/PAGE_NAME">EN</a>
</header>
<main>
<div class="page-wrap">
<!--MAIN-->
</div>
</main>
<footer>
<button id="sections-button" opened="false"><img src="/img/strelica-closed-light.svg" alt="OpenMenu"></button>
<nav>
<a href="/events">Događaji</a>
<a href="/services">Servisi</a>
<a href="/statute">Statut</a>
<a href="/about">O nama</>
<a class="account" href="/account">Nalog</a>
<a href="/support">Podrška</a>
</nav>
<span class="links">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img src="/img/cc-light.svg" alt="CreativeCommons"></a>
<a href="/webring"><img src="/img/w-light.svg" alt="Webring"></a>
<a href="https://gitea.dmz.rs/Decentrala/website"><img src="/img/git-light.svg" alt="SourceCode"></a>
<a href="https://balkan.fedive.rs/@decentrala"><img src="/img/mastodon-light.svg" alt="Mastodon"></a>
</span>
</footer>
</body>
<link rel="stylesheet" href="/styles/reset.css" />
<link rel="stylesheet" href="/styles/style.css" />
<!--ADDITIONAL_STYLE-->
<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon" />
<title><!--TITLE--> Decentrala</title>
<link rel="alternate" hreflang="en" href="/en/PAGE_NAME" />
</head>
<body>
<input type="checkbox" id="menu-toggle" />
<input type="checkbox" id="theme-toggle" />
<header>
<a id="logo" href="/">
<img src="/img/logo-light.svg" alt="Logo" />
Decentrala
</a>
<label for="theme-toggle" id="theme-switcher"></label>
<a class="lang" hreflang="en" href="/en/PAGE_NAME">EN</a>
</header>
<main>
<div class="page-wrap">
<!--MAIN-->
</div>
</main>
<footer>
<label for="menu-toggle" class="hamburger">
<img src="/img/strelica-closed-light.svg" alt="Menu" />
</label>
<nav class="menu">
<a href="/events">Događaji</a>
<a href="/services">Servisi</a>
<a href="/statute">Statut</a>
<a href="/about">O nama</a>
<a class="account" href="/account">Nalog</a>
<a href="/support">Podrška</a>
</nav>
<span class="links">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
<img src="/img/cc-light.svg" alt="CreativeCommons" />
</a>
<a href="/webring">
<img src="/img/w-light.svg" alt="Webring" />
</a>
<a href="https://gitea.dmz.rs/Decentrala/website">
<img src="/img/git-light.svg" alt="SourceCode" />
</a>
<a href="https://balkan.fedive.rs/@decentrala">
<img src="/img/mastodon-light.svg" alt="Mastodon" />
</a>
</span>
</footer>
</body>
</html>