diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index e2f61ad0e..3bfa9bc1b 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -45,6 +45,14 @@ jobs: - name: Build run: hugo --minify + - name: Build the search index + # Pagefind reads the pages Hugo wrote and writes public/pagefind/: + # the engine, the word index in chunks, one fragment per page. It + # runs after Hugo because it indexes what is on disk, and it is + # pinned the way Hugo is: bin/install-pagefind fetches the release + # named in .pagefind-version and checks its SHA-256. + run: bin/install-pagefind && bin/search public + - name: Deploy uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4.1.0 with: diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml new file mode 100644 index 000000000..9588daee2 --- /dev/null +++ b/.github/workflows/links.yml @@ -0,0 +1,60 @@ +# Check the external links of the site. +# +# Not part of the pull request checks. A link to another site breaks when +# that site changes, which is not something a pull request of ours causes +# or can fix, and asking for 139 external URLs on every pull request is +# both slow and close to behaving like a crawler. Run this when you want +# to know, which in practice is before a round of archive work. +# +# It never turns anything red. Read the report in the job summary. +name: links + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + external: + name: Check the external links + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Read the Hugo version + run: echo "HUGO_VERSION=$(tr -d '[:space:]' < .hugo-version)" >> "$GITHUB_ENV" + + - name: Setup Hugo + uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3.2.1 + with: + hugo-version: ${{ env.HUGO_VERSION }} + extended: true + + - name: Build + run: hugo --minify -d public --baseURL / + + - name: Check links + uses: lycheeverse/lychee-action@e7477775783ea5526144ba13e8db5eec57747ce8 # v2.9.0 + with: + # --exclude-path: the frozen 2016-2019 snapshots under archives/ + # keep their dead links on purpose. + # --exclude: hosts that answer bots with 400, 403, or 999, and + # canary.invalid, the host the canary fixture names as text. + # lychee reads URLs out of text nodes too, and .invalid never + # resolves. + args: >- + --no-progress + --exclude-all-private + --max-concurrency 4 + --cache + --max-cache-age 1w + --root-dir "$GITHUB_WORKSPACE/public" + --exclude-path 'public/archives/' + --exclude 'twitter\.com' + --exclude '^https?://(www\.)?x\.com/' + --exclude 'linkedin\.com' + --exclude 'pybcn\.slack\.com' + --exclude 'canary\.invalid' + 'public/**/*.html' + fail: false diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6d175291b..719026334 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -42,11 +42,21 @@ jobs: - name: Build run: hugo --minify + - name: Build the search index + # Pagefind reads the pages Hugo wrote and writes public/pagefind/: + # the engine, the word index in chunks, one fragment per page. It + # runs after Hugo because it indexes what is on disk, and it is + # pinned the way Hugo is: bin/install-pagefind fetches the release + # named in .pagefind-version and checks its SHA-256. + run: bin/install-pagefind && bin/search public + content: name: Check the content runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 # bin/authors --check reads the whole history - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: @@ -64,6 +74,19 @@ jobs: - name: Check content for dangerous raw HTML run: bin/check-html-safety + - name: Check that AUTHORS is what bin/authors writes + # The check writes the file again in memory and compares, so a new + # contributor, a second account of somebody already here, and a name + # that changed on a person record are all caught. It reads the + # GitHub API for the account of each commit and for the reviews, + # with the token the job already has; when the API cannot be reached + # it says it skipped and passes, because an outage of somebody else + # is not a broken build. The reviews come through GraphQL, three + # requests for the 205 pull requests, which is why it takes seconds. + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bin/authors --check + - name: Check the text normalizer run: python3 bin/canon.py --selftest @@ -117,29 +140,28 @@ jobs: # runner's python3 is enough. run: bin/check-rendered public - - name: Check links + - name: Check the internal links uses: lycheeverse/lychee-action@e7477775783ea5526144ba13e8db5eec57747ce8 # v2.9.0 with: - # --root-dir: where "/path/" links resolve. Without it lychee flags - # every absolute link in a local file as an error. + # --offline: only the links that point inside this build. The + # external ones are the job of .github/workflows/links.yml, + # which runs on request. The site holds 139 distinct external + # URLs outside the frozen snapshots, and checking them took 25 + # minutes on the pull request that added the person pages: with + # the concurrency low enough not to look like a crawler, every + # pull request asked every host we have ever linked to whether + # it is still there, and reported rot that is not ours to fix. + # An internal link that does not resolve is a typo, is ours, + # and is found in seconds. + # --root-dir: where "/path/" links resolve. Without it lychee + # flags every absolute link in a local file as an error. # --exclude-path: the frozen 2016-2019 snapshots under archives/ # keep their dead links on purpose. - # --exclude: hosts that answer bots with 400, 403, or 999, and - # canary.invalid, the host the canary fixture names as text. - # lychee reads URLs out of text nodes too, and .invalid never - # resolves. args: >- --no-progress - --exclude-all-private - --max-concurrency 4 + --offline --root-dir "$GITHUB_WORKSPACE/public" --exclude-path 'public/archives/' - --exclude 'twitter\.com' - --exclude '^https?://(www\.)?x\.com/' - --exclude 'linkedin\.com' - --exclude 'pybcn\.slack\.com' - --exclude 'canary\.invalid' 'public/**/*.html' - # External sites rate-limit. Keep the report in the job summary and - # do not turn the check red. - fail: false + # An internal link is ours, so this one does turn the check red. + fail: true diff --git a/.gitignore b/.gitignore index 7f4f2d853..cdd53cf88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea bin/hugo +bin/pagefind public/** # Hugo build output and caches. resources/ covers the SCSS cache and the diff --git a/.pagefind-version b/.pagefind-version new file mode 100644 index 000000000..4cda8f19e --- /dev/null +++ b/.pagefind-version @@ -0,0 +1 @@ +1.5.2 diff --git a/AGENTS.md b/AGENTS.md index c8a3d74ec..fca2cd84a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,22 +14,35 @@ bin/install # downloads the pinned Hugo binary, verifies its SHA256 bin/serve # dev server, Hugo's default :1313 bin/build # writes to docs/ bin/hugo --quiet -d /tmp/out # the binary directly +bin/install-pagefind # the pinned Pagefind binary, verifies its SHA256 +bin/search /tmp/out # the search index of a built site, after the build ``` **The Hugo binary lives at `bin/hugo` and is gitignored.** `bin/helpers` prefers it over anything on `$PATH`, and checks the version from `.hugo-version`. +**The search index is not built by Hugo.** `bin/search ` runs +Pagefind (pinned in `.pagefind-version`, binary at the gitignored +`bin/pagefind`) over the pages Hugo wrote, and CI runs it right after +`hugo --minify`. The dev server has none, so `/search/` says so there. What +is indexed is what the templates mark `data-pagefind-body`: the record of +each talk, event and person, and the photo captions, not the whole page. +`partials/search_kind.html` says which pages, and `partials/hero_header.html` +and the layouts of the three kinds say what of each. + **Do not `pip install hugo`.** That PyPI package now requires a Go toolchain and fails. `bin/install` fetches the official release binary instead. -A clean build with `-D` produces **1369 HTML pages**: 1313 Hugo-generated and +A clean build with `-D` produces **1377 HTML pages**: 1321 Hugo-generated and 56 copied from `static/archives/`. Recount rather than trusting this line: the number moves with the content. It was 317 until #202 stopped publishing the 206 person and sponsor pages that nothing linked to, 109 until the archive -import added a page per meetup and per talk, and 991 until the person pages +import added a page per meetup and per talk, 991 until the person pages came back with the Archive (378 of them, one per record of `content/people/`, -the canary fixture included), which is how quickly a figure like this goes -stale. Recount with: +the canary fixture included), and 1363 until the tabs of `/talks/` and +`/people/` added a page per talk type and per role (the two content adapters +under `content/`), which is how quickly a figure like this goes stale. +Recount with: ```sh find -name '*.html' | wc -l @@ -45,6 +58,26 @@ and checking the output, not by reading the file. **`merge.ff = only`.** Any local merge needs `--no-ff`. A failed merge here reports "Not possible to fast-forward", which is not a conflict. +**A photograph belongs to the event its text names, not to the day it was +posted.** `bin/import-x-photos --ids FILE` takes the posts to import, and the +day stops deciding. Reading the export by date looks right and is wrong three +ways, each found the hard way on 2026-10-17: + +- The account replies to its own posts of years before, so following the chain + of replies builds threads that run from 2014 to 2021. Cut the chain at four + days from the photograph. +- A talk titled in two or three generic words matches any post that uses them: + a 2014 talk swallowed every post that said "machine learning" since. A title + has to be long and belong to one event before it can attribute on its own. +- Some titles repeat anyway. There are several "Introduction to Python", and + "Barcelona Python Meetup" is both the name of the event of 2007 and what + every monthly meetup is called. There the text says what the event is and + the day says which one of them, which is the rule a person would use. + +A post with photographs and no text at all is not imported: the caption is the +alt text of the image, and a gallery leaves a photograph out rather than +publish one nobody can read. + **The archive imports run in one order and only once.** `bin/import-meetups`, then `bin/import-talks`, then `bin/import-videos`. `bin/import-talks` replaces the whole `talks` block of a page and everything after it in the front matter, @@ -219,8 +252,9 @@ plausible but different result. | `themes/pybcn_theme/layouts/partials/` | Most of the interesting template logic | | `static/archives/` | Verbatim mirrors of pre-Hugo sites, copied unprocessed | | `data/` | Tables the templates read: `roles.yaml` maps a heading to a role, `role_emoji.yaml` a role to a glyph, `event_emoji.yaml` an event to a glyph, `venues.yaml` the exact `venue` string of an event to the short name the `/events/` list prints (the page of the meetup keeps the full string). Plus `channel_videos.yaml`, the inventory of the YouTube channel, which `bin/check-content` reads and `bin/list-channel` refreshes | -| `bin/` | Setup and build scripts, the checks, `bin/list-channel` (names a channel video the inventory lacks; needs `yt-dlp` and the network), the one-time `bin/import-*` scripts, plus the gitignored Hugo binary | +| `bin/` | Setup and build scripts, the checks, `bin/list-channel` (names a channel video the inventory lacks; needs `yt-dlp` and the network), `bin/new-meetup` (writes the page of one past meetup from its Meetup URL, and `--discover` names the ones with no page; needs the network), the one-time `bin/import-*` scripts, plus the gitignored Hugo binary | | `.hugo-version` | The pinned Hugo version, single source of truth | +| `.pagefind-version` | The pinned Pagefind version, same rule; `bin/install-pagefind` reads it | The checks, which are what a pull request has to pass: diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..e9a0900c8 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,52 @@ +PyBCN publishes this site. These are the people who built it, in the order +they arrived. Writing it and reviewing it both count, because a change that +nobody reads is not finished, and the years are the first and the last one +each person worked on it. + +The name of each one is the name their page of the site carries, or the name +they signed their own commits with when they have no page. A person who would +rather appear another way can change it in a pull request, because this file +is generated: from the commits, from the reviews, and from the pages. + +The people behind the events themselves, the speakers, the organizers, the +venues and the sponsors, are named on the pages that stay current, which +static/humans.txt links. + +Written by bin/authors. + +Areski Belaid (@areski) wrote, 2013 to 2015. + https://pybcn.org/people/areski-belaid/ +Núria Pujol Vilanova (@llevaNEUS) wrote, 2014 to 2015. + https://pybcn.org/people/nuria-pujol-vilanova/ +David Arcos (@DZPM) wrote and reviewed, 2015 to 2026. + https://pybcn.org/people/david-arcos/ +Jordi Soucheiron (@jsoucheiron) wrote, 2015 to 2016. + https://pybcn.org/people/jordi-soucheiron/ +Loris Mularoni (@batterio) wrote, 2015. + https://pybcn.org/people/loris-mularoni/ +Ignasi Fosch (@ifosch) wrote and reviewed, 2016 to 2026. + https://pybcn.org/people/ignasi-fosch/ +Laura Pérez Mayos (@lpmayos) wrote and reviewed, 2016 to 2025. + https://pybcn.org/people/laura-perez-mayos/ +Israel Saeta Pérez (@dukebody) wrote and reviewed, 2018 to 2024. + https://pybcn.org/people/israel-saeta-perez/ +Ruben Berenguel (@rberenguel) wrote and reviewed, 2018 to 2023. + https://pybcn.org/people/ruben-berenguel/ +Juan Luis Cano Rodríguez (@astrojuanlu) reviewed, 2018. + https://pybcn.org/people/juan-luis-cano-rodriguez/ +Natàlia Padilla (@NataliaSirera) wrote and reviewed, 2019 to 2025. + https://pybcn.org/people/natalia-padilla/ +Dimitri Herrero (@dim1tri) wrote, 2019. + https://pybcn.org/people/dimitri-herrero/ +Xavi Francisco Gilabert (@srxavi) wrote and reviewed, 2021 to 2022. + https://pybcn.org/people/xavi-francisco-gilabert/ +Ferran Jovell (@mrswats) wrote and reviewed, 2023 to 2024. + https://pybcn.org/people/ferran-jovell/ +Alicia Morales Carrasco (@amoralca16) wrote and reviewed, 2024 to 2025. + https://pybcn.org/people/alicia-morales-carrasco/ +Sergi Ramírez (@ramitjansIA, @ramitjans) wrote, 2025. + https://pybcn.org/people/sergi-ramirez/ +Daniel Mesejo León (@mesejo) wrote and reviewed, 2025 to 2026. + https://pybcn.org/people/daniel-mesejo-leon/ +Alberto Cámara (@ber2) reviewed, 2026. + https://pybcn.org/people/alberto-camara/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b1c2ab52..f8482745b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -97,8 +97,18 @@ Edit the file on GitHub, or clone the repository and follow the steps below. [Person photos](README.md#person-photos). - **A sponsor**: run `bin/hugo new sponsors/my-sponsor.md` and fill the four fields listed in [How to add a new sponsor](README.md#how-to-add-a-new-sponsor). - The logo goes under `themes/pybcn_theme/assets/images/sponsors/`. Then list - the sponsor on the sponsors page, or on the event, that shows it. + The logo goes under `themes/pybcn_theme/assets/images/sponsors/`. The + [sponsors page](https://pybcn.org/sponsors/) reads the directory, so the + new file reaches it by existing; list the sponsor on its event as well, in + the `sponsor_levels` of that page, which is what gives it a level. +- **A monthly meetup**, after it happened: run `bin/new-meetup --discover` + to see which ones have no page yet, then + `bin/new-meetup `. It writes the page from the + public event page: the title, the day, the venue, the number of + registrations, the source URL, and the group. It writes no talk, because the + announcement says them in prose: pass `--description` to print that prose, + and see [Import a meetup](README.md#import-a-meetup) for the rest of the + path, which is the same one the 268 pages of the archive came through. - **An event**: copy the previous edition under `content/events/`, for example `content/events/pyday_bcn/pyday_bcn_2025.md`, and edit it. The sections, the agenda and the people grids are described in diff --git a/LICENSING.md b/LICENSING.md index 6aa643fbc..47af6aee5 100644 --- a/LICENSING.md +++ b/LICENSING.md @@ -157,7 +157,7 @@ case (section 2(b)(2) of the legal code). The PyBCN logo and its variants (`themes/pybcn_theme/assets/images/logo.png`, `themes/pybcn_theme/assets/images/favicon.png`, `static/favicon.ico`, -`static/favicon.png`, and the files under `static/images/backgrounds/`) +and the files under `static/images/backgrounds/`) identify the association. They are not covered by the content licence: use them to refer to PyBCN, not to suggest that PyBCN endorses something it has not seen. The PyLadies name and logo in that same folder are not the @@ -174,8 +174,8 @@ with it: - `themes/pybcn_theme/static/vendor/font-awesome/webfonts/`: the Font Awesome fonts (SIL OFL 1.1). - `themes/pybcn_theme/assets/css/bootstrap.min.css`: Bootstrap 4.0.0 (MIT). -- `themes/pybcn_theme/assets/images/anon_member.png`: the Font Awesome `user` - icon as a PNG (CC BY 4.0). +- `themes/pybcn_theme/assets/images/anon_member.webp`: the Font Awesome `user` + icon as a WebP (CC BY 4.0). ### Archived sites diff --git a/README.md b/README.md index 5856ed723..206501bab 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,15 @@ do not need Python, Go, or npm. The version lives in `.hugo-version`, which is the single source of truth. To move to a new Hugo release, edit that file and run `bin/install` again. +The site search is built after Hugo, by [Pagefind](https://pagefind.app/), +over the pages Hugo wrote. `bin/install-pagefind` downloads the release +pinned in `.pagefind-version` the same way, checks its SHA256 and puts it at +`bin/pagefind`; `bin/search public` then writes the index to +`public/pagefind/`. CI does both after every build. `bin/serve` runs no +Pagefind, so `/search/` on the dev server says the search is not available +there: build with `bin/hugo --minify -d public && bin/search public` and +serve `public/` with any static server to try it. + ### Running local server @@ -93,6 +102,23 @@ and not two that drift apart. The two sections below are the detail of the checks it names. +### The sources of the archive + +The pages of the archive were written from the Meetup export of both groups, +the X exports of the association, the playlists of our channel, the records +pyvideo keeps of PyData Barcelona 2017, and the frozen copies of the old site +under `static/archives/`. Those sources, the tools that read them, and the +reports of the import live in a separate repository of this organisation, +`pybcn/pybcn-archive`, which is **private**: a copy of a public page is not a +secret, but 950 Meetup comments with the name of whoever wrote them, and the +email addresses, the phone numbers, and the personal profiles that the event +descriptions still carry, add up to something that is. Ask a member of the +board for access. + +Nothing in this repository needs it. It is the record of where each page came +from, and the insurance policy if a page has to be written again. + + ### Content safety check `bin/check-html-safety` scans `content/` and fails if it finds raw HTML that @@ -192,6 +218,8 @@ Currently, there are two sponsor pages implemented: The PyBCN sponsors and the P The template collects all the pages under sponsors content and iterates over the levels defined in the corresponding sponsors page, rendering the level name, if any, and then all the summaries for each sponsor defined in the level's sponsors list. +A page that defines no `sponsor_levels` gets one level with every sponsor under `content/sponsors/`, sorted by name, 4 to the line. `/sponsors/` is that page. It used to carry the list by hand and the list had drifted: 25 sponsors were on their edition page and not on it. The two association accounts, `pybcn` and `pyladiesbcn`, are left out of that automatic list, because an edition page lists them under an Organizers level and they are not sponsors of themselves. The PyLadies BCN page defines its own levels, so it keeps its own list. + The sponsor summary is defined in a separate partial `themes/pybcn_theme/layouts/partials/sponsor_summary.html`. This partial receives the sponsor page to render the summary from. About the creation of new sponsors, the `themes/pybcn_theme/archetypes/sponsors.md` file contains the template Hugo will use when the editor runs the command `hugo new sponsors/my-new-sponsor.md`. @@ -256,6 +284,49 @@ every page that lists the person and tell that party who viewed it, and `bin/check-content` reports it as an error. +### Import a meetup + +`bin/new-meetup ` writes +`content/events/meetups/-.md`. One command, one GET of the public +event page, no API key and no login: Meetup serves the whole event as JSON in +the `__NEXT_DATA__` script tag its own front end reads. The retired REST API +is why the archive needed an export at all; this page is what replaced it. + +It writes the fields that are a copy of one field each, which is the same set +and the same order the 268 pages of the archive carry, through the same +function in `bin/import-meetups`: `title`, `date`, `year`, `venue`, +`attendance`, `meetup_url`, and `group`. `attendance` is who said yes on +Meetup, not who came. + +It refuses an event that is not `PAST`, because the registrations are not +final and the archive records what happened, and an event whose title says +PyDay or PyData, because the large editions have their own pages. `--force` +overrides both. It refuses to overwrite a page that is already there. +`--dry-run` prints the file instead of writing it. + +What it does not write, and what to do about each: + +| Not written | Why, and the next step | +|---|---| +| The talks | The announcement says them in prose, which no parser reads. `--description` prints that prose; `bin/prompts/extract-talks.md` is the prompt a model reads it with; `bin/check-extraction` compares every extracted field against the source; `bin/import-talks` writes the block | +| The description | It is the logistics of signing up, and an archive records what happened and not how to register for something that is over | +| A video | It comes from the YouTube channel after the day, through `bin/import-videos`, and `data/channel_videos.yaml` is the inventory `bin/check-content` reads | +| A person page | A page publishes a named person. A speaker who just spoke is reachable, so ask that person first | +| A venue short name | The script reports a `venue` string that `data/venues.yaml` does not name. The short name is a choice somebody makes | + +`bin/new-meetup --discover` answers the other half: **which** meetups are +missing. It reads the past events page of both groups, which carries the ten +most recent as JSON in the same script tag, names the ones no page records, +and prints the command for each. It writes nothing. Ten is more than a year +of a group that meets monthly; a longer gap than that is what the +pybcn-archive export is for. + +So the whole path for the meetup of last Tuesday is: `bin/new-meetup +--discover` to see what is missing, `bin/new-meetup URL --description`, +extract the talks, `bin/check-extraction`, `bin/import-talks`, +`bin/check-content`, and `bin/import-videos` once the recording is up. + + ### Monthly event page implementation details The monthly event page uses the meetup component to show PyBCN and PyLadies BCN meetup events lists. The template embeds the `meetup.js` code without `defer` using the `requiredJS` block. Then, it invokes the `meetup-events` partial which processes the list of meetup events. @@ -467,6 +538,25 @@ at 1 GB. The cost is a one-time clone, not a recurring one, so the answer is not now. If it is ever done, the moment is an empty pull request queue and a day when everybody can re-clone together. +## Who built it + +[AUTHORS](AUTHORS) names every person who has written or reviewed here, in +the order they arrived, with the years they worked on it, the account they +did it from, and their page on the site. Reviewing counts: a change nobody +reads is not finished, and two of the people in the file have done nothing +else. It is written by `bin/authors` out of the commits, the pull request +reviews, and the person records, and never by hand: a list of people kept by +hand goes stale the day somebody new lands and nobody notices. +`bin/authors --check` writes the file again in memory and compares, so a new +contributor, a second account of somebody already here, and a name edited on +a person record are all caught. It runs in CI with the token the job already +has, and says it skipped rather than failing when the API cannot be reached. +A person who would rather appear another way changes it in a pull request. + +The people behind the events, the speakers, the organizers, the venues, and +the sponsors, are named on the pages of the site, which stay current on +their own. `static/humans.txt` points at both. + ## Licence The code of the site (the templates, the stylesheets, the scripts, the diff --git a/bin/authors b/bin/authors new file mode 100755 index 000000000..6330314f3 --- /dev/null +++ b/bin/authors @@ -0,0 +1,409 @@ +#!/usr/bin/env python3 +"""Write AUTHORS from the history of this repository. + +Every person who has a commit here is named, in the order they arrived, +with the years they were active and the account the commits came from. +The file is generated because a list of people kept by hand goes stale +the moment somebody new lands, and nobody notices: static/humans.txt +counted 207 meetups for three weeks after the archive said 281. + +What it reads, and why that and not something else: + + the GitHub API the account behind each commit. This is the only + source that joins the identities of one person + without a table that somebody has to keep: the + three git identities of one contributor, and the + two of another, fall into one account on their own. + git log the name each person signed with, and the first and + the last day they committed. + content/people/ the page of each one on the site, through the + github field of their record. A person with no + record, or a record with no github field, is + printed without a page rather than left out. + +No email is written. They are in the history already, and some of them +carry the name of a laptop or an internal address from ten years ago, +which is nothing this repository needs to publish. + +A commit whose email is on no account is attributed by two rules, in +this order, so that no table of addresses has to live in the repository: + + 1. the local part of the email is the login of a known account + (a commit from a laptop, "someone@their-macbook.local") + 2. the name on the commit is a name a known account already signed + with (a commit from a work address) + +Two accounts that sign with the same name are one person, and the file +prints both handles, the one with more commits first. + +Usage: + bin/authors write AUTHORS + bin/authors --check write the file again in memory and compare: + this is what CI runs + bin/authors --dry-run print what it would write + +--check is the generation, compared against the file instead of written +over it, so a new contributor, a second account of somebody already here, +and a name that changed on a person record are all caught. It needs the +GitHub API; when that cannot be reached it says it skipped and passes, +because an outage of somebody else is not a reason to fail a build. + +Exit codes: + 0 written, or --check passed, or --check could not reach the API + 1 --check found a file that is not what bin/authors writes + 2 it could not run: no git, no API, or an empty history +""" + +import argparse +import collections +import json +import pathlib +import re +import subprocess +import sys +import unicodedata + +ROOT = pathlib.Path(__file__).resolve().parent.parent +AUTHORS = ROOT / "AUTHORS" +SITE = "https://pybcn.org/people/" +# The branch the history is read from. A checkout in CI has no remote +# ref, and a pull request builds a merge commit, so the name is looked +# up in that order and falls back to what is checked out. +BRANCHES = ("origin/edition", "edition", "HEAD") + +HEADER = """PyBCN publishes this site. These are the people who built it, in the order +they arrived. Writing it and reviewing it both count, because a change that +nobody reads is not finished, and the years are the first and the last one +each person worked on it. + +The name of each one is the name their page of the site carries, or the name +they signed their own commits with when they have no page. A person who would +rather appear another way can change it in a pull request, because this file +is generated: from the commits, from the reviews, and from the pages. + +The people behind the events themselves, the speakers, the organizers, the +venues and the sponsors, are named on the pages that stay current, which +static/humans.txt links. + +Written by bin/authors. +""" + + +def fail(message): + sys.exit("authors: %s" % message) + + +def fold(name): + """Return name with its accents and its case set aside, for comparing.""" + plain = unicodedata.normalize("NFD", name.lower()) + return "".join(c for c in plain if unicodedata.category(c) != "Mn").strip() + + +def git(*args): + run = subprocess.run(["git", "-C", str(ROOT), *args], + capture_output=True, text=True) + if run.returncode: + fail("git %s: %s" % (args[0], run.stderr.strip()[:200])) + return run.stdout + + +def branch(): + """Return the first of BRANCHES that this checkout has.""" + for name in BRANCHES: + run = subprocess.run(["git", "-C", str(ROOT), "rev-parse", "--verify", "-q", name], + capture_output=True, text=True) + if run.returncode == 0: + return name + fail("no branch to read: tried %s" % ", ".join(BRANCHES)) + + +def history(): + """Return one record per commit: the name, the email, and the day.""" + out = git("log", "--no-merges", "--format=%an\t%ae\t%ad", "--date=short", branch()) + rows = [line.split("\t") for line in out.strip().split("\n") if line] + if not rows: + fail("no commits on %s" % branch()) + return [(name, email.lower(), day) for name, email, day in rows] + + +def accounts(): + """Return the account behind each commit email, from the GitHub API.""" + found = {} + for page in range(1, 20): + run = subprocess.run( + ["gh", "api", "repos/pybcn/pybcn.github.io/commits" + "?sha=%s&per_page=100&page=%d" % (branch().split("/")[-1], page)], + capture_output=True, text=True) + if run.returncode: + fail("the GitHub API did not answer: %s" % run.stderr.strip()[:160]) + batch = json.loads(run.stdout or "[]") + if not batch: + break + for commit in batch: + email = ((commit.get("commit") or {}).get("author") or {}).get("email") + author = commit.get("author") or {} + if email and author.get("login"): + found.setdefault(email.lower(), author["login"]) + if not found: + fail("the GitHub API named no account") + return found + + +def reviews(): + """Return the reviews of each account: how many, and the first day. + + A review is a contribution and the commits do not hold it: somebody + who reads a pull request carefully and says what is wrong with it has + worked on the site, and two people here have done nothing else. + + This asks GraphQL rather than the REST endpoint for the reviews of + each pull request, which would be one request per pull request, 205 + of them today. Three are enough this way. + """ + query = """ + query($cursor: String) { + repository(owner: "pybcn", name: "pybcn.github.io") { + pullRequests(first: 100, after: $cursor) { + pageInfo { hasNextPage endCursor } + nodes { + author { login } + reviews(first: 100) { nodes { author { login } submittedAt } } + } + } + } + }""" + found = {} + cursor = None + for _ in range(20): + args = ["gh", "api", "graphql", "-f", "query=%s" % query] + if cursor: + args += ["-F", "cursor=%s" % cursor] + run = subprocess.run(args, capture_output=True, text=True) + if run.returncode: + fail("the GitHub API did not answer: %s" % run.stderr.strip()[:160]) + page = json.loads(run.stdout)["data"]["repository"]["pullRequests"] + for node in page["nodes"]: + owner = ((node.get("author") or {}).get("login") or "").lower() + for review in (node.get("reviews") or {}).get("nodes") or []: + login = (review.get("author") or {}).get("login") + day = (review.get("submittedAt") or "")[:10] + # A comment on your own pull request is not a review of it. + if not login or not day or login.lower() == owner: + continue + seen = found.setdefault(login, {"n": 0, "first": day, "last": day}) + seen["n"] += 1 + seen["first"] = min(seen["first"], day) + seen["last"] = max(seen["last"], day) + if not page["pageInfo"]["hasNextPage"]: + break + cursor = page["pageInfo"]["endCursor"] + return found + + +def attribute(rows, by_email): + """Return the commits of each account, with the two fallback rules.""" + logins = {login.lower(): login for login in by_email.values()} + signed = collections.defaultdict(set) + for name, email, _ in rows: + login = by_email.get(email) + if login: + signed[login].add(fold(name)) + + people = collections.defaultdict( + lambda: {"n": 0, "first": "9999-99-99", "last": "0000-00-00", + "names": collections.Counter()}) + orphans = [] + for name, email, day in rows: + login = by_email.get(email) + if not login: + local = logins.get(email.split("@")[0].lower()) + if local: + login = local + if not login: + login = next((l for l, names in signed.items() if fold(name) in names), None) + if not login: + orphans.append((name, day)) + continue + person = people[login] + person["n"] += 1 + person["names"][name] += 1 + person["first"] = min(person["first"], day) + person["last"] = max(person["last"], day) + return people, orphans + + +def merge(people): + """Join the accounts that sign with the same name.""" + by_name = collections.defaultdict(list) + for login, person in people.items(): + by_name[fold(person["names"].most_common(1)[0][0])].append(login) + out = {} + for logins in by_name.values(): + logins.sort(key=lambda login: -people[login]["n"]) + joined = {"n": sum(people[l]["n"] for l in logins), + "first": min(people[l]["first"] for l in logins), + "last": max(people[l]["last"] for l in logins), + "names": collections.Counter(), + "logins": logins} + for login in logins: + joined["names"].update(people[login]["names"]) + out[logins[0]] = joined + return out + + +def pages(): + """Return the page and the name of each GitHub handle, from the records. + + The name of a record is the one the site prints, so it is the one a + reader of this file will see when they follow the link. Three people + signed their commits with a handle and have a record with their name + on it; this is what tells the file the difference. + """ + out = {} + for path in sorted((ROOT / "content" / "people").glob("*.md")): + head = path.read_text(encoding="utf-8").split("---") + if len(head) < 2: + continue + found = re.search(r"^github:\s*\"?(\S+?)\"?\s*$", head[1], re.M) + if not found: + continue + named = re.search(r"^name:\s*\"?(.+?)\"?\s*$", head[1], re.M) + handle = found.group(1).rstrip("/").split("/")[-1] + out[handle.lower()] = {"page": "%s%s/" % (SITE, path.stem), + "name": named.group(1) if named else ""} + return out + + +def assemble(people, by_review, by_handle): + """Return one record per person, with the reviews folded in. + + Somebody with reviews and no commit is here too: the account carries + their name and their page through their person record, which is the + only place this repository knows them from. + """ + out = [] + placed = set() + for person in people.values(): + record = next((by_handle[l.lower()] for l in person["logins"] + if l.lower() in by_handle), None) + reviewed = [by_review[l] for l in person["logins"] if l in by_review] + placed.update(l.lower() for l in person["logins"]) + first = person["first"] + for seen in reviewed: + first = min(first, seen["first"]) + out.append({ + "name": (record or {}).get("name") or person["names"].most_common(1)[0][0], + "logins": person["logins"], + "first": first, + "last": max([person["last"]] + [s["last"] for s in reviewed]), + "wrote": True, + "reviewed": bool(reviewed), + "page": (record or {}).get("page", ""), + }) + for login, seen in by_review.items(): + if login.lower() in placed: + continue + record = by_handle.get(login.lower()) + out.append({ + "name": (record or {}).get("name") or login, + "logins": [login], + "first": seen["first"], + "last": seen["last"], + "wrote": False, + "reviewed": True, + "page": (record or {}).get("page", ""), + }) + out.sort(key=lambda p: (p["first"], p["name"])) + return out + + +def render(people): + """One sentence per person, which is what a reader reads once.""" + lines = [] + for person in people: + handles = ", ".join("@" + login for login in person["logins"]) + if person["wrote"] and person["reviewed"]: + did = "wrote and reviewed" + elif person["reviewed"]: + did = "reviewed" + else: + did = "wrote" + first, last = person["first"][:4], person["last"][:4] + when = first if first == last else "%s to %s" % (first, last) + line = "%s (%s) %s, %s." % (person["name"], handles, did, when) + if person["page"]: + line += "\n %s" % person["page"] + lines.append(line) + return "%s\n%s\n" % (HEADER, "\n".join(lines)) + + +def check(rows): + """Say whether AUTHORS is what bin/authors would write right now. + + This writes the file again in memory and compares, which is exact: a + name that changed on a person record, a new contributor, and a second + account of somebody already here are all caught the same way. It needs + the GitHub API, because that is what names the account of a commit. + + When the API cannot be reached it says so and passes, rather than + turning an outage of somebody else into a red build. The check that + matters still runs on every other pull request. + """ + if not AUTHORS.is_file(): + print("MISSING AUTHORS is not there. Write it with bin/authors.") + return 1 + try: + by_email = accounts() + except SystemExit as stop: + print("SKIPPED %s" % stop) + print(" AUTHORS was not checked. The API names the account of" + " a commit and nothing else does.") + return 0 + people, orphans = attribute(rows, by_email) + for name, day in sorted(set(orphans)): + print("UNATTRIBUTED %r, %s: no account, and no rule reached it" % (name, day)) + want = render(assemble(merge(people), reviews(), pages())) + if AUTHORS.read_text(encoding="utf-8") == want and not orphans: + print("AUTHORS is what bin/authors writes today.") + return 0 + import difflib + diff = difflib.unified_diff(AUTHORS.read_text(encoding="utf-8").splitlines(), + want.splitlines(), "AUTHORS", "what bin/authors writes", + lineterm="", n=1) + print("\n".join(diff)) + print("\nRun bin/authors to write it again.") + return 1 + + +def main(): + parser = argparse.ArgumentParser(description="Write AUTHORS from the history.") + parser.add_argument("--check", action="store_true", + help="say whether AUTHORS names everyone, and read no API") + parser.add_argument("--dry-run", action="store_true", + help="print what it would write") + args = parser.parse_args() + + rows = history() + if args.check: + return check(rows) + + people, orphans = attribute(rows, accounts()) + if orphans: + # Never drop a person in silence: that is the failure this file + # exists to prevent. + for name, day in sorted(set(orphans)): + print("UNATTRIBUTED %r, %s: no account, and no rule reached it" + % (name, day), file=sys.stderr) + fail("%d commit(s) belong to nobody this script can name" % len(orphans)) + people = assemble(merge(people), reviews(), pages()) + text = render(people) + if args.dry_run: + print(text, end="") + return 0 + AUTHORS.write_text(text, encoding="utf-8") + print("wrote %s: %d people" % (AUTHORS.relative_to(ROOT), len(people))) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/check-content b/bin/check-content index 5f8356e84..01253cf27 100755 --- a/bin/check-content +++ b/bin/check-content @@ -703,6 +703,40 @@ def check_sources(): SOURCE_SUFFIXES = {".jpg", ".jpeg", ".png", ".webp"} +def check_canonical_photo(): + """Every event names one photo, and the file behind it exists. + + canonical_photo is the one picture of a day: the group photo when the + day has one, and the picture that says most about it when it does not. + partials/canonical_photos.html collects them, newest first, and the + carousel of the home page is one slide per event that has one. + + The template resolves the file with resources.Get and renders nothing + when it fails, so a typo costs a slide and says nothing. + + An edition with a gallery and no canonical photo is a warning. A + monthly meetup is not: 64 of them gained a gallery when the posts of + their own day were imported, and the carousel of the home page shows + the editions, not every day the association has photographed. A meetup + that wants a slide names one and gets it. + """ + missing = [] + for path in sorted((CONTENT / "events").rglob("*.md")): + data = front_matter(path) + if data is None: + continue + name = data.get("canonical_photo") + if name: + gallery_file(path, f"canonical_photo '{name}'", str(name)) + elif data.get("photos") and "meetups" not in path.parts: + missing.append(path) + for path in missing: + warn(path, "has a photo gallery and no 'canonical_photo'. The " + "carousel of the home page shows one photo per event, " + "and this one has none to show. Name the group photo of " + "the day, or the picture that says most about it.") + + def check_logos(sponsors): """A sponsor whose declared logo file is missing renders a broken image, and the Hugo build does not notice. A sponsor with no logo_image at all is only @@ -1573,6 +1607,7 @@ def main(): sponsors = collect_ids("sponsors") check_photos(people) check_gallery(people) + check_canonical_photo() check_logos(sponsors) check_social(people, sponsors) check_sources() diff --git a/bin/check-rendered b/bin/check-rendered index 7c6b50199..a6e5c1903 100755 --- a/bin/check-rendered +++ b/bin/check-rendered @@ -511,6 +511,15 @@ ALLOWLIST = [ "partials/video_frame.html): a recording of a session has no page of " "its own, so the page of its day is the page about it. Three meetups " "carry one. A listing or a programme grid prints a link and no frame"}, + {"path": "index.html", + "kind": "iframe", + "prefix": "https://www.youtube-nocookie.com/embed/", + "why": "the player of the About PyBCN block of the home page " + "(layouts/_default/home.html, through partials/video_frame.html): the " + "presentation of the Barcelona community at PyConES 2020, the one video " + "of the channel that belongs to no event of the association, so no page " + "of the archive carries it and the home page does. The id is " + "about_video in content/_index.md; one frame on the page"}, {"path": "people/", "kind": "iframe", "prefix": "https://www.youtube-nocookie.com/embed/", diff --git a/bin/import-meetups b/bin/import-meetups index 8aebc0a91..ff0e82e29 100755 --- a/bin/import-meetups +++ b/bin/import-meetups @@ -140,21 +140,35 @@ def venue_of(event): return name, None -def front_matter(event): +def export_provenance(event): + """Return the comment lines that say this file comes from the export.""" + return [ + "# One monthly meetup, imported from data/raw/meetup/%s/events.json in" % event["group_id"], + "# the pybcn-archive export, which is not in this repository, event %s." % event["id"], + "# bin/import-meetups writes this file from that record: a correction goes", + "# to the export or to the script, never here. The Meetup description is", + "# the logistics of signing up and is not published, and the talks it", + "# announces arrive separately. See content/events/meetups/_index.md.", + ] + + +def front_matter(event, provenance=None, source="the export"): """Return the content file of one meetup record, front matter only. No body. The Meetup description is the only prose the export carries and it is not published, so a body would be invented text. + + provenance replaces the comment lines that name where the record came + from. bin/new-meetup passes its own, because it reads one event off the + public event page and not out of the export. Everything below those + lines is the same in both, which is the point of sharing this function: + a page written months later looks like the 266 the import wrote. + + source names what the fields were read from, for the one comment that + says so. It is "the export" here and "the event page" there. """ group_id = event["group_id"] - lines = [ - "---", - "# One monthly meetup, imported from data/raw/meetup/%s/events.json in" % group_id, - "# the pybcn-archive export, which is not in this repository, event %s." % event["id"], - "# bin/import-meetups writes this file from that record: a correction goes", - "# to the export or to the script, never here. The Meetup description is", - "# the logistics of signing up and is not published, and the talks it", - "# announces arrive separately. See content/events/meetups/_index.md.", + lines = ["---"] + (provenance or export_provenance(event)) + [ "title: %s" % yaml_string(canon(event["title"]).strip()), "date: %s" % event["dateTime"][:10], "year: %s" % event["dateTime"][:4], @@ -169,7 +183,7 @@ def front_matter(event): lines.append("# source gives it, so the page says nothing rather than a guess.") attendance = (event.get("rsvps") or {}).get("yesCount") or 0 lines.append("# Who said yes on Meetup, not who came: attendedCount is zero on almost") - lines.append("# every record, so this is the only figure the export gives. It names") + lines.append("# every record, so this is the only figure %s gives. It names" % source) lines.append("# nobody, which is what makes it publishable.") if attendance: lines.append("attendance: %d" % attendance) diff --git a/bin/import-x-photos b/bin/import-x-photos index f9eccfae5..61629fc2c 100755 --- a/bin/import-x-photos +++ b/bin/import-x-photos @@ -71,7 +71,7 @@ Exit codes: touches private data Usage: - bin/import-x-photos --date YYYY-MM-DD [--until YYYY-MM-DD] + bin/import-x-photos --date YYYY-MM-DD [--until YYYY-MM-DD] [--ids FILE] --export DIR --out DIR [--slug NAME] [--event FILE] [--install] [--one-per-tweet] [--drop PATTERN ...] @@ -110,9 +110,11 @@ ROOT = pathlib.Path(__file__).resolve().parent.parent # directory that makes a staged photo render. INSTALL_ROOT = ROOT / "themes" / "pybcn_theme" / "assets" / "images" / "photos" -# The two accounts that posted from a PyDay: the association's own account -# and the one of the member who live-tweeted several editions. -ACCOUNTS = ("PyBCN", "DZPM") +# The account of the association, and nothing else. A member who posts a +# photograph of a meetup from their own account keeps it: the archive +# publishes what the association published, so a personal archive is never +# read, not even for the day of an event. +ACCOUNTS = ("PyBCN",) # The photo times are reported in Barcelona local time, because that is the # order the day happened in and the only form a curator can place against a @@ -396,14 +398,28 @@ def match_talk(caption, talks): return match_title(caption, [(talk["id"], talk["folded"]) for talk in talks]) -def collect(export_dir, start, end): - """Return the own tweets and the excluded retweets of a date range. +def own_https(url): + """Return url with https for a link to the site of the association.""" + return re.sub(r"\Ahttp://(www\.)?pybcn\.org", "https://pybcn.org", url) - A tweet counts when it carries at least one photo and its created_at, - read as UTC, falls on or between the two dates. Both accounts are - walked, and the result is sorted chronologically over the two of them - together, because the numbering has to follow the event and not the - account. + +def collect(export_dir, start, end, ids=None): + """Return the own tweets and the excluded retweets of a selection. + + A tweet counts when it carries at least one photo and, by default, its + created_at read as UTC falls on or between the two dates. Both accounts + are walked, and the result is sorted chronologically over the two of + them together, because the numbering has to follow the event and not + the account. + + With ids, the day stops deciding and the set does: a tweet counts when + its id is in it, whenever it was posted. The photographs of a day are + not all posted on that day. A thread that opens with "Welcome to + November's Python Meetup!" runs past midnight, the post that closes a + PyDay arrives two days later, and the association has posted a + photograph of an event weeks after it. What says which event a + photograph belongs to is the text of its thread, which a person reads; + this option is how that reading reaches the importer. """ own, retweets = [], [] @@ -420,7 +436,10 @@ def collect(export_dir, start, end): continue moment = parsedate_to_datetime(tweet["created_at"]) - if not start <= moment.astimezone(datetime.timezone.utc).date() <= end: + if ids is not None: + if tweet["id_str"] not in ids: + continue + elif not start <= moment.astimezone(datetime.timezone.utc).date() <= end: continue full_text = tweet.get("full_text") or "" @@ -441,7 +460,11 @@ def collect(export_dir, start, end): # tweet reads as "https://t.co/..." in full_text. Removing the # t.co links therefore removes real content, and entities.urls # is the only place that still holds what it said. - "urls": {url["url"]: (url.get("expanded_url") or url["url"]) + # An expanded URL of our own site comes out of the export + # as http:// on the posts of 2014, and bin/check-rendered + # refuses an insecure link on a built page. The scheme is + # the only thing this changes, and only for pybcn.org. + "urls": {url["url"]: own_https(url.get("expanded_url") or url["url"]) for url in (tweet.get("entities") or {}).get("urls", []) if url.get("url")}, } @@ -871,6 +894,9 @@ def main(): parser.add_argument("--out", required=True, help="the staging directory to write") parser.add_argument("--slug", help="the media directory name used in photos.yaml" " (default: the first date)") + parser.add_argument("--ids", help="a file of post ids, one per line, that says which" + " posts belong to this event; the dates stop" + " deciding when it is given") parser.add_argument("--event", help="the event file whose talks a caption is matched" " against") parser.add_argument("--install", action="store_true", @@ -910,7 +936,23 @@ def main(): except ValueError: event_path = event_file - own, retweets = collect(export_dir, start, end) + ids = None + if args.ids: + ids_file = pathlib.Path(args.ids).expanduser().resolve() + if not ids_file.is_file(): + fail(f"no such --ids file: {ids_file}") + ids = {line.split("#")[0].strip() for line in + ids_file.read_text(encoding="utf-8").split("\n")} + ids = {i for i in ids if i} + if not ids: + fail(f"--ids file holds no post id: {ids_file}") + + own, retweets = collect(export_dir, start, end, ids) + if ids: + found = {entry["id"] for entry in own} + for missing_id in sorted(ids - found): + print(f"warning: no post with photos and id {missing_id} in the export", + file=sys.stderr) photos = enumerate_photos(own, talks) apply_filters(photos, args.one_per_tweet, patterns) staged, missing = stage(photos, out_dir) diff --git a/bin/install-pagefind b/bin/install-pagefind new file mode 100755 index 000000000..5495445a5 --- /dev/null +++ b/bin/install-pagefind @@ -0,0 +1,92 @@ +#!/bin/bash +# +# Install the pinned Pagefind binary into bin/pagefind. +# +# The version comes from .pagefind-version, which is the single source of +# truth, the way .hugo-version is for Hugo. bin/pagefind is ignored by git. +# +# Pagefind builds the search index of the site after Hugo has built the +# pages (see bin/search). It is the release binary from GitHub, not the npm +# wrapper: the wrapper adds Node and a second registry to the build job for +# the same file. The release publishes one SHA-256 per asset, in a file +# named after it, and the download is verified against it before it is +# unpacked. The plain build is enough: the extended build adds the Chinese, +# Japanese and Korean segmenters and weighs 52 MB against 5. + +set -euo pipefail + +ROOT=$(cd "$(dirname "$0")/.." && pwd -P) + +PAGEFIND_VERSION=$(tr -d '[:space:]' < "${ROOT}/.pagefind-version") +RELEASES="https://github.com/Pagefind/pagefind/releases/download" +PAGEFIND_BIN="${ROOT}/bin/pagefind" + +# The download goes to a temporary directory. The EXIT trap removes it on +# success and on failure, for the reason bin/install gives. +workdir="" +trap 'rm -rf "${workdir}"' EXIT + +function platform() { + local os arch + case "$(uname -s)" in + Linux) os="unknown-linux-musl" ;; + Darwin) os="apple-darwin" ;; + *) echo "Unsupported OS: $(uname -s)." >&2 + echo "Download Pagefind ${PAGEFIND_VERSION} yourself and put it at bin/pagefind." >&2 + exit 1 ;; + esac + case "$(uname -m)" in + x86_64|amd64) arch="x86_64" ;; + arm64|aarch64) arch="aarch64" ;; + *) echo "Unsupported architecture: $(uname -m)." >&2 + exit 1 ;; + esac + echo "${arch}-${os}" +} + +# Stock macOS ships shasum, not sha256sum. Both read the same checksum list. +function sha256_check() { + if command -v sha256sum >/dev/null; then + sha256sum -c - + else + shasum -a 256 -c - + fi +} + +function is_right_pagefind() { + [ -x "${PAGEFIND_BIN}" ] || return 1 + "${PAGEFIND_BIN}" --version 2>/dev/null | grep -q "${PAGEFIND_VERSION}\$" || return 1 +} + +function install_pagefind() { + local target archive url + target=$(platform) + archive="pagefind-v${PAGEFIND_VERSION}-${target}.tar.gz" + url="${RELEASES}/v${PAGEFIND_VERSION}/${archive}" + + workdir=$(mktemp -d) + + echo "Downloading Pagefind ${PAGEFIND_VERSION} (${target})..." + curl -sSfL -o "${workdir}/${archive}" "${url}" + curl -sSfL -o "${workdir}/${archive}.sha256" "${url}.sha256" + + # The published file holds the hash, with or without the file name after + # it. The first field is the hash either way, and the archive name is + # ours, so the line to check is built here. + echo -n "Verifying checksum... " + (cd "${workdir}" && printf '%s %s\n' "$(cut -d' ' -f1 "${archive}.sha256")" "${archive}" | sha256_check >/dev/null) + echo "OK" + + tar xzf "${workdir}/${archive}" -C "${workdir}" pagefind + mv "${workdir}/pagefind" "${PAGEFIND_BIN}" + chmod +x "${PAGEFIND_BIN}" +} + +if is_right_pagefind; then + echo "Pagefind ${PAGEFIND_VERSION} is already installed." + exit 0 +fi + +install_pagefind +is_right_pagefind || { echo "bin/pagefind does not report version ${PAGEFIND_VERSION}." >&2; exit 1; } +echo "Using ${PAGEFIND_BIN} ($("${PAGEFIND_BIN}" --version))" diff --git a/bin/new-meetup b/bin/new-meetup new file mode 100755 index 000000000..da062ca23 --- /dev/null +++ b/bin/new-meetup @@ -0,0 +1,349 @@ +#!/usr/bin/env python3 +"""Write the page of one meetup from its Meetup URL. + +bin/import-meetups built 266 of the meetup pages of the archive out of the pybcn-archive +export, which is a dump somebody has to take. That is the right tool for 19 +years of history and the wrong one for the meetup of last Tuesday: nobody +should have to re-export the whole group, and nobody should have to remember +the shape of the front matter either. + +Give this script the URL of a past meetup and it writes +content/events/meetups/-.md, with the same fields the import +wrote, through the same function. The page it writes is complete as a page: +the day, the venue, the registrations, the source, and the group. + +Where the fields come from. The public event page carries the whole event as +JSON, in the __NEXT_DATA__ script tag Meetup's own front end reads, so there +is no API key, no login, and one GET. The retired REST API is why the archive +needed an export at all (see partials/meetup-events.html); this page is what +replaced it. Every field is one field of that JSON, with canon() from +bin/canon.py as the only transform. + +What it does not write: + + The talks. The description announces them in prose, which no parser reads: + a model extracts them and bin/check-extraction compares every field against + the source. --description prints the description so that work can start, + and bin/prompts/extract-talks.md is the prompt. bin/import-talks writes the + block. + + The description itself. It is the logistics of signing up, and an archive + records what happened and not how to register for something that is over. + + A person page, or a venue in data/venues.yaml. The script reports a venue + it does not recognise and writes nothing else: a new venue is a short name + somebody chooses. + + Anything about who came. The RSVP count is who said yes, it names nobody, + and no host name or attendee leaves this script. + +Exit codes: + 0 the file was written, or --dry-run ran + 1 the event is one this script refuses to write, and nothing was written + 2 the script could not run: bad arguments, or the page did not answer + +--discover answers the other half of the question: which meetups are missing. +It reads the past events page of both groups, which carries the ten most +recent as JSON in the same script tag, and names the ones no page of +content/events/meetups/ already records. A meetup a month means ten covers +any gap worth catching; a longer gap is what the pybcn-archive export is +for. It writes nothing and prints the command for each one. + +Usage: + bin/new-meetup https://www.meetup.com/python-barcelona/events/316366469/ + bin/new-meetup URL --dry-run --description + bin/new-meetup --discover +""" + +import argparse +import importlib.util +import json +import pathlib +import re +import sys +import urllib.error +import urllib.request + +import yaml + +BIN = pathlib.Path(__file__).resolve().parent +sys.path.insert(0, str(BIN)) + +from canon import canon +from slug import slugify + + +def fail(message): + """Stop with exit 2: the script could not run. + + sys.exit with a string exits 1, which this script uses for an event it + refuses to write. The two cases are different: one means fix the + arguments, the other means the event is not one of these. + """ + print("new-meetup: %s" % message, file=sys.stderr) + sys.exit(2) + + +def load_import_meetups(): + """Return bin/import-meetups as a module. + + The file has a hyphen in its name and no extension, so it is not + importable by name. Loading it by path is worth the five lines: the front + matter of a new page then comes from the same function as the 266 of the + archive, and the two cannot drift. + """ + spec = importlib.util.spec_from_loader( + "import_meetups", + importlib.machinery.SourceFileLoader("import_meetups", str(BIN / "import-meetups")), + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +# https://www.meetup.com//events// +EVENT_URL = re.compile(r"^https://www\.meetup\.com/([^/]+)/events/(\d+)/?") + +NEXT_DATA = re.compile( + r'', re.S) + +# An honest agent. The request is one GET of a public page, and a host that +# wants to say no deserves to know who is asking. +USER_AGENT = "pybcn-site/1.0 bin/new-meetup (+https://pybcn.org/)" + + +def fetch(url): + """Return the event record and the group record of one event page.""" + request = urllib.request.Request( + url, headers={"User-Agent": USER_AGENT, "Accept": "text/html"}) + try: + with urllib.request.urlopen(request, timeout=30) as response: + html = response.read().decode("utf-8", "replace") + except (urllib.error.URLError, TimeoutError) as error: + fail("%s did not answer: %s" % (url, error)) + found = NEXT_DATA.search(html) + if not found: + fail("%s carries no __NEXT_DATA__, so the page changed shape" % url) + try: + state = json.loads(found.group(1))["props"]["pageProps"]["__APOLLO_STATE__"] + except (ValueError, KeyError) as error: + fail("the JSON of %s changed shape: %s" % (url, error)) + events = [value for key, value in state.items() if key.startswith("Event:")] + if len(events) != 1: + fail("%s carries %d events, expected 1" % (url, len(events))) + return events[0], state + + +def fetch_past(group_id): + """Return the past events of one group, newest first. + + The page of past events carries the same __NEXT_DATA__ as the page of + one event, with the ten most recent in it. Ten and not all of them: the + page loads the rest on scroll, which needs a browser, and ten is more + than a year of a group that meets monthly. + """ + url = "https://www.meetup.com/%s/events/?type=past" % group_id + request = urllib.request.Request( + url, headers={"User-Agent": USER_AGENT, "Accept": "text/html"}) + try: + with urllib.request.urlopen(request, timeout=30) as response: + html = response.read().decode("utf-8", "replace") + except (urllib.error.URLError, TimeoutError) as error: + fail("%s did not answer: %s" % (url, error)) + found = NEXT_DATA.search(html) + if not found: + fail("%s carries no __NEXT_DATA__, so the page changed shape" % url) + try: + state = json.loads(found.group(1))["props"]["pageProps"]["__APOLLO_STATE__"] + except (ValueError, KeyError) as error: + fail("the JSON of %s changed shape: %s" % (url, error)) + events = [v for k, v in state.items() if k.startswith("Event:")] + events.sort(key=lambda e: e.get("dateTime") or "", reverse=True) + return events + + +def recorded_ids(out): + """Return the Meetup event id of every page already written.""" + ids = set() + if not out.is_dir(): + return ids + for path in out.glob("*.md"): + for found in re.finditer(r"/events/(\d+)/", path.read_text(encoding="utf-8")): + ids.add(found.group(1)) + return ids + + +def discover(import_meetups, out): + """Name the past meetups that no page records. Writes nothing.""" + have = recorded_ids(out) + missing = [] + for group_id in sorted(import_meetups.GROUPS): + for event in fetch_past(group_id): + if event.get("status") != "PAST": + continue + if import_meetups.BIG_EDITION.search(event.get("title") or ""): + continue + if event["id"] in have: + continue + missing.append((event["dateTime"][:10], event["title"], event["eventUrl"])) + print("%d pages in %s, %d of them with a Meetup id" % ( + len(list(out.glob("*.md"))) if out.is_dir() else 0, out, len(have))) + if not missing: + print("nothing new: every past meetup of the last ten of each group has a page") + return 0 + missing.sort(reverse=True) + print("%d past meetups have no page, newest first:" % len(missing)) + for date, title, url in missing: + print(" %s %s" % (date, title)) + print(" bin/new-meetup %s --description" % url) + return 0 + + +def resolve(state, ref): + """Return the record a __ref points at, or an empty one.""" + return state.get((ref or {}).get("__ref"), {}) + + +def as_export_record(event, state, group_id): + """Return the event in the shape bin/import-meetups reads. + + The export and the page agree field for field, under different names: + the export nests the RSVP count as rsvps.yesCount and the page asks for + it by status. Translating here, once, means front_matter() stays the one + place that decides what a meetup page says. + """ + yes = 0 + for key, value in event.items(): + if key.startswith("rsvps(") and '"YES"' in key: + yes = value.get("totalCount") or 0 + return { + "id": event["id"], + "title": event["title"], + "dateTime": event["dateTime"], + "eventUrl": event.get("eventUrl") or "", + "eventType": event.get("eventType"), + "venue": {"name": resolve(state, event.get("venue")).get("name") or ""}, + "rsvps": {"yesCount": yes}, + "group_id": group_id, + } + + +def known_venues(root): + """Return the venue strings data/venues.yaml already names.""" + path = root / "data" / "venues.yaml" + if not path.is_file(): + return None + names = yaml.safe_load(path.read_text(encoding="utf-8")) + return set(names) or None + + +def provenance(event, group_id): + """Return the comment lines of a page written from the live event page.""" + return [ + "# One monthly meetup, written by bin/new-meetup from the public Meetup", + "# event page of %s, event %s. Every field below is one" % (group_id, event["id"]), + "# field of that page: a correction goes to Meetup or to the script,", + "# never here.", + "# The Meetup description is the logistics of signing up and is not", + "# published, and the talks it announces arrive separately. See", + "# content/events/meetups/_index.md.", + ] + + +def main(): + parser = argparse.ArgumentParser( + description="Write the page of one past meetup from its Meetup URL.") + parser.add_argument("url", nargs="*", help="the URL of a past Meetup event") + parser.add_argument("--discover", action="store_true", + help="name the past meetups that have no page, and write nothing") + parser.add_argument("--out", type=pathlib.Path, default=None, + help="the directory to write in (default content/events/meetups)") + parser.add_argument("--dry-run", action="store_true", + help="print the file instead of writing it") + parser.add_argument("--description", action="store_true", + help="print the Meetup description, to extract the talks from") + parser.add_argument("--force", action="store_true", + help="write an upcoming event, or a large edition, anyway") + args = parser.parse_args() + + import_meetups = load_import_meetups() + root = BIN.parent + out = args.out or root / "content" / "events" / "meetups" + + if args.discover: + return discover(import_meetups, out) + if not args.url: + fail("give the URL of a past Meetup event, or --discover") + + venues = known_venues(root) + written = [] + # A URL that is skipped must not take the report of a URL already + # written with it: the loop goes on, and the exit code says at the end + # that one of them was skipped. + skipped = False + + for url in args.url: + match = EVENT_URL.match(url) + if not match: + fail("%s is not a Meetup event URL" % url) + group_id, event_id = match.group(1), match.group(2) + if group_id not in import_meetups.GROUPS: + fail("%s is not a group of the association" % group_id) + + event, state = fetch(url) + if event["id"] != event_id: + fail("%s answered with event %s" % (url, event["id"])) + if event.get("status") != "PAST" and not args.force: + print("SKIP %s is %s, not PAST. The archive records what happened: run" + % (url, (event.get("status") or "unknown").lower())) + print(" this after the day, when the registrations are final, or") + print(" pass --force.") + skipped = True + continue + if import_meetups.BIG_EDITION.search(event["title"]) and not args.force: + print("SKIP %s says PyDay or PyData. The large editions have their own" + % event["title"]) + print(" pages under content/events/, so this would be a second page") + print(" for the same day. Pass --force if it is really a meetup.") + skipped = True + continue + + record = as_export_record(event, state, group_id) + slug = slugify(record["title"]) + date = record["dateTime"][:10] + name = "%s-%s.md" % (date, slug) if slug else "%s.md" % date + text = import_meetups.front_matter( + record, provenance(event, group_id), source="the event page") + path = out / name + + if args.dry_run: + print("--- %s" % path) + print(text, end="") + else: + if path.exists(): + print("SKIP %s is already there. Delete it to write it again." % path) + skipped = True + continue + out.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + written.append((path, record, event, state)) + + for path, record, event, state in written: + venue = record["venue"]["name"] + print("%s %s" % ("would write" if args.dry_run else "wrote", path)) + print(" %s, %s, %d registrations" + % (record["dateTime"][:10], venue or "no venue", record["rsvps"]["yesCount"])) + if venue and venues is not None and canon(venue) not in venues: + print(" NEW VENUE data/venues.yaml does not name %r. Add a short name" % venue) + print(" for it, or the listings print the whole string.") + if args.description: + print(" --- the description, to extract the talks from:") + print(canon(event.get("description") or "").strip()) + print(" Next: extract the talks with bin/prompts/extract-talks.md, check them") + print(" with bin/check-extraction, and write them with bin/import-talks.") + print(" A video of the day arrives later, through bin/import-videos.") + return 1 if skipped else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/prompts/extract-talks.md b/bin/prompts/extract-talks.md index 46e668f8e..e96b2d8df 100644 --- a/bin/prompts/extract-talks.md +++ b/bin/prompts/extract-talks.md @@ -96,5 +96,5 @@ string. That makes the result consistent by construction, and it keeps letters a reach. `bin/check-extraction` compares what the model wrote against the normalized source, so a curly quote turned straight passes and a changed accent fails. -Measurement and reasoning: `Personal/PyBCN/2026-10-11 Fase 3 - El Archive, propuesta de modelos` -in David's vault, section "Qué modelo hace falta, medido". +Which model: measured on the seven recorded extraction runs of +`tests/extraction/`, which is what `bin/check-extraction --selftest` reads. diff --git a/bin/search b/bin/search new file mode 100755 index 000000000..f1a8c2ca6 --- /dev/null +++ b/bin/search @@ -0,0 +1,72 @@ +#!/bin/bash +# +# Build the search index of a built site with Pagefind. +# +# bin/search e.g. bin/search public +# +# Pagefind reads the pages Hugo wrote and writes /pagefind/: the +# engine (pagefind.js and the WebAssembly), the metadata, the word index in +# alphabetical chunks, one fragment per page, and the filter values. Run it +# after Hugo, never before: it indexes what is on disk. CI runs it right +# after "hugo --minify" (.github/workflows/pr.yml and gh-pages.yml). +# +# Only the pages under events/, talks/ and people/ are read. The frozen +# mirrors under archives/ are copies of retired sites and would add 56 old +# pages of dead links to the index; the association pages, the PyLadies +# pages and the home are out of this first version. Within the pages read, +# only the elements marked data-pagefind-body are indexed (the record of +# each talk, event and person, and the photo captions), which is what +# keeps the index near 400 KB instead of the 1.5 MB that whole pages would +# make. The decision and the figures: the proposal of 2026-10-16. +# +# The dev server (bin/serve) runs no Pagefind, so /search/ says there that +# the search is not available. To try it locally: +# +# bin/hugo --minify -d public && bin/search public +# +# then serve public/ with any static server (Hugo's server rebuilds from +# the sources and would not carry the index). + +set -euo pipefail + +ROOT=$(cd "$(dirname "$0")/.." && pwd -P) +PAGEFIND_BIN="${ROOT}/bin/pagefind" + +if [ $# -ne 1 ]; then + echo "Usage: bin/search " >&2 + exit 2 +fi +SITE=$1 + +if [ ! -d "${SITE}" ] || [ -z "$(find "${SITE}" -maxdepth 2 -name '*.html' -print -quit)" ]; then + echo "bin/search: ${SITE} holds no built site. Build first: bin/hugo --minify -d ${SITE}" >&2 + exit 2 +fi + +if [ ! -x "${PAGEFIND_BIN}" ]; then + echo "bin/search: bin/pagefind is missing. Run bin/install-pagefind." >&2 + exit 1 +fi + +"${PAGEFIND_BIN}" --site "${SITE}" --glob "{events,talks,people}/**/*.html" + +# Pagefind writes its three ready-made interfaces and a highlight script +# next to the index, 527 KB in nine files measured on 1.5.2, and this site +# uses none of them: assets/js/search.js talks to pagefind.js directly and +# draws its own results. They are removed so that what is deployed under +# /pagefind/ is what /search/ loads. wasm.unknown.pagefind is the engine +# for a page with no lang attribute, and every page of this site has one. +# pagefind-worker.js stays: pagefind.js loads it to search off the main +# thread. +rm -f "${SITE}"/pagefind/pagefind-component-ui.js "${SITE}"/pagefind/pagefind-component-ui.css \ + "${SITE}"/pagefind/pagefind-ui.js "${SITE}"/pagefind/pagefind-ui.css \ + "${SITE}"/pagefind/pagefind-modular-ui.js "${SITE}"/pagefind/pagefind-modular-ui.css \ + "${SITE}"/pagefind/pagefind-highlight.js "${SITE}"/pagefind/wasm.unknown.pagefind + +# Pagefind exits 0 after indexing nothing, which would deploy a site whose +# search answers every query with no result. The entry file is written only +# when an index was. +if [ ! -f "${SITE}/pagefind/pagefind-entry.json" ]; then + echo "bin/search: Pagefind wrote no index under ${SITE}/pagefind/." >&2 + exit 1 +fi diff --git a/config.toml b/config.toml index df748bb2f..9df87639c 100644 --- a/config.toml +++ b/config.toml @@ -41,8 +41,8 @@ timeout = "300s" # # The Archive met it, and the person pages are back: /people//, from # themes/pybcn_theme/layouts/people/single.html, one per record, the way -# the site has a page per event and a page per talk (David Arcos, -# 2026-10-13). Measured in this tree when the pages came back: 378 files +# the site has a page per event and a page per talk. Measured in this +# tree when the pages came back: 378 files # under content/people/, one of them the draft canary fixture of # bin/check-rendered, so 377 records. 353 are credited by at least one # talk, 124 are listed in at least one page block (the board, a committee, @@ -124,42 +124,67 @@ unsafe=true main_contact_name_pyladies = "PyLadiesBCN Organizers" main_contact_email_pyladies = "pyladies-bcn@googlegroups.com" + # The order of the row, by reach, measured on 2026-10-16 where the + # account publishes a number: Meetup 4,669 members of python-barcelona + # (plus 919 of pyladies-bcn), YouTube 351 subscribers, Bluesky 229 + # followers, GitHub 27. X and LinkedIn answer nothing without an + # account, so they sit on the judgement that X has the longest history + # of the set, 987 archived tweet ids and every photo thread of the + # archive, and that LinkedIn is the professional one. Slack is last + # because it is a workspace to join and not a feed to read. + # + # weight is what partials/footer.html sorts by. Without it Hugo ranges + # the map by key, which is alphabetical and put Bluesky first for no + # reason other than its name. [params.social_items] + [params.social_items.meetup] + weight = 1 + name = "Meetup" + link = "https://www.meetup.com/python-barcelona/" + icon = "fab fa-meetup fa-2x" [params.social_items.twitter] + weight = 3 name = "X" icon = "icon_x fa-2x" link = "https://x.com/PyBCN" + [params.social_items.linkedin] + weight = 2 + name = "LinkedIn" + link = "https://linkedin.com/company/pybcn" + icon = "fab fa-linkedin fa-2x" [params.social_items.youtube] + weight = 4 name = "YouTube" link = "https://www.youtube.com/c/PythonBarcelona" icon = "fab fa-youtube-square fa-2x" - [params.social_items.meetup] - name = "Meetup" - link = "https://www.meetup.com/python-barcelona/" - icon = "fab fa-meetup fa-2x" + [params.social_items.bluesky] + weight = 5 + name = "Bluesky" + link = "https://bsky.app/profile/pybcn.org" + icon = "icon_bluesky fa-2x" [params.social_items.github] + weight = 7 name = "GitHub" link = "https://github.com/pybcn" icon = "fab fa-github fa-2x" - [params.social_items.linkedin] - name = "LinkedIn" - link = "https://linkedin.com/company/pybcn" - icon = "fab fa-linkedin fa-2x" [params.social_items.slack] + weight = 6 name = "Slack" link = "https://pybcn.slack.com" icon = "fab fa-slack fa-2x" - [params.social_items_pyladies] [params.social_items_pyladies.twitter] + weight = 3 name = "X" icon = "icon_x fa-2x" link = "https://x.com/PyLadiesBCN" [params.social_items_pyladies.meetup] + weight = 1 name = "Meetup" link = "https://www.meetup.com/PyLadies-BCN" icon = "fab fa-meetup fa-2x" [params.social_items_pyladies.github] + weight = 7 name = "GitHub" link = "https://github.com/pyladies-bcn" icon = "fab fa-github fa-2x" diff --git a/content/_index.md b/content/_index.md index eaa7d2380..c70d0472f 100644 --- a/content/_index.md +++ b/content/_index.md @@ -4,8 +4,9 @@ description: "If you are in Barcelona and interested in Python, this is your pag layout: home -twitterLists: -- PyBCN/lists/pyladies-bcn-pybcn +# The page draws its own h1, in its first block, so +# partials/hero_header.html prints none. +no_page_heading: true meetupEvents: - name: PyBCN @@ -13,17 +14,21 @@ meetupEvents: - name: PyLadies BCN id: pyladies-bcn -carousel_header: true -carousel_indicators: true -carousel_class: home_carousel -carousel_photos: -- photo: /photos/canodrom_header.jpg - caption: PyDay 2025 - link: events/pyday_bcn/pyday_bcn_2025/ -- photo: /photos/meetups.jpg - caption: PyBCN Meetups - link: events/monthly_events -- photo: /photos/pyladies_meetups.jpeg - caption: PyLadies BCN Meetups - link: pyladies_bcn/meetups +# The video of the About PyBCN block: the presentation of the Barcelona +# community at PyConES 2020, the one video of the channel that belongs to +# no event of the association, which is why no page of the archive carries +# it (data/channel_videos.yaml has the entry and the reason). The frame is +# partials/video_frame.html, which accepts a YouTube watch URL and prints +# nothing for any other. The title is the one the channel shows, and it is +# the text of the link under the player. +about_video: + url: https://www.youtube.com/watch?v=JYCcPr4QW_k + title: "PyLadies Barcelona & Python Barcelona - Presentación comunidad local - PyConES 2020" + --- + +**Python Barcelona (PyBCN)** is the Python community of Barcelona: a meetup group since 2007, and a non-profit association since 2018. We run the monthly PyBCN meetups, the PyLadies BCN workshops, the practice sessions and coding dojos, and the annual PyDay BCN. The events are free or low cost, held in Barcelona, and hosted by local companies and universities. + +In this talk at PyConES 2020, PyLadies Barcelona and Python Barcelona present the local community. + +[Read more about the association](/pybcn_association/information/) diff --git a/content/events/_index.md b/content/events/_index.md index c8350f358..094bb682c 100644 --- a/content/events/_index.md +++ b/content/events/_index.md @@ -1,6 +1,6 @@ --- title: "Events" -description: "" +description: "Every event the association has organized, the most recent first: the monthly meetups since 2007, and the larger days, PyDay BCN and PyDataBCN." menu: "main" weight: 4 layout: events_index diff --git a/content/events/meetups/2011-01-31-barcelona-python-meetup-january-2011.md b/content/events/meetups/2011-01-31-barcelona-python-meetup-january-2011.md index 0d726ca52..02123eb5a 100644 --- a/content/events/meetups/2011-01-31-barcelona-python-meetup-january-2011.md +++ b/content/events/meetups/2011-01-31-barcelona-python-meetup-january-2011.md @@ -38,6 +38,6 @@ talks: type: talk - id: the-basics-and-customization-of-the-satchmo-project-remarks title: "The basics and customization of the Satchmo project: Remarks and Personal Experience" - speakers: [juan-gonzalez-vallinas] + speakers: [juan-ramon-gonzalez-vallinas] type: talk --- diff --git a/content/events/meetups/2011-02-24-barcelona-python-meetup-february-2011.md b/content/events/meetups/2011-02-24-barcelona-python-meetup-february-2011.md index 0fce3082b..52b14512f 100644 --- a/content/events/meetups/2011-02-24-barcelona-python-meetup-february-2011.md +++ b/content/events/meetups/2011-02-24-barcelona-python-meetup-february-2011.md @@ -36,7 +36,7 @@ talks: duration_minutes: 15 - id: statistics-and-plotting-with-python title: "Statistics and Plotting with Python" - speakers: [juan-gonzalez-vallinas] + speakers: [juan-ramon-gonzalez-vallinas] type: talk duration_minutes: 30 --- diff --git a/content/events/meetups/2011-09-02-lets-start-again-with-the-proper-meetups.md b/content/events/meetups/2011-09-02-lets-start-again-with-the-proper-meetups.md index 8c8cd25e7..ccfe4f376 100644 --- a/content/events/meetups/2011-09-02-lets-start-again-with-the-proper-meetups.md +++ b/content/events/meetups/2011-09-02-lets-start-again-with-the-proper-meetups.md @@ -26,7 +26,7 @@ group: "PyBCN" talks: - id: launching-a-webstore-with-django-and-satchmo-a-personal title: "Launching a webstore with Django and Satchmo: A personal experience" - speakers: [juan-gonzalez-vallinas] + speakers: [juan-ramon-gonzalez-vallinas] type: talk - id: wok-title-pending title: "Wok (Title pending)" diff --git a/content/events/meetups/2013-02-07-python-for-data-analysis.md b/content/events/meetups/2013-02-07-python-for-data-analysis.md index a280d0f2a..ce9c81cb8 100644 --- a/content/events/meetups/2013-02-07-python-for-data-analysis.md +++ b/content/events/meetups/2013-02-07-python-for-data-analysis.md @@ -26,7 +26,7 @@ group: "PyBCN" talks: - id: matplotlib title: "Matplotlib" - speakers: [juan-gonzalez-vallinas] + speakers: [juan-ramon-gonzalez-vallinas] type: talk duration_minutes: 10 - id: quick-introduction-to-ipython diff --git a/content/events/meetups/2014-01-16-robotics-and-python.md b/content/events/meetups/2014-01-16-robotics-and-python.md index 3233b7248..eea5b6265 100644 --- a/content/events/meetups/2014-01-16-robotics-and-python.md +++ b/content/events/meetups/2014-01-16-robotics-and-python.md @@ -39,4 +39,31 @@ talks: speakers: [sam-pfeiffer] type: talk description: "Introducción al Sistema Operativo Robótico (ROS) desde el punto de vista de un desarrollador en Python en un caso real: REEM" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/423876642587815936" + items: + - file: 2014-01-16-robotics-and-python/01-a-punto-de-empezar-easy-gps-tracker-using-arduino.webp + caption: "A punto de empezar 'Easy GPS tracker using Arduino and Python' #pybcn" + source: "https://x.com/PyBCN/status/423876642587815936" + time: "18:57" + - file: 2014-01-16-robotics-and-python/02-final-version-of-llevaneus-gps-tracker-using-ardui.webp + caption: "Final version of @llevaNEUS GPS Tracker, using Arduino, QT and Python #pybcn" + source: "https://x.com/PyBCN/status/423884976497905664" + time: "19:30" + - file: 2014-01-16-robotics-and-python/03-empieza-the-robot-operating-system-ecosystem-and-p.webp + caption: "Empieza 'The Robot Operating System ecosystem and Python', por @esteve #ROS #pybcn" + source: "https://x.com/PyBCN/status/423889253048000513" + time: "19:47" + - file: 2014-01-16-robotics-and-python/04-ejemplos-de-robots-que-usan-ros-pybcn.webp + caption: "Ejemplos de robots que usan ROS #pybcn" + source: "https://x.com/PyBCN/status/423891026680754176" + time: "19:54" + - file: 2014-01-16-robotics-and-python/05-y-ahora-a-real-use-case-of-ros-pybcn.webp + caption: "Y ahora, 'A real use case of ROS' #pybcn" + source: "https://x.com/PyBCN/status/423898372614135808" + time: "20:23" --- diff --git a/content/events/meetups/2014-02-20-python-web-frameworks.md b/content/events/meetups/2014-02-20-python-web-frameworks.md index 356f129ab..9cda34c88 100644 --- a/content/events/meetups/2014-02-20-python-web-frameworks.md +++ b/content/events/meetups/2014-02-20-python-web-frameworks.md @@ -40,4 +40,31 @@ talks: title: "Pybcn.org website powered by Nikola" speakers: [areski-belaid] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/436564028190904320" + items: + - file: 2014-02-20-python-web-frameworks/01-pyramid-python-webframework-by-ramon-navarro-blood.webp + caption: "Pyramid Python WebFramework, by Ramon Navarro (@bloodbare) #pybcn" + source: "https://x.com/PyBCN/status/436564028190904320" + time: "19:12" + talk: pyramid-python-webframework + - file: 2014-02-20-python-web-frameworks/02-simple-webapps-with-nginx-uwsgi-emperor-bottle-by.webp + caption: "Simple webapps with nginx + uWSGI emperor + Bottle, by Jordi Soucheiron (@jordixou) #pybcn" + source: "https://x.com/PyBCN/status/436570487955918848" + time: "19:38" + talk: simple-webapps-with-nginx-uwsgi-emperor-bottle + - file: 2014-02-20-python-web-frameworks/03-rapid-web-development-with-web2py-by-giorgio-zoppi.webp + caption: "Rapid web development with Web2py, by Giorgio Zoppi (@jo_zoppi) #pybcn" + source: "https://x.com/PyBCN/status/436577595820630017" + time: "20:06" + talk: rapid-web-development-with-web2py + - file: 2014-02-20-python-web-frameworks/04-did-you-know-that-the-http-pybcn-org-website-power.webp + caption: "Did you know that the https://pybcn.org website powered by Nikola? by Areski Belaid (@areskib) #pybcn" + source: "https://x.com/PyBCN/status/436581795501719552" + time: "20:23" + talk: pybcn-org-website-powered-by-nikola --- diff --git a/content/events/meetups/2014-03-20-python-for-beginners-learn-some-python.md b/content/events/meetups/2014-03-20-python-for-beginners-learn-some-python.md index f1c9d2374..0a149a129 100644 --- a/content/events/meetups/2014-03-20-python-for-beginners-learn-some-python.md +++ b/content/events/meetups/2014-03-20-python-for-beginners-learn-some-python.md @@ -59,4 +59,44 @@ talks: title: "Where to find help for Python" speakers: [aleta-dunne] type: lightning +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/446736550618222592" + items: + - file: 2014-03-20-python-for-beginners-learn-some-python/06-introduction-to-python-by-pablo-enfedaque-vidal-pa.webp + caption: "Introduction to Python, by Pablo Enfedaque Vidal (@pablitoev56) #pybcn" + source: "https://x.com/PyBCN/status/446712242487443456" + time: "19:17" + - file: 2014-03-20-python-for-beginners-learn-some-python/07-mutables-vs-immutables-pybcn.webp + caption: "Mutables vs. immutables #pybcn" + source: "https://x.com/PyBCN/status/446724872958644224" + time: "20:08" + - file: 2014-03-20-python-for-beginners-learn-some-python/01-the-zen-of-python-by-david-arcos-dzpm-pybcn.webp + caption: "The Zen of Python, by David Arcos (@DZPM) #pybcn" + source: "https://x.com/PyBCN/status/446736550618222592" + time: "20:54" + talk: the-zen-of-python + - file: 2014-03-20-python-for-beginners-learn-some-python/02-virtualenv-and-pip-by-alex-maneu-zouave-pybcn.webp + caption: "Virtualenv and pip, by Alex Maneu (@zouave) #pybcn" + source: "https://x.com/PyBCN/status/446737043549601792" + time: "20:56" + talk: virtualenv-and-pip + - file: 2014-03-20-python-for-beginners-learn-some-python/03-list-comprehensions-by-jordi-gomez-bao-jgomezb79-p.webp + caption: "List comprehensions, by Jordi Gomez Bao (@jgomezb79) #pybcn" + source: "https://x.com/PyBCN/status/446739185815552000" + time: "21:04" + talk: list-comprehensions + - file: 2014-03-20-python-for-beginners-learn-some-python/04-metodos-magicos-en-python-by-nacho-gentile-nachoge.webp + caption: "Métodos mágicos en Python, by Nacho Gentile (@nachogentile) #pybcn" + source: "https://x.com/PyBCN/status/446742622154289152" + time: "21:18" + talk: metodos-magicos-en-python + - file: 2014-03-20-python-for-beginners-learn-some-python/05-where-to-find-help-for-python-by-aleta-dunne-dtibu.webp + caption: "Where to find help for Python, by Aleta Dunne (@dtiburon) #pybcn" + source: "https://x.com/PyBCN/status/446749040899010560" + time: "21:44" + talk: where-to-find-help-for-python --- diff --git a/content/events/meetups/2014-04-24-python-sciences.md b/content/events/meetups/2014-04-24-python-sciences.md index afdf03d4e..2e8579db4 100644 --- a/content/events/meetups/2014-04-24-python-sciences.md +++ b/content/events/meetups/2014-04-24-python-sciences.md @@ -35,4 +35,25 @@ talks: title: "Introduction to Pandas" speakers: [piotr-migdal] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/459394310275084289" + items: + - file: 2014-04-24-python-sciences/01-introduction-to-ipython-notebook-by-loris-mularoni.webp + caption: "Introduction to IPython Notebook, by Loris Mularoni (@LorisMularoni) #pybcn" + source: "https://x.com/PyBCN/status/459394310275084289" + time: "20:11" + talk: introduction-to-ipython-notebook + - file: 2014-04-24-python-sciences/03-introduction-to-python-for-data-analysis-by-christ.webp + caption: "Introduction to Python for Data Analysis, by Christine Doig (@ch_doig) #pybcn" + source: "https://x.com/PyBCN/status/459406658519961600" + time: "21:00" + - file: 2014-04-24-python-sciences/02-introduction-to-pandas-by-piotr-migdal-pmigdal-pyb.webp + caption: "Introduction to Pandas, by Piotr Migdal (@pmigdal) #pybcn" + source: "https://x.com/PyBCN/status/459412929951985664" + time: "21:25" + talk: introduction-to-pandas --- diff --git a/content/events/meetups/2014-05-22-python-and-databases.md b/content/events/meetups/2014-05-22-python-and-databases.md index 1af807c98..9fe420f3e 100644 --- a/content/events/meetups/2014-05-22-python-and-databases.md +++ b/content/events/meetups/2014-05-22-python-and-databases.md @@ -44,4 +44,24 @@ talks: speakers: [andres-correa-casablanca] type: talk duration_minutes: 20 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/469535749222961152" + items: + - file: 2014-05-22-python-and-databases/02-introduction-to-python-orm-sqlalchemy-by-jorge-med.webp + caption: "Introduction to python ORM SQLAlchemy, by Jorge Medina #pybcn" + source: "https://x.com/PyBCN/status/469527412104232960" + time: "19:17" + - file: 2014-05-22-python-and-databases/01-python-with-mysql-by-miquel-camprodon-pybcn.webp + caption: "Python with MySQL, by Miquel Camprodon #pybcn" + source: "https://x.com/PyBCN/status/469535749222961152" + time: "19:50" + talk: python-with-mysql + - file: 2014-05-22-python-and-databases/01-python-and-mongodb-by-javier-arias-javier-arilos-p.webp + caption: "Python and MongoDB, by Javier Arias (@javier_arilos) #pybcn" + source: "https://x.com/PyBCN/status/469544096076673024" + time: "20:23" --- diff --git a/content/events/meetups/2014-06-10-introduction-to-raspberry-pi-workshop-trial-run.md b/content/events/meetups/2014-06-10-introduction-to-raspberry-pi-workshop-trial-run.md index 5c564debd..0f37c16b7 100644 --- a/content/events/meetups/2014-06-10-introduction-to-raspberry-pi-workshop-trial-run.md +++ b/content/events/meetups/2014-06-10-introduction-to-raspberry-pi-workshop-trial-run.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to Raspberry Pi Workshop - trial run" +title: "PyLadies BCN Workshop, June 2014" date: 2014-06-10 year: 2014 venue: "UPF Music Technology Group" diff --git a/content/events/meetups/2014-06-26-python-devops.md b/content/events/meetups/2014-06-26-python-devops.md index b0c2cb930..78a136390 100644 --- a/content/events/meetups/2014-06-26-python-devops.md +++ b/content/events/meetups/2014-06-26-python-devops.md @@ -48,4 +48,23 @@ talks: links: - type: site url: "https://www.fabfile.org/" +photos: + thread: "https://x.com/PyBCN/status/482210638417395712" + items: + - file: 2014-06-26-python-devops/01-openstack-by-xavier-queralt-xqueralt-pybcn.webp + caption: "OpenStack, by Xavier Queralt (@xqueralt) #pybcn" + source: "https://x.com/PyBCN/status/482210638417395712" + time: "19:15" + - file: 2014-06-26-python-devops/02-fabric-by-pablo-enfedaque-pablitoev56-pybcn.webp + caption: "Fabric, by Pablo Enfedaque (@pablitoev56) #pybcn" + source: "https://x.com/PyBCN/status/482216745785368577" + time: "19:40" + - file: 2014-06-26-python-devops/04-cuisine-by-daniel-mellado-pybcn.webp + caption: "Cuisine, by Daniel Mellado #pybcn" + source: "https://x.com/PyBCN/status/482228259485388800" + time: "20:25" + - file: 2014-06-26-python-devops/03-ansible-by-ignasi-fosch-ifosch-pybcn.webp + caption: "Ansible, by Ignasi Fosch (@ifosch) #pybcn" + source: "https://x.com/PyBCN/status/482230379924172800" + time: "20:34" --- diff --git a/content/events/meetups/2014-09-25-artificial-intelligence-panstamp.md b/content/events/meetups/2014-09-25-artificial-intelligence-panstamp.md index b16c9740b..d9cbc7219 100644 --- a/content/events/meetups/2014-09-25-artificial-intelligence-panstamp.md +++ b/content/events/meetups/2014-09-25-artificial-intelligence-panstamp.md @@ -42,4 +42,25 @@ talks: type: talk language: en duration_minutes: 20 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/515188039250092032" + items: + - file: 2014-09-25-artificial-intelligence-panstamp/01-python-and-machine-learning-by-xavier-arrufat-pybc.webp + caption: "Python and Machine Learning, by Xavier Arrufat #pybcn" + source: "https://x.com/PyBCN/status/515188039250092032" + time: "19:16" + talk: machine-learning + - file: 2014-09-25-artificial-intelligence-panstamp/02-heating-solution-using-panstamp-and-python-by-orio.webp + caption: "Heating solution using Panstamp and Python, by Oriol Rius @oriolrius #pybcn" + source: "https://x.com/PyBCN/status/515198678844596224" + time: "19:58" + talk: heating-solution-using-panstamp-and-python + - file: 2014-09-25-artificial-intelligence-panstamp/03-application-of-dynamical-systems-in-artificial-int.webp + caption: "Application of dynamical systems in Artificial Inteligence, by Bac Ko #pybcn" + source: "https://x.com/PyBCN/status/515208025507119105" + time: "20:35" --- diff --git a/content/events/meetups/2014-10-13-go-meetup-golang.md b/content/events/meetups/2014-10-13-go-meetup-golang.md index e5cdcd2ab..c32df5a36 100644 --- a/content/events/meetups/2014-10-13-go-meetup-golang.md +++ b/content/events/meetups/2014-10-13-go-meetup-golang.md @@ -34,4 +34,24 @@ talks: speakers: [brett-hartshorn] type: talk duration_minutes: 20 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/521712502686883840" + items: + - file: 2014-10-13-go-meetup-golang/02-today-we-will-have-speakers-talking-about-golang-p.webp + caption: "Today we will have speakers talking about Golang #pybcn" + source: "https://x.com/PyBCN/status/521709881435623424" + time: "19:11" + - file: 2014-10-13-go-meetup-golang/01-differences-and-common-aspects-of-go-by-francesc-c.webp + caption: "Differences and common aspects of Go, by Francesc Campoy (@francesc) #pybcn" + source: "https://x.com/PyBCN/status/521712502686883840" + time: "19:22" + talk: differences-and-common-aspects-of-go + - file: 2014-10-13-go-meetup-golang/03-gythonjs-translator-to-compile-a-subset-of-python.webp + caption: "GythonJS translator to compile a subset of Python to Go, by Brett Hartshorn #pybcn" + source: "https://x.com/PyBCN/status/521726869004365824" + time: "20:19" --- diff --git a/content/events/meetups/2014-11-20-python-meetup-november.md b/content/events/meetups/2014-11-20-python-meetup-november.md index 076812b5a..6c6daeb05 100644 --- a/content/events/meetups/2014-11-20-python-meetup-november.md +++ b/content/events/meetups/2014-11-20-python-meetup-november.md @@ -47,4 +47,25 @@ talks: language: en duration_minutes: 40 description: "a visual and intuitive journey to understand how it stores knowledge and how it takes decisions." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/535503325022937088" + items: + - file: 2014-11-20-python-meetup-november/03-conda-and-bokeh-by-christine-doig-ch-doig-pybcn.webp + caption: "Conda and Bokeh, by Christine Doig (@ch_doig) #pybcn" + source: "https://x.com/PyBCN/status/535501261425364995" + time: "19:33" + - file: 2014-11-20-python-meetup-november/01-putting-python-inside-postgresql-by-brian-sutherla.webp + caption: "Putting Python inside PostgreSQL, by Brian Sutherland #pybcn" + source: "https://x.com/PyBCN/status/535503325022937088" + time: "19:41" + talk: putting-python-inside-postgresql + - file: 2014-11-20-python-meetup-november/02-inside-the-artificial-neural-network-by-xavier-arr.webp + caption: "Inside the Artificial Neural Network, by Xavier Arrufat #pybcn" + source: "https://x.com/PyBCN/status/535509138097188865" + time: "20:05" + talk: inside-the-artificial-neural-network --- diff --git a/content/events/meetups/2014-12-18-python-december-meetup.md b/content/events/meetups/2014-12-18-python-december-meetup.md index f5680d688..cf9d2231a 100644 --- a/content/events/meetups/2014-12-18-python-december-meetup.md +++ b/content/events/meetups/2014-12-18-python-december-meetup.md @@ -39,4 +39,30 @@ talks: title: "Unit-Test-Based Programming" speakers: [miguel-lechon] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/545642649240489984" + items: + - file: 2014-12-18-python-december-meetup/04-about-to-start-learn-more-about-us-at-http-pybcn-o.webp + caption: "About to start. Learn more about us at https://pybcn.org #pybcn" + source: "https://x.com/PyBCN/status/545642100256436225" + time: "19:09" + - file: 2014-12-18-python-december-meetup/01-python-tips-tricks-and-dark-magic-by-jordixou-pybc.webp + caption: "Python tips, tricks and dark magic, by @jordixou #pybcn" + source: "https://x.com/PyBCN/status/545642649240489984" + time: "19:11" + talk: python-tips-tricks-and-dark-magic + - file: 2014-12-18-python-december-meetup/02-buildbot-the-continuous-integration-python-framewo.webp + caption: "Buildbot: The Continuous Integration Python framework, by @carlesanagustin #pybcn" + source: "https://x.com/PyBCN/status/545648408682577920" + time: "19:34" + talk: buildbot-the-continuous-integration-python-framework + - file: 2014-12-18-python-december-meetup/03-unit-test-based-programming-by-miguel-lechon-pybcn.webp + caption: "Unit-Test-Based Programming, by Miguel Lechon #pybcn" + source: "https://x.com/PyBCN/status/545658374357274624" + time: "20:14" + talk: unit-test-based-programming --- diff --git a/content/events/meetups/2015-01-22-python-january-meetup.md b/content/events/meetups/2015-01-22-python-january-meetup.md index b6622571b..9336be342 100644 --- a/content/events/meetups/2015-01-22-python-january-meetup.md +++ b/content/events/meetups/2015-01-22-python-january-meetup.md @@ -39,4 +39,25 @@ talks: speakers: [ramon-navarro-bosch] type: talk duration_minutes: 40 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/558326161332518913" + items: + - file: 2015-01-22-python-january-meetup/01-an-introduction-to-sqlalchemy-and-orm-in-python-by.webp + caption: "An introduction to SQLAlchemy and ORM in Python, by Oriol Andrés (@Oriol_And) #pybcn" + source: "https://x.com/PyBCN/status/558326161332518913" + time: "19:11" + talk: an-introduction-to-sqlalchemy-and-orm-in-python + - file: 2015-01-22-python-january-meetup/02-how-to-open-a-bar-in-python-by-edward-van-kuik-ale.webp + caption: "How to open a bar in Python, by Edward van Kuik (@AlexanderBarCT) #pybcn" + source: "https://x.com/PyBCN/status/558333223806464001" + time: "19:39" + talk: how-to-open-a-bar-in-python + - file: 2015-01-22-python-january-meetup/03-continuous-integration-on-a-large-open-source-soft.webp + caption: "Continuous Integration on a large open source software: Plone, by Ramon Navarro Bosch (@bloodbare) #pybcn" + source: "https://x.com/PyBCN/status/558341847735869440" + time: "20:14" --- diff --git a/content/events/meetups/2015-01-29-python-tips-and-tricks.md b/content/events/meetups/2015-01-29-python-tips-and-tricks.md index 8affa68ad..580a7d7a9 100644 --- a/content/events/meetups/2015-01-29-python-tips-and-tricks.md +++ b/content/events/meetups/2015-01-29-python-tips-and-tricks.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Python Tips and Tricks" +title: "PyLadies BCN Workshop, January 2015" date: 2015-01-29 year: 2015 venue: "UPF, Campus de la Comunicación - Poblenou" diff --git a/content/events/meetups/2015-02-19-python-february-meetup.md b/content/events/meetups/2015-02-19-python-february-meetup.md index e68421d40..3c897f166 100644 --- a/content/events/meetups/2015-02-19-python-february-meetup.md +++ b/content/events/meetups/2015-02-19-python-february-meetup.md @@ -41,4 +41,43 @@ talks: title: "Natural Language Processing with Python and NLTK" type: talk duration_minutes: 20 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/568472498829959168" + items: + - file: 2015-02-19-python-february-meetup/05-about-to-start-the-barcelona-python-meetup-pybcn.webp + caption: "About to start the Barcelona Python Meetup #pybcn" + source: "https://x.com/PyBCN/status/568471862310772736" + time: "19:07" + - file: 2015-02-19-python-february-meetup/01-high-performance-python-by-marc-garcia-mgarcia-pyb.webp + caption: "High Performance Python, by Marc Garcia (@__mgarcia__) #pybcn" + source: "https://x.com/PyBCN/status/568472498829959168" + time: "19:09" + talk: high-performance-python + - file: 2015-02-19-python-february-meetup/06-types-of-optimizations-pybcn.webp + caption: "Types of optimizations #pybcn" + source: "https://x.com/PyBCN/status/568475832362143745" + time: "19:22" + - file: 2015-02-19-python-february-meetup/07-python-optimization-takeaways-pybcn.webp + caption: "Python Optimization takeaways #pybcn" + source: "https://x.com/PyBCN/status/568483491006025729" + time: "19:53" + - file: 2015-02-19-python-february-meetup/02-natural-language-processing-with-python-and-nltk-b.webp + caption: "Natural Language Processing with Python and NLTK, by Lusy #pybcn" + source: "https://x.com/PyBCN/status/568488804119654401" + time: "20:14" + talk: natural-language-processing-with-python-and-nltk + - file: 2015-02-19-python-february-meetup/03-zipline-a-powerful-algorithmic-trading-simulator-b.webp + caption: "Zipline, a powerful algorithmic trading simulator, by Jesús Corrius (@jcorrius) #pybcn" + source: "https://x.com/PyBCN/status/568496278100951041" + time: "20:44" + talk: zipline-a-powerful-algorithmic-trading-simulator + - file: 2015-02-19-python-february-meetup/04-issue-certificates-with-python-to-build-a-trust-re.webp + caption: "Issue certificates with Python to build a trust relationship by Pau Freixes (@pfreixes) #pybcn" + source: "https://x.com/PyBCN/status/568498483696693248" + time: "20:52" + talk: issue-certificates-with-python-to-build-a-trust-relationship --- diff --git a/content/events/meetups/2015-02-26-introduction-to-debugging-in-python-codefights.md b/content/events/meetups/2015-02-26-introduction-to-debugging-in-python-codefights.md index 73fa96baa..2d0154cd2 100644 --- a/content/events/meetups/2015-02-26-introduction-to-debugging-in-python-codefights.md +++ b/content/events/meetups/2015-02-26-introduction-to-debugging-in-python-codefights.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to debugging in Python (+ CodeFights!)" +title: "PyLadies BCN Workshop, February 2015" date: 2015-02-26 year: 2015 venue: "UPF, Campus de la Comunicación - Poblenou" diff --git a/content/events/meetups/2015-03-26-python-march-meetup.md b/content/events/meetups/2015-03-26-python-march-meetup.md index 72f4a68b8..25283e566 100644 --- a/content/events/meetups/2015-03-26-python-march-meetup.md +++ b/content/events/meetups/2015-03-26-python-march-meetup.md @@ -34,4 +34,34 @@ talks: speakers: [aitor-guevara] type: talk duration_minutes: 40 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/581173303932518400" + items: + - file: 2015-03-26-python-march-meetup/01-spark-ipython-by-guillermo-blasco-theblackboxio-at.webp + caption: "Spark + iPython, by Guillermo Blasco (@theblackboxio) at @itnig #pybcn" + source: "https://x.com/PyBCN/status/581156478972751873" + time: "19:11" + talk: spark-ipython + - file: 2015-03-26-python-march-meetup/02-spark-ipython-why-pybcn.webp + caption: "Spark + ipython, why? #pybcn" + source: "https://x.com/PyBCN/status/581158394972733440" + time: "19:18" + talk: spark-ipython + - file: 2015-03-26-python-march-meetup/03-networking-at-the-python-barcelona-meetup-at-itnig.webp + caption: "Networking at the Python Barcelona Meetup at @itnig, thanks to @EstrellaDammCat :) #pybcn" + source: "https://x.com/PyBCN/status/581172700883845120" + time: "20:15" + - file: 2015-03-26-python-march-meetup/01-concurrency-in-python-by-aitor-guevara-aitorciki-a.webp + caption: "Concurrency in Python, by Aitor Guevara (@aitorciki) at @itnig #pybcn" + source: "https://x.com/PyBCN/status/581173303932518400" + time: "20:18" + talk: concurrency-in-python + - file: 2015-03-26-python-march-meetup/04-finally-asyncio-for-python-3-aitorciki-at-itnig-py.webp + caption: "Finally, asyncio for Python 3 - @aitorciki at @itnig #pybcn" + source: "https://x.com/PyBCN/status/581183553096060928" + time: "20:58" --- diff --git a/content/events/meetups/2015-04-16-python-april-meetup.md b/content/events/meetups/2015-04-16-python-april-meetup.md index 203672794..9bbdb8574 100644 --- a/content/events/meetups/2015-04-16-python-april-meetup.md +++ b/content/events/meetups/2015-04-16-python-april-meetup.md @@ -39,4 +39,27 @@ talks: speakers: [ivan-company] type: talk duration_minutes: 30 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/588751026209083393" + items: + - file: 2015-04-16-python-april-meetup/01-practical-webcrawling-with-scrapy-by-ivan-company.webp + caption: "Practical webcrawling with Scrapy, by Iván Compañy (@pyivanc)" + source: "https://x.com/PyBCN/status/588751026209083393" + time: "19:09" + talk: practical-webcrawling-with-scrapy + - file: 2015-04-16-python-april-meetup/02-15-fails-in-15-minutes-an-interactive-guide-to-sho.webp + caption: "15 fails in 15 minutes: An interactive guide to shooting yourself in the foot, by Manuel Ebert (@maebert) #pybcn" + source: "https://x.com/PyBCN/status/588759705603940352" + time: "19:43" + talk: 15-fails-in-15-minutes-an-interactive-guide-to-shooting + - file: 2015-04-16-python-april-meetup/03-mutable-vs-immutable-objects-and-typical-mistakes.webp + caption: "Mutable vs Immutable objects and typical mistakes, by Pablo Enfedaque (@pablitoev56)" + source: "https://x.com/PyBCN/status/588770705464041473" + time: "20:27" + talk: mutable-vs-immutable-objects-and-typical-mistakes + --- diff --git a/content/events/meetups/2015-05-14-testing-test-driven-development-tdd-in-python.md b/content/events/meetups/2015-05-14-testing-test-driven-development-tdd-in-python.md index 3596a5827..79da58d72 100644 --- a/content/events/meetups/2015-05-14-testing-test-driven-development-tdd-in-python.md +++ b/content/events/meetups/2015-05-14-testing-test-driven-development-tdd-in-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Testing & Test-driven development (TDD) in Python" +title: "PyLadies BCN Workshop, May 2015" date: 2015-05-14 year: 2015 venue: "UPF, Campus de la Comunicación - Poblenou" diff --git a/content/events/meetups/2015-05-21-python-may-meetup.md b/content/events/meetups/2015-05-21-python-may-meetup.md index d74ee1a29..310459209 100644 --- a/content/events/meetups/2015-05-21-python-may-meetup.md +++ b/content/events/meetups/2015-05-21-python-may-meetup.md @@ -31,7 +31,7 @@ talks: duration_minutes: 40 - id: python-for-data-analysis title: "Python for Data Analysis" - speakers: [juan-gonzales-vallinas] + speakers: [juan-ramon-gonzalez-vallinas] type: talk duration_minutes: 40 - id: machine-learning-with-scikit-learn @@ -39,4 +39,30 @@ talks: speakers: [christopher-bonnett] type: talk duration_minutes: 30 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/601436263019782144" + items: + - file: 2015-05-21-python-may-meetup/04-empezando-el-barcelona-python-meetup-de-mayo-pybcn.webp + caption: "Empezando el Barcelona Python Meetup de Mayo #pybcn" + source: "https://x.com/PyBCN/status/601435871280177152" + time: "19:14" + - file: 2015-05-21-python-may-meetup/01-python-decorators-by-guillermo-blasco-theblackboxi.webp + caption: "Python Decorators, by Guillermo Blasco (@theblackboxio) #pybcn" + source: "https://x.com/PyBCN/status/601436263019782144" + time: "19:15" + talk: python-decorators + - file: 2015-05-21-python-may-meetup/02-python-for-data-analysis-by-juan-gonzales-vallinas.webp + caption: "Python for Data Analysis, by Juan Gonzales-Vallinas #pybcn" + source: "https://x.com/PyBCN/status/601447469210214401" + time: "20:00" + talk: python-for-data-analysis + - file: 2015-05-21-python-may-meetup/03-machine-learning-with-scikit-learn-by-christopher.webp + caption: "Machine Learning with scikit-learn, by Christopher Bonnett (@cbonnett) #pybcn" + source: "https://x.com/PyBCN/status/601453857508438016" + time: "20:25" + talk: machine-learning-with-scikit-learn --- diff --git a/content/events/meetups/2015-06-18-python-june-meetup.md b/content/events/meetups/2015-06-18-python-june-meetup.md index 6de635472..d75f8c8e1 100644 --- a/content/events/meetups/2015-06-18-python-june-meetup.md +++ b/content/events/meetups/2015-06-18-python-june-meetup.md @@ -38,4 +38,25 @@ talks: speakers: [loris-mularoni] type: talk duration_minutes: 20 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/611581671289307136" + items: + - file: 2015-06-18-python-june-meetup/01-an-introduction-to-the-flask-web-framework-and-a-r.webp + caption: "\"An introduction to the Flask Web framework and a recipe for the Google's App Engine\" by Gabriel de Maeztu #pybcn" + source: "https://x.com/PyBCN/status/611581671289307136" + time: "19:10" + talk: an-introduction-to-the-flask-web-framework-and-a-recipe-for + - file: 2015-06-18-python-june-meetup/03-real-time-kpi-metrics-with-django-graphite-and-sta.webp + caption: "\"Real-time KPI metrics with Django, Graphite and Statsd\" by Israel Saeta Pérez (@dukebody) #pybcn" + source: "https://x.com/PyBCN/status/611591342364446720" + time: "19:48" + - file: 2015-06-18-python-june-meetup/02-python-and-cancer-genomics-by-loris-mularoni-pybcn.webp + caption: "\"Python and Cancer Genomics\" by Loris Mularoni #pybcn" + source: "https://x.com/PyBCN/status/611598407946371072" + time: "20:16" + talk: python-and-cancer-genomics --- diff --git a/content/events/meetups/2015-09-22-python-september-meetup.md b/content/events/meetups/2015-09-22-python-september-meetup.md index bd3244963..041191f8e 100644 --- a/content/events/meetups/2015-09-22-python-september-meetup.md +++ b/content/events/meetups/2015-09-22-python-september-meetup.md @@ -48,4 +48,29 @@ talks: type: talk language: en duration_minutes: 30 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/646387703106412544" + items: + - file: 2015-09-22-python-september-meetup/02-hacking-the-bcn-housing-market-by-tudor-barbu-mota.webp + caption: "Hacking the BCN housing market, by Tudor Barbu (@motanelu) #pybcn" + source: "https://x.com/PyBCN/status/646371088189014016" + time: "19:10" + - file: 2015-09-22-python-september-meetup/03-tecnicas-osint-python-by-albert-sanchez-state-x-py.webp + caption: "Técnicas OSINT & Python, by Albert Sanchez (@State_X) #pybcn" + source: "https://x.com/PyBCN/status/646376911845916672" + time: "19:33" + talk: tecnicas-osint-python + - file: 2015-09-22-python-september-meetup/01-image-processing-for-beginners-by-prassanna-ganesh.webp + caption: "Image processing for beginners, by Prassanna Ganesh #pybcn" + source: "https://x.com/PyBCN/status/646387703106412544" + time: "20:16" + talk: image-processing-for-beginners + - file: 2015-09-22-python-september-meetup/04-great-talks-thanks-skyscanner-for-the-pizza-beers.webp + caption: "Great talks! Thanks @Skyscanner for the pizza & beers! #pybcn" + source: "https://x.com/PyBCN/status/646400405795115008" + time: "21:07" --- diff --git a/content/events/meetups/2015-10-22-python-october-meetup.md b/content/events/meetups/2015-10-22-python-october-meetup.md index d7f462344..63b131a20 100644 --- a/content/events/meetups/2015-10-22-python-october-meetup.md +++ b/content/events/meetups/2015-10-22-python-october-meetup.md @@ -52,4 +52,32 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=Nb4mJEn04rY" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/657245171701166080" + items: + - file: 2015-10-22-python-october-meetup/01-ofxpython-embedding-python-into-c-by-carles-f-juli.webp + caption: "\"ofxPython: embedding Python into C++\", by Carles F. Julià (@chaosct) #pybcn" + source: "https://x.com/PyBCN/status/657245171701166080" + time: "19:20" + talk: ofxpython-embedding-python-into-c + - file: 2015-10-22-python-october-meetup/02-web-crawling-with-notebook-and-selenium-by-silvia.webp + caption: "\"Web crawling with Notebook and Selenium\", by Silvia Puglisi (@nopressure) #pybcn" + source: "https://x.com/PyBCN/status/657257370347806720" + time: "20:09" + talk: web-crawling-with-notebook-and-selenium + - file: 2015-10-22-python-october-meetup/03-data-structures-beyond-dicts-and-lists-by-sergi-so.webp + caption: "\"Data structures beyond dicts and lists\", by Sergi Sorribas #pybcn" + source: "https://x.com/PyBCN/status/657260707470290944" + time: "20:22" + talk: data-structures-beyond-dicts-and-lists + - file: 2015-10-22-python-october-meetup/01-api-by-example-by-carles-barrobes-technomilk-pybcn.webp + caption: "\"Api By Example\", by Carles Barrobés (@technomilk) #pybcn" + source: "https://x.com/PyBCN/status/657242234404872193" + time: "19:08" + talk: api-by-example + --- diff --git a/content/events/meetups/2015-11-26-python-november-meetup.md b/content/events/meetups/2015-11-26-python-november-meetup.md index e34dd14d0..64a6f2145 100644 --- a/content/events/meetups/2015-11-26-python-november-meetup.md +++ b/content/events/meetups/2015-11-26-python-november-meetup.md @@ -36,4 +36,17 @@ talks: title: "Python descriptors in detail" speakers: [pablo-enfedaque-vidal] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/669952673492373504" + items: + - file: 2015-11-26-python-november-meetup/01-now-is-xorduna-turn-using-telegram-as-an-interface.webp + caption: "Now is @xorduna turn! Using Telegram as an interface for an LED wall by Xavier Orduña. #pybcn" + source: "https://x.com/PyBCN/status/669952673492373504" + time: "19:55" + talk: using-telegram-as-an-interface-for-an-led-wall + --- diff --git a/content/events/meetups/2015-12-01-python-for-data-analysis-introduction-to-pandas.md b/content/events/meetups/2015-12-01-python-for-data-analysis-introduction-to-pandas.md index 9e7c39cb0..929bda58d 100644 --- a/content/events/meetups/2015-12-01-python-for-data-analysis-introduction-to-pandas.md +++ b/content/events/meetups/2015-12-01-python-for-data-analysis-introduction-to-pandas.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: 'Python for data analysis: introduction to Pandas' +title: "PyLadies BCN Workshop, December 2015" date: 2015-12-01 year: 2015 venue: UPF, Campus de la Comunicación - Poblenou diff --git a/content/events/meetups/2015-12-17-python-december-meetup.md b/content/events/meetups/2015-12-17-python-december-meetup.md index 4e903fc15..4106ece2a 100644 --- a/content/events/meetups/2015-12-17-python-december-meetup.md +++ b/content/events/meetups/2015-12-17-python-december-meetup.md @@ -45,4 +45,27 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=pTFM5-ur8e8" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/677552945223831552" + items: + - file: 2015-12-17-python-december-meetup/01-functional-programming-by-guillermo-blasco-theblac.webp + caption: "Functional programming, by Guillermo Blasco (@theblackboxio) #pybcn" + source: "https://x.com/PyBCN/status/677552945223831552" + time: "19:16" + talk: functional-programming + - file: 2015-12-17-python-december-meetup/02-ipython-parallel-by-jordi-deu-pons-elbioc-pybcn.webp + caption: "IPython parallel, by Jordi Deu-Pons (@elbioc) #pybcn" + source: "https://x.com/PyBCN/status/677563742884884484" + time: "19:59" + talk: ipython-parallel + - file: 2015-12-17-python-december-meetup/01-python-for-porn-by-gabriel-gavilan-gabriicom-pybcn.webp + caption: "Python for porn, by Gabriel Gavilan (@gabriicom) #pybcn" + source: "https://x.com/PyBCN/status/677574110046789632" + time: "20:40" + talk: python-for-porn + --- diff --git a/content/events/meetups/2016-01-21-python-january-meetup.md b/content/events/meetups/2016-01-21-python-january-meetup.md index c8f826521..ba41eb1e7 100644 --- a/content/events/meetups/2016-01-21-python-january-meetup.md +++ b/content/events/meetups/2016-01-21-python-january-meetup.md @@ -36,4 +36,25 @@ talks: title: "Tracking Django errors with rollbar" speakers: [antonio-barcia-garcia] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/690235396987420676" + items: + - file: 2016-01-21-python-january-meetup/01-a-journey-to-using-an-encryption-standard-in-pytho.webp + caption: "\"A journey to using an encryption standard in python\" by Daniel Moreno #pybcn" + source: "https://x.com/PyBCN/status/690235396987420676" + time: "19:11" + talk: a-journey-to-using-an-encryption-standard-in-python + - file: 2016-01-21-python-january-meetup/03-recommendation-systems-in-python-by-biel-aparicio.webp + caption: "\"Recommendation Systems in Python\" by Biel Aparicio y David Arazo #pybcn" + source: "https://x.com/PyBCN/status/690241657896308736" + time: "19:36" + - file: 2016-01-21-python-january-meetup/02-tracking-django-errors-with-rollbar-by-antonio-bar.webp + caption: "\"Tracking Django errors with Rollbar\" by Antonio Barcia (@ygneo) #pybcn" + source: "https://x.com/PyBCN/status/690252231979966464" + time: "20:18" + talk: tracking-django-errors-with-rollbar --- diff --git a/content/events/meetups/2016-01-26-django-1-introduction-to-django-models.md b/content/events/meetups/2016-01-26-django-1-introduction-to-django-models.md index 060509766..1c7e47242 100644 --- a/content/events/meetups/2016-01-26-django-1-introduction-to-django-models.md +++ b/content/events/meetups/2016-01-26-django-1-introduction-to-django-models.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Django 1: Introduction to Django Models" +title: "PyLadies BCN Workshop, January 2016" date: 2016-01-26 year: 2016 venue: "UPF, Campus de la Comunicación - Poblenou" diff --git a/content/events/meetups/2016-02-18-python-february-meetup.md b/content/events/meetups/2016-02-18-python-february-meetup.md index b9dbe9949..e0e1cbd8a 100644 --- a/content/events/meetups/2016-02-18-python-february-meetup.md +++ b/content/events/meetups/2016-02-18-python-february-meetup.md @@ -36,4 +36,29 @@ talks: title: "Django Channels: beyond request and response" speakers: [aitor-guevara] type: talk +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/700382389114183681" + items: + - file: 2016-02-18-python-february-meetup/01-our-first-speaker-gabimaeztu-speaking-about-bokeh.webp + caption: "Our first speaker! @gabimaeztu speaking about Bokeh! \"Bokeh: from zero to contributor\"" + source: "https://x.com/PyBCN/status/700382389114183681" + time: "19:12" + talk: bokeh-from-zero-to-contributor + - file: 2016-02-18-python-february-meetup/03-amazing-brain-connections-represented-using-bokeh.webp + caption: "Amazing brain connections represented using Bokeh! Thanks @gabimaeztu for coming! #pybcn" + source: "https://x.com/PyBCN/status/700385590571827200" + time: "19:25" + - file: 2016-02-18-python-february-meetup/02-now-life-coding-packaging-deploying-and-running-a.webp + caption: "Now \"Life coding, packaging, deploying and running a dummy microservice with Python and Docker\" turn! @javier_arilos" + source: "https://x.com/PyBCN/status/700387960420696064" + time: "19:34" + talk: life-coding-packaging-deploying-and-running-a-dummy + - file: 2016-02-18-python-february-meetup/04-last-questions-to-aitorciki-nice-to-have-you-again.webp + caption: "Last questions to @aitorciki. Nice to have you again in #pybcn. Thanks!" + source: "https://x.com/PyBCN/status/700409478294929408" + time: "21:00" --- diff --git a/content/events/meetups/2016-03-01-django-2-views-templates.md b/content/events/meetups/2016-03-01-django-2-views-templates.md index 2c387bb19..6f3707f17 100644 --- a/content/events/meetups/2016-03-01-django-2-views-templates.md +++ b/content/events/meetups/2016-03-01-django-2-views-templates.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Django 2: Views & templates" +title: "PyLadies BCN Workshop, March 2016" date: 2016-03-01 year: 2016 venue: "UPF, Campus de la Comunicación - Poblenou" diff --git a/content/events/meetups/2016-03-17-python-march-meetup.md b/content/events/meetups/2016-03-17-python-march-meetup.md index 991824773..43c24d1aa 100644 --- a/content/events/meetups/2016-03-17-python-march-meetup.md +++ b/content/events/meetups/2016-03-17-python-march-meetup.md @@ -45,4 +45,30 @@ talks: url: https://www.youtube.com/watch?v=3V1AEXT3PrI speakers: - israel-saeta-perez +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/710528772924153856" + items: + - file: 2016-03-17-python-march-meetup/01-piggybacking-trello-for-automatic-student-assessme.webp + caption: "Piggybacking Trello for automatic student assessment, by Jordi Saludes (@jsaludes) #pybcn" + source: "https://x.com/PyBCN/status/710528772924153856" + time: "19:10" + talk: piggybacking-trello-for-automatic-student-assessment + - file: 2016-03-17-python-march-meetup/02-computational-complexity-in-python-by-jordi-souche.webp + caption: "Computational complexity in Python, by Jordi Soucheiron (@jordixou) #pybcn" + source: "https://x.com/PyBCN/status/710536419798859776" + time: "19:40" + talk: computational-complexity-in-python + - file: 2016-03-17-python-march-meetup/03-sklearn-pandas-streamline-your-model-building-proc.webp + caption: "sklearn-pandas: streamline your model building process, by Israel Saeta (@dukebody) #pybcn" + source: "https://x.com/PyBCN/status/710548634962632706" + time: "20:29" + talk: sklearn-pandas-streamline-your-model-building-process + - file: 2016-03-17-python-march-meetup/04-photo.webp + caption: "A slide of the talk: the scikit-learn logo, a broken heart, and a panda, with the note \"improved in sklearn>=0.16!\"" + source: "https://x.com/PyBCN/status/710550278043508737" + time: "20:36" --- diff --git a/content/events/meetups/2016-04-21-python-april-meetup.md b/content/events/meetups/2016-04-21-python-april-meetup.md index 53b442d5d..23f9bd980 100644 --- a/content/events/meetups/2016-04-21-python-april-meetup.md +++ b/content/events/meetups/2016-04-21-python-april-meetup.md @@ -64,4 +64,37 @@ talks: session_videos: - title: "Lightning Talk Session" url: "https://www.youtube.com/watch?v=R3R9q5mf8Uw" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/723196695870377984" + items: + - file: 2016-04-21-python-april-meetup/01-ingesting-35-million-hotel-images-with-python-in-t.webp + caption: "Ingesting 35 Million Hotel Images With Python In The Cloud, by Alex Vinyals (@alevinval) #pybcn" + source: "https://x.com/PyBCN/status/723196695870377984" + time: "19:08" + talk: ingesting-35-million-hotel-images-with-python-in-the-cloud + - file: 2016-04-21-python-april-meetup/02-introduction-to-testing-and-py-test-by-ignasi-fosc.webp + caption: "Introduction to testing and py.test, by Ignasi Fosch (@ifosch) #pybcn" + source: "https://x.com/PyBCN/status/723203784336388096" + time: "19:36" + talk: introduction-to-testing-and-py-test + - file: 2016-04-21-python-april-meetup/03-bots-are-the-new-hype-long-life-to-slackbot-by-gab.webp + caption: "Bots are the new hype. Long life to slackbot, by Gabriel de Maeztu (@gabimaeztu) #pybcn #santi" + source: "https://x.com/PyBCN/status/723215165223755776" + time: "20:21" + talk: bots-are-the-new-hype-long-life-to-slackbot + - file: 2016-04-21-python-april-meetup/04-accloudtant-tool-for-managing-aws-costs-by-ignasi.webp + caption: "Accloudtant - tool for managing AWS costs, by Ignasi Fosch (@ifosch): https://github.com/ifosch/accloudtant #pybcn" + source: "https://x.com/PyBCN/status/723217460896382976" + time: "20:30" + talk: accloudtant-tool-for-managing-aws-costs + - file: 2016-04-21-python-april-meetup/05-comprehensions-in-5-min-by-jordi-soucheiron-jordix.webp + caption: "Comprehensions in 5 min, by Jordi Soucheiron (@jordixou) #pybcn" + source: "https://x.com/PyBCN/status/723219991227707392" + time: "20:40" + talk: comprehensions-in-5-min + --- diff --git a/content/events/meetups/2016-06-16-python-june-meetup.md b/content/events/meetups/2016-06-16-python-june-meetup.md index 54546c531..e09965bf2 100644 --- a/content/events/meetups/2016-06-16-python-june-meetup.md +++ b/content/events/meetups/2016-06-16-python-june-meetup.md @@ -45,4 +45,25 @@ talks: links: - type: video url: https://www.youtube.com/watch?v=YFfnKTB362c +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/743490975662747648" + items: + - file: 2016-06-16-python-june-meetup/01-machine-learning-for-dummies-with-python-by-javier.webp + caption: "\"Machine Learning for Dummies with Python\", by Javier Arias Losada (@javier_arilos) #pybcn" + source: "https://x.com/PyBCN/status/743490975662747648" + time: "19:10" + talk: machine-learning-for-dummies-with-python + - file: 2016-06-16-python-june-meetup/03-how-to-solve-a-complex-problem-using-machine-learn.webp + caption: "How to solve a complex problem using Machine Learning #pybcn" + source: "https://x.com/PyBCN/status/743494244170600448" + time: "19:23" + - file: 2016-06-16-python-june-meetup/02-geodjango-use-case-mapping-farmer-fields-all-over.webp + caption: "\"GeoDjango Use Case: Mapping Farmer Fields all over Spain for @Agroptima\" by Domènec Castillo & John Powell #pybcn" + source: "https://x.com/PyBCN/status/743506225913073665" + time: "20:11" + talk: geodjango-use-case-mapping-farmer-fields-all-over-spain-for --- diff --git a/content/events/meetups/2016-07-28-python-july-meetup.md b/content/events/meetups/2016-07-28-python-july-meetup.md index 7dd4bd313..7d9865a8d 100644 --- a/content/events/meetups/2016-07-28-python-july-meetup.md +++ b/content/events/meetups/2016-07-28-python-july-meetup.md @@ -44,4 +44,22 @@ talks: url: "https://www.youtube.com/watch?v=S-8tyE62unI" - type: site url: "https://kinto.readthedocs.io" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/758711749356953600" + items: + - file: 2016-07-28-python-july-meetup/01-efficient-django-by-david-arcos-dzpm-pybcn.webp + caption: "Efficient Django by David Arcos (@DZPM) #pybcn" + source: "https://x.com/PyBCN/status/758711749356953600" + time: "19:12" + talk: efficient-django + - file: 2016-07-28-python-july-meetup/02-kinto-a-minimalist-json-storage-service-by-mathieu.webp + caption: "Kinto - A minimalist JSON storage service by Mathieu Leplatre (@leplatrem) #pybcn" + source: "https://x.com/PyBCN/status/758729659164921856" + time: "20:23" + talk: kinto-a-minimalist-json-storage-service + --- diff --git a/content/events/meetups/2016-10-20-python-october-meetup.md b/content/events/meetups/2016-10-20-python-october-meetup.md index e3e1472e1..c16c05b47 100644 --- a/content/events/meetups/2016-10-20-python-october-meetup.md +++ b/content/events/meetups/2016-10-20-python-october-meetup.md @@ -42,4 +42,30 @@ talks: type: talk duration_minutes: 25 description: "Basic introduction to tornado." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/789152943681499136" + items: + - file: 2016-10-20-python-october-meetup/04-about-to-start-october-s-meetup-full-house-pybcn.webp + caption: "About to start October's meetup. Full house! #pybcn" + source: "https://x.com/PyBCN/status/789151624086298624" + time: "19:09" + - file: 2016-10-20-python-october-meetup/01-how-to-avoid-sql-with-dataset-pandas-and-blaze-by.webp + caption: "\"How to avoid SQL with dataset, pandas, and blaze\" by Gabriel de Maeztu (@gabimaeztu) #pybcn" + source: "https://x.com/PyBCN/status/789152943681499136" + time: "19:14" + talk: how-to-avoid-sql-with-dataset-pandas-and-blaze + - file: 2016-10-20-python-october-meetup/02-best-practices-for-a-python-project-by-enrique-sae.webp + caption: "\"Best practices for a Python project\" by Enrique Sáez #pybcn" + source: "https://x.com/PyBCN/status/789159836730679296" + time: "19:42" + talk: best-practices-for-a-python-project + - file: 2016-10-20-python-october-meetup/03-tornado-an-asynchronous-web-framework-and-network.webp + caption: "\"Tornado: An asynchronous web framework and network library\" by Jordi Soucheiron (@jordixou) #pybcn" + source: "https://x.com/PyBCN/status/789169711959330817" + time: "20:21" + talk: tornado-an-asynchronous-web-framework-and-network-library --- diff --git a/content/events/meetups/2016-11-17-python-november-meetup.md b/content/events/meetups/2016-11-17-python-november-meetup.md index 0c5a1ee9f..c6301bc09 100644 --- a/content/events/meetups/2016-11-17-python-november-meetup.md +++ b/content/events/meetups/2016-11-17-python-november-meetup.md @@ -49,4 +49,27 @@ talks: description: On the Plone Community we have different efforts for 2020. One of them is switching from actual Zope Stack to a different backend that holds content in a ZODB, with modern technologies and python 3. Plone.server is an experiemental Framework to build Content based REST API services based on a asyncio loop and a object database called ZODB. speakers: - ramon-navarro-bosch +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/799313832703365121" + items: + - file: 2016-11-17-python-november-meetup/01-ajuntament-de-barcelona-inicia-el-desarrollo-de-su.webp + caption: "\"Ajuntament de Barcelona inicia el desarrollo de sus sistema core-business en Python/Django\", por Xavi Roca (@XaviRocaV) y Montse Comaposada" + source: "https://x.com/PyBCN/status/799313832703365121" + time: "19:10" + talk: ajuntament-de-barcelona-inicia-el-desarrollo-de-sus-sistema + - file: 2016-11-17-python-november-meetup/02-introduction-to-conda-by-ignasi-fosch-ifosch.webp + caption: "\"Introduction to Conda\", by Ignasi Fosch (@ifosch)" + source: "https://x.com/PyBCN/status/799322408410894336" + time: "19:44" + talk: introduction-to-conda + - file: 2016-11-17-python-november-meetup/03-plone-server-rest-api-async-framework-for-cms-by-r.webp + caption: "\"plone.server - REST API async framework for CMS\", by Ramon Navarro (@bloodbare)" + source: "https://x.com/PyBCN/status/799334257340588032" + time: "20:31" + talk: plone-server-rest-api-async-framework-for-cms + --- diff --git a/content/events/meetups/2016-12-05-scalable-machine-learning-in-r-and-python-with-h2o.md b/content/events/meetups/2016-12-05-scalable-machine-learning-in-r-and-python-with-h2o.md index 55e2bcf2b..cdbcc8224 100644 --- a/content/events/meetups/2016-12-05-scalable-machine-learning-in-r-and-python-with-h2o.md +++ b/content/events/meetups/2016-12-05-scalable-machine-learning-in-r-and-python-with-h2o.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Scalable Machine Learning in R and Python with H2O" +title: "PyLadies BCN Workshop, December 2016" date: 2016-12-05 year: 2016 venue: "Edifici Històric UB (Aula B7)" diff --git a/content/events/meetups/2017-02-16-python-february-meetup.md b/content/events/meetups/2017-02-16-python-february-meetup.md index d43f5da50..2a1b96fec 100644 --- a/content/events/meetups/2017-02-16-python-february-meetup.md +++ b/content/events/meetups/2017-02-16-python-february-meetup.md @@ -38,4 +38,26 @@ talks: language: en duration_minutes: 45 description: "GraphQL is a query language for APIs developed by Facebook that overcomes many limitations of REST to make web app development more flexible and powerful. In this talk we will introduce its main features and show how to create an example GraphQL app with Graphene and Django." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/832290684031868929" + items: + - file: 2017-02-16-python-february-meetup/01-python-cryptography-101-by-giorgio-zoppi-jo-zoppi.webp + caption: "\"Python Cryptography 101\", by Giorgio Zoppi (@jo_zoppi) #pybcn" + source: "https://x.com/PyBCN/status/832290684031868929" + time: "19:08" + talk: python-cryptography-101 + - file: 2017-02-16-python-february-meetup/02-modern-web-development-with-graphql-by-israel-saet.webp + caption: "\"Modern web development with GraphQL\", by Israel Saeta Pérez (@dukebody) #pybcn" + source: "https://x.com/PyBCN/status/832295162575482883" + time: "19:26" + talk: modern-web-development-with-graphql + - file: 2017-02-16-python-february-meetup/03-thanks-to-travelperk-for-providing-us-with-the-gre.webp + caption: "Thanks to @travelperk for providing us with the great venue, pizza and drinks! #pybcn" + source: "https://x.com/PyBCN/status/832308538496139264" + time: "20:19" + --- diff --git a/content/events/meetups/2017-02-18-february-dojo-understanding-sockets.md b/content/events/meetups/2017-02-18-february-dojo-understanding-sockets.md index ca32f2369..d92490010 100644 --- a/content/events/meetups/2017-02-18-february-dojo-understanding-sockets.md +++ b/content/events/meetups/2017-02-18-february-dojo-understanding-sockets.md @@ -31,4 +31,15 @@ talks: links: - type: site url: "https://en.wikipedia.org/wiki/Berkeley_sockets" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/832999756796461057" + items: + - file: 2017-02-18-february-dojo-understanding-sockets/01-session-about-sockets-by-jaume-mila-at-pybcn-febru.webp + caption: "Session about sockets by Jaume Mila at @pybcn February dojo" + source: "https://x.com/PyBCN/status/832999756796461057" + time: "18:06" --- diff --git a/content/events/meetups/2017-03-16-python-march-meetup.md b/content/events/meetups/2017-03-16-python-march-meetup.md index a83d16030..66b4a5356 100644 --- a/content/events/meetups/2017-03-16-python-march-meetup.md +++ b/content/events/meetups/2017-03-16-python-march-meetup.md @@ -45,4 +45,25 @@ talks: language: en duration_minutes: 30 description: "A small presentation on using celery as a fast option to build scalable bots in both platforms. Tips and tricks included!" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/842457421687738370" + items: + - file: 2017-03-16-python-march-meetup/02-data-visualisation-with-python-plotly-by-giovanni.webp + caption: "\"Data visualisation with Python & Plotly\", by Giovanni Perna #pybcn" + source: "https://x.com/PyBCN/status/842439670910857219" + time: "19:17" + talk: data-visualisation-with-python-plotly + - file: 2017-03-16-python-march-meetup/03-como-automatizamos-la-edicion-de-podcast-entredevy.webp + caption: "\"Cómo automatizamos la edición de podcast @EntreDevYOps\", by David Acacio (@david_acacio) #pybcn" + source: "https://x.com/PyBCN/status/842445808909881344" + time: "19:41" + - file: 2017-03-16-python-march-meetup/01-using-celery-for-bots-slack-and-telegram-by-xavier.webp + caption: "\"Using celery for bots (Slack and Telegram)\", by Xavier Orduña (@xorduna) #pybcn" + source: "https://x.com/PyBCN/status/842457421687738370" + time: "20:27" + talk: using-celery-for-bots-slack-and-telegram --- diff --git a/content/events/meetups/2017-04-20-python-april-meetup.md b/content/events/meetups/2017-04-20-python-april-meetup.md index ff73212fb..daee560b2 100644 --- a/content/events/meetups/2017-04-20-python-april-meetup.md +++ b/content/events/meetups/2017-04-20-python-april-meetup.md @@ -38,4 +38,22 @@ talks: language: en duration_minutes: 30 description: "Examples of usage of cProfiler, line profiler and memory profiler to detect performance problems on data analysis algorithms." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/855107420997201920" + items: + - file: 2017-04-20-python-april-meetup/01-python-performance-profiling-for-data-analysis-by.webp + caption: "\"Python performance profiling for data analysis\", by Jordi Deu-Pons (@elbioc) #pybcn" + source: "https://x.com/PyBCN/status/855107420997201920" + time: "19:14" + talk: python-performance-profiling-for-data-analysis + - file: 2017-04-20-python-april-meetup/02-when-your-dataframe-is-bigger-than-your-ram-what-s.webp + caption: "\"When your dataframe is bigger than your RAM what's next ?\" by Gabriel de Maeztu (@gabimaeztu) #pybcn" + source: "https://x.com/PyBCN/status/855116974610948096" + time: "19:52" + talk: when-your-dataframe-is-bigger-than-your-ram-what-s-next + --- diff --git a/content/events/meetups/2017-06-15-python-june-meetup.md b/content/events/meetups/2017-06-15-python-june-meetup.md index f05bca085..6a2c99df4 100644 --- a/content/events/meetups/2017-06-15-python-june-meetup.md +++ b/content/events/meetups/2017-06-15-python-june-meetup.md @@ -45,4 +45,38 @@ talks: language: en duration_minutes: 25 description: "Scala is the language showing fastest growth in the data science and engineering field. In an area where Python is king, what is so special about Scala? In this talk I'll introduce some of the concepts and ideas that make Scala compelling, and how they relate to how we work with Python." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/875402167921856512" + items: + - file: 2017-06-15-python-june-meetup/01-tiendeo-high-level-reporting-with-office-libraries.webp + caption: "\"@Tiendeo : high level reporting with office libraries and python\" by Antonio Escartin #pybcn" + source: "https://x.com/PyBCN/status/875402167921856512" + time: "19:18" + talk: tiendeo-high-level-reporting-with-office-libraries-and + - file: 2017-06-15-python-june-meetup/02-plenty-of-good-questions-for-antonio-pybcn.webp + caption: "Plenty of good questions for Antonio! #pybcn" + source: "https://x.com/PyBCN/status/875405763665166337" + time: "19:32" + - file: 2017-06-15-python-june-meetup/03-deep-learning-for-signal-processing-by-marius-miro.webp + caption: "\"Deep Learning for Signal Processing\", by Marius Miron #pybcn" + source: "https://x.com/PyBCN/status/875406243837378560" + time: "19:34" + talk: deep-learning-for-signal-processing + - file: 2017-06-15-python-june-meetup/04-snakes-ladders-a-taste-of-scala-for-pythonistas-by.webp + caption: "\"Snakes & ladders: A taste of Scala for pythonistas\", by Ruben Berenguel (@berenguel) #pybcn" + source: "https://x.com/PyBCN/status/875412321245569024" + time: "19:58" + talk: snakes-ladders-a-taste-of-scala-for-pythonistas + - file: 2017-06-15-python-june-meetup/05-learn-some-scala-and-come-back-to-python-berenguel.webp + caption: "Learn some scala, and come back to Python! - @berenguel #pybcn" + source: "https://x.com/PyBCN/status/875417577631207424" + time: "20:19" + - file: 2017-06-15-python-june-meetup/06-post-meetup-networking-while-enjoying-awesome-view.webp + caption: "Post-meetup networking, while enjoying awesome views. Thanks @Tiendeo for hosting us! #pybcn" + source: "https://x.com/PyBCN/status/875419053090906112" + time: "20:25" --- diff --git a/content/events/meetups/2017-09-21-python-september-meetup.md b/content/events/meetups/2017-09-21-python-september-meetup.md index 142010be9..3442204c5 100644 --- a/content/events/meetups/2017-09-21-python-september-meetup.md +++ b/content/events/meetups/2017-09-21-python-september-meetup.md @@ -45,4 +45,42 @@ talks: language: en duration_minutes: 30 description: "Geotracking is a tool developed by Tiendeo that measures the impact of digital campaings in the real world andallow companies to get a better picture of their customers. Based in python, Tiendeo Geotracking is an analysis tool that combines data from multiples sources (geolocation, product-based information) mixed with in-house developed algorithms in order to obtain valuable KPI'S from big data." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/910917280695033856" + items: + - file: 2017-09-21-python-september-meetup/07-about-to-start-september-s-python-meetup-at-tiende.webp + caption: "About to start September's Python Meetup at @Tiendeo!" + source: "https://x.com/PyBCN/status/910915174718164993" + time: "19:14" + - file: 2017-09-21-python-september-meetup/01-python-for-robotics-a-quick-introduction-to-rospy.webp + caption: "Python for robotics: a quick introduction to rospy, by @jotape #pybcn" + source: "https://x.com/PyBCN/status/910917280695033856" + time: "19:22" + talk: python-for-robotics-a-quick-introduction-to-rospy + - file: 2017-09-21-python-september-meetup/02-demo-face-detection-with-rospy.webp + caption: "Demo: face detection with rospy" + source: "https://x.com/PyBCN/status/910920907048222720" + time: "19:37" + - file: 2017-09-21-python-september-meetup/03-fun-with-python-and-c-by-jomsdev-pybcn.webp + caption: "Fun with Python and C++, by @jomsdev #pybcn" + source: "https://x.com/PyBCN/status/910923502923939841" + time: "19:47" + talk: fun-with-python-and-c + - file: 2017-09-21-python-september-meetup/04-live-demo.webp + caption: "Live demo!" + source: "https://x.com/PyBCN/status/910930108730499072" + time: "20:13" + - file: 2017-09-21-python-september-meetup/05-tiendeo-geotracking-from-online-to-store-by-ernest.webp + caption: "Tiendeo Geotracking: From Online to Store, by Ernest Carbonell from @Tiendeo #pybcn" + source: "https://x.com/PyBCN/status/910931864914939906" + time: "20:20" + talk: tiendeo-geotracking-from-online-to-store + - file: 2017-09-21-python-september-meetup/06-lets-manage-lots-of-pickles-rick.webp + caption: "Lets manage lots of pickles! #Rick" + source: "https://x.com/PyBCN/status/910935135859683333" + time: "20:33" --- diff --git a/content/events/meetups/2017-10-26-kiwi-com-python-meetup.md b/content/events/meetups/2017-10-26-kiwi-com-python-meetup.md index 7a781bd66..0bbd23208 100644 --- a/content/events/meetups/2017-10-26-kiwi-com-python-meetup.md +++ b/content/events/meetups/2017-10-26-kiwi-com-python-meetup.md @@ -39,4 +39,38 @@ talks: speakers: [petr-joachim] type: talk description: "In this session Petr will show you how to dig into code reviews on practical examples with explanations. How to approach them, what to look for and, finally, how to return feedback to the programmer who wrote the code? All of those questions will be covered." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/923603730792148992" + items: + - file: 2017-10-26-kiwi-com-python-meetup/04-hi-newcomers-check-https-pybcn-org-and-welcome-to.webp + caption: "Hi newcomers, check https://pybcn.org and welcome to PyBCN!" + source: "https://x.com/PyBCN/status/923593892406194176" + time: "18:55" + - file: 2017-10-26-kiwi-com-python-meetup/01-introduction-to-dronekit-creating-apps-for-uavs-wi.webp + caption: "Introduction to DroneKit: creating apps for UAVs with Python, by Dimitri Herrero" + source: "https://x.com/PyBCN/status/923603730792148992" + time: "19:34" + talk: introduction-to-dronekit-creating-apps-for-uavs-with-python + - file: 2017-10-26-kiwi-com-python-meetup/05-dronekit-demo-time.webp + caption: "Dronekit, demo time!" + source: "https://x.com/PyBCN/status/923608916730277889" + time: "19:55" + - file: 2017-10-26-kiwi-com-python-meetup/02-python-memory-management-by-robert-kuska.webp + caption: "Python Memory Management, by Robert Kuska" + source: "https://x.com/PyBCN/status/923613717614530561" + time: "20:14" + talk: python-memory-management + - file: 2017-10-26-kiwi-com-python-meetup/03-the-secret-art-of-code-reviews-by-petr-joachim.webp + caption: "The secret art of code reviews, by Petr Joachim" + source: "https://x.com/PyBCN/status/923623310604296192" + time: "20:52" + talk: secret-art-of-code-reviews + - file: 2017-10-26-kiwi-com-python-meetup/06-iveta-is-doing-a-quizz-and-giving-away-kiwi-com-vo.webp + caption: "Iveta is doing a quizz, and giving away Kiwi•com vouchers to the winners! Thanks!" + source: "https://x.com/PyBCN/status/923629733383950336" + time: "21:17" --- diff --git a/content/events/meetups/2017-11-23-python-november-meetup.md b/content/events/meetups/2017-11-23-python-november-meetup.md index d866a6ab7..9b629c4a8 100644 --- a/content/events/meetups/2017-11-23-python-november-meetup.md +++ b/content/events/meetups/2017-11-23-python-november-meetup.md @@ -45,4 +45,27 @@ talks: language: en duration_minutes: 30 description: "In TravelPerk, we have achieved the continuous deployment of our current application stack. In this talk we will explain and show how we achieved it, the challenges we faced and the tools we have used. Also we will show possible alternatives to our current implementation." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/933759562452230149" + items: + - file: 2017-11-23-python-november-meetup/01-websockets-and-chatbots-by-cfenollosa-pybcn.webp + caption: "Websockets and chatbots, by @cfenollosa #pybcn" + source: "https://x.com/PyBCN/status/933759562452230149" + time: "19:10" + talk: websockets-and-chatbots + - file: 2017-11-23-python-november-meetup/02-cffi-interfacing-c-libraries-using-python-by-gerar.webp + caption: "cffi: Interfacing C libraries using Python, by Gerard Marull #pybcn" + source: "https://x.com/PyBCN/status/933768251255001088" + time: "19:44" + talk: cffi-interfacing-c-libraries-using-python + - file: 2017-11-23-python-november-meetup/03-continuous-deployment-of-web-applications-the-trav.webp + caption: "Continuous deployment of Web Applications: The @TravelPerk example, by Dave García #pybcn" + source: "https://x.com/PyBCN/status/933776911855210496" + time: "20:18" + talk: continuous-deployment-of-web-applications-the-travelperk + --- diff --git a/content/events/meetups/2017-12-20-python-december-meetup.md b/content/events/meetups/2017-12-20-python-december-meetup.md index 87c5edc3e..51023ec8b 100644 --- a/content/events/meetups/2017-12-20-python-december-meetup.md +++ b/content/events/meetups/2017-12-20-python-december-meetup.md @@ -40,4 +40,25 @@ talks: description: The use of Python for Astronomy has been rising in the last few years, and now there are more and more applications for Aerospace as well. In this talk we will describe orbit-predictor, a Python library to track Earth-orbiting artificial satellites open sourced this year by Satellogic, and poliastro, a community developed, open source Python library for interplanetary orbit computation and interactive visualization. The development of these libraries posed several interesting challenges aside from the algorithms themselves, such as the need of careful validation against external data from NASA and other sources, acceleration of some core parts using numba to replace FORTRAN code, and thoughtful design of the API to simplify physical unit and astronomical time scales handling on the user side. We will discuss the impact of these challenges on the development, highlight the strengths and limitations of Python for these specific applications and, of course, show some cool pictures of rockets. speakers: - juan-luis-cano-rodriguez +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/943545149052915712" + items: + - file: 2017-12-20-python-december-meetup/01-why-lazy-developers-write-beautiful-code-by-javier.webp + caption: "Why lazy developers write beautiful code?, by Javier Arias (@javier_arilos)" + source: "https://x.com/PyBCN/status/943545149052915712" + time: "19:14" + talk: why-lazy-developers-write-beautiful-code + - file: 2017-12-20-python-december-meetup/02-catching-asteroids-and-tracking-satellites-with-py.webp + caption: "Catching asteroids and tracking satellites with Python, by Juan Luis Cano (@astrojuanlu)" + source: "https://x.com/PyBCN/status/943559036171116549" + time: "20:09" + talk: catching-asteroids-and-tracking-satellites-with-python + - file: 2017-12-20-python-december-meetup/03-it-s-very-difficult-to-get-external-data-to-test-y.webp + caption: "\"It's very difficult to get external data to test your algorithm\" - @astrojuanlu" + source: "https://x.com/PyBCN/status/943564850998870016" + time: "20:32" --- diff --git a/content/events/meetups/2018-01-17-python-january-meetup.md b/content/events/meetups/2018-01-17-python-january-meetup.md index 6ec99233c..f368930d4 100644 --- a/content/events/meetups/2018-01-17-python-january-meetup.md +++ b/content/events/meetups/2018-01-17-python-january-meetup.md @@ -38,4 +38,25 @@ talks: language: en duration_minutes: 30 description: "Data analysis oriented comprative" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/953690942837534723" + items: + - file: 2018-01-17-python-january-meetup/03-thanks-to-bynder-for-hosting-the-barcelona-python.webp + caption: "Thanks to @bynder for hosting the Barcelona Python Meetup!" + source: "https://x.com/PyBCN/status/953690814495981569" + time: "19:09" + - file: 2018-01-17-python-january-meetup/01-exploring-generators-and-coroutines-by-mariano-ana.webp + caption: "Exploring generators and coroutines, by Mariano Anaya (@rmarianoa)" + source: "https://x.com/PyBCN/status/953690942837534723" + time: "19:10" + talk: exploring-generators-and-coroutines + - file: 2018-01-17-python-january-meetup/02-python-vs-julia-by-jordi-deu-pons-elbioc.webp + caption: "Python vs Julia, by Jordi Deu-Pons (@elbioc)" + source: "https://x.com/PyBCN/status/953703340046716928" + time: "19:59" + talk: python-vs-julia --- diff --git a/content/events/meetups/2018-01-25-gender-imbalance-in-science.md b/content/events/meetups/2018-01-25-gender-imbalance-in-science.md index 416f49685..4113bafd8 100644 --- a/content/events/meetups/2018-01-25-gender-imbalance-in-science.md +++ b/content/events/meetups/2018-01-25-gender-imbalance-in-science.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Gender Imbalance in Science" +title: "PyLadies BCN Workshop, January 2018" date: 2018-01-25 year: 2018 venue: "Skyscanner's offices" diff --git a/content/events/meetups/2018-02-22-python-february-meetup.md b/content/events/meetups/2018-02-22-python-february-meetup.md index 18d3cdfe9..22b7b921c 100644 --- a/content/events/meetups/2018-02-22-python-february-meetup.md +++ b/content/events/meetups/2018-02-22-python-february-meetup.md @@ -44,4 +44,37 @@ talks: language: en duration_minutes: 40 description: "These days, a number of frameworks to deploy FaaS based services have appeared. The purpose of this talk is to demonstrate that it is perfectly possible (and even in some cases even advisable) to deploy a manageable application without adding the additional complexity and risks that opinionated dependencies add to our software systems." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/966738901145661443" + items: + - file: 2018-02-22-python-february-meetup/03-about-to-start-today-s-meetup-pybcn.webp + caption: "About to start today's meetup! #PyBCN" + source: "https://x.com/PyBCN/status/966737392609656843" + time: "19:12" + - file: 2018-02-22-python-february-meetup/04-first-meetup-at-worldsensing-is-starting.webp + caption: "First meetup at @Worldsensing is starting" + source: "https://x.com/PyBCN/status/966738066948927488" + time: "19:14" + - file: 2018-02-22-python-february-meetup/01-using-python-for-everything-pyot-by-the-worldsensi.webp + caption: "\"Using Python for everything (PyoT)\", by the @Worldsensing team #PyBCN" + source: "https://x.com/PyBCN/status/966738901145661443" + time: "19:18" + talk: using-python-for-everything-pyot + - file: 2018-02-22-python-february-meetup/05-no-no-no-problem.webp + caption: "No ; No {} No Problem" + source: "https://x.com/PyBCN/status/966739895090864134" + time: "19:22" + - file: 2018-02-22-python-february-meetup/02-addressing-a-hard-graph-colouring-problem-in-pytho.webp + caption: "\"Addressing a hard graph colouring problem in Python\", by Joan Vilaltella (@joanvilaltella) #PyBCN" + source: "https://x.com/PyBCN/status/966745972289212422" + time: "19:46" + talk: addressing-a-hard-graph-colouring-problem-in-python + - file: 2018-02-22-python-february-meetup/06-do-we-need-a-serverless-framework-with-python-i-di.webp + caption: "\"Do we need a serverless framework? With Python, I did not\", by Cristóbal García (@xtblg) #PyBCN" + source: "https://x.com/PyBCN/status/966754057133215744" + time: "20:18" --- diff --git a/content/events/meetups/2018-02-24-february-dojo-web-spiders-with-scrapy.md b/content/events/meetups/2018-02-24-february-dojo-web-spiders-with-scrapy.md index d2decc6a8..3b8ab8126 100644 --- a/content/events/meetups/2018-02-24-february-dojo-web-spiders-with-scrapy.md +++ b/content/events/meetups/2018-02-24-february-dojo-web-spiders-with-scrapy.md @@ -28,4 +28,15 @@ talks: title: "Web spiders with Scrapy" type: workshop description: "We will explain the Scrapy architecture and show an example of a simple web spider. Then, you will have a chance to write several web spiders to compare prices from different e-commerce sites. You will work in pairs and we will be by your side to help you learn." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/967329461426409472" + items: + - file: 2018-02-24-february-dojo-web-spiders-with-scrapy/01-workshop-in-scrapy-by-dimitri-herrero-at-pybcn-doj.webp + caption: "Workshop in scrapy by Dimitri Herrero at @pybcn Dojos" + source: "https://x.com/PyBCN/status/967329461426409472" + time: "10:24" --- diff --git a/content/events/meetups/2018-03-06-data-analysis-with-jupyter-notebook-pandas-and-plotly.md b/content/events/meetups/2018-03-06-data-analysis-with-jupyter-notebook-pandas-and-plotly.md index df574f41b..1c7d178bb 100644 --- a/content/events/meetups/2018-03-06-data-analysis-with-jupyter-notebook-pandas-and-plotly.md +++ b/content/events/meetups/2018-03-06-data-analysis-with-jupyter-notebook-pandas-and-plotly.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Data analysis with Jupyter Notebook, Pandas and Plotly" +title: "PyLadies BCN Workshop, March 2018" date: 2018-03-06 year: 2018 venue: "Worldsensing" diff --git a/content/events/meetups/2018-03-22-python-march-meetup.md b/content/events/meetups/2018-03-22-python-march-meetup.md index 494a9f894..977305f03 100644 --- a/content/events/meetups/2018-03-22-python-march-meetup.md +++ b/content/events/meetups/2018-03-22-python-march-meetup.md @@ -38,4 +38,19 @@ talks: language: es duration_minutes: 40 description: "El uso de terminal y herramientas CLI es un mundo a veces desconocido y/o temido por algunos por tener una curva de aprendizaje más pronunciada que las herramientas gráficas, GUI. En esta charla se intentará explicar las ventajas de dominar el uso del terminal y del shell para ser más productivo." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/976884974145146881" + items: + - file: 2018-03-22-python-march-meetup/01-we-are-starting-our-meetup-at-the-travelperk-offic.webp + caption: "We are starting our meetup at the @travelperk offices with @toniher" + source: "https://x.com/PyBCN/status/976884974145146881" + time: "19:15" + - file: 2018-03-22-python-march-meetup/02-our-last-talk-today-by-edu2b.webp + caption: "Our last talk today, by @edu2b" + source: "https://x.com/PyBCN/status/976893710029000705" + time: "19:49" --- diff --git a/content/events/meetups/2018-04-10-very-first-hands-on-arduino-and-its-connection-to-python.md b/content/events/meetups/2018-04-10-very-first-hands-on-arduino-and-its-connection-to-python.md index af2e28461..dfdde5a3f 100644 --- a/content/events/meetups/2018-04-10-very-first-hands-on-arduino-and-its-connection-to-python.md +++ b/content/events/meetups/2018-04-10-very-first-hands-on-arduino-and-its-connection-to-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Very first hands on Arduino and its connection to Python through PySerial" +title: "PyLadies BCN Workshop, April 2018" date: 2018-04-10 year: 2018 venue: "espai30" diff --git a/content/events/meetups/2018-04-19-python-april-meetup.md b/content/events/meetups/2018-04-19-python-april-meetup.md index db885bf1e..154e25866 100644 --- a/content/events/meetups/2018-04-19-python-april-meetup.md +++ b/content/events/meetups/2018-04-19-python-april-meetup.md @@ -37,4 +37,37 @@ talks: language: en duration_minutes: 30 description: "We visited the stratosphere with a big helium-filled balloon and a long string of capsules that were ready to do some citizen science. The Koroliov 2 capsule featured a Raspberry Pi Zero running Linux and some sweet Python scripts that made the job easier." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/987032822899757056" + items: + - file: 2018-04-19-python-april-meetup/04-everything-is-ready-for-today-s-meetup.webp + caption: "Everything is ready for today's meetup!" + source: "https://x.com/PyBCN/status/987006834979598336" + time: "18:35" + - file: 2018-04-19-python-april-meetup/05-ttn-3-python-by-xose-perez-xoseperez-pybcn.webp + caption: "\"TTN <3 Python\" by Xose Pérez @xoseperez #pybcn" + source: "https://x.com/PyBCN/status/987014949636632578" + time: "19:07" + talk: ttn-3-python + - file: 2018-04-19-python-april-meetup/06-coverage-of-lora-networks-in-barcelona-europe-chec.webp + caption: "Coverage of LoRa networks in Barcelona & Europe. Check https://ttnmapper.org" + source: "https://x.com/PyBCN/status/987020397651595267" + time: "19:29" + - file: 2018-04-19-python-april-meetup/01-high-altitude-python-to-the-stratosphere-and-back.webp + caption: "\"High Altitude Python: to the stratosphere and back again\" by Juampe López (@jotape) #pybcn" + source: "https://x.com/PyBCN/status/987032822899757056" + time: "20:18" + talk: high-altitude-python + - file: 2018-04-19-python-april-meetup/02-the-traffic-controllers-tell-the-planes-that-there.webp + caption: "\"The traffic controllers tell the planes that there are some nerds playing with balloons\" - Juampe" + source: "https://x.com/PyBCN/status/987034514177318913" + time: "20:25" + - file: 2018-04-19-python-april-meetup/03-linux-and-python-are-a-safe-bet-for-embedded-proje.webp + caption: "\"Linux and Python are a safe bet for embedded projects\"" + source: "https://x.com/PyBCN/status/987040626628849664" + time: "20:49" --- diff --git a/content/events/meetups/2018-05-16-build-graphic-user-interfaces-with-python-tk.md b/content/events/meetups/2018-05-16-build-graphic-user-interfaces-with-python-tk.md index c946f8ae1..072c7456b 100644 --- a/content/events/meetups/2018-05-16-build-graphic-user-interfaces-with-python-tk.md +++ b/content/events/meetups/2018-05-16-build-graphic-user-interfaces-with-python-tk.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Build Graphic User Interfaces with Python Tk" +title: "PyLadies BCN Workshop, May 2018" date: 2018-05-16 year: 2018 venue: "Punt Multimedia" diff --git a/content/events/meetups/2018-05-24-python-may-meetup.md b/content/events/meetups/2018-05-24-python-may-meetup.md index d8c5af286..9c616f701 100644 --- a/content/events/meetups/2018-05-24-python-may-meetup.md +++ b/content/events/meetups/2018-05-24-python-may-meetup.md @@ -51,4 +51,29 @@ talks: language: en duration_minutes: 30 description: Today's data systems and usage of data are all about distributed ecosystems of data, systems, people - modern business intelligence departments are driving data provisioning, data preparation, and data education as a top priority with the highest automation possible. Learn how we build kiwi.com's data provisioning architecture based on python-friendly solutions from scratch to serve analytics use cases and our lessons learned. +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/999701938169155584" + items: + - file: 2018-05-24-python-may-meetup/03-starting-may-s-meetup-pybcn.webp + caption: "Starting May's Meetup! #pybcn" + source: "https://x.com/PyBCN/status/999700473681727489" + time: "19:15" + - file: 2018-05-24-python-may-meetup/01-something-something-moving-data-by-lukas-kubis-unc.webp + caption: "\"Something, something, moving data...\" by Lukas Kubis (@uncannylukas) #pybcn" + source: "https://x.com/PyBCN/status/999701938169155584" + time: "19:21" + talk: something-something-moving-data + - file: 2018-05-24-python-may-meetup/02-telluric-manipulacion-interactiva-de-datos-geoespa.webp + caption: "telluric: manipulación interactiva de datos geoespaciales en Jupyter con Python by Juan Luis Cano (@astrojuanlu) https://github.com/satellogic/telluric/" + source: "https://x.com/PyBCN/status/999709118976929793" + time: "19:50" + talk: telluric-manipulacion-interactiva-de-datos-geoespaciales-en + - file: 2018-05-24-python-may-meetup/04-building-python-friendly-scalable-reliable-busines.webp + caption: "\"Building Python-friendly Scalable, Reliable Business Intelligence Platform\" by Miki Stencl (@michaelstencl) #pybcn" + source: "https://x.com/PyBCN/status/999717244878848001" + time: "20:22" --- diff --git a/content/events/meetups/2018-06-14-data-science-for-smarter-cities.md b/content/events/meetups/2018-06-14-data-science-for-smarter-cities.md index aff9357b0..0bfe8d35b 100644 --- a/content/events/meetups/2018-06-14-data-science-for-smarter-cities.md +++ b/content/events/meetups/2018-06-14-data-science-for-smarter-cities.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Data science for smarter cities" +title: "PyLadies BCN Workshop, June 2018" date: 2018-06-14 year: 2018 venue: "Worldsensing" diff --git a/content/events/meetups/2018-06-21-python-june-meetup.md b/content/events/meetups/2018-06-21-python-june-meetup.md index aafed6ea9..d19af7ce7 100644 --- a/content/events/meetups/2018-06-21-python-june-meetup.md +++ b/content/events/meetups/2018-06-21-python-june-meetup.md @@ -46,4 +46,29 @@ talks: url: "https://www.youtube.com/watch?v=bqphJQnp3Hw" - type: site url: "https://headingnorthweb.wordpress.com/tag/en-us/" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1009846763178602496" + items: + - file: 2018-06-21-python-june-meetup/04-starting-june-s-python-meetup-at-dow-jones-thanks.webp + caption: "Starting June's Python Meetup at Dow Jones. Thanks foe coming! #PyBCN" + source: "https://x.com/PyBCN/status/1009845952885264384" + time: "19:10" + - file: 2018-06-21-python-june-meetup/01-how-does-that-pyspark-thing-work-and-why-arrow-mak.webp + caption: "How does that PySpark thing work? And why Arrow makes it faster? by Rubén Berenguel (@berenguel) #pybcn" + source: "https://x.com/PyBCN/status/1009846763178602496" + time: "19:13" + talk: how-does-that-pyspark-thing-work-and-why-arrow-makes-it + - file: 2018-06-21-python-june-meetup/02-frozen-python-satice-ice-dataloggers-by-oriol-sanc.webp + caption: "Frozen Python: satice ice dataloggers by Oriol Sánchez #PyBCN" + source: "https://x.com/PyBCN/status/1009858653292294145" + time: "20:00" + talk: frozen-python-satice-ice-dataloggers + - file: 2018-06-21-python-june-meetup/03-of-course-the-cpu-used-uses-python-and-linux-pybcn.webp + caption: "Of course, the CPU used uses Python and Linux #pybcn" + source: "https://x.com/PyBCN/status/1009860881331687424" + time: "20:09" --- diff --git a/content/events/meetups/2018-07-10-build-your-first-neural-network.md b/content/events/meetups/2018-07-10-build-your-first-neural-network.md index 8072783aa..161de8a7e 100644 --- a/content/events/meetups/2018-07-10-build-your-first-neural-network.md +++ b/content/events/meetups/2018-07-10-build-your-first-neural-network.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Build your first neural network" +title: "PyLadies BCN Workshop, July 2018" date: 2018-07-10 year: 2018 venue: "Aticco" diff --git a/content/events/meetups/2018-07-19-python-july-meetup.md b/content/events/meetups/2018-07-19-python-july-meetup.md index 3ed4a14b7..6e4603a66 100644 --- a/content/events/meetups/2018-07-19-python-july-meetup.md +++ b/content/events/meetups/2018-07-19-python-july-meetup.md @@ -44,4 +44,23 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=prWA_rqKtVo" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1019991293353758720" + items: + - file: 2018-07-19-python-july-meetup/01-we-are-already-here-at-travelperk-waiting-for-our.webp + caption: "We are already here at @travelperk waiting for our first speaker to start: @dukebody" + source: "https://x.com/PyBCN/status/1019991293353758720" + time: "19:04" + - file: 2018-07-19-python-july-meetup/02-now-it-s-gabimaeztu-s-turn-with-practical-nlp.webp + caption: "Now it's @gabimaeztu's turn with Practical NLP" + source: "https://x.com/PyBCN/status/1020005100528562177" + time: "19:59" + - file: 2018-07-19-python-july-meetup/03-today-we-had-a-nice-surprise-after-the-talks.webp + caption: "Today we had a nice surprise after the talks" + source: "https://x.com/PyBCN/status/1020029753980596224" + time: "21:36" --- diff --git a/content/events/meetups/2018-09-20-python-september-meetup.md b/content/events/meetups/2018-09-20-python-september-meetup.md index f95d31968..0fdee8c53 100644 --- a/content/events/meetups/2018-09-20-python-september-meetup.md +++ b/content/events/meetups/2018-09-20-python-september-meetup.md @@ -38,4 +38,29 @@ talks: language: en duration_minutes: 30 description: "In Skyscanner we operate hundreds of services and perform thousands of deploys a day. In this talk I'll try to cover what have we put in place to empower our team so we can focus on solving traveler problems." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1042824805202972672" + items: + - file: 2018-09-20-python-september-meetup/04-full-venue-at-today-s-meetup-thanks-skyscanner-for.webp + caption: "Full venue at today's Meetup. Thanks Skyscanner for hosting us! #pybcn" + source: "https://x.com/PyBCN/status/1042824484896616448" + time: "19:15" + - file: 2018-09-20-python-september-meetup/01-deep-learning-for-time-series-by-alexander-honchar.webp + caption: "Deep learning for time series, by Alexander Honchar (@alexrachnog) #pybcn" + source: "https://x.com/PyBCN/status/1042824805202972672" + time: "19:16" + talk: deep-learning-for-time-series + - file: 2018-09-20-python-september-meetup/02-classical-approaches.webp + caption: "Classical approaches..." + source: "https://x.com/PyBCN/status/1042827545819930624" + time: "19:27" + - file: 2018-09-20-python-september-meetup/03-microservices-at-scale-by-jordi-soucheiron-jordixo.webp + caption: "Microservices at scale, by Jordi Soucheiron (@jordixou) #pybcn Slides: https://docs.google.com/presentation/d/1rtTkhtdzJflTTZYJaJ_zJ3u56T8nVBNLTpA9wL8tVm4/edit" + source: "https://x.com/PyBCN/status/1042842561164062721" + time: "20:26" + talk: microservices-at-scale --- diff --git a/content/events/meetups/2018-09-25-introduction-to-computer-vision.md b/content/events/meetups/2018-09-25-introduction-to-computer-vision.md index 3479ca49b..7a2c9659b 100644 --- a/content/events/meetups/2018-09-25-introduction-to-computer-vision.md +++ b/content/events/meetups/2018-09-25-introduction-to-computer-vision.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Introduction to Computer Vision +title: "PyLadies BCN Workshop, September 2018" date: 2018-09-25 year: 2018 venue: Kiwi.com diff --git a/content/events/meetups/2018-10-23-introduccion-a-the-things-network.md b/content/events/meetups/2018-10-23-introduccion-a-the-things-network.md index f985ad5cb..18d3d4635 100644 --- a/content/events/meetups/2018-10-23-introduccion-a-the-things-network.md +++ b/content/events/meetups/2018-10-23-introduccion-a-the-things-network.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introducción a The Things Network" +title: "PyLadies BCN Workshop, October 2018" date: 2018-10-23 year: 2018 venue: "Travelperk" diff --git a/content/events/meetups/2018-11-20-data-analysis-with-jupyter-notebook-pandas-and-plotly.md b/content/events/meetups/2018-11-20-data-analysis-with-jupyter-notebook-pandas-and-plotly.md index 7e58970b6..e77e9de6c 100644 --- a/content/events/meetups/2018-11-20-data-analysis-with-jupyter-notebook-pandas-and-plotly.md +++ b/content/events/meetups/2018-11-20-data-analysis-with-jupyter-notebook-pandas-and-plotly.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Data analysis with Jupyter Notebook, Pandas and Plotly" +title: "PyLadies BCN Workshop, November 2018" date: 2018-11-20 year: 2018 venue: "Skyscanner's offices" diff --git a/content/events/meetups/2018-12-20-barcelona-supercomputing-center-joining-generations-of.md b/content/events/meetups/2018-12-20-barcelona-supercomputing-center-joining-generations-of.md index c1508297c..1b5577e8e 100644 --- a/content/events/meetups/2018-12-20-barcelona-supercomputing-center-joining-generations-of.md +++ b/content/events/meetups/2018-12-20-barcelona-supercomputing-center-joining-generations-of.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Barcelona Supercomputing Center + Joining Generations of Women in Tech" +title: "PyLadies BCN Workshop, December 2018" date: 2018-12-20 year: 2018 venue: "Barcelona Supercomputing Center - Centro Nacional de Supercomputación" diff --git a/content/events/meetups/2019-01-17-python-january-meetup.md b/content/events/meetups/2019-01-17-python-january-meetup.md index 604bbbe51..16ac214d0 100644 --- a/content/events/meetups/2019-01-17-python-january-meetup.md +++ b/content/events/meetups/2019-01-17-python-january-meetup.md @@ -45,4 +45,30 @@ talks: language: en duration_minutes: 30 description: "There is a growing number of analytical applications offered by new firms and established software vendors. IT and Data departments have to decide between buying an external tool or developing one in-house. Either is costly. Glovo created a suitable analytical tool for leveraging the large amount of spatial data we collect using open-source tools, python libraries and frameworks. We were able to build a minimum viable product and a foundation for a spatial analytics framework without committing too much money or developer hours. This talk will take you through the process of designing and building the tool, and present the current architecture, with a demo." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1085962521322930181" + items: + - file: 2019-01-17-python-january-meetup/04-about-to-start-today-s-meetup.webp + caption: "About to start today's meetup!" + source: "https://x.com/PyBCN/status/1085962107647115270" + time: "19:08" + - file: 2019-01-17-python-january-meetup/01-django-gone-clean-by-jairovadillo-at-21buttonseng.webp + caption: "\"Django gone clean\" by @jairovadillo at @21ButtonsEng" + source: "https://x.com/PyBCN/status/1085962521322930181" + time: "19:10" + talk: django-gone-clean + - file: 2019-01-17-python-january-meetup/02-machine-learning-and-time-series-analysis-for-brai.webp + caption: "\"Machine Learning and Time Series Analysis for Brain Signals\" by Andrea Insabato" + source: "https://x.com/PyBCN/status/1085972411760234497" + time: "19:49" + talk: machine-learning-and-time-series-analysis-for-brain-signals + - file: 2019-01-17-python-january-meetup/03-building-glovo-s-own-spatial-analytics-tool-by-ale.webp + caption: "\"Building Glovo's own spatial analytics tool\" by Aleksey Martynyuk" + source: "https://x.com/PyBCN/status/1085985211039531009" + time: "20:40" + talk: building-glovo-s-own-spatial-analytics-tool --- diff --git a/content/events/meetups/2019-01-29-data-interactive-plots.md b/content/events/meetups/2019-01-29-data-interactive-plots.md index 37203c84b..745d43476 100644 --- a/content/events/meetups/2019-01-29-data-interactive-plots.md +++ b/content/events/meetups/2019-01-29-data-interactive-plots.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Data & interactive plots +title: "PyLadies BCN Workshop, January 2019" date: 2019-01-29 year: 2019 venue: Kiwi.com diff --git a/content/events/meetups/2019-02-21-python-february-meetup.md b/content/events/meetups/2019-02-21-python-february-meetup.md index e3feaf18d..8102961fb 100644 --- a/content/events/meetups/2019-02-21-python-february-meetup.md +++ b/content/events/meetups/2019-02-21-python-february-meetup.md @@ -65,4 +65,25 @@ talks: session_videos: - title: "February 2019 Meetup" url: "https://www.youtube.com/watch?v=5lHomEoRndM" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1098646349124456449" + items: + - file: 2019-02-21-python-february-meetup/01-repository-templates-with-cookiecutter-by-hector-c.webp + caption: "Repository templates with Cookiecutter by Héctor Canto (@hectorcanto_dev)" + source: "https://x.com/PyBCN/status/1098646349124456449" + time: "19:11" + talk: repository-templates-with-cookiecutter + - file: 2019-02-21-python-february-meetup/02-recursive-generators-by-joan-vilaltella-joanvilalt.webp + caption: "Recursive generators by Joan Vilaltella, (@joanvilaltella)" + source: "https://x.com/PyBCN/status/1098656264207433729" + time: "19:50" + talk: recursive-generators + - file: 2019-02-21-python-february-meetup/03-pipenv-python-dev-workflow-for-humans-by-andreu-va.webp + caption: "Pipenv: Python Dev Workflow for Humans, by Andreu Vallbona (@avallbona)" + source: "https://x.com/PyBCN/status/1098667623976452098" + time: "20:35" --- diff --git a/content/events/meetups/2019-02-26-data-apis-intro-to-web-scraping.md b/content/events/meetups/2019-02-26-data-apis-intro-to-web-scraping.md index 520115878..779d89c44 100644 --- a/content/events/meetups/2019-02-26-data-apis-intro-to-web-scraping.md +++ b/content/events/meetups/2019-02-26-data-apis-intro-to-web-scraping.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Data, APIs & intro to web scraping +title: "PyLadies BCN Workshop, February 2019" date: 2019-02-26 year: 2019 venue: Codely at Spaces22@ coworking, Carrer Pallars 193. diff --git a/content/events/meetups/2019-03-21-python-march-meetup.md b/content/events/meetups/2019-03-21-python-march-meetup.md index cb58c513c..dbf528aec 100644 --- a/content/events/meetups/2019-03-21-python-march-meetup.md +++ b/content/events/meetups/2019-03-21-python-march-meetup.md @@ -58,4 +58,31 @@ talks: links: - type: video url: https://www.youtube.com/watch?v=t2Z2yscYaQA +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1108794016521469952" + items: + - file: 2019-03-21-python-march-meetup/01-welcome-to-pybcn-march-meetup-houston-we-have-a-sn.webp + caption: "Welcome to PyBCN March Meetup! \"Houston, we have a snake: Python at @Satellogic\", by Albert Pujol and Juan Luis Cano (@astrojuanlu)" + source: "https://x.com/PyBCN/status/1108794016521469952" + time: "19:14" + talk: houston-we-have-a-snake-python-at-satellogic + - file: 2019-03-21-python-march-meetup/02-pyspark-on-kubernetes-avoiding-the-pain-of-yarn-by.webp + caption: "\"PySpark on Kubernetes -- Avoiding the pain of YARN\", by Holden Karau (@holdenkarau)" + source: "https://x.com/PyBCN/status/1108802526760058887" + time: "19:48" + talk: pyspark-on-kubernetes-avoiding-the-pain-of-yarn + - file: 2019-03-21-python-march-meetup/03-codificando-atomos-con-python-por-johanna-sanchez.webp + caption: "\"Codificando átomos con Python\", por Johanna Sanchez (@EllaQuimica) de @argenpython" + source: "https://x.com/PyBCN/status/1108810729375887360" + time: "20:20" + talk: codificando-atomos-con-python + - file: 2019-03-21-python-march-meetup/04-thanks-all-for-coming-and-satellogic-for-hosting-u.webp + caption: "Thanks all for coming, and @Satellogic for hosting us!" + source: "https://x.com/PyBCN/status/1108825216543797249" + time: "21:18" + --- diff --git a/content/events/meetups/2019-03-26-multiprocessing-versus-threading-in-a-single-workstation-in.md b/content/events/meetups/2019-03-26-multiprocessing-versus-threading-in-a-single-workstation-in.md index 148c97da0..377c801c1 100644 --- a/content/events/meetups/2019-03-26-multiprocessing-versus-threading-in-a-single-workstation-in.md +++ b/content/events/meetups/2019-03-26-multiprocessing-versus-threading-in-a-single-workstation-in.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Multiprocessing versus threading in a single workstation in Python 2.x" +title: "PyLadies BCN Workshop, March 2019" date: 2019-03-26 year: 2019 venue: "Universitat de Barcelona" diff --git a/content/events/meetups/2019-04-25-python-april-meetup.md b/content/events/meetups/2019-04-25-python-april-meetup.md index 33628ff86..46bfc0a01 100644 --- a/content/events/meetups/2019-04-25-python-april-meetup.md +++ b/content/events/meetups/2019-04-25-python-april-meetup.md @@ -43,4 +43,21 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=S1fZAascs04" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1121461493751529472" + items: + - file: 2019-04-25-python-april-meetup/01-building-a-validation-scheme-for-a-rest-api-using.webp + caption: "\"Building a validation scheme for a REST API using voluptuous\", by Alberto Cámara" + source: "https://x.com/PyBCN/status/1121461493751529472" + time: "19:10" + talk: building-a-validation-scheme-for-a-rest-api-using-voluptuous + - file: 2019-04-25-python-april-meetup/02-does-django-scale-by-david-arcos-dzpm.webp + caption: "\"Does Django scale?\" by David Arcos (@DZPM)" + source: "https://x.com/PyBCN/status/1121494160081608706" + time: "21:20" + --- diff --git a/content/events/meetups/2019-04-25-python-nlp-introduction-to-spacy-with-jupyter-notebooks.md b/content/events/meetups/2019-04-25-python-nlp-introduction-to-spacy-with-jupyter-notebooks.md index a8cef7b1e..516eb512d 100644 --- a/content/events/meetups/2019-04-25-python-nlp-introduction-to-spacy-with-jupyter-notebooks.md +++ b/content/events/meetups/2019-04-25-python-nlp-introduction-to-spacy-with-jupyter-notebooks.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Python & NLP. Introduction to spaCy with Jupyter notebooks" +title: "PyLadies BCN Workshop, April 2019" date: 2019-04-25 year: 2019 venue: "Holaluz" diff --git a/content/events/meetups/2019-05-16-python-may-meetup.md b/content/events/meetups/2019-05-16-python-may-meetup.md index fc09b2470..42be034a9 100644 --- a/content/events/meetups/2019-05-16-python-may-meetup.md +++ b/content/events/meetups/2019-05-16-python-may-meetup.md @@ -59,4 +59,27 @@ talks: links: - type: video url: https://www.youtube.com/watch?v=qqse-zvnNn0 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1129338940014645248" + items: + - file: 2019-05-16-python-may-meetup/01-mocking-and-patching-pitfalls-by-edwin-jung.webp + caption: "\"Mocking and Patching Pitfalls\" by Edwin Jung" + source: "https://x.com/PyBCN/status/1129338940014645248" + time: "12:52" + talk: mocking-and-patching-pitfalls + - file: 2019-05-16-python-may-meetup/02-damegender-gender-detection-tool-experiments-with.webp + caption: "\"Damegender: gender detection tool experiments with NLTK and Scikit\" by David Arroyo Menéndez" + source: "https://x.com/PyBCN/status/1129338949950853120" + time: "12:52" + talk: damegender-gender-detection-tool-experiments-with-nltk-and + - file: 2019-05-16-python-may-meetup/03-chatops-101-with-python-and-opsdroid-by-angel-fern.webp + caption: "\"Chatops 101 with Python and Opsdroid\", by Àngel Fernández (@anxodio)" + source: "https://x.com/PyBCN/status/1129338964433879042" + time: "12:52" + talk: chatops-101-with-python-and-opsdroid + --- diff --git a/content/events/meetups/2019-05-21-selenium-for-webscraping.md b/content/events/meetups/2019-05-21-selenium-for-webscraping.md index 4fc0979d7..bdeec0490 100644 --- a/content/events/meetups/2019-05-21-selenium-for-webscraping.md +++ b/content/events/meetups/2019-05-21-selenium-for-webscraping.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Selenium for WebScraping" +title: "PyLadies BCN Workshop, May 2019" date: 2019-05-21 year: 2019 venue: "letgo" diff --git a/content/events/meetups/2019-06-20-python-june-meetup.md b/content/events/meetups/2019-06-20-python-june-meetup.md index af86ef7f1..f8289bac0 100644 --- a/content/events/meetups/2019-06-20-python-june-meetup.md +++ b/content/events/meetups/2019-06-20-python-june-meetup.md @@ -69,4 +69,31 @@ talks: session_videos: - title: "Kiwi Python Tour Intro" url: "https://www.youtube.com/watch?v=8H2PrNLEEYQ" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1141756308313563139" + items: + - file: 2019-06-20-python-june-meetup/01-welcome-to-python-june-meetup-pybcn-https-www-meet.webp + caption: "Welcome to Python June Meetup! #pybcn https://www.meetup.com/python-185/events/262097404/" + source: "https://x.com/PyBCN/status/1141756308313563139" + time: "19:14" + - file: 2019-06-20-python-june-meetup/02-pytest-recomendaciones-paquetes-basicos-para-testi.webp + caption: "Pytest: recomendaciones, paquetes básicos para testing en Python y Django - Andreu Vallbona (@avallbona)" + source: "https://x.com/PyBCN/status/1141758033338540032" + time: "19:21" + talk: pytest-recomendaciones-paquetes-basicos-para-testing-en + - file: 2019-06-20-python-june-meetup/03-automatize-reports-using-google-slides-api-by-vict.webp + caption: "Automatize reports using Google Slides API by Victor Perez (@vperezb)" + source: "https://x.com/PyBCN/status/1141770507597078528" + time: "20:11" + talk: automatize-reports-using-google-slides-api + - file: 2019-06-20-python-june-meetup/04-don-t-talk-scheme-make-service-integration-easier.webp + caption: "Don't talk, scheme! Make service integration easier with schemata, By Tin Marković" + source: "https://x.com/PyBCN/status/1141776488460705792" + time: "20:35" + talk: don-t-talk-scheme + --- diff --git a/content/events/meetups/2019-06-25-introduction-to-django-a-python-web-framework.md b/content/events/meetups/2019-06-25-introduction-to-django-a-python-web-framework.md index 55b321257..e48a0ff92 100644 --- a/content/events/meetups/2019-06-25-introduction-to-django-a-python-web-framework.md +++ b/content/events/meetups/2019-06-25-introduction-to-django-a-python-web-framework.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to Django, a python web framework" +title: "PyLadies BCN Workshop, June 2019" date: 2019-06-25 year: 2019 venue: "Verse" diff --git a/content/events/meetups/2019-07-18-python-july-meetup.md b/content/events/meetups/2019-07-18-python-july-meetup.md index 8022c860c..3ac7f3bed 100644 --- a/content/events/meetups/2019-07-18-python-july-meetup.md +++ b/content/events/meetups/2019-07-18-python-july-meetup.md @@ -42,4 +42,21 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=xOT4pg5jqVU" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1153265126415450113" + items: + - file: 2019-07-18-python-july-meetup/01-ml-against-fraud-catching-bad-guys-with-python-by.webp + caption: "ML Against Fraud: Catching Bad Guys with Python by Gabriel Oliveira-Barra (@nospotfer)" + source: "https://x.com/PyBCN/status/1153265126415450113" + time: "13:26" + talk: ml-against-fraud-catching-bad-guys-with-python + - file: 2019-07-18-python-july-meetup/02-python-on-ucontrollers-by-juan-biondi.webp + caption: "Python on uControllers by Juan Biondi" + source: "https://x.com/PyBCN/status/1153265590783696896" + time: "13:28" + talk: python-on-ucontrollers --- diff --git a/content/events/meetups/2019-09-19-python-september-meetup.md b/content/events/meetups/2019-09-19-python-september-meetup.md index 8030507d4..b349bcdcc 100644 --- a/content/events/meetups/2019-09-19-python-september-meetup.md +++ b/content/events/meetups/2019-09-19-python-september-meetup.md @@ -44,4 +44,37 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=JzX9WAv7PVM" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1174736672845705216" + items: + - file: 2019-09-19-python-september-meetup/05-welcome-to-python-barcelona-by-nataliasirera.webp + caption: "Welcome to Python Barcelona, by @nataliasirera" + source: "https://x.com/PyBCN/status/1174735529469984769" + time: "19:22" + - file: 2019-09-19-python-september-meetup/06-come-to-the-pydaybcn-send-proposals-join-us-at-the.webp + caption: "Come to the #PyDayBCN! Send proposals! Join us at the mentoring session! by @DZPM" + source: "https://x.com/PyBCN/status/1174736115816943616" + time: "19:24" + - file: 2019-09-19-python-september-meetup/01-data-quality-and-how-we-are-trying-to-break-the-80.webp + caption: "\"Data Quality and how we are trying to break the 80/20 cleaning rule\" by Ana Dorofei" + source: "https://x.com/PyBCN/status/1174736672845705216" + time: "19:27" + talk: data-quality-and-how-we-are-trying-to-break-the-80-20 + - file: 2019-09-19-python-september-meetup/02-there-is-one-way-to-do-it-right-and-many-ways-to-m.webp + caption: "\"There is one way to do it right, and many ways to mess it up\" - Alberto Cámara" + source: "https://x.com/PyBCN/status/1174742270429585409" + time: "19:49" + - file: 2019-09-19-python-september-meetup/03-it-started-as-fiction-and-now-it-seems-to-be-scien.webp + caption: "\"It started as fiction, and now it seems to be science fiction. Let's see which word we keep\" - Sergi Ortiz" + source: "https://x.com/PyBCN/status/1174742700312137730" + time: "19:51" + - file: 2019-09-19-python-september-meetup/04-python-for-the-management-of-iot-platforms-at-worl.webp + caption: "\"Python for the management of IoT platforms at Worldsensing\" by Toni Martínez del Hoyo (@tonidelhoyo)" + source: "https://x.com/PyBCN/status/1174746936307593222" + time: "20:07" + talk: python-for-the-management-of-iot-platforms-at-worldsensing --- diff --git a/content/events/meetups/2019-09-30-introduction-to-relational-databases-with-sql-and-python.md b/content/events/meetups/2019-09-30-introduction-to-relational-databases-with-sql-and-python.md index 49871bc1a..fd13d56d6 100644 --- a/content/events/meetups/2019-09-30-introduction-to-relational-databases-with-sql-and-python.md +++ b/content/events/meetups/2019-09-30-introduction-to-relational-databases-with-sql-and-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Introduction to Relational Databases with SQL and Python +title: "PyLadies BCN Workshop, September 2019" date: 2019-09-30 year: 2019 venue: TravelPerk diff --git a/content/events/meetups/2019-10-23-introduction-to-programming-with-python.md b/content/events/meetups/2019-10-23-introduction-to-programming-with-python.md index dc079202f..02284a9fc 100644 --- a/content/events/meetups/2019-10-23-introduction-to-programming-with-python.md +++ b/content/events/meetups/2019-10-23-introduction-to-programming-with-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to Programming with Python" +title: "PyLadies BCN Workshop, October 2019" date: 2019-10-23 year: 2019 venue: "Carrer de Tànger, 122" diff --git a/content/events/meetups/2019-11-20-introduction-to-tackling-networks-in-python.md b/content/events/meetups/2019-11-20-introduction-to-tackling-networks-in-python.md index 5e26f14b1..8b57df58c 100644 --- a/content/events/meetups/2019-11-20-introduction-to-tackling-networks-in-python.md +++ b/content/events/meetups/2019-11-20-introduction-to-tackling-networks-in-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to Tackling networks in Python" +title: "PyLadies BCN Workshop, November 2019" date: 2019-11-20 year: 2019 venue: "Holaluz" @@ -29,4 +29,15 @@ talks: speakers: [carolina-fernandez] type: workshop description: "Wondering how to create, manage and test a virtual network in your local environment? Different Python-based solutions allow you to do so in an easy way. During the workshop we will be able to define a network and its behaviour via Python, then play with it! Come, learn and practice how to access to remote computers from wherever you are and manage this kind of networks!" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1197083775844438018" + items: + - file: 2019-11-20-introduction-to-tackling-networks-in-python/01-we-have-the-pictures-of-the-event-will-post-them-s.webp + caption: "We have the pictures of the event! Will post them soon. This was the traditional group photo with all the assistants. Also, big thanks to out great photographers, @Mevoyaverpatos and @jmartinezvila! 👏👏👏" + source: "https://x.com/PyBCN/status/1197083775844438018" + time: "10:26" --- diff --git a/content/events/meetups/2019-11-21-python-november-meetup.md b/content/events/meetups/2019-11-21-python-november-meetup.md index 97d5f4fc9..5ff7b5dcc 100644 --- a/content/events/meetups/2019-11-21-python-november-meetup.md +++ b/content/events/meetups/2019-11-21-python-november-meetup.md @@ -41,4 +41,20 @@ talks: language: en duration_minutes: 45 description: "EHR systems can have data from a variety of different sources including billing data, patient demographics, medical history, lab results, sensor data, prescriptions, clinical notes, medical images, etc. I will cover a couple of ML models that use this kind of data to cover different use cases and i'll talk about the multiple bias that the data might have." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1197582659465207808" + items: + - file: 2019-11-21-python-november-meetup/01-we-start-today-s-meetup-with-ismansiete-from-color.webp + caption: "We start today's meetup with @ismansiete from @ColorSensing" + source: "https://x.com/PyBCN/status/1197582659465207808" + time: "19:28" + talk: avoid-food-waste-with-qr-codes-and-computer-vision + - file: 2019-11-21-python-november-meetup/02-now-we-continue-with-gabimaeztu-from-iomed-ehr.webp + caption: "Now we continue with @gabimaeztu from @iomed_ehr" + source: "https://x.com/PyBCN/status/1197591648517197826" + time: "20:04" --- diff --git a/content/events/meetups/2020-01-23-python-january-meetup.md b/content/events/meetups/2020-01-23-python-january-meetup.md index 9b3bc7f84..e6ce2fd80 100644 --- a/content/events/meetups/2020-01-23-python-january-meetup.md +++ b/content/events/meetups/2020-01-23-python-january-meetup.md @@ -62,4 +62,35 @@ talks: url: https://www.youtube.com/watch?v=u-KDwDqMbCI - type: github url: https://github.com/alecthomas/injector +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1220410751074041858" + items: + - file: 2020-01-23-python-january-meetup/01-welcome-to-python-january-meetup-pybcn-https-www-m.webp + caption: "Welcome to Python January Meetup! #PyBCN https://www.meetup.com/python-185/events/267876301/" + source: "https://x.com/PyBCN/status/1220410751074041858" + time: "19:19" + - file: 2020-01-23-python-january-meetup/02-jazz-chord-generation-using-deep-learning-by-mateu.webp + caption: "\"Jazz chord generation using Deep Learning\" by Mateusz Dorobek" + source: "https://x.com/PyBCN/status/1220411066347401217" + time: "19:20" + talk: jazz-chord-generation-using-deep-learning + - file: 2020-01-23-python-january-meetup/03-using-pydantic-for-security-static-analysis-of-aws.webp + caption: "\"Using pydantic for security static analysis of AWS cloudformation files\" by Oscar Blanco (@oscarbc96)" + source: "https://x.com/PyBCN/status/1220419289460674560" + time: "19:53" + talk: using-pydantic-for-security-static-analysis-of-aws + - file: 2020-01-23-python-january-meetup/04-forbidden-toppings-on-pizza.webp + caption: "Forbidden toppings on pizza! ❌🍍" + source: "https://x.com/PyBCN/status/1220422619134074880" + time: "20:06" + - file: 2020-01-23-python-january-meetup/05-inversion-de-control-e-inyeccion-de-dependencias-t.webp + caption: "\"Inversión de control e Inyección de dependencias, Teoría y ejemplos usando `Injector`\" by Manuel Gomez & Daniel Albarral" + source: "https://x.com/PyBCN/status/1220427960240558081" + time: "20:27" + talk: inversion-de-control-e-inyeccion-de-dependencias-teoria-y + --- diff --git a/content/events/meetups/2020-01-27-how-to-face-and-maybe-even-pass-big-technical-interviews.md b/content/events/meetups/2020-01-27-how-to-face-and-maybe-even-pass-big-technical-interviews.md index d1295bf5d..45ebaa479 100644 --- a/content/events/meetups/2020-01-27-how-to-face-and-maybe-even-pass-big-technical-interviews.md +++ b/content/events/meetups/2020-01-27-how-to-face-and-maybe-even-pass-big-technical-interviews.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "How to face (and maybe even pass) big technical interviews" +title: "PyLadies BCN Workshop, January 2020" date: 2020-01-27 year: 2020 venue: "C/ de Sardenya, 229" diff --git a/content/events/meetups/2020-02-20-python-february-meetup.md b/content/events/meetups/2020-02-20-python-february-meetup.md index 111bfd832..5054d7ba3 100644 --- a/content/events/meetups/2020-02-20-python-february-meetup.md +++ b/content/events/meetups/2020-02-20-python-february-meetup.md @@ -46,4 +46,37 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=QmqrBAKSB6s" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1230569930065661952" + items: + - file: 2020-02-20-python-february-meetup/04-about-to-start-today-s-meetup-thanks-holaluzeng-fo.webp + caption: "About to start today's meetup. Thanks @HolaluzEng for hosting us!" + source: "https://x.com/PyBCN/status/1230558963164311552" + time: "19:24" + - file: 2020-02-20-python-february-meetup/05-automatically-intercepting-debugging-all-python-ht.webp + caption: "\"Automatically intercepting & debugging all Python HTTP(S)\" by Tim Perry (@pimterry)" + source: "https://x.com/PyBCN/status/1230559515424129026" + time: "19:27" + talk: automatically-intercepting-debugging-all-python-http-s + - file: 2020-02-20-python-february-meetup/06-it-s-magic.webp + caption: "It's #magic 🤷‍♂️" + source: "https://x.com/PyBCN/status/1230561043979522053" + time: "19:33" + - file: 2020-02-20-python-february-meetup/01-migracode-creating-a-migrant-tech-community-by-vin.webp + caption: "\"Migracode: Creating a Migrant-Tech Community\" by Vincent van Grondelle (@VsVangrondelle)" + source: "https://x.com/PyBCN/status/1230569930065661952" + time: "20:08" + talk: migracode-creating-a-migrant-tech-community + - file: 2020-02-20-python-february-meetup/02-how-can-you-volunteer-with-migracodebcn.webp + caption: "How can you volunteer with @MigracodeBCN?" + source: "https://x.com/PyBCN/status/1230571857277005824" + time: "20:16" + - file: 2020-02-20-python-february-meetup/03-thanks-holaluzeng-for-the-venue-and-the-pizzas.webp + caption: "Thanks @HolaluzEng for the venue and the pizzas! 👏👏" + source: "https://x.com/PyBCN/status/1230582036961906689" + time: "20:56" --- diff --git a/content/events/meetups/2020-02-24-ros-and-robomaker-programming-robots-in-python.md b/content/events/meetups/2020-02-24-ros-and-robomaker-programming-robots-in-python.md index a89c80d0c..d4e17bc36 100644 --- a/content/events/meetups/2020-02-24-ros-and-robomaker-programming-robots-in-python.md +++ b/content/events/meetups/2020-02-24-ros-and-robomaker-programming-robots-in-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "ROS and RoboMaker: programming robots in Python" +title: "PyLadies BCN Workshop, February 2020" date: 2020-02-24 year: 2020 venue: "Marfeel" diff --git a/content/events/meetups/2021-01-28-haz-tu-primera-skill-de-alexa-con-python.md b/content/events/meetups/2021-01-28-haz-tu-primera-skill-de-alexa-con-python.md index d45dc1cc2..3631175b8 100644 --- a/content/events/meetups/2021-01-28-haz-tu-primera-skill-de-alexa-con-python.md +++ b/content/events/meetups/2021-01-28-haz-tu-primera-skill-de-alexa-con-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Haz tu primera skill de Alexa con Python" +title: "PyLadies BCN Workshop, January 2021" date: 2021-01-28 year: 2021 # The export records this event as ONLINE, so it had no room. diff --git a/content/events/meetups/2021-04-27-get-rid-of-matlab-struggling-process-from-matlab-to-python.md b/content/events/meetups/2021-04-27-get-rid-of-matlab-struggling-process-from-matlab-to-python.md index 8599854bf..4bbcdb186 100644 --- a/content/events/meetups/2021-04-27-get-rid-of-matlab-struggling-process-from-matlab-to-python.md +++ b/content/events/meetups/2021-04-27-get-rid-of-matlab-struggling-process-from-matlab-to-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Get rid of Matlab! (struggling process from Matlab to Python)" +title: "PyLadies BCN Workshop, April 2021" date: 2021-04-27 year: 2021 # The export records this event as ONLINE, so it had no room. diff --git a/content/events/meetups/2021-05-25-home-and-cleaning-automation-with-microcontrollers-and.md b/content/events/meetups/2021-05-25-home-and-cleaning-automation-with-microcontrollers-and.md index ec54755e0..23eda8239 100644 --- a/content/events/meetups/2021-05-25-home-and-cleaning-automation-with-microcontrollers-and.md +++ b/content/events/meetups/2021-05-25-home-and-cleaning-automation-with-microcontrollers-and.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Home and cleaning automation with Microcontrollers and CircuitPython" +title: "PyLadies BCN Workshop, May 2021" date: 2021-05-25 year: 2021 # The export records this event as ONLINE, so it had no room. diff --git a/content/events/meetups/2021-06-29-build-your-first-webpage-with-django.md b/content/events/meetups/2021-06-29-build-your-first-webpage-with-django.md index 59e2b6942..0eb8e1236 100644 --- a/content/events/meetups/2021-06-29-build-your-first-webpage-with-django.md +++ b/content/events/meetups/2021-06-29-build-your-first-webpage-with-django.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Build your first webpage with Django" +title: "PyLadies BCN Workshop, June 2021" date: 2021-06-29 year: 2021 # The export records this event as ONLINE, so it had no room. diff --git a/content/events/meetups/2021-10-26-how-we-built-our-experimentation-framework-with-python.md b/content/events/meetups/2021-10-26-how-we-built-our-experimentation-framework-with-python.md index d68e35855..90c79d225 100644 --- a/content/events/meetups/2021-10-26-how-we-built-our-experimentation-framework-with-python.md +++ b/content/events/meetups/2021-10-26-how-we-built-our-experimentation-framework-with-python.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "How we built our experimentation framework with Python" +title: "PyLadies BCN Workshop, October 2021" date: 2021-10-26 year: 2021 # The export records this event as ONLINE, so it had no room. diff --git a/content/events/meetups/2021-11-25-python-november-meetup-in-person.md b/content/events/meetups/2021-11-25-python-november-meetup-in-person.md index c90234698..55af57542 100644 --- a/content/events/meetups/2021-11-25-python-november-meetup-in-person.md +++ b/content/events/meetups/2021-11-25-python-november-meetup-in-person.md @@ -38,4 +38,45 @@ talks: language: es duration_minutes: 30 description: "Cómo hemos usado en Tiendeo la suite de Google Cloud (AppEngine, Datastore, Storage) para el prototipado y despliegue de aplicaciones web y como ha evolucionado el proyecto bcnmarket.barcelona para soportar el incremento de tráfico. Reestructuración del repositorio, mejora de la caché, colas (RabbitMQ), indexado a Elastic, API-Swagger, Celery" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1463934429278220292" + items: + - file: 2021-11-25-python-november-meetup-in-person/08-welcome-to-november-s-python-meetup-https-www-meet.webp + caption: "Welcome to November's Python Meetup! https://www.meetup.com/python-barcelona/events/282194482/ @berenguel is introducing us" + source: "https://x.com/PyBCN/status/1463933197444689922" + time: "19:10" + - file: 2021-11-25-python-november-meetup-in-person/01-property-based-testing-with-hypothesis-by-alberto.webp + caption: "\"Property-based testing with hypothesis\", by Alberto Cámara (@b3r2s)" + source: "https://x.com/PyBCN/status/1463934429278220292" + time: "19:15" + talk: property-based-testing-with-hypothesis + - file: 2021-11-25-python-november-meetup-in-person/02-pip-install-hypothesis.webp + caption: "pip install hypothesis" + source: "https://x.com/PyBCN/status/1463936064129798145" + time: "19:22" + - file: 2021-11-25-python-november-meetup-in-person/03-serverless-webapp-using-googleappengine-by-victor.webp + caption: "\"Serverless WebApp using GoogleAppEngine\", by Victor Pérez (@vperezb) and Carlos Gálvez" + source: "https://x.com/PyBCN/status/1463944314715791362" + time: "19:54" + talk: serverless-webapp-using-googleappengine + - file: 2021-11-25-python-november-meetup-in-person/04-advantages-and-disadvantages-of-google-datastore.webp + caption: "Advantages and disadvantages of Google Datastore:" + source: "https://x.com/PyBCN/status/1463946088721920002" + time: "20:02" + - file: 2021-11-25-python-november-meetup-in-person/05-demo.webp + caption: "Demo!" + source: "https://x.com/PyBCN/status/1463948721201332234" + time: "20:12" + - file: 2021-11-25-python-november-meetup-in-person/06-enough-talks-for-today-pizza-time.webp + caption: "Enough talks for today. Pizza time!! 🍕🍺" + source: "https://x.com/PyBCN/status/1463953791477329931" + time: "20:32" + - file: 2021-11-25-python-november-meetup-in-person/07-thanks-travelperk-for-hosting-python-barcelona.webp + caption: "Thanks @travelperk for hosting Python Barcelona!" + source: "https://x.com/PyBCN/status/1463959177789906945" + time: "20:54" --- diff --git a/content/events/meetups/2022-02-22-introduction-to-apache-airflow-author-schedule-and-monitor.md b/content/events/meetups/2022-02-22-introduction-to-apache-airflow-author-schedule-and-monitor.md index c9e4c1268..dd4562e0a 100644 --- a/content/events/meetups/2022-02-22-introduction-to-apache-airflow-author-schedule-and-monitor.md +++ b/content/events/meetups/2022-02-22-introduction-to-apache-airflow-author-schedule-and-monitor.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Introduction to Apache Airflow: author, schedule and monitor workflows" +title: "PyLadies BCN Workshop, February 2022" date: 2022-02-22 year: 2022 venue: "Canòdrom - Ateneu d'Innovació Digital i Democràtica" diff --git a/content/events/meetups/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production.md b/content/events/meetups/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production.md index bd8cc2ef7..c02da0e71 100644 --- a/content/events/meetups/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production.md +++ b/content/events/meetups/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production.md @@ -34,4 +34,29 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=pOg3IbFEnlw" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1507051231600160772" + items: + - file: 2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/01-we-re-back-telegram-bots-from-idea-to-production-b.webp + caption: "We're back! \"Telegram bots - From idea to production\" by Ferran Jovell (@MrSwats)" + source: "https://x.com/PyBCN/status/1507051231600160772" + time: "18:46" + talk: telegram-bots-from-idea-to-production + - file: 2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/02-we-need-to-talk-to-the-bot-father.webp + caption: "\"We need to talk to the Bot Father\"" + source: "https://x.com/PyBCN/status/1507053638841155587" + time: "18:56" + - file: 2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/03-nice-bots-mrswats.webp + caption: "Nice bots, @MrSwats!" + source: "https://x.com/PyBCN/status/1507059973494345732" + time: "19:21" + - file: 2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/04-pythin-bircilini-miitip.webp + caption: "\"pythin bircilini miitip\"" + source: "https://x.com/PyBCN/status/1507060430065258499" + time: "19:23" + --- diff --git a/content/events/meetups/2022-03-29-data-analysis-with-pandas-and-dash.md b/content/events/meetups/2022-03-29-data-analysis-with-pandas-and-dash.md index e36a5952b..397f5b9ec 100644 --- a/content/events/meetups/2022-03-29-data-analysis-with-pandas-and-dash.md +++ b/content/events/meetups/2022-03-29-data-analysis-with-pandas-and-dash.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Data Analysis with Pandas and Dash +title: "PyLadies BCN Workshop, March 2022" date: 2022-03-29 year: 2022 venue: Canòdrom - Ateneu d'Innovació Digital i Democràtica diff --git a/content/events/meetups/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a.md b/content/events/meetups/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a.md index 2318d0b03..ac72dc32c 100644 --- a/content/events/meetups/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a.md +++ b/content/events/meetups/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a.md @@ -44,4 +44,49 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=a8smnNogLQU" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1517184934225580033" + items: + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/09-full-attendance-at-pybcn-s-meetup-thanks-backmarke.webp + caption: "Full attendance at PyBCN's meetup! Thanks @backmarket for hosting us!" + source: "https://x.com/PyBCN/status/1517184573595164674" + time: "18:52" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/01-shorter-feedback-loop-by-running-impacted-tests-on.webp + caption: "\"Shorter feedback loop by running impacted tests only\", by Mathieu Kniewallner (@mkniewallner)" + source: "https://x.com/PyBCN/status/1517184934225580033" + time: "18:54" + talk: shorter-feedback-loop-by-running-impacted-tests-only + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/02-pip-install-partialtesting-pytest-testmon.webp + caption: "# pip install partialtesting pytest-testmon" + source: "https://x.com/PyBCN/status/1517186918496325634" + time: "19:02" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/03-current-limitations.webp + caption: "Current limitations:" + source: "https://x.com/PyBCN/status/1517190331451719681" + time: "19:15" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/04-aprendizaje-a-traves-de-grafos-graph-neural-networ.webp + caption: "\"Aprendizaje a través de grafos: Graph Neural Networks (GNNs)\", by Camilo Chacón Sartori (@camilo_chacon_s)" + source: "https://x.com/PyBCN/status/1517193144126824450" + time: "19:26" + talk: aprendizaje-a-traves-de-grafos-graph-neural-networks + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/05-estructura-regular-vs-irregular.webp + caption: "Estructura regular vs irregular" + source: "https://x.com/PyBCN/status/1517196070769541122" + time: "19:38" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/06-gnns.webp + caption: "GNNs:" + source: "https://x.com/PyBCN/status/1517197177046683649" + time: "19:42" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/07-more-books-for-my-library.webp + caption: "More books for my library! 😅" + source: "https://x.com/PyBCN/status/1517201755238551563" + time: "20:01" + - file: 2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/08-finally-a-great-networking-we-missed-you-a-lot-tha.webp + caption: "Finally, a great networking 🍕🍻. We missed you a lot, thanks for attending!" + source: "https://x.com/PyBCN/status/1517222836770942977" + time: "21:24" --- diff --git a/content/events/meetups/2022-05-05-outreachy-internships-in-open-source-software.md b/content/events/meetups/2022-05-05-outreachy-internships-in-open-source-software.md index 864a04a9e..676a5b3f1 100644 --- a/content/events/meetups/2022-05-05-outreachy-internships-in-open-source-software.md +++ b/content/events/meetups/2022-05-05-outreachy-internships-in-open-source-software.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Outreachy: internships in open source software" +title: "PyLadies BCN Workshop, May 2022" date: 2022-05-05 year: 2022 venue: "Canòdrom - Ateneu d'Innovació Digital i Democràtica" diff --git a/content/events/meetups/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro.md b/content/events/meetups/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro.md index d2cb3a748..8c9343d35 100644 --- a/content/events/meetups/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro.md +++ b/content/events/meetups/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro.md @@ -46,4 +46,33 @@ talks: links: - type: video url: https://www.youtube.com/watch?v=rF3pLmxr3v8 +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1527333657157185537" + items: + - file: 2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/04-welcome-to-python-may-meetup-building-a-django-sca.webp + caption: "Welcome to Python May Meetup: Building a Django scalable system & Intro to PyScript. @b3r2s is doing the intro" + source: "https://x.com/PyBCN/status/1527331598282027009" + time: "18:53" + - file: 2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/05-thanks-mundimoto-for-hosting-us-jacobcr.webp + caption: "Thanks Mundimoto for hosting us! @jacobcr" + source: "https://x.com/PyBCN/status/1527332565866012690" + time: "18:57" + - file: 2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/01-from-zero-to-hero-building-a-scalable-system-from.webp + caption: "\"From zero to hero: building a scalable system from scratch using Django\", by Samuel Parra" + source: "https://x.com/PyBCN/status/1527333657157185537" + time: "19:01" + talk: from-zero-to-hero-building-a-scalable-system-from-scratch + - file: 2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/02-introduction-to-pyscript-by-david-arcos-dzpm.webp + caption: "\"Introduction to #PyScript\", by David Arcos (@DZPM)" + source: "https://x.com/PyBCN/status/1527367484734484513" + time: "21:16" + talk: introduction-to-pyscript + - file: 2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/03-happy-to-be-back-to-offline-events-see-you-next-mo.webp + caption: "Happy to be back to \"offline\" events! 🤟🍕🍺 See you next month! 🫶" + source: "https://x.com/PyBCN/status/1527371910069514240" + time: "21:33" --- diff --git a/content/events/meetups/2022-06-17-quantum-computing-for-everyone-with-qiskit.md b/content/events/meetups/2022-06-17-quantum-computing-for-everyone-with-qiskit.md index 77af90827..f1f4a72ff 100644 --- a/content/events/meetups/2022-06-17-quantum-computing-for-everyone-with-qiskit.md +++ b/content/events/meetups/2022-06-17-quantum-computing-for-everyone-with-qiskit.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: Quantum computing for everyone with Qiskit +title: "PyLadies BCN Workshop, June 2022" date: 2022-06-17 year: 2022 venue: Mundimoto diff --git a/content/events/meetups/2022-09-20-python-september-meetup-fraud-detection-qr-codes.md b/content/events/meetups/2022-09-20-python-september-meetup-fraud-detection-qr-codes.md index 49c2112b3..d24a39297 100644 --- a/content/events/meetups/2022-09-20-python-september-meetup-fraud-detection-qr-codes.md +++ b/content/events/meetups/2022-09-20-python-september-meetup-fraud-detection-qr-codes.md @@ -44,4 +44,22 @@ talks: However, QR Code can be aesthetically boring. Let us explore some cool libraries in Python to create more dynamic QR Codes, also, let us understand a bit how QR Codes work and how these fancy solutions still are compatible with smartphone QR Code readers.' speakers: - ismael-benito +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1572275772542582784" + items: + - file: 2022-09-20-python-september-meetup-fraud-detection-qr-codes/01-september-pybcn-meetup-crunching-data-to-catch-fra.webp + caption: "September @PyBCN meetup 🤩 Crunching data to catch fraud detection, by @rivolaks from @Veriff" + source: "https://x.com/PyBCN/status/1572275772542582784" + time: "19:25" + talk: crunching-data-to-catch-fraud + - file: 2022-09-20-python-september-meetup-fraud-detection-qr-codes/02-and-now-qr-codes-let-us-make-some-gifs-with-ismans.webp + caption: "And now: QR Codes: let us make some GIFs, with @ismansiete 🤩" + source: "https://x.com/PyBCN/status/1572278881112965121" + time: "19:37" + talk: qr-codes-let-us-make-some-gifs + --- diff --git a/content/events/meetups/2022-09-28-python-for-technical-interviews-tips-tricks.md b/content/events/meetups/2022-09-28-python-for-technical-interviews-tips-tricks.md index ba2084b2b..eadc3ea87 100644 --- a/content/events/meetups/2022-09-28-python-for-technical-interviews-tips-tricks.md +++ b/content/events/meetups/2022-09-28-python-for-technical-interviews-tips-tricks.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Python for technical interviews. Tips & tricks" +title: "PyLadies BCN Workshop, September 2022" date: 2022-09-28 year: 2022 venue: "Happy Scribe - Servicios de transcripcion" diff --git a/content/events/meetups/2022-10-05-first-steps-to-open-source-with-hacktoberfest-2022.md b/content/events/meetups/2022-10-05-first-steps-to-open-source-with-hacktoberfest-2022.md index 85775e19b..0f68f89d3 100644 --- a/content/events/meetups/2022-10-05-first-steps-to-open-source-with-hacktoberfest-2022.md +++ b/content/events/meetups/2022-10-05-first-steps-to-open-source-with-hacktoberfest-2022.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: First steps to open source with Hacktoberfest 2022 +title: "PyLadies BCN Workshop, October 2022" date: 2022-10-05 year: 2022 venue: Canòdrom - Ateneu d'Innovació Digital i Democràtica diff --git a/content/events/meetups/2022-10-20-python-october-meetup-smart-shop-biohacking.md b/content/events/meetups/2022-10-20-python-october-meetup-smart-shop-biohacking.md index 704ad3a2f..ea16ee08e 100644 --- a/content/events/meetups/2022-10-20-python-october-meetup-smart-shop-biohacking.md +++ b/content/events/meetups/2022-10-20-python-october-meetup-smart-shop-biohacking.md @@ -38,4 +38,37 @@ talks: language: en duration_minutes: 30 description: "Would you like to become the fluorescent Mr. Burns? In this talk we will go through a brief introduction to biohacking and a very short class on genetics in order to understand perfectly and carry out an experiment to edit our own DNA with CRISPR (a copy-paste biological tool) and a Python script (that will design the genetic sequences needed for this tool) to biohack certain genes and become that man. All this will allow us to see the huge potential of the synergy between genetic engineering and Python, not only for funny examples like the one mentioned before but also in the clinical field for therapy." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1583137255924695042" + items: + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/06-thanks-ocadotechnology-for-hosting-the-python-barc.webp + caption: "Thanks @OcadoTechnology for hosting the Python Barcelona Meetup! @marc_maycas is introducing the speakers:" + source: "https://x.com/PyBCN/status/1583136573188902914" + time: "18:42" + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/01-smart-shop-populate-your-basket-with-one-click-by.webp + caption: "\"Smart Shop - Populate your basket with one click\", by Dennis Doerrich & Laurent Candillier" + source: "https://x.com/PyBCN/status/1583137255924695042" + time: "18:45" + talk: smart-shop-populate-your-basket-with-one-click + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/02-they-use-python-to-orchestrate-the-ml-pipelines.webp + caption: "They use Python to orchestrate the ML pipelines:" + source: "https://x.com/PyBCN/status/1583142036827688960" + time: "19:04" + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/03-biohacking-with-python-by-marina-moro-lopez-marina.webp + caption: "\"Biohacking with Python\", by Marina Moro López (@marinamorolopez)" + source: "https://x.com/PyBCN/status/1583146317240750081" + time: "19:21" + talk: biohacking-with-python + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/04-nice-bottle-hello-pyladiesbcn.webp + caption: "Nice bottle! Hello, @PyLadiesBCN! 👋" + source: "https://x.com/PyBCN/status/1583148444197482496" + time: "19:29" + - file: 2022-10-20-python-october-meetup-smart-shop-biohacking/05-doing-crispr-from-python-the-full-code-is-availabl.webp + caption: "Doing CRISPR from Python. The full code is available at @marinamorolopez's github:" + source: "https://x.com/PyBCN/status/1583148949015523328" + time: "19:31" --- diff --git a/content/events/meetups/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and.md b/content/events/meetups/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and.md index 0c20f300d..e83be4cb3 100644 --- a/content/events/meetups/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and.md +++ b/content/events/meetups/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and.md @@ -38,4 +38,23 @@ talks: language: en duration_minutes: 20 description: "JAX is an Open Source Python library created by Google and already adopted by DeepMind. JAX supports automatic differentiation and employs XLA, resulting in faster numerical computing than Numpy." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1595834308610379776" + items: + - file: 2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/01-today-we-are-enjoying-the-hospitality-of-thisisclo.webp + caption: "Today we are enjoying the hospitality of @ThisisCloudBlue for our monthly meetup" + source: "https://x.com/PyBCN/status/1595834308610379776" + time: "18:38" + - file: 2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/02-first-talk-we-have-ferran-jimenez-talking-about-ja.webp + caption: "First talk! We have Ferran Jimenez talking about JAX" + source: "https://x.com/PyBCN/status/1595836332068065280" + time: "18:46" + - file: 2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/03-and-now-we-have-pavel-lonkin-from-thisiscloudblue.webp + caption: "And now we have @pavel_lonkin from @ThisisCloudBlue" + source: "https://x.com/PyBCN/status/1595843153038229504" + time: "19:13" --- diff --git a/content/events/meetups/2022-12-21-micropython-python-for-new-and-intermediate-makers.md b/content/events/meetups/2022-12-21-micropython-python-for-new-and-intermediate-makers.md index 872238788..8060bf392 100644 --- a/content/events/meetups/2022-12-21-micropython-python-for-new-and-intermediate-makers.md +++ b/content/events/meetups/2022-12-21-micropython-python-for-new-and-intermediate-makers.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: 'Micropython: Python for new and intermediate makers' +title: "PyLadies BCN Workshop, December 2022" date: 2022-12-21 year: 2022 venue: Canòdrom - Ateneu d'Innovació Digital i Democràtica diff --git a/content/events/meetups/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips.md b/content/events/meetups/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips.md index d38de61bd..5c6836187 100644 --- a/content/events/meetups/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips.md +++ b/content/events/meetups/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips.md @@ -38,4 +38,29 @@ talks: language: en duration_minutes: 30 description: "How can we approach a Machine Learning competition with agility? What similarities & differences are there with respect to doing Machine Learning in production? By looking at the real experience of participating in a Kaggle competition, we will discuss how to structure work, and what techniques and tools are at the hand of a practicing Data Scientist to ensure making the most out of their time." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1641483654638497793" + items: + - file: 2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/04-welcome-to-python-march-meetup-cloud-infrastructur.webp + caption: "Welcome to Python March Meetup: Cloud Infrastructure & ML Competition tips Great topics today!" + source: "https://x.com/PyBCN/status/1641481637589397508" + time: "18:44" + - file: 2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/01-cloud-infrastructure-the-software-way-by-joan-garc.webp + caption: "\"Cloud Infrastructure, the Software Way\", by Joan García from @OcadoTechnology" + source: "https://x.com/PyBCN/status/1641483654638497793" + time: "18:52" + talk: cloud-infrastructure-the-software-way + - file: 2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/02-the-archival-datathon-ml-competition-tips-by-alber.webp + caption: "\"The Archival Datathon: ML competition tips\", by Alberto Cámara (@b3r2s)" + source: "https://x.com/PyBCN/status/1641490711831883787" + time: "19:20" + talk: the-archival-datathon-ml-competition-tips + - file: 2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/03-alberto-is-explaining-about-real-experience-of-par.webp + caption: "Alberto is explaining about real experience of participating in @AAC_GD's Kaggle competition, \"The Archival Problem\" https://x.com/AAC_GD/status/1640248471788613632" + source: "https://x.com/PyBCN/status/1641492377075429392" + time: "19:27" --- diff --git a/content/events/meetups/2023-05-23-fast-and-fun-computer-vision-train-your-image.md b/content/events/meetups/2023-05-23-fast-and-fun-computer-vision-train-your-image.md index fe431d806..735b3e11b 100644 --- a/content/events/meetups/2023-05-23-fast-and-fun-computer-vision-train-your-image.md +++ b/content/events/meetups/2023-05-23-fast-and-fun-computer-vision-train-your-image.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "Fast and Fun Computer Vision: Train Your Image Classification Model in Minutes!" +title: "PyLadies BCN Workshop, May 2023" date: 2023-05-23 year: 2023 venue: "Canòdrom - Ateneu d'Innovació Digital i Democràtica" diff --git a/content/events/meetups/2023-09-28-python-september-meetup-back-to-school.md b/content/events/meetups/2023-09-28-python-september-meetup-back-to-school.md index b3b4defcc..7e02a3776 100644 --- a/content/events/meetups/2023-09-28-python-september-meetup-back-to-school.md +++ b/content/events/meetups/2023-09-28-python-september-meetup-back-to-school.md @@ -38,4 +38,37 @@ talks: language: en duration_minutes: 45 description: "This presentation will explore the application of image generative algorithms in fashion design with a particular focus on their most valuable use cases and implementation at Mango. We will discuss the innovative ways in which these algorithms are transforming the fashion industry by generating diverse design elements such as photographic prints, vector and cartoon illustrations, fabric patterns, and textures. Additionally, we will delve into the art of prompt engineering, providing valuable insights into the creative process behind generating useful images. The presentation will shed light on the future of fashion design and the growing influence of artificial intelligence in this dynamic industry." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1707446292253745529" + items: + - file: 2023-09-28-python-september-meetup-back-to-school/06-during-the-intro-we-just-announced-a-new-pydaybcn.webp + caption: "During the intro, we just announced a new PyDayBCN. Looking for speakers, sponsors, etc. Will keep you updated!" + source: "https://x.com/PyBCN/status/1707445980931461366" + time: "19:23" + - file: 2023-09-28-python-september-meetup-back-to-school/01-the-two-language-problem-in-vectorized-python-expr.webp + caption: "\"The two language problem in vectorized python expressions\", by David Buchaca" + source: "https://x.com/PyBCN/status/1707446292253745529" + time: "19:24" + talk: the-two-language-problem-in-vectorized-python-expressions + - file: 2023-09-28-python-september-meetup-back-to-school/02-this-is-the-way.webp + caption: "This is the way" + source: "https://x.com/PyBCN/status/1707452439895421056" + time: "19:49" + - file: 2023-09-28-python-september-meetup-back-to-school/03-ai-image-generative-algorithm-in-fashion-design-by.webp + caption: "\"AI image generative algorithm in fashion design\", by Lucas Pastur" + source: "https://x.com/PyBCN/status/1707454034368454912" + time: "19:55" + talk: ai-image-generative-algorithm-in-fashion-design + - file: 2023-09-28-python-september-meetup-back-to-school/04-many-use-cases-in-fashion-design.webp + caption: "Many use cases in fashion design:" + source: "https://x.com/PyBCN/status/1707456945139880437" + time: "20:07" + - file: 2023-09-28-python-september-meetup-back-to-school/05-we-ve-seen-some-good-tips-on-prompt-engineering.webp + caption: "We've seen some good tips on prompt engineering" + source: "https://x.com/PyBCN/status/1707461285250580920" + time: "20:24" --- diff --git a/content/events/meetups/2024-01-24-python-meetup-january-happy-new-year.md b/content/events/meetups/2024-01-24-python-meetup-january-happy-new-year.md index 6a16e7276..3d0e9c1a4 100644 --- a/content/events/meetups/2024-01-24-python-meetup-january-happy-new-year.md +++ b/content/events/meetups/2024-01-24-python-meetup-january-happy-new-year.md @@ -38,4 +38,45 @@ talks: language: es duration_minutes: 30 description: "Tired about PDF paperwork? Join the PDF revolution as we see how PyPDF Python library changes how we work with PDF forms completion. We'll discover how to form-fill PDFs with a touch of Python magic. By the end, you'll be a PDF expert, eliminating manual data entry. Get ready to improve your data skills!" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1750224028298567970" + items: + - file: 2024-01-24-python-meetup-january-happy-new-year/08-welcome-to-the-python-barcelona-january-meetup-htt.webp + caption: "Welcome to the Python Barcelona January Meetup! https://www.meetup.com/python-barcelona/events/298506663/ Thanks @AdevintaSpain for hosting us" + source: "https://x.com/PyBCN/status/1750221307872989536" + time: "19:17" + - file: 2024-01-24-python-meetup-january-happy-new-year/01-launch-your-own-python-library-within-the-company.webp + caption: "\"Launch your own Python Library within the company\", by Julian Boronat" + source: "https://x.com/PyBCN/status/1750224028298567970" + time: "19:28" + talk: launch-your-own-python-library-within-the-company + - file: 2024-01-24-python-meetup-january-happy-new-year/02-live-demo-time-julian-is-creating-a-new-python-lib.webp + caption: "Live demo time! Julian is creating a new python library 🙌" + source: "https://x.com/PyBCN/status/1750229232976839079" + time: "19:49" + - file: 2024-01-24-python-meetup-january-happy-new-year/03-and-after-a-few-minutes-it-s-done-if-you-want-to-r.webp + caption: "And... after a few minutes, it's done! 🪄✨ If you want to reproduce, find the code here: https://github.com/boroju/backend-di--python-lib-template" + source: "https://x.com/PyBCN/status/1750231786418786713" + time: "19:59" + - file: 2024-01-24-python-meetup-january-happy-new-year/04-mastering-pdf-form-filling-with-pypdf-by-jordi-bos.webp + caption: "\"Mastering PDF Form-Filling with PyPDF\", by Jordi Bosch" + source: "https://x.com/PyBCN/status/1750234567355592749" + time: "20:10" + talk: mastering-pdf-form-filling-with-pypdf + - file: 2024-01-24-python-meetup-january-happy-new-year/05-wow-thanks-martinthoma-the-maintainer-of-pypdf.webp + caption: "Wow, thanks @_martinthoma, the maintainer of PyPDF! 👋👋" + source: "https://x.com/PyBCN/status/1750237454320222526" + time: "20:21" + - file: 2024-01-24-python-meetup-january-happy-new-year/06-today-i-learned-filigrana-watermark.webp + caption: "Today I Learned: \"Filigrana\" = \"Watermark\"" + source: "https://x.com/PyBCN/status/1750242272493404178" + time: "20:40" + - file: 2024-01-24-python-meetup-january-happy-new-year/07-it-worked.webp + caption: "It worked! 👏" + source: "https://x.com/PyBCN/status/1750244302691737616" + time: "20:48" --- diff --git a/content/events/meetups/2024-02-21-python-meetup-february-python-world-congress.md b/content/events/meetups/2024-02-21-python-meetup-february-python-world-congress.md index c0dcab527..11f990be2 100644 --- a/content/events/meetups/2024-02-21-python-meetup-february-python-world-congress.md +++ b/content/events/meetups/2024-02-21-python-meetup-february-python-world-congress.md @@ -38,4 +38,40 @@ talks: language: en duration_minutes: 15 description: "In 2017 Lucas LaRochelle created the webpage Queering The Map. Its purpose was to provide a safe space for queer people around the globe to share experiences anonymously, and link them to a physical space. The information of the page arises this question: How does race, gender, sexuality, citizenship, ability, and class affect the ways in which we relate to, move through, and create space?\n\nThis presentation aims to give some insights in the process of answering this question, respecting the anonymity of the community involved, through the analysis of the discourse of the shared experiences and its relationship with the physical space defined by each country." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1760369660006965534" + items: + - file: 2024-02-21-python-meetup-february-python-world-congress/06-thanks-servizurich-for-hosting-us.webp + caption: "Thanks Servizurich for hosting us" + source: "https://x.com/PyBCN/status/1760368277266612664" + time: "19:17" + - file: 2024-02-21-python-meetup-february-python-world-congress/01-pytest-a-short-hike-by-itxaso-aizpurua.webp + caption: "\"Pytest, a short hike\", by Itxaso Aizpurua" + source: "https://x.com/PyBCN/status/1760369660006965534" + time: "19:23" + talk: pytest-a-short-hike + - file: 2024-02-21-python-meetup-february-python-world-congress/02-live-demo-with-cat-facts.webp + caption: "Live demo, with cat facts 😺" + source: "https://x.com/PyBCN/status/1760370131836776878" + time: "19:25" + - file: 2024-02-21-python-meetup-february-python-world-congress/03-fyi-we-re-recording-the-talks-go-check-our-youtube.webp + caption: "FYI we're recording the talks, go check our YouTube channel later: https://www.youtube.com/c/PythonBarcelona" + source: "https://x.com/PyBCN/status/1760373331193114667" + time: "19:38" + - file: 2024-02-21-python-meetup-february-python-world-congress/04-analysis-of-queering-the-map-by-marta-garcia.webp + caption: "Analysis of \"Queering The Map\", by Marta García" + source: "https://x.com/PyBCN/status/1760377376507056400" + time: "19:54" + - file: 2024-02-21-python-meetup-february-python-world-congress/05-today-s-meetup-is-surely-about-cats-if-you-also-lo.webp + caption: "Today's meetup is surely about cats! ❤️ if you also love Ellie 🐈" + source: "https://x.com/PyBCN/status/1760377864774471838" + time: "19:56" + - file: 2024-02-21-python-meetup-february-python-world-congress/07-photo.webp + caption: "A speaker at the lectern, beside a slide of a Streamlit app: Description branches into Web and Discourse, and both run down to Analysis" + source: "https://x.com/PyBCN/status/1760411826565623870" + time: "22:11" --- diff --git a/content/events/meetups/2024-03-21-python-meetup-march-rustacean-python-skills.md b/content/events/meetups/2024-03-21-python-meetup-march-rustacean-python-skills.md index 057cc3202..e067f1bc2 100644 --- a/content/events/meetups/2024-03-21-python-meetup-march-rustacean-python-skills.md +++ b/content/events/meetups/2024-03-21-python-meetup-march-rustacean-python-skills.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: 'Python Meetup March: Rustacean Python Skills 🐍 🦀' +title: 'Python Meetup March: Rustacean Python Skills' date: 2024-03-21 year: 2024 venue: Codurance diff --git a/content/events/meetups/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing.md b/content/events/meetups/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing.md index 01d4bedcd..b4767e24d 100644 --- a/content/events/meetups/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing.md +++ b/content/events/meetups/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing.md @@ -38,4 +38,34 @@ talks: language: en duration_minutes: 45 description: "Cluster-experiments is an open-source library that is used at Glovo to design AB tests (assess experiment length, AA tests, etc). We use a simulation approach which can accommodate different types of tests, being more general than what more popular libraries provide." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1793686859220193609" + items: + - file: 2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/01-welcome-to-python-meetup-may-computer-vision-and-a.webp + caption: "Welcome to Python Meetup May: Computer vision and A/B Testing https://www.meetup.com/python-barcelona/events/300940146/ Full room!" + source: "https://x.com/PyBCN/status/1793686859220193609" + time: "18:54" + - file: 2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/02-using-opencv-in-ai-practical-image-processing-in-p.webp + caption: "\"Using OpenCV in AI: Practical Image Processing in Python\", by Paula Osés" + source: "https://x.com/PyBCN/status/1793687768687902832" + time: "18:57" + talk: using-opencv-in-ai-practical-image-processing-in-python + - file: 2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/03-what-s-more-practical-that-looking-at-the-source-c.webp + caption: "What's more practical that looking at the source code?" + source: "https://x.com/PyBCN/status/1793689248605819163" + time: "19:03" + - file: 2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/04-cluster-experiments-a-simulation-library-to-design.webp + caption: "\"cluster-experiments, a simulation library to design AB tests\", by David Masip" + source: "https://x.com/PyBCN/status/1793694454232293428" + time: "19:24" + talk: cluster-experiments-a-simulation-library-to-design-ab-tests + - file: 2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/05-hello-world.webp + caption: "Hello world!" + source: "https://x.com/PyBCN/status/1793697976386510946" + time: "19:38" + --- diff --git a/content/events/meetups/2024-06-13-python-meetup-june-pyments-and-openpyxl.md b/content/events/meetups/2024-06-13-python-meetup-june-pyments-and-openpyxl.md index 623dca89d..cfe3cf7f0 100644 --- a/content/events/meetups/2024-06-13-python-meetup-june-pyments-and-openpyxl.md +++ b/content/events/meetups/2024-06-13-python-meetup-june-pyments-and-openpyxl.md @@ -44,4 +44,34 @@ talks: description: 'Tired about complex VBA macros and functions? Join the Excel revolution as we see how OpenPYXL Python library changes how we work with spreadsheets. We''ll discover how to handle data with a touch of Python magic. By the end, you''ll be an Excel expert, easily automating tasks and managing complex data with a few clicks. Get ready to improve your data skills!' +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1801298830899523584" + items: + - file: 2024-06-13-python-meetup-june-pyments-and-openpyxl/01-welcome-to-the-python-meetup-june-pyments-and-open.webp + caption: "Welcome 👋 to the Python Meetup June: Pyments and OpenPyXL Thanks Gartner for hosting us!" + source: "https://x.com/PyBCN/status/1801298830899523584" + time: "19:01" + - file: 2024-06-13-python-meetup-june-pyments-and-openpyxl/02-pyments-how-to-design-payment-applications-in-pyth.webp + caption: "\"Pyments: How To Design Payment Applications In Python\", by Alvaro Duran" + source: "https://x.com/PyBCN/status/1801299520258486580" + time: "19:04" + talk: pyments-how-to-design-payment-applications-in-python + - file: 2024-06-13-python-meetup-june-pyments-and-openpyxl/03-good-reasons-against-outsourcing-their-payments.webp + caption: "Good reasons against outsourcing their payments!" + source: "https://x.com/PyBCN/status/1801308635601268853" + time: "19:40" + - file: 2024-06-13-python-meetup-june-pyments-and-openpyxl/04-mastering-excel-automation-with-openpyxl-by-jordi.webp + caption: "\"Mastering Excel Automation with OpenPYXL\", by Jordi Bosch" + source: "https://x.com/PyBCN/status/1801309052363833670" + time: "19:41" + talk: mastering-excel-automation-with-openpyxl + - file: 2024-06-13-python-meetup-june-pyments-and-openpyxl/05-they-tried-to-automate-excel-with-phpexcel-but-php.webp + caption: "They tried to automate excel with PHPExcel... but PHP didn't work (🤔)... so they moved to OpenPyXL!" + source: "https://x.com/PyBCN/status/1801309846479819137" + time: "19:45" + --- diff --git a/content/events/meetups/2024-09-26-python-meetup-september-ai-goes-back-to-school.md b/content/events/meetups/2024-09-26-python-meetup-september-ai-goes-back-to-school.md index 787aa3359..288b76955 100644 --- a/content/events/meetups/2024-09-26-python-meetup-september-ai-goes-back-to-school.md +++ b/content/events/meetups/2024-09-26-python-meetup-september-ai-goes-back-to-school.md @@ -44,4 +44,46 @@ talks: links: - type: video url: "https://www.youtube.com/watch?v=h_LXliq1Wik" +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/1839346960492589226" + items: + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/01-welcome-to-python-meetup-september-ai-goes-back-to.webp + caption: "Welcome to \"Python Meetup September: AI Goes Back To School\" Thanks @codurance_ES for hosting us!" + source: "https://x.com/PyBCN/status/1839346960492589226" + time: "18:51" + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/02-ragtime-an-approach-to-retrieval-augmented-generat.webp + caption: "\"Ragtime: An Approach to Retrieval-Augmented Generation\", by Javier Martinez Alcantara" + source: "https://x.com/PyBCN/status/1839348035287138621" + time: "18:55" + talk: ragtime-an-approach-to-retrieval-augmented-generation + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/03-what-is-retrieval-augmented-information.webp + caption: "What is \"Retrieval Augmented Information\"?" + source: "https://x.com/PyBCN/status/1839349547111490044" + time: "19:01" + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/04-wow-he-s-using-a-rag-to-figure-out-warhammer-rules.webp + caption: "Wow, he's using a RAG to figure out Warhammer rules 🙌" + source: "https://x.com/PyBCN/status/1839354553927639500" + time: "19:21" + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/05-from-text-to-actions-llms-as-the-new-software-cons.webp + caption: "\"From text to actions: LLMs as the new software consumers\", by Pol Alvarez Vecino" + source: "https://x.com/PyBCN/status/1839359574895407158" + time: "19:41" + talk: from-text-to-actions-llms-as-the-new-software-consumers + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/06-doing-http-actions.webp + caption: "Doing HTTP actions" + source: "https://x.com/PyBCN/status/1839361844865384827" + time: "19:50" + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/07-putting-everything-together-with-talk2apis.webp + caption: "Putting everything together with Talk2Apis" + source: "https://x.com/PyBCN/status/1839362903075598809" + time: "19:54" + - file: 2024-09-26-python-meetup-september-ai-goes-back-to-school/08-it-just-built-a-flask-app-with-html-js-frontend-in.webp + caption: "It just built a flask app with html+js frontend in replit, awesome!" + source: "https://x.com/PyBCN/status/1839365156167672042" + time: "20:03" + --- diff --git a/content/events/meetups/2025-11-08-global-day-of-coderetreat-november-8th.md b/content/events/meetups/2025-11-08-global-day-of-coderetreat-november-8th.md index 9ae707a35..b8f72ff9d 100644 --- a/content/events/meetups/2025-11-08-global-day-of-coderetreat-november-8th.md +++ b/content/events/meetups/2025-11-08-global-day-of-coderetreat-november-8th.md @@ -5,7 +5,7 @@ # to the export or to the script, never here. The Meetup description is # the logistics of signing up and is not published, and the talks it # announces arrive separately. See content/events/meetups/_index.md. -title: "🌍 Global Day of Coderetreat - November 8th! 🚀" +title: "Global Day of Coderetreat - November 8th!" date: 2025-11-08 year: 2025 venue: "Codurance" diff --git a/content/events/meetups/2026-04-30-python-meetup-april-back-to-school.md b/content/events/meetups/2026-04-30-python-meetup-april-back-to-school.md index d45097fc2..4c143b079 100644 --- a/content/events/meetups/2026-04-30-python-meetup-april-back-to-school.md +++ b/content/events/meetups/2026-04-30-python-meetup-april-back-to-school.md @@ -38,4 +38,15 @@ talks: language: en duration_minutes: 30 description: "Apache Arrow and Apache Parquet are the de-facto standards for in-memory and file formats for columnar data. We use them on our data workflows daily, sometimes even without noticing. This talk will demystify these formats by going over the specifications and showing some real world examples of how the data actually looks on our systems." +# The photographs the association published of this day, one per post +# so no two share a caption, which is also the alt text. The posts were +# read out of the X export by the text of their thread, and imported +# with bin/import-x-photos --ids. +photos: + thread: "https://x.com/PyBCN/status/2049893503522554254" + items: + - file: 2026-04-30-python-meetup-april-back-to-school/01-first-talk-spec-driven-development-by-sergei-marty.webp + caption: "First talk \"Spec Driven Development\" by Sergei Martynov at @UniBarcelona" + source: "https://x.com/PyBCN/status/2049893503522554254" + time: "18:47" --- diff --git a/content/events/other_events/django_pyladies_2022.md b/content/events/other_events/django_pyladies_2022.md index ae80a5537..95ab8d366 100644 --- a/content/events/other_events/django_pyladies_2022.md +++ b/content/events/other_events/django_pyladies_2022.md @@ -15,6 +15,13 @@ heroBackground: /images/photos/django_pyladies_2022/header.jpg layout: event +# The group that ran the day, which is what decides the marker of its row +# on /events/ and on /talks/ (data/event_emoji.yaml through +# partials/event_type.html). Without it the page took the "Other event" +# glyph, because the rule reads this field and the title writes +# "PyLadiesBCN" with no space. +group: "PyLadies BCN" + content_columns: 5 carousel_columns: 7 @@ -219,6 +226,12 @@ agenda: # closing session of the 11th: the same room, the same screen, and the same # speaker as photo 1. The search ran to the 13th for them, and it found no # photo at all on the 12th, so no other event of that weekend is in this set. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: django-2022/09-thanks-for-attending-it-s-been-great.jpg + photos: thread: "https://x.com/PyBCN/status/1535567826257420288" items: diff --git a/content/events/other_events/pydata_2017_barcelona.md b/content/events/other_events/pydata_2017_barcelona.md index b81fc4ccc..633835522 100644 --- a/content/events/other_events/pydata_2017_barcelona.md +++ b/content/events/other_events/pydata_2017_barcelona.md @@ -741,6 +741,12 @@ talks: links: - type: slides url: https://github.com/jtorrents/pydata_bcn_NetworkX +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: group-pydata-2017.jpg + photos: thread: https://x.com/PyBCN/status/865470914107891717 items: diff --git a/content/events/pydatabcn/pydatabcn_2023.md b/content/events/pydatabcn/pydatabcn_2023.md index fe906d502..1fa25e933 100644 --- a/content/events/pydatabcn/pydatabcn_2023.md +++ b/content/events/pydatabcn/pydatabcn_2023.md @@ -366,6 +366,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pydata-2023/25-nataliasirera-the-pydatabcn-2023-has-been-incredib.jpg + photos: thread: "https://x.com/PyBCN/status/1667433149322735616" items: diff --git a/content/events/pyday_bcn/pyday_bcn_2016.md b/content/events/pyday_bcn/pyday_bcn_2016.md index 05f5ccefc..390ec23a4 100644 --- a/content/events/pyday_bcn/pyday_bcn_2016.md +++ b/content/events/pyday_bcn/pyday_bcn_2016.md @@ -76,6 +76,21 @@ sponsor_levels: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +# +# This one is the full lecture hall of the Universitat de Barcelona, facing +# the camera. It is not in the thread of @PyBCN: @PyLadiesBCN published it +# on 2016-09-15 at 17:20 UTC, "And this is happing now in Barcelona +# #PyDayBCN16 @pybcn", as the second of its two photographs, +# https://x.com/PyLadiesBCN/status/776470703289802752/photo/2. It is the +# canonical photo over people-pyday-2016.jpg, which is the cloister at +# the door. Stored at 1600px wide, the size the other chosen pictures of +# images/photos/ are kept at. +canonical_photo: group-pyday-2016.jpg + photos: thread: "https://x.com/PyBCN/status/776469200915337217" items: diff --git a/content/events/pyday_bcn/pyday_bcn_2018.md b/content/events/pyday_bcn/pyday_bcn_2018.md index e08de84b2..c44e1a9d8 100644 --- a/content/events/pyday_bcn/pyday_bcn_2018.md +++ b/content/events/pyday_bcn/pyday_bcn_2018.md @@ -217,6 +217,12 @@ agenda: # A photo carries a talk only when its caption names that talk. The eight # that do are the eight sessions of the programme above, each announced as # it started. The other eight are the room, the welcome slides, and lunch. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2018/03-full-room-the-100-tickets-were-over-in-less-than-t.jpg + photos: date: 2018-11-24 thread: "https://x.com/PyBCN/status/1066253610957324288" @@ -296,6 +302,21 @@ photos: # The index of sections in the sidebar, like every other edition. layout: event + +# The sponsors of the day, with the two levels the site of 2018 published, +# static/archives/pybcn.org/pyday-bcn-2018/. The page used to carry them as +# the HTML of that frozen page pasted into its body: six img tags straight +# from the archive, each with its own height written in a style attribute, +# 150px for one logo and 80px for another. They read as a row of mismatched +# pictures next to the cards of every other edition. As levels they go through partials/sponsors-grid.html and +# take the same card as the rest. +sponsor_levels: + - sponsors_per_line: 2 + sponsors: [kiwi, onna] + name: Platinum + - sponsors_per_line: 4 + sponsors: [kernel-analytics, travelperk, kschool, psf] + name: Gold ---

We are excited and glad to announce that we are organizing the second edition of PyDay in Barcelona! @@ -496,12 +517,3 @@ Get the workshop materialsscikit-learn

  • spacy (with Spanish model installed)
  • -

    Sponsors

    -

    Platinum

    -

    Kiwicom logo -Onna logo

    -

    Gold

    -

    Kernel Analytics logo -TravelPerk logo -KSchool logo -Python Software Foundation logo

    diff --git a/content/events/pyday_bcn/pyday_bcn_2019.md b/content/events/pyday_bcn/pyday_bcn_2019.md index 55ddbcf8b..fd3c3f0d8 100644 --- a/content/events/pyday_bcn/pyday_bcn_2019.md +++ b/content/events/pyday_bcn/pyday_bcn_2019.md @@ -22,6 +22,31 @@ heroBackground: /images/photos/people-pyday-2019.jpg # are still on single.html and still have no index. layout: event +# The sponsors of the day, with the five levels the site of 2019 published, +# static/archives/pybcn.org/pyday-bcn-2019/. The page used to carry them as +# the HTML of that frozen page pasted into its body: nineteen img tags +# straight from the archive, each with its own width written in a style +# attribute, from 350px for one logo to 70px for another, inside
    +# tags. They read as a wall of mismatched pictures next to the cards of +# every other edition, as the page of 2018 did. As levels they go through +# partials/sponsors-grid.html and take the same card as the rest. +sponsor_levels: + - sponsors_per_line: 2 + sponsors: [ub, psf] + name: Venue + - sponsors_per_line: 3 + sponsors: [upcloud, kiwi, invisiblebits, chartboost, king, qustodio] + name: Platinum + - sponsors_per_line: 1 + sponsors: [affectv] + name: Coffee Sponsor + - sponsors_per_line: 4 + sponsors: [thoughtworks, bmat, holaluz, travelperk, elastic, verse, fundacion-ci] + name: Gold + - sponsors_per_line: 3 + sponsors: [kschool, satellogic, blueliv] + name: Silver + # The programme of this edition, read from the printed agenda that the live # thread on X photographed (tweet 1195637939285430272, the photo on this page). # The Google Calendar embed that held it is gone, and the Meetup description @@ -37,8 +62,9 @@ layout: event talks: # The two keynotes. The printed sheets announce the opening one in all three # tracks and give it no title, and the closing one is not on them at all: the - # thread tweeted it at 20:03, well after the 18:30 the sheets end at. David - # Arcos supplied both titles, which is why they are plain and not quoted. + # thread tweeted it at 20:03, well after the 18:30 the sheets end at. Both + # titles come from the thread and not from a printed source, which is + # why they are plain and not quoted. - id: opening-keynote title: "Opening keynote" speakers: [laura-perez-mayos] @@ -238,14 +264,18 @@ agenda: level: beginner # Photos published by PyBCN on the day. One per tweet, so no two share a -# caption, and the caption is also the alt text. PyBCN organisers took them, -# David Arcos all but the one he is standing in. The page credits the account -# that published them, which is the part the post itself proves. +# caption, and the caption is also the alt text. PyBCN organisers took them. +# The page credits the account that published them, which is the part the +# post itself proves. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2019/21-finally-our-gratitude-to-the-python-barcelona-comm.jpg + photos: - date: 2019-11-16 thread: "https://x.com/PyBCN/status/1195623896537554944" - # The album the organisers kept at the time. It holds more of the day than - # the posts do, so the gallery links it instead of the body of the page. + date: 2019-11-16 album: "https://drive.google.com/drive/folders/1kODXtBARnTbZmQwVW1Qx2EvBCDSqhZjX?usp=sharing" items: - file: pyday-2019/01-the-pydaybcn-just-started-keynote-by-our-president.jpg @@ -310,6 +340,10 @@ photos: caption: "Thanks @codekiwicom for bringing churros con chocolate, and hot wine! 👏👏👏 #PyDay" source: "https://x.com/PyBCN/status/1195680425752051712" time: "13:30" + - file: pyday-2019/21-finally-our-gratitude-to-the-python-barcelona-comm.jpg + caption: "Finally, our gratitude to the Python Barcelona community! @PyBCN, @PyLadiesBCN, @DjangoGirlsBCN, and all our awesome organizers, coaches, speakers, volunteers and assistants! 👏👏👏" + source: "https://x.com/PyBCN/status/1197534799130497024" + time: "16:18" - file: pyday-2019/16-building-interactive-data-visualizations-with-plot.jpg caption: "\"Building Interactive Data Visualizations with Plotly and Dash\" by Anna Fedotova" source: "https://x.com/PyBCN/status/1195729247731630080" @@ -334,10 +368,10 @@ photos: source: "https://x.com/PyBCN/status/1195779452829097984" time: "20:03" talk: closing-keynote - - file: pyday-2019/21-finally-our-gratitude-to-the-python-barcelona-comm.jpg - caption: "Finally, our gratitude to the Python Barcelona community! @PyBCN, @PyLadiesBCN, @DjangoGirlsBCN, and all our awesome organizers, coaches, speakers, volunteers and assistants! 👏👏👏" - source: "https://x.com/PyBCN/status/1197534799130497024" - time: "16:18" + - file: pyday_bcn_2019/22-thanks-to-all-the-sponsors-speakers-volunteers-coa.webp + caption: "Thanks to all the sponsors, speakers, volunteers, coaches, organizers and assistants! Without you, the #PyDayBCN would not be possible 👏 Remember to send proposals: https://pybcn.org/call-for-proposals/ And become a member: https://pybcn.org/association/become-a-member/ And follow @PyBCN! Thanks 👏👏" + source: "https://x.com/PyBCN/status/1195780662810304512" + time: "20:08" ---

    The group photograph of PyDay BCN 2019, in the cloister of the Universitat de Barcelona

    Archived content

    @@ -357,36 +391,3 @@ photos: {{< google-embed kind="calendar" height="600" title="Agenda of PyDay BCN 2019" src="https://calendar.google.com/calendar/embed?height=600&wkst=1&bgcolor=%23ffffff&ctz=Europe%2FMadrid&mode=AGENDA&showNav=0&showDate=0&showTabs=0&showCalendars=0&showTz=1&src=eTEway53c19pdWMxYW00c2Y5c3V2NGtqcjV0YXZuYzEzY0Bncm91cC5jYWxlbmRhci5nb29nbGUuY29t&color=%23F09300&title=Agenda%20del%20evento&showTitle=0" >}} -

    Sponsors

    -

    Venue

    -
    -Universitat de Barcelona logo -Python Software Foundation logo -

    Platinum

    -
    -UpCloud logo -Kiwi.com logo -Invisible Bits logo -Chartboost logo -King logo -Qustodio logo -

    Coffee Sponsor

    -
    -Affectv logo -

    Gold

    -
    -ThoughtWorks logo -BMAT logo -Holaluz logo -
    -TravelPerk logo -Elastic logo -Verse logo -
    -Fundación Cibervoluntarios logo -

    Silver

    -
    -KSchool logo -Satellogic logo -Blueliv logo -
    diff --git a/content/events/pyday_bcn/pyday_bcn_2021.md b/content/events/pyday_bcn/pyday_bcn_2021.md index dd415da70..b8e262f3d 100644 --- a/content/events/pyday_bcn/pyday_bcn_2021.md +++ b/content/events/pyday_bcn/pyday_bcn_2021.md @@ -415,6 +415,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2021/25-say-cheese.jpg + photos: thread: "https://x.com/PyBCN/status/1464506413720420352" items: @@ -486,7 +492,7 @@ photos: caption: "Remember, we'll take the group photo at 13h, in the terrace. See you there!" source: "https://x.com/PyBCN/status/1464549374147678209" time: "11:59" - - file: pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.png + - file: pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.webp caption: "At the end of each talk, please use the post-its to leave feedback for the speakers:" source: "https://x.com/PyBCN/status/1464550721731371008" time: "12:04" diff --git a/content/events/pyday_bcn/pyday_bcn_2022.md b/content/events/pyday_bcn/pyday_bcn_2022.md index 0cc0800f5..faf8f8ba1 100644 --- a/content/events/pyday_bcn/pyday_bcn_2022.md +++ b/content/events/pyday_bcn/pyday_bcn_2022.md @@ -380,6 +380,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2022/32-thank-you-all-for-attending-the-pydaybcn.jpg + photos: thread: "https://x.com/PyBCN/status/1596420421569908741" items: diff --git a/content/events/pyday_bcn/pyday_bcn_2023.md b/content/events/pyday_bcn/pyday_bcn_2023.md index dc7626335..5797cebed 100644 --- a/content/events/pyday_bcn/pyday_bcn_2023.md +++ b/content/events/pyday_bcn/pyday_bcn_2023.md @@ -377,6 +377,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2023/33-thank-you-for-the-pydaybcn.jpg + photos: thread: "https://x.com/PyBCN/status/1723274179888230446" items: diff --git a/content/events/pyday_bcn/pyday_bcn_2024.md b/content/events/pyday_bcn/pyday_bcn_2024.md index 770e4be5f..e113d8567 100644 --- a/content/events/pyday_bcn/pyday_bcn_2024.md +++ b/content/events/pyday_bcn/pyday_bcn_2024.md @@ -420,6 +420,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2024/01-thanks-for-attending-the-pydaybcn-2024-see-you-nex.jpg + photos: thread: "https://x.com/PyBCN/status/1855180142240272592" items: diff --git a/content/events/pyday_bcn/pyday_bcn_2025.md b/content/events/pyday_bcn/pyday_bcn_2025.md index 50e8b9dfc..9f1c0635b 100644 --- a/content/events/pyday_bcn/pyday_bcn_2025.md +++ b/content/events/pyday_bcn/pyday_bcn_2025.md @@ -6,6 +6,13 @@ year: 2025 date: 2025-11-29 # The venue of this edition, from the room names and the hero image of this page: this edition sold tickets on Eventbrite and was never a Meetup event. venue: "Canòdrom" +# How many people came. Not a registration: this edition sold its tickets +# on Eventbrite, so there is no RSVP count, and the number is the one the +# association counted and published the day after, in the post that closes +# the thread of the day: "The #PyDayBCN 2025 was a success! 140 +# attendants, 16 workshops, many lightning talks, and hundreds of +# coffees!", https://x.com/PyBCN/status/1995426809425613242. +attendees: 140 description: "For the community, by the community!" menu: main: @@ -527,6 +534,12 @@ agenda: # Photos published by PyBCN on the day, one per post so no two share a caption, # which is also the alt text. Imported with bin/import-x-photos, which excludes # anything the account only shared: that copyright belongs to somebody else. +# The one photo of this day: the group photo when the day has one, and the +# picture that says most about it when it does not. It is what the carousel +# of the home page shows, one slide per event. See +# partials/canonical_photos.html. +canonical_photo: pyday-2025/02-the-pydaybcn-2025-was-a-success-140-attendants-16.jpg + photos: thread: "https://x.com/PyBCN/status/1994662616132673581" items: diff --git a/content/people/_content.gotmpl b/content/people/_content.gotmpl new file mode 100644 index 000000000..41fcc3227 --- /dev/null +++ b/content/people/_content.gotmpl @@ -0,0 +1,157 @@ +{{- /* + One page per role, built from the pages that credit people. + + /people/ lists every person the archive credits and offers a tab per + role above the list (see partials/people_tabs.html), and each tab is a + page of its own that lists only the people who hold that role: + + /people/role/speaker/ + /people/role/permanent-committee/ + + The filter is sub-pages and not JavaScript, as on /talks/, and each + one carries its emoji. A role is not + in the front matter of a person: AGENTS.md says never to store one + that can be computed, and partials/appearances_index.html computes + them at render time from the pages that list the person under a + heading and from the talks that credit the person. A content adapter + runs before the pages exist and cannot read that index (site.Pages is + not available yet, see content/talks/_content.gotmpl), so this one + reads the same front matter from disk and resolves the same headings + the same way: the level name or the section title of a people_sections + block, the level name of a people_levels block, and "Speakers" for the + speakers of a talks block, each through data/roles.yaml, which turns + "Speakers" into "Speaker". The set of labels this gives is the set the + index gives, because both read one rule from one table; the layout then + picks the rows of a label from the index, so the pages this adapter + adds and the rows those pages hold cannot name a role differently. + + A page exists only for a label that at least one person holds: a + heading with no id under it, and a talks block with no speaker, add + nothing. A draft page is skipped as the index skips it, so a server + run with -D adds no role for the fixture of content/canary.md. + + The path segment is the label through urlize, "Permanent Committee" + to permanent-committee and "Former Management Board (2018 - 2025)" to + former-management-board-2018-2025, under one directory, role/, so a + segment can never collide with a person id, which is firstname-surname. + The page carries the label as params.filter, which is how every walker + of the people section tells a listing from a person (a person has an + id, a listing has a filter), and how layouts/people/role.html knows + which rows to keep. No page of this section is a record: the layouts + that read the records skip a page with no id already. + + The walk covers content/ and two levels of directories under it, which + is the shape of the tree: content/canary.md, content/
    /.md, + and content/events//.md. A directory nested deeper + logs a warning rather than losing its headings in silence. The front + matter is read as the talks adapter reads it, through + resources.FromString with a name so that transform.Unmarshal knows the + format; the name here is the path of the file under content/, which is + unique, where two sections both hold a job-offers.md. + + One more page, Assistants, which no label gives: /people/role/assistants/ + answers the question a reader of the other tabs asks next, who came, + and the answer is that the association never recorded it. The tab + exists to say so. It is the data policy of the + archive told as a joke: a programme, a board page, or a credit names + the people who spoke, organized, mentored, or collaborated, and an + attendee is on no such list. The one figure that exists is the count + of Meetup RSVPs, which the page of a meetup prints as registrations + and never as attendance (AGENTS.md: RSVPs are not attendance). The + page carries its text as content and the same filter param as the + others, so partials/people_tabs.html lists it from the pages like any + other view, with no count because there is no number to print, and + layouts/people/role.html prints the text where /people/ prints its + intro and no empty bar of letters under it. +*/ -}} +{{- $root := "content" -}} + +{{- /* The files to read: every markdown file of content/ and of the + directories two levels under it. */ -}} +{{- $files := slice -}} +{{- range $entry := os.ReadDir $root -}} + {{- $here := path.Join $root $entry.Name -}} + {{- if not $entry.IsDir -}} + {{- $files = $files | append $here -}} + {{- continue -}} + {{- end -}} + {{- range $child := os.ReadDir $here -}} + {{- $there := path.Join $here $child.Name -}} + {{- if not $child.IsDir -}} + {{- $files = $files | append $there -}} + {{- continue -}} + {{- end -}} + {{- range $leaf := os.ReadDir $there -}} + {{- if $leaf.IsDir -}} + {{- warnf "people adapter: %q is nested deeper than this walk reads, so any role in it gets no page." (path.Join $there $leaf.Name) -}} + {{- else -}} + {{- $files = $files | append (path.Join $there $leaf.Name) -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- /* The labels at least one person holds, as a set. */ -}} +{{- $labels := dict -}} +{{- range $file := $files -}} + {{- if ne (path.Ext $file) ".md" }}{{ continue }}{{ end -}} + {{- $raw := os.ReadFile $file -}} + {{- if not (hasPrefix $raw "---") }}{{ continue }}{{ end -}} + {{- $front := strings.TrimPrefix "---" (index (split $raw "\n---") 0) -}} + {{- $name := printf "people-roles/%s.yaml" (strings.TrimSuffix ".md" (strings.TrimPrefix "content/" $file)) -}} + {{- $page := resources.FromString $name $front | transform.Unmarshal -}} + {{- if $page.draft }}{{ continue }}{{ end -}} + {{- /* The headings of the page that list at least one person. */ -}} + {{- $headings := slice -}} + {{- range $section := $page.people_sections -}} + {{- range $level := $section.levels -}} + {{- with $level.people }}{{ $headings = $headings | append (default $section.title $level.name) }}{{ end -}} + {{- end -}} + {{- end -}} + {{- range $level := $page.people_levels -}} + {{- with $level.people }}{{ $headings = $headings | append $level.name }}{{ end -}} + {{- end -}} + {{- range $talk := $page.talks -}} + {{- with $talk.speakers }}{{ $headings = $headings | append "Speakers" }}{{ end -}} + {{- end -}} + {{- range $heading := $headings -}} + {{- if not $heading }}{{ continue }}{{ end -}} + {{- $label := default $heading (index site.Data.roles $heading) -}} + {{- $labels = merge $labels (dict $label true) -}} + {{- end -}} +{{- end -}} + +{{- /* The page of each label, in the order of the labels, so two builds + add the pages in one order. The title is the label itself, the + words the row of a person prints and the tab reads. */ -}} +{{- range $label, $_ := $labels -}} + {{- /* "Organizers (23)" and not "Organizer (23)": the heading names + what the page holds, which is people. A label that is a group + and not a role ("Permanent Committee", "Management Board + (2026)") is already the name of the thing and is left alone. */ -}} + {{- $title := $label -}} + {{- if not (or (strings.Contains $label " ") (strings.Contains $label "(")) -}} + {{- $title = pluralize $label -}} + {{- end -}} + {{- $.AddPage (dict + "kind" "page" + "path" (printf "role/%s" (urlize $label)) + "title" $title + "layout" "role" + "params" (dict + "filter" $label + "description" (printf "Every person the archive credits as %s, with their roles, their events, and their links." $label))) -}} +{{- end -}} + +{{- $assistants := `## We don't track that! + +The association has never recorded who came to an event. The archive holds the people who spoke, organized, mentored, or collaborated, because a programme, a board page, or a credit names them, and an attendee is on no such list. The one figure that exists is how many people said yes on Meetup, which the page of a meetup prints as registrations: a promise to come, not a seat filled.` -}} +{{- $.AddPage (dict + "kind" "page" + "path" "role/assistants" + "title" "Assistants" + "layout" "role" + "content" (dict "mediaType" "text/markdown" "value" $assistants) + "params" (dict + "filter" "Assistants" + "description" "Who came to an event. The association never recorded it, so the archive holds the people who spoke, organized, mentored, or collaborated, and nobody else.")) -}} diff --git a/content/people/_index.md b/content/people/_index.md index d31a44a52..05ae3bad6 100644 --- a/content/people/_index.md +++ b/content/people/_index.md @@ -5,4 +5,4 @@ menu: "main" weight: 3 --- -Everyone the archive credits, by name. A row holds the roles the person has held, the years they were here, how many talks they gave, and the pages that say so: the programme of a day, its photos, and the page of the board or the committee they sat on. The board and the committee of today are on [the organizers page](/pybcn_association/organizers/), with a photo and a bio each. +Everyone the archive credits, by name. A row holds the roles the person has held, how many events credit them, and the pages that say so: the programme of a day, its photos, and the page of the board or the committee they sat on. The tabs above the list keep one role at a time. The board, the committee, and the collaborators of today are grouped on [the organizers page](/pybcn_association/organizers/). diff --git a/content/people/alex-molas.md b/content/people/alex-molas.md index 02063af20..d388dd425 100644 --- a/content/people/alex-molas.md +++ b/content/people/alex-molas.md @@ -1,7 +1,7 @@ --- id: alex-molas name: Alex Molas -photo: alex-molas.png +photo: alex-molas.webp github: https://github.com/alexmolas twitter: https://x.com/molasalex diff --git a/content/people/ankit-mahato.md b/content/people/ankit-mahato.md index 0bc7547f2..5bb5cd510 100644 --- a/content/people/ankit-mahato.md +++ b/content/people/ankit-mahato.md @@ -1,7 +1,7 @@ --- id: ankit-mahato name: Ankit Mahato -photo: ankit-mahato.png +photo: ankit-mahato.webp twitter: https://x.com/ankitmahato linkedin: https://www.linkedin.com/in/ankitmahato diff --git a/content/people/areski-belaid.md b/content/people/areski-belaid.md index 8059e5337..120fad16b 100644 --- a/content/people/areski-belaid.md +++ b/content/people/areski-belaid.md @@ -1,4 +1,5 @@ --- id: areski-belaid name: "Areski Belaid" +github: https://github.com/areski --- diff --git a/content/people/dave-pitts.md b/content/people/dave-pitts.md index 512c35016..64eefc2e6 100644 --- a/content/people/dave-pitts.md +++ b/content/people/dave-pitts.md @@ -1,7 +1,7 @@ --- id: dave-pitts name: "Dave Pitts" -photo: "dave-pitts.png" +photo: "dave-pitts.webp" github: https://github.com/dgapitts linkedin: https://www.linkedin.com/in/dave-pitts-533a7b5 --- diff --git a/content/people/diego-giaquinta.md b/content/people/diego-giaquinta.md index 5e9ffeca6..e01645734 100644 --- a/content/people/diego-giaquinta.md +++ b/content/people/diego-giaquinta.md @@ -1,7 +1,7 @@ --- id: diego-giaquinta name: "Diego Giaquinta" -photo: "diego-giaquinta.png" +photo: "diego-giaquinta.webp" linkedin: "https://www.linkedin.com/in/diego-giaquinta" --- diff --git a/content/people/dimitri-herrero.md b/content/people/dimitri-herrero.md index 7123047e0..848b87466 100644 --- a/content/people/dimitri-herrero.md +++ b/content/people/dimitri-herrero.md @@ -3,4 +3,5 @@ id: dimitri-herrero name: Dimitri Herrero pybcn_position: Organizer +github: https://github.com/dim1tri --- diff --git a/content/people/eva-martin-del-pico.md b/content/people/eva-martin-del-pico.md index 8e5779f24..f3268e3ba 100644 --- a/content/people/eva-martin-del-pico.md +++ b/content/people/eva-martin-del-pico.md @@ -1,7 +1,7 @@ --- id: eva-martin-del-pico name: "Eva Martín del Pico" -photo: "eva-martin-del-pico.png" +photo: "eva-martin-del-pico.webp" linkedin: "https://www.linkedin.com/in/eva-martín-del-pico-4095b988" github: "https://github.com/EvaMart" diff --git a/content/people/ferran-fabregas.md b/content/people/ferran-fabregas.md index 7b9ad4aa6..3c8453fb8 100644 --- a/content/people/ferran-fabregas.md +++ b/content/people/ferran-fabregas.md @@ -1,7 +1,7 @@ --- id: ferran-fabregas name: "Ferran Fàbregas" -photo: ferran-fabregas.png +photo: ferran-fabregas.webp twitter: https://x.com/ferrithemaker linkedin: https://www.linkedin.com/in/ferran-fabregas-94a68525 github: https://github.com/ferrithemaker diff --git a/content/people/francesco-faraone.md b/content/people/francesco-faraone.md index f2790b05e..a7898b502 100644 --- a/content/people/francesco-faraone.md +++ b/content/people/francesco-faraone.md @@ -1,7 +1,7 @@ --- id: francesco-faraone name: Francesco Faraone -photo: francesco-faraone.png +photo: francesco-faraone.webp photo_anchor: Bottom twitter: https://x.com/cicfaraone diff --git a/content/people/israel-saeta-perez.md b/content/people/israel-saeta-perez.md index e8d67ac26..9cc121d4e 100644 --- a/content/people/israel-saeta-perez.md +++ b/content/people/israel-saeta-perez.md @@ -2,6 +2,7 @@ id: israel-saeta-perez name: "Israel Saeta Pérez" photo: israel-saeta-perez.jpg +github: https://github.com/dukebody twitter: "https://x.com/dukebody" --- diff --git a/content/people/jose-haro-peralta.md b/content/people/jose-haro-peralta.md index 0218cb31e..ec28ba238 100644 --- a/content/people/jose-haro-peralta.md +++ b/content/people/jose-haro-peralta.md @@ -1,7 +1,7 @@ --- id: jose-haro-peralta name: Jose Haro Peralta -photo: jose-haro-peralta.png +photo: jose-haro-peralta.webp photo_anchor: Top twitter: https://x.com/JoseHaroPeralta diff --git a/content/people/juan-gonzales-vallinas.md b/content/people/juan-gonzales-vallinas.md deleted file mode 100644 index c081f925c..000000000 --- a/content/people/juan-gonzales-vallinas.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -id: juan-gonzales-vallinas -name: "Juan Gonzales-Vallinas" ---- diff --git a/content/people/juan-gonzalez-vallinas.md b/content/people/juan-gonzalez-vallinas.md deleted file mode 100644 index d8e48e65a..000000000 --- a/content/people/juan-gonzalez-vallinas.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -id: juan-gonzalez-vallinas -name: "Juan González-Vallinas" ---- diff --git a/content/people/mariana-meireles.md b/content/people/mariana-meireles.md index 4b6dc86c2..34546187d 100644 --- a/content/people/mariana-meireles.md +++ b/content/people/mariana-meireles.md @@ -1,8 +1,7 @@ --- id: mariana-meireles name: Mariana Meireles -photo: mariana-meireles.png - +photo: mariana-meireles.webp twitter: https://x.com/mari_meir linkedin: https://www.linkedin.com/in/mariana-meireles github: https://github.com/marimeireles diff --git a/content/people/mauricio-volcanes.md b/content/people/mauricio-volcanes.md index 90135f1fa..a6e63a1df 100644 --- a/content/people/mauricio-volcanes.md +++ b/content/people/mauricio-volcanes.md @@ -2,8 +2,7 @@ id: mauricio-volcanes name: "Mauricio Volcanes" -photo: mauricio-volcanes.png - +photo: mauricio-volcanes.webp pybcn_position: "Communications" linkedin: https://www.linkedin.com/in/mauriciovolcanes diff --git a/content/people/noe-casas.md b/content/people/noe-casas.md index 2952af8b6..d3d4e684e 100644 --- a/content/people/noe-casas.md +++ b/content/people/noe-casas.md @@ -1,7 +1,7 @@ --- id: noe-casas name: "Noé Casas" -photo: noe-casas.png +photo: noe-casas.webp linkedin: "https://www.linkedin.com/in/noecasas" twitter: "https://x.com/noecasas" diff --git a/content/people/oriol-abril-pla.md b/content/people/oriol-abril-pla.md index ffdd7d066..72618148e 100644 --- a/content/people/oriol-abril-pla.md +++ b/content/people/oriol-abril-pla.md @@ -1,7 +1,7 @@ --- id: oriol-abril-pla name: Oriol Abril Pla -photo: oriol-abril-pla.png +photo: oriol-abril-pla.webp linkedin: https://www.linkedin.com/in/oriol-abril-pla-1b9123180 github: https://github.com/OriolAbril --- diff --git a/content/people/pavel-sulimov.md b/content/people/pavel-sulimov.md index 2249b85a5..d053d58bc 100644 --- a/content/people/pavel-sulimov.md +++ b/content/people/pavel-sulimov.md @@ -1,7 +1,7 @@ --- id: pavel-sulimov name: Pavel Sulimov -photo: pavel-sulimov.png +photo: pavel-sulimov.webp photo_anchor: Right --- diff --git a/content/people/ruben-afonso.md b/content/people/ruben-afonso.md index 95c97a75e..deadb5203 100644 --- a/content/people/ruben-afonso.md +++ b/content/people/ruben-afonso.md @@ -1,7 +1,7 @@ --- id: ruben-afonso name: Ruben Afonso -photo: ruben-afonso.png +photo: ruben-afonso.webp photo_anchor: Bottom twitter: https://x.com/rubenafo diff --git a/content/people/ruben-berenguel.md b/content/people/ruben-berenguel.md index 56bc52df0..e6c0a5e75 100644 --- a/content/people/ruben-berenguel.md +++ b/content/people/ruben-berenguel.md @@ -1,7 +1,7 @@ --- id: ruben-berenguel name: "Ruben Berenguel" -photo: ruben-berenguel.png +photo: ruben-berenguel.webp pybcn_position: Organizer twitter: "https://x.com/berenguel" diff --git a/content/people/sergi-ramirez.md b/content/people/sergi-ramirez.md index f27777529..078859698 100644 --- a/content/people/sergi-ramirez.md +++ b/content/people/sergi-ramirez.md @@ -7,6 +7,7 @@ photo_anchor: Left pybcn_position: "Events" +github: https://github.com/ramitjansIA linkedin: https://www.linkedin.com/in/ramitjans --- diff --git a/content/people/yago-tafalla.md b/content/people/yago-tafalla.md index f0d460990..e20eb998f 100644 --- a/content/people/yago-tafalla.md +++ b/content/people/yago-tafalla.md @@ -2,8 +2,7 @@ id: yago-tafalla name: "Yago Tafalla" -photo: yago-tafalla.png - +photo: yago-tafalla.webp pybcn_position: "Treasurer" linkedin: https://www.linkedin.com/in/yagorafaeltafallasmit diff --git a/content/pybcn_association/information.md b/content/pybcn_association/information.md index 95ba205cd..33d4f366b 100644 --- a/content/pybcn_association/information.md +++ b/content/pybcn_association/information.md @@ -56,14 +56,14 @@ All the work groups must follow some rules: * [Internal Regulations](https://docs.google.com/document/d/1xd36jkdcT3s3zGjNrSMnGuuk5xgodAos2fLDyJMLE30/edit?usp=sharing) * [Code of Conduct](/pybcn_association/coc/) * [Founding Act](https://docs.google.com/document/d/1_fTbgT-Bw25aaGLb9O9vCMi1Gkxhb3FiY-S7yeZLq6k/edit?usp=sharing) -* [Assamblea General Ordinària 2019](https://docs.google.com/document/d/1mJuuoymGJe4ayO5y08yN0bHBSqrPPyRZW2QLQSXXuYg/edit?usp=sharing) -* [Assamblea General Ordinària 2020](https://docs.google.com/document/d/1yLR9p_vDKZPs0NlVMaKtrBMooqHdDyY0Lk5cPmcGs5I/edit?usp=sharing) -* [Assamblea General Ordinària 2021](https://docs.google.com/document/d/1Qi0efxdC7T2bk2oVT2z6tTrrJ3UONwCK3Vnf3cL4KFA/edit?usp=sharing) -* [Assamblea General Ordinària 2022](https://docs.google.com/document/d/13xiLuUGIzT8kyZWGTkA6T-dbUO7Y_Z6hlUjakkwlSGM/edit?usp=sharing) -* [Assamblea General Ordinària 2023](https://docs.google.com/document/d/1CnJzGjz7COsc-45w5tEVu5gpDBv1mUozFh4eGXw8-GU/edit?usp=sharing) -* [Assamblea General Ordinària 2024](https://docs.google.com/document/d/1IDYEQvStyM8YxQHIcmZbfE0SYePDGDavHssz3CG3d1E/edit?usp=share_link) -* [Assamblea Extraordinària 2025](https://docs.google.com/document/d/12BHpSCe7yOdgdm7JiuzKxT_RNKyxHN18R9p0_1rCWl4/edit?usp=share_link) -* [Assamblea General Ordinària 2026](https://docs.google.com/document/d/1Yx_4OMf3TkUDrI4MT3FD4NWm0y-3mSh32krX5F1RqMY/edit?usp=sharing) + +## Assemblies + +Once a year the association meets its members, renders its accounts, and +writes down what was agreed. The minutes are below, newest first, with the +photograph of the day where the association published one. + +{{< assemblies >}} ## Past Management Boards * Management Board 2018 - 2025 diff --git a/content/pybcn_association/legal-notice.md b/content/pybcn_association/legal-notice.md index 6707346fa..f0eda4875 100644 --- a/content/pybcn_association/legal-notice.md +++ b/content/pybcn_association/legal-notice.md @@ -23,7 +23,7 @@ The Management Board is responsible for this website. You can see who sits on it ## What this site is -This is an informational site. It describes the association, its events, the people who organise them and speak at them, and how to join, propose a talk, or sponsor us. Nothing is sold through this site. The membership fee is paid on PayPal's own site, not here. Some pages embed a Google Form or a Google Calendar, and the page of a recorded talk embeds its video in a YouTube player (youtube-nocookie.com); those frames are served by Google. +This is an informational site. It describes the association, its events, the people who organise them and speak at them, and how to join, propose a talk, or sponsor us. Nothing is sold through this site. The membership fee is paid on PayPal's own site, not here. Some pages embed a Google Form or a Google Calendar, and the page of a recorded talk, the page of a recorded session, the page of a speaker, and the home page embed video in a YouTube player (youtube-nocookie.com); those frames are served by Google. The site is a set of static pages, published from a public repository on GitHub and served by GitHub Pages. We keep no server of our own and we run no analytics. The [Privacy policy](/pybcn_association/privacy-policy/) says what personal data this involves. diff --git a/content/pybcn_association/organizers.md b/content/pybcn_association/organizers.md index 7bf2178e5..b636826dc 100644 --- a/content/pybcn_association/organizers.md +++ b/content/pybcn_association/organizers.md @@ -18,10 +18,16 @@ people_levels: - people_per_line: 5 people: [jordi-bosch, daniel-mesejo-leon, yago-tafalla, mauricio-volcanes, sergi-ramirez] name: Management Board (2026) + # The faces the home page shows, which are the two bodies that + # run the association. + home_faces: true - people_per_line: 6 people: [alberto-camara, david-arcos, ignasi-fosch, natalia-padilla, alicia-morales-carrasco, ferran-jovell] name: Permanent Committee - - people_per_line: 4 + home_faces: true + # Six on a line, so the eight read as the two rows of a group and not + # as two rows of four with a gap. + - people_per_line: 6 people: [elisabeth-ortega-carrasco, josep-martinez-vila, loris-mularoni, laura-perez-mayos, nuria-pujol-vilanova, jose-riera-sanchez, ruben-berenguel, xavi-francisco-gilabert] name: Collaborators - people_per_line: 5 diff --git a/content/pybcn_association/privacy-policy.md b/content/pybcn_association/privacy-policy.md index 81089c399..d77b5b1be 100644 --- a/content/pybcn_association/privacy-policy.md +++ b/content/pybcn_association/privacy-policy.md @@ -63,9 +63,9 @@ Our contact addresses, such as pybcn@googlegroups.com and pyladies-bcn@googlegro A few pages embed a Google Form or a Google Calendar in a frame: the two talk proposal forms and the agenda of PyDay BCN 2019. The frame is served by Google: when the page loads, Google sees your IP address and browser details, and may set its own cookies inside the frame. Google's [privacy policy](https://policies.google.com/privacy) applies to that. -The page of a talk that was recorded embeds the video in a frame from **youtube-nocookie.com**, the YouTube player Google serves for sites that do not want it to set cookies. Only the page of a recorded talk carries one, one frame per talk. No other page has one: the lists of talks and the event pages carry a link to the video and nothing else. What the frame does and does not do: +Some pages embed a video in a frame from **youtube-nocookie.com**, the YouTube player Google serves for sites that do not want it to set cookies. Four kinds of page carry one: the page of a talk that was recorded, one frame per talk; the page of a meetup whose session was recorded as a whole, one frame per recording; the page of a person, one frame per recorded talk they gave; and the home page, which plays the presentation of the Barcelona community at PyConES 2020. No other page has one: the lists of events, talks, and people, and the programme of an event, carry a link to the video and nothing else. What the frame does and does not do: -- When you open the page of a recorded talk and scroll near the video, your browser asks Google for the player. Google then sees your IP address and browser details, and that you opened a talk page on this site, as it would for an image loaded from its servers. This happens before you press play. +- When you open one of those pages and scroll near a video, your browser asks Google for the player. Google then sees your IP address and browser details, and that you opened that page on this site, as it would for an image loaded from its servers. This happens before you press play. - Until you press play, Google states that this player stores nothing in your browser and sets no cookie. - When you press play, you are watching a YouTube video inside this page, and Google's [privacy policy](https://policies.google.com/privacy) applies as it would on youtube.com. - Under every player there is the plain link to the same video on youtube.com, so you can watch it there instead, and the page reads fine with the frame blocked. diff --git a/content/pyladies_bcn/sponsors.md b/content/pyladies_bcn/sponsors.md index 1e70cc795..c747921aa 100644 --- a/content/pyladies_bcn/sponsors.md +++ b/content/pyladies_bcn/sponsors.md @@ -13,4 +13,4 @@ sponsor_levels: sponsors: [backmarket, canodrom, codeop, digitalfems, europython_society, holaluz, kiwi, letgo, marfeel, mundimoto, orpheus, psf, rover, tecnologas, travelperk, verse, ub, upf] --- -Lorem ipsum +These organizations have sponsored a PyLadies BCN activity: a workshop, a meetup, or the PyLadies track of a PyDay BCN. The whole list of the association is on the [Sponsors](/sponsors/) page. diff --git a/content/search.md b/content/search.md new file mode 100644 index 000000000..ac2f0effd --- /dev/null +++ b/content/search.md @@ -0,0 +1,11 @@ +--- +title: "Search" +description: "Search the archive of Python Barcelona: the talks, the events, the people, and the photos." +layout: search +# Built and not listed: in no feed, no sitemap and no listing. The navbar +# form is how a reader reaches it. +_build: + list: never +--- + +Every talk, event, person, and photo caption of the archive, in one box. Type a technology, a name, a venue, or a year. diff --git a/content/sponsors/21buttons.md b/content/sponsors/21buttons.md index 353f3ab69..74584e5d1 100644 --- a/content/sponsors/21buttons.md +++ b/content/sponsors/21buttons.md @@ -1,6 +1,6 @@ --- id: 21buttons name: 21 Buttons -logo_image: 21buttons.png +logo_image: 21buttons.webp site: https://es.21buttons.com --- diff --git a/content/sponsors/_index.md b/content/sponsors/_index.md index 268a701d3..97e13fc0b 100644 --- a/content/sponsors/_index.md +++ b/content/sponsors/_index.md @@ -6,53 +6,10 @@ weight: 5 layout: "sponsors" heroBackground: /images/photos/sponsors-area-pyday-2019.jpg -sponsor_levels: -- sponsors_per_line: 4 - sponsors: - - 21buttons - - backmarket - - bitphy - - bling - - bmat - - canodrom - - casadelmig - - cloudblue - - codelytv - - colorsensing - - digitalfems - - edgetier - - europython_society - - gesco - - holaluz - - hybridtheory - - iomed - - kiwi - - letgo - - marfeel - - mundimoto - - onna - - orpheus - - preply - - psf - - qida - - qustodio - - rover - - satellogic - - skyscanner - - tecnologas - - travelperk - - typeform - - ub - - upf - - verse - - veriff - - apsl - - coopdevs - - somenergia - - jobfluent - - pythones - - aimsun - - nuclia - - shimoku - - rakuten --- + +Every organization on this page has sponsored an event of ours at some point since 2007: a PyDay BCN, a PyDataBCN, a PyLadies BCN workshop, or a monthly meetup. Some gave money, some gave a room, some gave both. None of them is a current sponsor by being here, and the page is a thank you and not an endorsement. + +Thanks to all of them. Python Barcelona is possible thanks to the sponsors, and the best ones brought pizza 🍕 and beers 🍺. + +The sponsors of one edition, with their levels, are on the page of that edition. diff --git a/content/sponsors/affectv.md b/content/sponsors/affectv.md index 03d21ed39..823276b6a 100644 --- a/content/sponsors/affectv.md +++ b/content/sponsors/affectv.md @@ -1,7 +1,7 @@ --- id: affectv name: affectv -logo_image: affectv.png +logo_image: affectv.webp site: https://www.affectv.com --- diff --git a/content/sponsors/atlasense.md b/content/sponsors/atlasense.md index 9a16d3a32..435d5fbc6 100644 --- a/content/sponsors/atlasense.md +++ b/content/sponsors/atlasense.md @@ -1,6 +1,6 @@ --- id: atlasense name: AtlaSense -logo_image: atlasense.png +logo_image: atlasense.webp site: https://atlasense.com --- diff --git a/content/sponsors/backmarket.md b/content/sponsors/backmarket.md index f169392d3..91e5b01fd 100644 --- a/content/sponsors/backmarket.md +++ b/content/sponsors/backmarket.md @@ -1,6 +1,6 @@ --- id: backmarket name: BackMarket -logo_image: backmarket.png +logo_image: backmarket.webp site: https://www.backmarket.com --- diff --git a/content/sponsors/bitphy.md b/content/sponsors/bitphy.md index 8f3d8fca8..535a8ca62 100644 --- a/content/sponsors/bitphy.md +++ b/content/sponsors/bitphy.md @@ -1,6 +1,6 @@ --- id: bitphy name: BitPhy -logo_image: bitphy.png +logo_image: bitphy.webp site: https://www.bitphy.com --- diff --git a/content/sponsors/bling.md b/content/sponsors/bling.md index 9302bd7b5..17b6d6149 100644 --- a/content/sponsors/bling.md +++ b/content/sponsors/bling.md @@ -1,6 +1,6 @@ --- id: bling name: BLING -logo_image: bling.png +logo_image: bling.webp site: https://www.bling.eu --- diff --git a/content/sponsors/blueliv.md b/content/sponsors/blueliv.md new file mode 100644 index 000000000..2e1a8e0cf --- /dev/null +++ b/content/sponsors/blueliv.md @@ -0,0 +1,7 @@ +--- +id: blueliv +name: Blueliv +logo_image: blueliv.webp +# No site: blueliv.com does not answer. Blueliv was bought in 2021 and +# its domain is gone, so the logo is printed without a link. +--- diff --git a/content/sponsors/business-insights.md b/content/sponsors/business-insights.md index e32e4021a..6b234e4f9 100644 --- a/content/sponsors/business-insights.md +++ b/content/sponsors/business-insights.md @@ -1,6 +1,6 @@ --- id: business-insights name: Business Insights -logo_image: business-insights.png +logo_image: business-insights.webp site: https://www.businessinsights.es --- diff --git a/content/sponsors/canodrom.md b/content/sponsors/canodrom.md index ffb65c5a3..f56ff0ba1 100644 --- a/content/sponsors/canodrom.md +++ b/content/sponsors/canodrom.md @@ -1,6 +1,6 @@ --- id: canodrom name: Canòdrom - Ateneu d'innovació digital i democràtica -logo_image: canodrom.png +logo_image: canodrom.webp site: https://canodrom.barcelona --- diff --git a/content/sponsors/chartboost.md b/content/sponsors/chartboost.md new file mode 100644 index 000000000..08b0a5118 --- /dev/null +++ b/content/sponsors/chartboost.md @@ -0,0 +1,6 @@ +--- +id: chartboost +name: Chartboost +logo_image: chartboost.webp +site: https://www.chartboost.com +--- diff --git a/content/sponsors/claranet.md b/content/sponsors/claranet.md index 50879b805..35140fb94 100644 --- a/content/sponsors/claranet.md +++ b/content/sponsors/claranet.md @@ -1,6 +1,6 @@ --- id: claranet name: Claranet -logo_image: claranet.png +logo_image: claranet.webp site: https://www.claranet.es --- diff --git a/content/sponsors/cloudblue.md b/content/sponsors/cloudblue.md index 4c04e3c14..3c52adcf4 100644 --- a/content/sponsors/cloudblue.md +++ b/content/sponsors/cloudblue.md @@ -1,6 +1,6 @@ --- id: cloudblue name: CloudBlue -logo_image: cloudblue.png +logo_image: cloudblue.webp site: https://www.cloudblue.com --- diff --git a/content/sponsors/codelytv.md b/content/sponsors/codelytv.md index 3e384be5c..aa79222a8 100644 --- a/content/sponsors/codelytv.md +++ b/content/sponsors/codelytv.md @@ -1,6 +1,6 @@ --- id: codelytv name: Codely TV -logo_image: codely.png +logo_image: codely.webp site: https://codely.tv --- diff --git a/content/sponsors/codeop.md b/content/sponsors/codeop.md index 0daa23005..76c265ac6 100644 --- a/content/sponsors/codeop.md +++ b/content/sponsors/codeop.md @@ -1,7 +1,7 @@ --- id: codeop name: CodeOp -logo_image: codeop.png +logo_image: codeop.webp site: https://codeop.tech --- diff --git a/content/sponsors/codurance.md b/content/sponsors/codurance.md index fa994e7a5..5ded6cfbe 100644 --- a/content/sponsors/codurance.md +++ b/content/sponsors/codurance.md @@ -1,7 +1,7 @@ --- id: codurance name: Codurance -logo_image: codurance.png +logo_image: codurance.webp site: https://www.codurance.com/es --- diff --git a/content/sponsors/digitalfems.md b/content/sponsors/digitalfems.md index 710b6eb38..1f14cf9e4 100644 --- a/content/sponsors/digitalfems.md +++ b/content/sponsors/digitalfems.md @@ -1,6 +1,6 @@ --- id: digitalfems name: DigitalFems -logo_image: digitalfems.png +logo_image: digitalfems.webp site: https://www.digitalfems.org --- diff --git a/content/sponsors/elastic.md b/content/sponsors/elastic.md new file mode 100644 index 000000000..9c3439bfd --- /dev/null +++ b/content/sponsors/elastic.md @@ -0,0 +1,6 @@ +--- +id: elastic +name: Elastic +logo_image: elastic.webp +site: https://www.elastic.co +--- diff --git a/content/sponsors/europython_society.md b/content/sponsors/europython_society.md index 97bf96321..1624e5e65 100644 --- a/content/sponsors/europython_society.md +++ b/content/sponsors/europython_society.md @@ -1,6 +1,6 @@ --- id: europython_society name: EuroPython Society -logo_image: europython_society.png +logo_image: europython_society.webp site: https://www.europython-society.org --- diff --git a/content/sponsors/flanks.md b/content/sponsors/flanks.md index 1a57b8be9..943d3e665 100644 --- a/content/sponsors/flanks.md +++ b/content/sponsors/flanks.md @@ -1,6 +1,6 @@ --- id: flanks name: Flanks -logo_image: flanks.png +logo_image: flanks.webp site: https://flanks.io --- diff --git a/content/sponsors/fundacion-ci.md b/content/sponsors/fundacion-ci.md new file mode 100644 index 000000000..7baba1469 --- /dev/null +++ b/content/sponsors/fundacion-ci.md @@ -0,0 +1,6 @@ +--- +id: fundacion-ci +name: Fundación Caja de Ingenieros +logo_image: fundacion-ci.jpg +site: https://www.caixaenginyers.com/web/fundacion +--- diff --git a/content/sponsors/gluecharm.md b/content/sponsors/gluecharm.md index d5a0f2976..fda51ff1b 100644 --- a/content/sponsors/gluecharm.md +++ b/content/sponsors/gluecharm.md @@ -1,6 +1,6 @@ --- id: gluecharm name: Gluecharm -logo_image: gluecharm.png +logo_image: gluecharm.webp site: https://gluecharm.com --- diff --git a/content/sponsors/holaluz.md b/content/sponsors/holaluz.md index 5091ed504..a6c425eb6 100644 --- a/content/sponsors/holaluz.md +++ b/content/sponsors/holaluz.md @@ -1,7 +1,7 @@ --- id: holaluz name: Holaluz -logo_image: holaluz.png +logo_image: holaluz.webp site: https://www.holaluz.com --- diff --git a/content/sponsors/hybridtheory.md b/content/sponsors/hybridtheory.md index b4008da40..fb341538f 100644 --- a/content/sponsors/hybridtheory.md +++ b/content/sponsors/hybridtheory.md @@ -1,7 +1,7 @@ --- id: hybridtheory name: Hybrid Theory -logo_image: hybridtheory.png +logo_image: hybridtheory.webp # No site field: hybridtheory.com now redirects to an Azerion press release, # so the logo renders without a link. Hybrid Theory sponsored PyDay BCN 2021 # (Gold) and PyDay BCN 2022 (Supporting). Azerion acquired the company in diff --git a/content/sponsors/innoit.md b/content/sponsors/innoit.md index 0a059ddd3..41c2ec62e 100644 --- a/content/sponsors/innoit.md +++ b/content/sponsors/innoit.md @@ -1,6 +1,6 @@ --- id: innoit name: Innoit -logo_image: innoit.png +logo_image: innoit.webp site: https://www.inno-it.es --- diff --git a/content/sponsors/invisiblebits.md b/content/sponsors/invisiblebits.md new file mode 100644 index 000000000..dd069e98c --- /dev/null +++ b/content/sponsors/invisiblebits.md @@ -0,0 +1,6 @@ +--- +id: invisiblebits +name: Invisible Bits +logo_image: invisiblebits.webp +site: https://invisiblebits.com +--- diff --git a/content/sponsors/iomed.md b/content/sponsors/iomed.md index 7c9911552..4fbef4dbd 100644 --- a/content/sponsors/iomed.md +++ b/content/sponsors/iomed.md @@ -1,6 +1,6 @@ --- id: iomed name: IOMED -logo_image: iomed.png +logo_image: iomed.webp site: https://iomed.health --- diff --git a/content/sponsors/isdieducation.md b/content/sponsors/isdieducation.md index 1e322d0f3..b354334a0 100644 --- a/content/sponsors/isdieducation.md +++ b/content/sponsors/isdieducation.md @@ -1,7 +1,7 @@ --- id: isdieducation name: ISDI Education -logo_image: isdi.png +logo_image: isdi.webp site: https://www.isdi.education/es --- diff --git a/content/sponsors/izi.md b/content/sponsors/izi.md index 90677e481..73becf3d7 100644 --- a/content/sponsors/izi.md +++ b/content/sponsors/izi.md @@ -1,7 +1,7 @@ --- id: izi name: IZI Record -logo_image: izi.png +logo_image: izi.webp site: https://izirecord.com --- diff --git a/content/sponsors/jobfluent.md b/content/sponsors/jobfluent.md index be100a975..d30352706 100644 --- a/content/sponsors/jobfluent.md +++ b/content/sponsors/jobfluent.md @@ -1,6 +1,6 @@ --- id: jobfluent name: Job Fluent -logo_image: jobfluent.png +logo_image: jobfluent.webp site: https://www.jobfluent.com/es/empleos-barcelona?q=python --- diff --git a/content/sponsors/kernel-analytics.md b/content/sponsors/kernel-analytics.md new file mode 100644 index 000000000..81fa83bc2 --- /dev/null +++ b/content/sponsors/kernel-analytics.md @@ -0,0 +1,9 @@ +--- +id: kernel-analytics +name: Kernel Analytics +logo_image: kernel-analytics.webp +# No site: kernel-analytics.com answers 410 Gone. The company was bought in +# 2019 and its site is not on the web any more, so the logo is printed +# without a link, as partials/sponsor_summary.html does for a sponsor with +# no web address. +--- diff --git a/content/sponsors/king.md b/content/sponsors/king.md new file mode 100644 index 000000000..ad087dba6 --- /dev/null +++ b/content/sponsors/king.md @@ -0,0 +1,6 @@ +--- +id: king +name: King +logo_image: king.webp +site: https://king.com +--- diff --git a/content/sponsors/kiwi.md b/content/sponsors/kiwi.md index 951d74e38..1862f46f4 100644 --- a/content/sponsors/kiwi.md +++ b/content/sponsors/kiwi.md @@ -1,6 +1,6 @@ --- id: kiwi name: Kiwi.com -logo_image: kiwi.png +logo_image: kiwi.webp site: https://www.kiwi.com/en --- diff --git a/content/sponsors/kschool.md b/content/sponsors/kschool.md new file mode 100644 index 000000000..172cfe097 --- /dev/null +++ b/content/sponsors/kschool.md @@ -0,0 +1,6 @@ +--- +id: kschool +name: KSchool +logo_image: kschool.webp +site: https://kschool.com +--- diff --git a/content/sponsors/lambdaloopers.md b/content/sponsors/lambdaloopers.md index cfbe0dc3f..cd5d12c3e 100644 --- a/content/sponsors/lambdaloopers.md +++ b/content/sponsors/lambdaloopers.md @@ -1,6 +1,6 @@ --- id: lambdaloopers name: LambdaLoopers -logo_image: lambdaloopers.png +logo_image: lambdaloopers.webp site: https://lambdaloopers.com --- diff --git a/content/sponsors/letgo.md b/content/sponsors/letgo.md index 9b330be41..44481b85f 100644 --- a/content/sponsors/letgo.md +++ b/content/sponsors/letgo.md @@ -1,7 +1,7 @@ --- id: letgo name: letgo -logo_image: letgo.png +logo_image: letgo.webp site: https://www.letgo.com --- diff --git a/content/sponsors/marfeel.md b/content/sponsors/marfeel.md index 84df9d628..646d2f67b 100644 --- a/content/sponsors/marfeel.md +++ b/content/sponsors/marfeel.md @@ -1,6 +1,6 @@ --- id: marfeel name: Marfeel -logo_image: marfeel.png +logo_image: marfeel.webp site: https://www.marfeel.com --- diff --git a/content/sponsors/mongodb.md b/content/sponsors/mongodb.md index 15356a58d..7d0da5f41 100644 --- a/content/sponsors/mongodb.md +++ b/content/sponsors/mongodb.md @@ -1,6 +1,6 @@ --- id: mongodb name: MongoDB -logo_image: mongodb.png +logo_image: mongodb.webp site: https://mongodb.com --- diff --git a/content/sponsors/mundimoto.md b/content/sponsors/mundimoto.md index 21f7b69c7..968c5a89d 100644 --- a/content/sponsors/mundimoto.md +++ b/content/sponsors/mundimoto.md @@ -1,6 +1,6 @@ --- id: mundimoto name: MundiMoto -logo_image: mundimoto.png +logo_image: mundimoto.webp site: https://mundimoto.com --- diff --git a/content/sponsors/nuclia.md b/content/sponsors/nuclia.md index a419a7874..9a4198e60 100644 --- a/content/sponsors/nuclia.md +++ b/content/sponsors/nuclia.md @@ -1,6 +1,6 @@ --- id: nuclia name: Nuclia -logo_image: Nuclia.png +logo_image: Nuclia.webp site: https://nuclia.com --- diff --git a/content/sponsors/okta.md b/content/sponsors/okta.md index dc542e3a4..34e46bc65 100644 --- a/content/sponsors/okta.md +++ b/content/sponsors/okta.md @@ -1,6 +1,6 @@ --- id: okta name: Okta -logo_image: okta.png +logo_image: okta.webp site: https://auth0.com/careers --- diff --git a/content/sponsors/onna.md b/content/sponsors/onna.md index 17ddffedd..139b8d0cb 100644 --- a/content/sponsors/onna.md +++ b/content/sponsors/onna.md @@ -1,6 +1,6 @@ --- id: onna name: Onna -logo_image: onna.png +logo_image: onna.webp site: https://onna.com --- diff --git a/content/sponsors/orpheus.md b/content/sponsors/orpheus.md index 1982133f9..fcf1456b6 100644 --- a/content/sponsors/orpheus.md +++ b/content/sponsors/orpheus.md @@ -1,6 +1,6 @@ --- id: orpheus name: Orph.eus -logo_image: orpheus.png +logo_image: orpheus.webp site: https://Orph.eus --- diff --git a/content/sponsors/preply.md b/content/sponsors/preply.md index 6f812792c..0fd34e104 100644 --- a/content/sponsors/preply.md +++ b/content/sponsors/preply.md @@ -1,6 +1,6 @@ --- id: preply name: Preply -logo_image: preply.png +logo_image: preply.webp site: https://preply.com --- diff --git a/content/sponsors/protopixel.md b/content/sponsors/protopixel.md index 954bfb30c..079a8d1b1 100644 --- a/content/sponsors/protopixel.md +++ b/content/sponsors/protopixel.md @@ -1,6 +1,6 @@ --- id: protopixel name: Protopixel -logo_image: protopixel.png +logo_image: protopixel.webp site: https://www.protopixel.io --- diff --git a/content/sponsors/psf.md b/content/sponsors/psf.md index be56d8257..674cc3090 100644 --- a/content/sponsors/psf.md +++ b/content/sponsors/psf.md @@ -1,6 +1,6 @@ --- id: psf name: Python Software Foundation -logo_image: psf.png +logo_image: psf.webp site: https://www.python.org/psf --- diff --git a/content/sponsors/punt-multimedia.md b/content/sponsors/punt-multimedia.md index c59d8a9da..eb1e115d4 100644 --- a/content/sponsors/punt-multimedia.md +++ b/content/sponsors/punt-multimedia.md @@ -1,6 +1,6 @@ --- id: punt-multimedia name: Punt Multimèdia -logo_image: punt-multimedia.png +logo_image: punt-multimedia.webp site: https://www.puntmultimedia.org --- diff --git a/content/sponsors/pybcn.md b/content/sponsors/pybcn.md index 891a8c830..b49d34078 100644 --- a/content/sponsors/pybcn.md +++ b/content/sponsors/pybcn.md @@ -1,6 +1,6 @@ --- id: pybcn name: PyBCN -logo_image: pybcn.png +logo_image: pybcn.webp site: https://pybcn.org --- diff --git a/content/sponsors/pythones.md b/content/sponsors/pythones.md index b3742671d..26700ee37 100644 --- a/content/sponsors/pythones.md +++ b/content/sponsors/pythones.md @@ -1,6 +1,6 @@ --- id: pythones name: Python España -logo_image: pythonES.png +logo_image: pythonES.webp site: https://es.python.org --- diff --git a/content/sponsors/qida.md b/content/sponsors/qida.md index fe1dc57ed..afbdf6892 100644 --- a/content/sponsors/qida.md +++ b/content/sponsors/qida.md @@ -1,6 +1,6 @@ --- id: qida name: Qida -logo_image: Qida.png +logo_image: Qida.webp site: https://qida.es --- diff --git a/content/sponsors/qilimanjaro.md b/content/sponsors/qilimanjaro.md index ed77ed87e..142ec952d 100644 --- a/content/sponsors/qilimanjaro.md +++ b/content/sponsors/qilimanjaro.md @@ -1,6 +1,6 @@ --- id: qilimanjaro name: Qilimanjaro -logo_image: qilimanjaro.png +logo_image: qilimanjaro.webp site: https://www.qilimanjaro.tech --- diff --git a/content/sponsors/quside.md b/content/sponsors/quside.md index 186cf757d..8116759b6 100644 --- a/content/sponsors/quside.md +++ b/content/sponsors/quside.md @@ -1,6 +1,6 @@ --- id: quside name: Quside -logo_image: quside.png +logo_image: quside.webp site: https://quside.com --- diff --git a/content/sponsors/qustodio.md b/content/sponsors/qustodio.md index 77a111537..c3ca35f41 100644 --- a/content/sponsors/qustodio.md +++ b/content/sponsors/qustodio.md @@ -1,6 +1,6 @@ --- id: qustodio name: Qustodio -logo_image: qustodio.png +logo_image: qustodio.webp site: https://www.qustodio.com --- diff --git a/content/sponsors/rakuten.md b/content/sponsors/rakuten.md index 83a20c456..174982510 100644 --- a/content/sponsors/rakuten.md +++ b/content/sponsors/rakuten.md @@ -1,7 +1,7 @@ --- id: rakuten name: Rakuten -logo_image: RakutenTV.png +logo_image: RakutenTV.webp site: https://www.rakuten.tv --- diff --git a/content/sponsors/rover.md b/content/sponsors/rover.md index dc0d6d0d3..3c865127e 100644 --- a/content/sponsors/rover.md +++ b/content/sponsors/rover.md @@ -1,6 +1,6 @@ --- id: rover name: Rover -logo_image: rover.png +logo_image: rover.webp site: https://rover.com --- diff --git a/content/sponsors/satellogic.md b/content/sponsors/satellogic.md index 63ae068a3..d8aa7bf9a 100644 --- a/content/sponsors/satellogic.md +++ b/content/sponsors/satellogic.md @@ -1,6 +1,6 @@ --- id: satellogic name: Satellogic -logo_image: satellogic.png +logo_image: satellogic.webp site: https://satellogic.com --- diff --git a/content/sponsors/schibsted-spain.md b/content/sponsors/schibsted-spain.md index f3f0c1efa..57f0212d4 100644 --- a/content/sponsors/schibsted-spain.md +++ b/content/sponsors/schibsted-spain.md @@ -1,6 +1,6 @@ --- id: schibsted-spain name: Schibsted Spain -logo_image: schibsted-spain.png +logo_image: schibsted-spain.webp site: https://www.schibsted.es --- diff --git a/content/sponsors/shimoku.md b/content/sponsors/shimoku.md index 10fe54818..8560683b7 100644 --- a/content/sponsors/shimoku.md +++ b/content/sponsors/shimoku.md @@ -1,7 +1,7 @@ --- id: shimoku name: Shimoku -logo_image: shimoku.png +logo_image: shimoku.webp site: https://www.shimoku.com --- diff --git a/content/sponsors/skyscanner.md b/content/sponsors/skyscanner.md index 6b2610e9c..e0ee3a04f 100644 --- a/content/sponsors/skyscanner.md +++ b/content/sponsors/skyscanner.md @@ -1,6 +1,6 @@ --- id: skyscanner name: SkyScanner -logo_image: skyscanner.png +logo_image: skyscanner.webp site: https://skyscanner.com --- diff --git a/content/sponsors/tecnologas.md b/content/sponsors/tecnologas.md index 0b59b6813..055d711f0 100644 --- a/content/sponsors/tecnologas.md +++ b/content/sponsors/tecnologas.md @@ -1,6 +1,6 @@ --- id: tecnologas name: TECNOLOGAS.ORG -logo_image: tecnologas.png +logo_image: tecnologas.webp site: https://tecnologas.org --- diff --git a/content/sponsors/thoughtworks.md b/content/sponsors/thoughtworks.md new file mode 100644 index 000000000..0c5388132 --- /dev/null +++ b/content/sponsors/thoughtworks.md @@ -0,0 +1,6 @@ +--- +id: thoughtworks +name: ThoughtWorks +logo_image: thoughtworks.webp +site: https://www.thoughtworks.com +--- diff --git a/content/sponsors/travelperk.md b/content/sponsors/travelperk.md index a02bffa62..edd77146b 100644 --- a/content/sponsors/travelperk.md +++ b/content/sponsors/travelperk.md @@ -1,7 +1,7 @@ --- id: travelperk name: TravelPerk -logo_image: travelperk.png +logo_image: travelperk.webp site: https://www.travelperk.com --- diff --git a/content/sponsors/typeform.md b/content/sponsors/typeform.md index 69caf98dd..5b655635d 100644 --- a/content/sponsors/typeform.md +++ b/content/sponsors/typeform.md @@ -1,6 +1,6 @@ --- id: typeform name: Typeform -logo_image: typeform.png +logo_image: typeform.webp site: https://typeform.com --- diff --git a/content/sponsors/upcloud.md b/content/sponsors/upcloud.md new file mode 100644 index 000000000..b1d522e63 --- /dev/null +++ b/content/sponsors/upcloud.md @@ -0,0 +1,6 @@ +--- +id: upcloud +name: UpCloud +logo_image: upcloud.webp +site: https://upcloud.com +--- diff --git a/content/sponsors/upf.md b/content/sponsors/upf.md index 56a7adea8..ae9fa4d84 100644 --- a/content/sponsors/upf.md +++ b/content/sponsors/upf.md @@ -1,6 +1,6 @@ --- id: upf name: Universitat Pompeu Fabra -logo_image: upf.png +logo_image: upf.webp site: https://upf.edu --- diff --git a/content/sponsors/veriff.md b/content/sponsors/veriff.md index cff56bba9..b708e15f3 100644 --- a/content/sponsors/veriff.md +++ b/content/sponsors/veriff.md @@ -1,7 +1,7 @@ --- id: veriff name: Veriff -logo_image: veriff.png +logo_image: veriff.webp site: https://veriff.com --- diff --git a/content/sponsors/xorq.md b/content/sponsors/xorq.md index 1c38d58eb..db70bd439 100644 --- a/content/sponsors/xorq.md +++ b/content/sponsors/xorq.md @@ -1,6 +1,6 @@ --- id: xorq name: Xorq Labs -logo_image: xorq.png +logo_image: xorq.webp site: https://www.xorq.dev --- \ No newline at end of file diff --git a/content/talks/_content.gotmpl b/content/talks/_content.gotmpl index 9c9a8528a..811641d0a 100644 --- a/content/talks/_content.gotmpl +++ b/content/talks/_content.gotmpl @@ -72,6 +72,29 @@ pydatabcn, other_events and meetups, each with its editions. A directory nested deeper logs a warning rather than losing its talks in silence. + + One more page per type of talk. /talks/ lists every row and offers a + tab per type above the table (see partials/talks_tabs.html), and each + tab is a page of its own that lists only the rows of that type: + + /talks/type/workshop/ + /talks/type/lightning/ + + The filter is sub-pages and not JavaScript, so a reader with no script, a crawler, and a link in a message all + reach the same list. A page exists only for a type that at least one + talk of the archive carries: the vocabulary of partials/event_types.html + holds eleven types, and a coffee break is one of them, but no talk is + a coffee break, so /talks/type/coffee/ is not built and no tab names + it. The type of a talk is read here the way partials/listing_counts.html + and partials/event_type_icon.html read it, lower case and trimmed, so + the pages this adapter adds are the types those partials count. The + path segment is the token of the vocabulary and not the noun, because + the token is what the front matter writes and the noun may be + reworded; one directory for all of them, type/, so the segment can + never collide with the base name of an event file. The page carries + the token as params.filter, which is how every walker of the talks + section tells a listing from a talk (they skip a page with a filter), + and how layouts/talks/talk_type.html knows which rows to keep. */ -}} {{- $root := "content/events" -}} @@ -94,6 +117,10 @@ {{- end -}} {{- end -}} +{{- /* The types the talks of the archive carry, as a set, filled by the + loop below and read after it for the pages per type. */ -}} +{{- $types := dict -}} + {{- range $file := $files -}} {{- if ne (path.Ext $file) ".md" }}{{ continue }}{{ end -}} {{- if eq (path.Base $file) "_index.md" }}{{ continue }}{{ end -}} @@ -119,6 +146,9 @@ {{- warnf "talks adapter: a talk of %q has no id, so it gets no page." $file -}} {{- continue -}} {{- end -}} + {{- with $talk.type -}} + {{- $types = merge $types (dict (lower (trim (printf "%v" .) " ")) true) -}} + {{- end -}} {{- $params := dict "talk" $talk.id "event" $path -}} {{- with $talk.title_lang -}} {{- $params = merge $params (dict "title_lang" .) -}} @@ -132,3 +162,25 @@ {{- end -}} {{- end -}} {{- end -}} + +{{- /* The page of each type that has a talk. The title is the plural noun + of the vocabulary with a capital, "Workshops", the words the tab + reads; a token the vocabulary does not hold gets no page, and a + warning, because no row would draw a marker for it either. The + tokens are sorted so that two builds add the pages in one order. */ -}} +{{- $vocabulary := partialCached "event_types.html" "event_types" -}} +{{- range $token, $_ := $types -}} + {{- $entry := index $vocabulary $token -}} + {{- if not $entry -}} + {{- warnf "talks adapter: type %q is not in partials/event_types.html, so it gets no page of its own." $token -}} + {{- continue -}} + {{- end -}} + {{- $.AddPage (dict + "kind" "page" + "path" (printf "type/%s" $token) + "title" (humanize $entry.many) + "layout" "talk_type" + "params" (dict + "filter" $token + "description" (printf "Every %s of every PyBCN event, with its speakers, its photo, its video, and its links." $entry.one))) -}} +{{- end -}} diff --git a/data/assemblies.yaml b/data/assemblies.yaml new file mode 100644 index 000000000..f14454c6c --- /dev/null +++ b/data/assemblies.yaml @@ -0,0 +1,66 @@ +# The general assemblies of the association, newest first: the minutes of +# each one, and the photograph the association published of the act. +# +# The minutes are the record that the law asks for and they live on Google +# Drive, where the board writes them. The photograph is the only thing that +# says what the day looked like: there is no event page for an assembly, no +# gallery, and nothing else in this repository. +# +# caption is the text of the post, as published, less the t.co links. The +# one of 2022 is cut after the roles it announces: the rest of that post is +# a call to take part, which is four years old now. +# +# photo is a file under images/photos/assemblies/, stored as WebP at 600px +# on its long side, which is twice what the page draws. Five of the eight +# assemblies have one: 2020, 2024, and the extraordinary one of 2025 were +# never photographed, or the photograph was never published. +# +# source is the post. It is what the credit line links to, the way a photo +# of a gallery credits its own post. + +- year: 2026 + name: "Assamblea General Ordinària 2026" + minutes: "https://docs.google.com/document/d/1Yx_4OMf3TkUDrI4MT3FD4NWm0y-3mSh32krX5F1RqMY/edit?usp=sharing" + photo: "assemblies/2026.webp" + source: "https://x.com/PyBCN/status/2044492055120949648" + caption: "Avui he celebrat la Assemblea Ordinària Python Barcelona 2026. Ja som més de 100 socis!" + +- year: 2025 + name: "Assamblea Extraordinària 2025" + minutes: "https://docs.google.com/document/d/12BHpSCe7yOdgdm7JiuzKxT_RNKyxHN18R9p0_1rCWl4/edit?usp=share_link" + +- year: 2024 + name: "Assamblea General Ordinària 2024" + minutes: "https://docs.google.com/document/d/1IDYEQvStyM8YxQHIcmZbfE0SYePDGDavHssz3CG3d1E/edit?usp=share_link" + +- year: 2023 + name: "Assamblea General Ordinària 2023" + minutes: "https://docs.google.com/document/d/1CnJzGjz7COsc-45w5tEVu5gpDBv1mUozFh4eGXw8-GU/edit?usp=sharing" + photo: "assemblies/2023.webp" + source: "https://x.com/PyBCN/status/1730651989736820840" + caption: "Comença l'Assemblea General Ordinària de Python Barcelona" + +- year: 2022 + name: "Assamblea General Ordinària 2022" + minutes: "https://docs.google.com/document/d/13xiLuUGIzT8kyZWGTkA6T-dbUO7Y_Z6hlUjakkwlSGM/edit?usp=sharing" + photo: "assemblies/2022.webp" + source: "https://x.com/PyBCN/status/1604908237635059714" + caption: "Assemblea General Ordinària de Python Barcelona. Ja som 76 socis! Hem renovat els rols de Presidenta (@lpmayos), Secretària (@nataliasirera), i Tresorera (@sianna)" + +- year: 2021 + name: "Assamblea General Ordinària 2021" + minutes: "https://docs.google.com/document/d/1Qi0efxdC7T2bk2oVT2z6tTrrJ3UONwCK3Vnf3cL4KFA/edit?usp=sharing" + photo: "assemblies/2021.webp" + source: "https://x.com/PyBCN/status/1471191462176034816" + caption: "Celebrant la nostra Assamblea General Ordinària. Cada any, rendim comptes davant dels socis" + +- year: 2020 + name: "Assamblea General Ordinària 2020" + minutes: "https://docs.google.com/document/d/1yLR9p_vDKZPs0NlVMaKtrBMooqHdDyY0Lk5cPmcGs5I/edit?usp=sharing" + +- year: 2019 + name: "Assamblea General Ordinària 2019" + minutes: "https://docs.google.com/document/d/1mJuuoymGJe4ayO5y08yN0bHBSqrPPyRZW2QLQSXXuYg/edit?usp=sharing" + photo: "assemblies/2019.webp" + source: "https://x.com/PyBCN/status/1204854069837344769" + caption: "Good job, Board! 👏👏" diff --git a/data/channel_videos.yaml b/data/channel_videos.yaml index 9f112da92..566db152a 100644 --- a/data/channel_videos.yaml +++ b/data/channel_videos.yaml @@ -2,7 +2,10 @@ # with each one. One entry per video of the channel, with the id, the title # as the channel shows it, and the decision: placed, which means some event # page carries a link to it, or placed: false with the reason it belongs to -# no page. +# no event page. One unplaced video is on the site all the same: the +# presentation of the community at PyConES 2020, which the home page plays +# (about_video in content/_index.md); its reason says so. placed stays +# about the event pages, which is what bin/check-content reads. # # This is the list the site maintains. It is not a copy of the pybcn-archive # export, which is one-time archaeology that is not in this repository: the @@ -131,7 +134,7 @@ videos: title: "PyLadies Barcelona & Python Barcelona - Presentación comunidad local - PyConES 2020" placed: false unlisted: true - reason: "a presentation of the Barcelona community given at PyConES 2020, which is no event of the association" + reason: "a presentation of the Barcelona community given at PyConES 2020, which is no event of the association; the home page plays it in its About PyBCN block (about_video in content/_index.md)" - id: "JzX9WAv7PVM" title: "PyBCN Meetup 2019/09 - Python for the management of IoT platforms at Worldsensing by T. Martínez" placed: true diff --git a/data/role_emoji.yaml b/data/role_emoji.yaml index 28e44778e..fa6470fe0 100644 --- a/data/role_emoji.yaml +++ b/data/role_emoji.yaml @@ -47,3 +47,10 @@ Events: 📅 Permanent Committee: 🧭 Management Board (2026): 📋 Former Management Board (2018 - 2025): 📋 + +# Not a role and not a level: the tab of /people/ that answers "who came" +# with the fact that the association never recorded it (see +# content/people/_content.gotmpl). An empty chair, for the audience the +# archive has no list of. U+1FA91 has emoji presentation by default, as +# the rule above asks. +Assistants: 🪑 diff --git a/data/roles.yaml b/data/roles.yaml index 401edc274..953976663 100644 --- a/data/roles.yaml +++ b/data/roles.yaml @@ -17,7 +17,7 @@ # # Collaborators is a level name of the organizers page and of PyDay BCN # 2016. Unmapped, it printed "Collaborators at PyBCN" on the page of one -# person, a plural for one (David Arcos, 2026-10-15). +# person, a plural for one. Speakers: Speaker Organizers: Organizer Collaborators: Collaborator diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html index 981ea6bdb..6b476d5a2 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_default/_markup/render-link.html @@ -26,8 +26,8 @@ {{- /* An external link in the body of a page carries the same mark as one a template writes, through partials/link_mark.html: every link that leaves - this site says where it goes (David Arcos, 2026-10-15). He found the gap - on the page of PyData Barcelona 2017, whose body links a YouTube playlist + this site says where it goes. The gap showed on the page of PyData + Barcelona 2017, whose body links a YouTube playlist and a Flickr album, and neither had a mark: the marks had reached the templates and not the prose. */ -}} diff --git a/layouts/partials/friends.html b/layouts/partials/friends.html new file mode 100644 index 000000000..ab4fb46aa --- /dev/null +++ b/layouts/partials/friends.html @@ -0,0 +1,75 @@ +{{- /* + The communities this one links to as friends, with the mark of each. + + Argument: none. Returns a slice of dicts: + + name what the link says + url the home page of that community + text one line on what it is + icon the file under images/friends/, the mark of that site + + The mark is the icon of the site itself. Two of the three sites + publish no favicon at + all: bcneng.org and pythongirona.cat answer 404 on every usual path + and declare no icon link, so what is kept here is the logo each one + draws on its own page, which is the mark a reader recognises anyway. + Python España does publish one, and that is the file used. + + The file is in this repository and is never fetched from the other + site. A remote image on a page of ours would tell that site who read + the page, which is the same reason partials/sponsor_summary.html + refuses an external logo URL. + + bcn-engineering.svg their badge, from /images/bcneng_outline.svg + python-girona.webp the pyGi sticker of /pygi.jpeg, cropped to + the mark and scaled to 96px + python-espana.webp their favicon, 1000px scaled to 96px + europython-society.webp + the mark of the EuroPython Society, a copy of + images/sponsors/europython_society.png + (300px square), so the friends and the + sponsors stay two separate sets of files + python-software-foundation.webp + the wordmark of the Python Software + Foundation, a copy of images/sponsors/psf.png + (256x84). The wordmark and not the two-snake + mark, because python-espana.webp is that mark + already and two friends cannot share one + picture + + The two last ones are the EuroPython Society, and the Python + Software Foundation. The text of each is one + line of under fifty characters, so it is two lines at most on a card a + quarter of the container wide (the second review). + + The mark takes the place of the generic external-link glyph of + partials/link_mark.html, which is one glyph per destination: the icon + of the site is that glyph, said better. +*/ -}} +{{- return slice + (dict + "name" "BCN Engineering" + "url" "https://bcneng.org/" + "text" "The software engineers of Barcelona, on Slack." + "icon" "images/friends/bcn-engineering.svg") + (dict + "name" "Python Girona" + "url" "https://pythongirona.cat/" + "text" "The Python user group of Girona." + "icon" "images/friends/python-girona.webp") + (dict + "name" "Python España" + "url" "https://es.python.org/" + "text" "The Spanish Python association, behind PyConES." + "icon" "images/friends/python-espana.webp") + (dict + "name" "EuroPython Society" + "url" "https://www.europython-society.org/" + "text" "The non-profit behind EuroPython." + "icon" "images/friends/europython-society.webp") + (dict + "name" "Python Software Foundation" + "url" "https://www.python.org/psf/" + "text" "The foundation behind Python." + "icon" "images/friends/python-software-foundation.webp") +-}} diff --git a/layouts/shortcodes/assemblies.html b/layouts/shortcodes/assemblies.html new file mode 100644 index 000000000..94165dfa6 --- /dev/null +++ b/layouts/shortcodes/assemblies.html @@ -0,0 +1,45 @@ +{{- /* + The general assemblies of the association: the minutes of each one, and + the photograph of the act when there is one. + + Takes no argument. Reads data/assemblies.yaml, which is the list and the + one place to edit when a new assembly is held. + + The minutes used to be eight more links at the end of "Association + documentation", between the statutes and the fiscal data, and nothing on + the page said that each one is a day the association met. They have a + section of their own now, with the photograph beside each: the minutes + are the record the law asks for, and the + photograph is the only thing that says what the day looked like, because + an assembly has no event page and no gallery. + + A year with no photograph prints its line alone, which is three of the + eight. The credit is the line the photo gallery of an event prints, "Via + @PyBCN" through partials/link_mark.html, pointing at the post the + photograph comes from. +*/ -}} +
      + {{- range site.Data.assemblies }} + {{- $assembly := . -}} +
    • + {{- with .photo }} + {{- /* $ is the page inside a shortcode, not the row of the + range, so the row is held in $assembly above. */ -}} + {{- with resources.Get (printf "images/photos/%s" .) }} + {{- $small := .Resize "300x webp q82" -}} + {{- $large := .Resize "600x webp q82" -}} + {{ $assembly.caption }} + {{- end }} + {{- end }} +
      + {{ partial "link_mark.html" .minutes }}{{ .name }} + {{- with .caption }} +

      {{ . }}

      + {{- end }} + {{- with .source }} +

      {{ partial "link_mark.html" . }}Via @PyBCN

      + {{- end }} +
      +
    • + {{- end }} +
    diff --git a/static/favicon.png b/static/favicon.png deleted file mode 100644 index 8af500b32..000000000 Binary files a/static/favicon.png and /dev/null differ diff --git a/static/humans.txt b/static/humans.txt index 131c88a7a..f0cb76cb0 100644 --- a/static/humans.txt +++ b/static/humans.txt @@ -12,7 +12,8 @@ Video Records the talks and publishes them on YouTube. Event groups Formed for one event, such as a PyDay. - The people are named on their own pages, which stay current: + The people who built this site are in AUTHORS, in the repository. + The rest are named on their own pages, which stay current: Organizers https://pybcn.org/pybcn_association/organizers/ PyLadies BCN https://pybcn.org/pyladies_bcn/organizers-and-speakers/ Speakers On the page of each event, https://pybcn.org/events/ @@ -20,7 +21,7 @@ /* THANKS */ Every speaker who prepared a talk or a workshop and gave it for free. - Every venue that opened its doors, about 70 of them over the years. + Every venue that opened its doors, 87 of them over the years. Every sponsor, listed at https://pybcn.org/sponsors/ Every person who came, asked a question, and stayed for the pizza. @@ -35,10 +36,19 @@ /* NUMBERS */ - Counted on 2026-09-30. They come from the Meetup group and they move. + From the archive on this site, which is built out of the sources it + cites, so these move when the archive does: + + Events 281 + Talks and workshops 607 + People the archive credits 370 + Sponsors 81 + Venues used 87 + Photographs published 530 + + From the Meetup group, counted on 2026-09-30, because only Meetup + knows them: - Meetups since November 2007 207 - Venues used about 70 Members on Meetup 4672 Average event rating 4.64, from 1295 ratings @@ -48,4 +58,7 @@ Source https://github.com/pybcn/pybcn.github.io Standards HTML5, CSS3 Components Bootstrap, jQuery, Font Awesome, all served from this site + Search Pagefind, https://pybcn.org/search/ The index is built with + the site and served from it: searching asks nobody else Language English + Privacy No page asks another site for anything to draw itself diff --git a/static/images/backgrounds/logo_mini_white.png b/static/images/backgrounds/logo_mini_white.png deleted file mode 100644 index 58d5b37b9..000000000 Binary files a/static/images/backgrounds/logo_mini_white.png and /dev/null differ diff --git a/static/images/backgrounds/pybcn_cut_transparent.webp b/static/images/backgrounds/pybcn_cut_transparent.webp new file mode 100644 index 000000000..2ae36f6a6 Binary files /dev/null and b/static/images/backgrounds/pybcn_cut_transparent.webp differ diff --git a/static/images/backgrounds/pyladiesbcn_head_transparent.webp b/static/images/backgrounds/pyladiesbcn_head_transparent.webp new file mode 100644 index 000000000..e8b23b531 Binary files /dev/null and b/static/images/backgrounds/pyladiesbcn_head_transparent.webp differ diff --git a/themes/pybcn_theme/assets/images/anon_member.png b/themes/pybcn_theme/assets/images/anon_member.png deleted file mode 100644 index 7e289478e..000000000 Binary files a/themes/pybcn_theme/assets/images/anon_member.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/anon_member.webp b/themes/pybcn_theme/assets/images/anon_member.webp new file mode 100644 index 000000000..c0bbf5b5a Binary files /dev/null and b/themes/pybcn_theme/assets/images/anon_member.webp differ diff --git a/themes/pybcn_theme/assets/images/backgrounds/zen_of_python.png b/themes/pybcn_theme/assets/images/backgrounds/zen_of_python.png deleted file mode 100644 index 2861fd2aa..000000000 Binary files a/themes/pybcn_theme/assets/images/backgrounds/zen_of_python.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/friends/bcn-engineering.svg b/themes/pybcn_theme/assets/images/friends/bcn-engineering.svg new file mode 100644 index 000000000..a85bf09b2 --- /dev/null +++ b/themes/pybcn_theme/assets/images/friends/bcn-engineering.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/pybcn_theme/assets/images/friends/europython-society.webp b/themes/pybcn_theme/assets/images/friends/europython-society.webp new file mode 100644 index 000000000..127946336 Binary files /dev/null and b/themes/pybcn_theme/assets/images/friends/europython-society.webp differ diff --git a/themes/pybcn_theme/assets/images/friends/python-espana.webp b/themes/pybcn_theme/assets/images/friends/python-espana.webp new file mode 100644 index 000000000..8c00091ef Binary files /dev/null and b/themes/pybcn_theme/assets/images/friends/python-espana.webp differ diff --git a/themes/pybcn_theme/assets/images/friends/python-girona.webp b/themes/pybcn_theme/assets/images/friends/python-girona.webp new file mode 100644 index 000000000..44d888bee Binary files /dev/null and b/themes/pybcn_theme/assets/images/friends/python-girona.webp differ diff --git a/themes/pybcn_theme/assets/images/friends/python-software-foundation.webp b/themes/pybcn_theme/assets/images/friends/python-software-foundation.webp new file mode 100644 index 000000000..b285e67c1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/friends/python-software-foundation.webp differ diff --git a/themes/pybcn_theme/assets/images/people/alex-molas.png b/themes/pybcn_theme/assets/images/people/alex-molas.png deleted file mode 100644 index 87d1251ec..000000000 Binary files a/themes/pybcn_theme/assets/images/people/alex-molas.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/alex-molas.webp b/themes/pybcn_theme/assets/images/people/alex-molas.webp new file mode 100644 index 000000000..dc73d0759 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/alex-molas.webp differ diff --git a/themes/pybcn_theme/assets/images/people/ankit-mahato.png b/themes/pybcn_theme/assets/images/people/ankit-mahato.png deleted file mode 100644 index 61a438973..000000000 Binary files a/themes/pybcn_theme/assets/images/people/ankit-mahato.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/ankit-mahato.webp b/themes/pybcn_theme/assets/images/people/ankit-mahato.webp new file mode 100644 index 000000000..c562329af Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/ankit-mahato.webp differ diff --git a/themes/pybcn_theme/assets/images/people/dave-pitts.png b/themes/pybcn_theme/assets/images/people/dave-pitts.png deleted file mode 100644 index 6ad4a037f..000000000 Binary files a/themes/pybcn_theme/assets/images/people/dave-pitts.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/dave-pitts.webp b/themes/pybcn_theme/assets/images/people/dave-pitts.webp new file mode 100644 index 000000000..40c7f640d Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/dave-pitts.webp differ diff --git a/themes/pybcn_theme/assets/images/people/diego-giaquinta.png b/themes/pybcn_theme/assets/images/people/diego-giaquinta.png deleted file mode 100644 index 67b03990f..000000000 Binary files a/themes/pybcn_theme/assets/images/people/diego-giaquinta.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/diego-giaquinta.webp b/themes/pybcn_theme/assets/images/people/diego-giaquinta.webp new file mode 100644 index 000000000..76f93776d Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/diego-giaquinta.webp differ diff --git a/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.png b/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.png deleted file mode 100644 index ca79a3348..000000000 Binary files a/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.webp b/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.webp new file mode 100644 index 000000000..75f54954d Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.webp differ diff --git a/themes/pybcn_theme/assets/images/people/ferran-fabregas.png b/themes/pybcn_theme/assets/images/people/ferran-fabregas.png deleted file mode 100644 index d21d2f45f..000000000 Binary files a/themes/pybcn_theme/assets/images/people/ferran-fabregas.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/ferran-fabregas.webp b/themes/pybcn_theme/assets/images/people/ferran-fabregas.webp new file mode 100644 index 000000000..2f609b489 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/ferran-fabregas.webp differ diff --git a/themes/pybcn_theme/assets/images/people/francesco-faraone.png b/themes/pybcn_theme/assets/images/people/francesco-faraone.png deleted file mode 100644 index ac54549f9..000000000 Binary files a/themes/pybcn_theme/assets/images/people/francesco-faraone.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/francesco-faraone.webp b/themes/pybcn_theme/assets/images/people/francesco-faraone.webp new file mode 100644 index 000000000..47b18f6fc Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/francesco-faraone.webp differ diff --git a/themes/pybcn_theme/assets/images/people/jose-haro-peralta.png b/themes/pybcn_theme/assets/images/people/jose-haro-peralta.png deleted file mode 100644 index 7cbfbcc4d..000000000 Binary files a/themes/pybcn_theme/assets/images/people/jose-haro-peralta.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/jose-haro-peralta.webp b/themes/pybcn_theme/assets/images/people/jose-haro-peralta.webp new file mode 100644 index 000000000..e3a63421a Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/jose-haro-peralta.webp differ diff --git a/themes/pybcn_theme/assets/images/people/mariana-meireles.png b/themes/pybcn_theme/assets/images/people/mariana-meireles.png deleted file mode 100644 index 415137f4c..000000000 Binary files a/themes/pybcn_theme/assets/images/people/mariana-meireles.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/mariana-meireles.webp b/themes/pybcn_theme/assets/images/people/mariana-meireles.webp new file mode 100644 index 000000000..972d868e0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/mariana-meireles.webp differ diff --git a/themes/pybcn_theme/assets/images/people/mauricio-volcanes.png b/themes/pybcn_theme/assets/images/people/mauricio-volcanes.png deleted file mode 100644 index 92d70815b..000000000 Binary files a/themes/pybcn_theme/assets/images/people/mauricio-volcanes.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/mauricio-volcanes.webp b/themes/pybcn_theme/assets/images/people/mauricio-volcanes.webp new file mode 100644 index 000000000..3f01cad9d Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/mauricio-volcanes.webp differ diff --git a/themes/pybcn_theme/assets/images/people/noe-casas.png b/themes/pybcn_theme/assets/images/people/noe-casas.png deleted file mode 100644 index 41df0c51f..000000000 Binary files a/themes/pybcn_theme/assets/images/people/noe-casas.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/noe-casas.webp b/themes/pybcn_theme/assets/images/people/noe-casas.webp new file mode 100644 index 000000000..d010f4af2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/noe-casas.webp differ diff --git a/themes/pybcn_theme/assets/images/people/oriol-abril-pla.png b/themes/pybcn_theme/assets/images/people/oriol-abril-pla.png deleted file mode 100644 index 561cac859..000000000 Binary files a/themes/pybcn_theme/assets/images/people/oriol-abril-pla.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/oriol-abril-pla.webp b/themes/pybcn_theme/assets/images/people/oriol-abril-pla.webp new file mode 100644 index 000000000..b5a4cc1ae Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/oriol-abril-pla.webp differ diff --git a/themes/pybcn_theme/assets/images/people/pavel-sulimov.png b/themes/pybcn_theme/assets/images/people/pavel-sulimov.png deleted file mode 100644 index fc34b6341..000000000 Binary files a/themes/pybcn_theme/assets/images/people/pavel-sulimov.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/pavel-sulimov.webp b/themes/pybcn_theme/assets/images/people/pavel-sulimov.webp new file mode 100644 index 000000000..30513fead Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/pavel-sulimov.webp differ diff --git a/themes/pybcn_theme/assets/images/people/ruben-afonso.png b/themes/pybcn_theme/assets/images/people/ruben-afonso.png deleted file mode 100644 index dcd6990f8..000000000 Binary files a/themes/pybcn_theme/assets/images/people/ruben-afonso.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/ruben-afonso.webp b/themes/pybcn_theme/assets/images/people/ruben-afonso.webp new file mode 100644 index 000000000..f2ec909d8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/ruben-afonso.webp differ diff --git a/themes/pybcn_theme/assets/images/people/ruben-berenguel.png b/themes/pybcn_theme/assets/images/people/ruben-berenguel.png deleted file mode 100644 index cbadf7530..000000000 Binary files a/themes/pybcn_theme/assets/images/people/ruben-berenguel.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/ruben-berenguel.webp b/themes/pybcn_theme/assets/images/people/ruben-berenguel.webp new file mode 100644 index 000000000..8d3814c32 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/ruben-berenguel.webp differ diff --git a/themes/pybcn_theme/assets/images/people/yago-tafalla.png b/themes/pybcn_theme/assets/images/people/yago-tafalla.png deleted file mode 100644 index e9763b040..000000000 Binary files a/themes/pybcn_theme/assets/images/people/yago-tafalla.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/people/yago-tafalla.webp b/themes/pybcn_theme/assets/images/people/yago-tafalla.webp new file mode 100644 index 000000000..dea396c29 Binary files /dev/null and b/themes/pybcn_theme/assets/images/people/yago-tafalla.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/01-a-punto-de-empezar-easy-gps-tracker-using-arduino.webp b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/01-a-punto-de-empezar-easy-gps-tracker-using-arduino.webp new file mode 100644 index 000000000..53ae4bfa4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/01-a-punto-de-empezar-easy-gps-tracker-using-arduino.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/02-final-version-of-llevaneus-gps-tracker-using-ardui.webp b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/02-final-version-of-llevaneus-gps-tracker-using-ardui.webp new file mode 100644 index 000000000..8053b1f33 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/02-final-version-of-llevaneus-gps-tracker-using-ardui.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/03-empieza-the-robot-operating-system-ecosystem-and-p.webp b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/03-empieza-the-robot-operating-system-ecosystem-and-p.webp new file mode 100644 index 000000000..6195b2172 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/03-empieza-the-robot-operating-system-ecosystem-and-p.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/04-ejemplos-de-robots-que-usan-ros-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/04-ejemplos-de-robots-que-usan-ros-pybcn.webp new file mode 100644 index 000000000..43e026a18 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/04-ejemplos-de-robots-que-usan-ros-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/05-y-ahora-a-real-use-case-of-ros-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/05-y-ahora-a-real-use-case-of-ros-pybcn.webp new file mode 100644 index 000000000..67e194490 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-01-16-robotics-and-python/05-y-ahora-a-real-use-case-of-ros-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/01-pyramid-python-webframework-by-ramon-navarro-blood.webp b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/01-pyramid-python-webframework-by-ramon-navarro-blood.webp new file mode 100644 index 000000000..9d03c8b32 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/01-pyramid-python-webframework-by-ramon-navarro-blood.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/02-simple-webapps-with-nginx-uwsgi-emperor-bottle-by.webp b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/02-simple-webapps-with-nginx-uwsgi-emperor-bottle-by.webp new file mode 100644 index 000000000..08acdba8a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/02-simple-webapps-with-nginx-uwsgi-emperor-bottle-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/03-rapid-web-development-with-web2py-by-giorgio-zoppi.webp b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/03-rapid-web-development-with-web2py-by-giorgio-zoppi.webp new file mode 100644 index 000000000..369d94954 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/03-rapid-web-development-with-web2py-by-giorgio-zoppi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/04-did-you-know-that-the-http-pybcn-org-website-power.webp b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/04-did-you-know-that-the-http-pybcn-org-website-power.webp new file mode 100644 index 000000000..1556a4f17 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-02-20-python-web-frameworks/04-did-you-know-that-the-http-pybcn-org-website-power.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/01-the-zen-of-python-by-david-arcos-dzpm-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/01-the-zen-of-python-by-david-arcos-dzpm-pybcn.webp new file mode 100644 index 000000000..d75f28704 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/01-the-zen-of-python-by-david-arcos-dzpm-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/02-virtualenv-and-pip-by-alex-maneu-zouave-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/02-virtualenv-and-pip-by-alex-maneu-zouave-pybcn.webp new file mode 100644 index 000000000..535b1351e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/02-virtualenv-and-pip-by-alex-maneu-zouave-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/03-list-comprehensions-by-jordi-gomez-bao-jgomezb79-p.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/03-list-comprehensions-by-jordi-gomez-bao-jgomezb79-p.webp new file mode 100644 index 000000000..0c5e16ac9 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/03-list-comprehensions-by-jordi-gomez-bao-jgomezb79-p.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/04-metodos-magicos-en-python-by-nacho-gentile-nachoge.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/04-metodos-magicos-en-python-by-nacho-gentile-nachoge.webp new file mode 100644 index 000000000..a3f81ed39 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/04-metodos-magicos-en-python-by-nacho-gentile-nachoge.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/05-where-to-find-help-for-python-by-aleta-dunne-dtibu.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/05-where-to-find-help-for-python-by-aleta-dunne-dtibu.webp new file mode 100644 index 000000000..f2672c61a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/05-where-to-find-help-for-python-by-aleta-dunne-dtibu.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/06-introduction-to-python-by-pablo-enfedaque-vidal-pa.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/06-introduction-to-python-by-pablo-enfedaque-vidal-pa.webp new file mode 100644 index 000000000..fdf9f73d0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/06-introduction-to-python-by-pablo-enfedaque-vidal-pa.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/07-mutables-vs-immutables-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/07-mutables-vs-immutables-pybcn.webp new file mode 100644 index 000000000..4e293bf7c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-03-20-python-for-beginners-learn-some-python/07-mutables-vs-immutables-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/01-introduction-to-ipython-notebook-by-loris-mularoni.webp b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/01-introduction-to-ipython-notebook-by-loris-mularoni.webp new file mode 100644 index 000000000..4e4cb452b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/01-introduction-to-ipython-notebook-by-loris-mularoni.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/02-introduction-to-pandas-by-piotr-migdal-pmigdal-pyb.webp b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/02-introduction-to-pandas-by-piotr-migdal-pmigdal-pyb.webp new file mode 100644 index 000000000..a0e555467 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/02-introduction-to-pandas-by-piotr-migdal-pmigdal-pyb.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/03-introduction-to-python-for-data-analysis-by-christ.webp b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/03-introduction-to-python-for-data-analysis-by-christ.webp new file mode 100644 index 000000000..5ebde4230 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-04-24-python-sciences/03-introduction-to-python-for-data-analysis-by-christ.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-and-mongodb-by-javier-arias-javier-arilos-p.webp b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-and-mongodb-by-javier-arias-javier-arilos-p.webp new file mode 100644 index 000000000..1d3300f85 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-and-mongodb-by-javier-arias-javier-arilos-p.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-with-mysql-by-miquel-camprodon-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-with-mysql-by-miquel-camprodon-pybcn.webp new file mode 100644 index 000000000..1f73a8fee Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/01-python-with-mysql-by-miquel-camprodon-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/02-introduction-to-python-orm-sqlalchemy-by-jorge-med.webp b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/02-introduction-to-python-orm-sqlalchemy-by-jorge-med.webp new file mode 100644 index 000000000..bd96a80ae Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-05-22-python-and-databases/02-introduction-to-python-orm-sqlalchemy-by-jorge-med.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/01-openstack-by-xavier-queralt-xqueralt-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/01-openstack-by-xavier-queralt-xqueralt-pybcn.webp new file mode 100644 index 000000000..dd6d8b8a5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/01-openstack-by-xavier-queralt-xqueralt-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/02-fabric-by-pablo-enfedaque-pablitoev56-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/02-fabric-by-pablo-enfedaque-pablitoev56-pybcn.webp new file mode 100644 index 000000000..7f385075f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/02-fabric-by-pablo-enfedaque-pablitoev56-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/03-ansible-by-ignasi-fosch-ifosch-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/03-ansible-by-ignasi-fosch-ifosch-pybcn.webp new file mode 100644 index 000000000..bb9280bce Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/03-ansible-by-ignasi-fosch-ifosch-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/04-cuisine-by-daniel-mellado-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/04-cuisine-by-daniel-mellado-pybcn.webp new file mode 100644 index 000000000..a784eb383 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-06-26-python-devops/04-cuisine-by-daniel-mellado-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/01-python-and-machine-learning-by-xavier-arrufat-pybc.webp b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/01-python-and-machine-learning-by-xavier-arrufat-pybc.webp new file mode 100644 index 000000000..819037233 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/01-python-and-machine-learning-by-xavier-arrufat-pybc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/02-heating-solution-using-panstamp-and-python-by-orio.webp b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/02-heating-solution-using-panstamp-and-python-by-orio.webp new file mode 100644 index 000000000..d380d9a2e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/02-heating-solution-using-panstamp-and-python-by-orio.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/03-application-of-dynamical-systems-in-artificial-int.webp b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/03-application-of-dynamical-systems-in-artificial-int.webp new file mode 100644 index 000000000..9ff2c1b9e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-09-25-artificial-intelligence-panstamp/03-application-of-dynamical-systems-in-artificial-int.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/01-differences-and-common-aspects-of-go-by-francesc-c.webp b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/01-differences-and-common-aspects-of-go-by-francesc-c.webp new file mode 100644 index 000000000..baf1d876e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/01-differences-and-common-aspects-of-go-by-francesc-c.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/02-today-we-will-have-speakers-talking-about-golang-p.webp b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/02-today-we-will-have-speakers-talking-about-golang-p.webp new file mode 100644 index 000000000..7801cab8d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/02-today-we-will-have-speakers-talking-about-golang-p.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/03-gythonjs-translator-to-compile-a-subset-of-python.webp b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/03-gythonjs-translator-to-compile-a-subset-of-python.webp new file mode 100644 index 000000000..c58bc2fc5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-10-13-go-meetup-golang/03-gythonjs-translator-to-compile-a-subset-of-python.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/01-putting-python-inside-postgresql-by-brian-sutherla.webp b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/01-putting-python-inside-postgresql-by-brian-sutherla.webp new file mode 100644 index 000000000..e0e587158 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/01-putting-python-inside-postgresql-by-brian-sutherla.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/02-inside-the-artificial-neural-network-by-xavier-arr.webp b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/02-inside-the-artificial-neural-network-by-xavier-arr.webp new file mode 100644 index 000000000..c43a4d248 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/02-inside-the-artificial-neural-network-by-xavier-arr.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/03-conda-and-bokeh-by-christine-doig-ch-doig-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/03-conda-and-bokeh-by-christine-doig-ch-doig-pybcn.webp new file mode 100644 index 000000000..89e16590c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-11-20-python-meetup-november/03-conda-and-bokeh-by-christine-doig-ch-doig-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/01-python-tips-tricks-and-dark-magic-by-jordixou-pybc.webp b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/01-python-tips-tricks-and-dark-magic-by-jordixou-pybc.webp new file mode 100644 index 000000000..a2fcabd37 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/01-python-tips-tricks-and-dark-magic-by-jordixou-pybc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/02-buildbot-the-continuous-integration-python-framewo.webp b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/02-buildbot-the-continuous-integration-python-framewo.webp new file mode 100644 index 000000000..ea72935e1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/02-buildbot-the-continuous-integration-python-framewo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/03-unit-test-based-programming-by-miguel-lechon-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/03-unit-test-based-programming-by-miguel-lechon-pybcn.webp new file mode 100644 index 000000000..742040aba Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/03-unit-test-based-programming-by-miguel-lechon-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/04-about-to-start-learn-more-about-us-at-http-pybcn-o.webp b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/04-about-to-start-learn-more-about-us-at-http-pybcn-o.webp new file mode 100644 index 000000000..0d2aec273 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2014-12-18-python-december-meetup/04-about-to-start-learn-more-about-us-at-http-pybcn-o.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/01-an-introduction-to-sqlalchemy-and-orm-in-python-by.webp b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/01-an-introduction-to-sqlalchemy-and-orm-in-python-by.webp new file mode 100644 index 000000000..3fb9c4e2e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/01-an-introduction-to-sqlalchemy-and-orm-in-python-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/02-how-to-open-a-bar-in-python-by-edward-van-kuik-ale.webp b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/02-how-to-open-a-bar-in-python-by-edward-van-kuik-ale.webp new file mode 100644 index 000000000..ff0697d75 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/02-how-to-open-a-bar-in-python-by-edward-van-kuik-ale.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/03-continuous-integration-on-a-large-open-source-soft.webp b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/03-continuous-integration-on-a-large-open-source-soft.webp new file mode 100644 index 000000000..5a2d07346 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-01-22-python-january-meetup/03-continuous-integration-on-a-large-open-source-soft.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/01-high-performance-python-by-marc-garcia-mgarcia-pyb.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/01-high-performance-python-by-marc-garcia-mgarcia-pyb.webp new file mode 100644 index 000000000..98c4744b2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/01-high-performance-python-by-marc-garcia-mgarcia-pyb.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/02-natural-language-processing-with-python-and-nltk-b.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/02-natural-language-processing-with-python-and-nltk-b.webp new file mode 100644 index 000000000..09441ed58 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/02-natural-language-processing-with-python-and-nltk-b.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/03-zipline-a-powerful-algorithmic-trading-simulator-b.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/03-zipline-a-powerful-algorithmic-trading-simulator-b.webp new file mode 100644 index 000000000..b6d900a60 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/03-zipline-a-powerful-algorithmic-trading-simulator-b.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/04-issue-certificates-with-python-to-build-a-trust-re.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/04-issue-certificates-with-python-to-build-a-trust-re.webp new file mode 100644 index 000000000..70a97338b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/04-issue-certificates-with-python-to-build-a-trust-re.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/05-about-to-start-the-barcelona-python-meetup-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/05-about-to-start-the-barcelona-python-meetup-pybcn.webp new file mode 100644 index 000000000..713f8e30f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/05-about-to-start-the-barcelona-python-meetup-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/06-types-of-optimizations-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/06-types-of-optimizations-pybcn.webp new file mode 100644 index 000000000..1c1d577c1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/06-types-of-optimizations-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/07-python-optimization-takeaways-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/07-python-optimization-takeaways-pybcn.webp new file mode 100644 index 000000000..309a7762c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-02-19-python-february-meetup/07-python-optimization-takeaways-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-concurrency-in-python-by-aitor-guevara-aitorciki-a.webp b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-concurrency-in-python-by-aitor-guevara-aitorciki-a.webp new file mode 100644 index 000000000..bd7d0b7fb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-concurrency-in-python-by-aitor-guevara-aitorciki-a.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-spark-ipython-by-guillermo-blasco-theblackboxio-at.webp b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-spark-ipython-by-guillermo-blasco-theblackboxio-at.webp new file mode 100644 index 000000000..96a3c10d9 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/01-spark-ipython-by-guillermo-blasco-theblackboxio-at.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/02-spark-ipython-why-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/02-spark-ipython-why-pybcn.webp new file mode 100644 index 000000000..9714750fe Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/02-spark-ipython-why-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/03-networking-at-the-python-barcelona-meetup-at-itnig.webp b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/03-networking-at-the-python-barcelona-meetup-at-itnig.webp new file mode 100644 index 000000000..2625b82f8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/03-networking-at-the-python-barcelona-meetup-at-itnig.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/04-finally-asyncio-for-python-3-aitorciki-at-itnig-py.webp b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/04-finally-asyncio-for-python-3-aitorciki-at-itnig-py.webp new file mode 100644 index 000000000..846948702 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-03-26-python-march-meetup/04-finally-asyncio-for-python-3-aitorciki-at-itnig-py.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/01-practical-webcrawling-with-scrapy-by-ivan-company.webp b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/01-practical-webcrawling-with-scrapy-by-ivan-company.webp new file mode 100644 index 000000000..afa0c25bf Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/01-practical-webcrawling-with-scrapy-by-ivan-company.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/02-15-fails-in-15-minutes-an-interactive-guide-to-sho.webp b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/02-15-fails-in-15-minutes-an-interactive-guide-to-sho.webp new file mode 100644 index 000000000..9e5bbef14 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/02-15-fails-in-15-minutes-an-interactive-guide-to-sho.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/03-mutable-vs-immutable-objects-and-typical-mistakes.webp b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/03-mutable-vs-immutable-objects-and-typical-mistakes.webp new file mode 100644 index 000000000..b18051a2d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-04-16-python-april-meetup/03-mutable-vs-immutable-objects-and-typical-mistakes.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/01-python-decorators-by-guillermo-blasco-theblackboxi.webp b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/01-python-decorators-by-guillermo-blasco-theblackboxi.webp new file mode 100644 index 000000000..0622e8790 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/01-python-decorators-by-guillermo-blasco-theblackboxi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/02-python-for-data-analysis-by-juan-gonzales-vallinas.webp b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/02-python-for-data-analysis-by-juan-gonzales-vallinas.webp new file mode 100644 index 000000000..c7ee60705 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/02-python-for-data-analysis-by-juan-gonzales-vallinas.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/03-machine-learning-with-scikit-learn-by-christopher.webp b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/03-machine-learning-with-scikit-learn-by-christopher.webp new file mode 100644 index 000000000..ffa4fa75d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/03-machine-learning-with-scikit-learn-by-christopher.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/04-empezando-el-barcelona-python-meetup-de-mayo-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/04-empezando-el-barcelona-python-meetup-de-mayo-pybcn.webp new file mode 100644 index 000000000..15a81d3d9 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-05-21-python-may-meetup/04-empezando-el-barcelona-python-meetup-de-mayo-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/01-an-introduction-to-the-flask-web-framework-and-a-r.webp b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/01-an-introduction-to-the-flask-web-framework-and-a-r.webp new file mode 100644 index 000000000..db8f586a1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/01-an-introduction-to-the-flask-web-framework-and-a-r.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/02-python-and-cancer-genomics-by-loris-mularoni-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/02-python-and-cancer-genomics-by-loris-mularoni-pybcn.webp new file mode 100644 index 000000000..7af3863b5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/02-python-and-cancer-genomics-by-loris-mularoni-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/03-real-time-kpi-metrics-with-django-graphite-and-sta.webp b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/03-real-time-kpi-metrics-with-django-graphite-and-sta.webp new file mode 100644 index 000000000..5cd09db38 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-06-18-python-june-meetup/03-real-time-kpi-metrics-with-django-graphite-and-sta.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/01-image-processing-for-beginners-by-prassanna-ganesh.webp b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/01-image-processing-for-beginners-by-prassanna-ganesh.webp new file mode 100644 index 000000000..814b029fc Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/01-image-processing-for-beginners-by-prassanna-ganesh.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/02-hacking-the-bcn-housing-market-by-tudor-barbu-mota.webp b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/02-hacking-the-bcn-housing-market-by-tudor-barbu-mota.webp new file mode 100644 index 000000000..2245170af Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/02-hacking-the-bcn-housing-market-by-tudor-barbu-mota.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/03-tecnicas-osint-python-by-albert-sanchez-state-x-py.webp b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/03-tecnicas-osint-python-by-albert-sanchez-state-x-py.webp new file mode 100644 index 000000000..afc0cefad Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/03-tecnicas-osint-python-by-albert-sanchez-state-x-py.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/04-great-talks-thanks-skyscanner-for-the-pizza-beers.webp b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/04-great-talks-thanks-skyscanner-for-the-pizza-beers.webp new file mode 100644 index 000000000..4ab321e95 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-09-22-python-september-meetup/04-great-talks-thanks-skyscanner-for-the-pizza-beers.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-api-by-example-by-carles-barrobes-technomilk-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-api-by-example-by-carles-barrobes-technomilk-pybcn.webp new file mode 100644 index 000000000..fd3a5b47a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-api-by-example-by-carles-barrobes-technomilk-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-ofxpython-embedding-python-into-c-by-carles-f-juli.webp b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-ofxpython-embedding-python-into-c-by-carles-f-juli.webp new file mode 100644 index 000000000..e6ed72709 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/01-ofxpython-embedding-python-into-c-by-carles-f-juli.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/02-web-crawling-with-notebook-and-selenium-by-silvia.webp b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/02-web-crawling-with-notebook-and-selenium-by-silvia.webp new file mode 100644 index 000000000..8982f4deb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/02-web-crawling-with-notebook-and-selenium-by-silvia.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/03-data-structures-beyond-dicts-and-lists-by-sergi-so.webp b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/03-data-structures-beyond-dicts-and-lists-by-sergi-so.webp new file mode 100644 index 000000000..603ad2e0b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-10-22-python-october-meetup/03-data-structures-beyond-dicts-and-lists-by-sergi-so.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-11-26-python-november-meetup/01-now-is-xorduna-turn-using-telegram-as-an-interface.webp b/themes/pybcn_theme/assets/images/photos/2015-11-26-python-november-meetup/01-now-is-xorduna-turn-using-telegram-as-an-interface.webp new file mode 100644 index 000000000..f6355acbd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-11-26-python-november-meetup/01-now-is-xorduna-turn-using-telegram-as-an-interface.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-functional-programming-by-guillermo-blasco-theblac.webp b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-functional-programming-by-guillermo-blasco-theblac.webp new file mode 100644 index 000000000..95c680c4f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-functional-programming-by-guillermo-blasco-theblac.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-python-for-porn-by-gabriel-gavilan-gabriicom-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-python-for-porn-by-gabriel-gavilan-gabriicom-pybcn.webp new file mode 100644 index 000000000..91dd2b823 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/01-python-for-porn-by-gabriel-gavilan-gabriicom-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/02-ipython-parallel-by-jordi-deu-pons-elbioc-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/02-ipython-parallel-by-jordi-deu-pons-elbioc-pybcn.webp new file mode 100644 index 000000000..daa47630d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2015-12-17-python-december-meetup/02-ipython-parallel-by-jordi-deu-pons-elbioc-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/01-a-journey-to-using-an-encryption-standard-in-pytho.webp b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/01-a-journey-to-using-an-encryption-standard-in-pytho.webp new file mode 100644 index 000000000..c0745d0eb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/01-a-journey-to-using-an-encryption-standard-in-pytho.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/02-tracking-django-errors-with-rollbar-by-antonio-bar.webp b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/02-tracking-django-errors-with-rollbar-by-antonio-bar.webp new file mode 100644 index 000000000..b72e563e4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/02-tracking-django-errors-with-rollbar-by-antonio-bar.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/03-recommendation-systems-in-python-by-biel-aparicio.webp b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/03-recommendation-systems-in-python-by-biel-aparicio.webp new file mode 100644 index 000000000..9dbf08549 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-01-21-python-january-meetup/03-recommendation-systems-in-python-by-biel-aparicio.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/01-our-first-speaker-gabimaeztu-speaking-about-bokeh.webp b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/01-our-first-speaker-gabimaeztu-speaking-about-bokeh.webp new file mode 100644 index 000000000..1ee0f07de Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/01-our-first-speaker-gabimaeztu-speaking-about-bokeh.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/02-now-life-coding-packaging-deploying-and-running-a.webp b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/02-now-life-coding-packaging-deploying-and-running-a.webp new file mode 100644 index 000000000..8e254112e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/02-now-life-coding-packaging-deploying-and-running-a.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/03-amazing-brain-connections-represented-using-bokeh.webp b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/03-amazing-brain-connections-represented-using-bokeh.webp new file mode 100644 index 000000000..47a046042 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/03-amazing-brain-connections-represented-using-bokeh.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/04-last-questions-to-aitorciki-nice-to-have-you-again.webp b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/04-last-questions-to-aitorciki-nice-to-have-you-again.webp new file mode 100644 index 000000000..8ca005421 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-02-18-python-february-meetup/04-last-questions-to-aitorciki-nice-to-have-you-again.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/01-piggybacking-trello-for-automatic-student-assessme.webp b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/01-piggybacking-trello-for-automatic-student-assessme.webp new file mode 100644 index 000000000..cb71a5a7d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/01-piggybacking-trello-for-automatic-student-assessme.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/02-computational-complexity-in-python-by-jordi-souche.webp b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/02-computational-complexity-in-python-by-jordi-souche.webp new file mode 100644 index 000000000..113a4b75f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/02-computational-complexity-in-python-by-jordi-souche.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/03-sklearn-pandas-streamline-your-model-building-proc.webp b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/03-sklearn-pandas-streamline-your-model-building-proc.webp new file mode 100644 index 000000000..64c8310e5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/03-sklearn-pandas-streamline-your-model-building-proc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/04-photo.webp b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/04-photo.webp new file mode 100644 index 000000000..6f8f65efd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-03-17-python-march-meetup/04-photo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/01-ingesting-35-million-hotel-images-with-python-in-t.webp b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/01-ingesting-35-million-hotel-images-with-python-in-t.webp new file mode 100644 index 000000000..bd422f4bd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/01-ingesting-35-million-hotel-images-with-python-in-t.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/02-introduction-to-testing-and-py-test-by-ignasi-fosc.webp b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/02-introduction-to-testing-and-py-test-by-ignasi-fosc.webp new file mode 100644 index 000000000..edf19609c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/02-introduction-to-testing-and-py-test-by-ignasi-fosc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/03-bots-are-the-new-hype-long-life-to-slackbot-by-gab.webp b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/03-bots-are-the-new-hype-long-life-to-slackbot-by-gab.webp new file mode 100644 index 000000000..838166b00 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/03-bots-are-the-new-hype-long-life-to-slackbot-by-gab.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/04-accloudtant-tool-for-managing-aws-costs-by-ignasi.webp b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/04-accloudtant-tool-for-managing-aws-costs-by-ignasi.webp new file mode 100644 index 000000000..89ba6b310 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/04-accloudtant-tool-for-managing-aws-costs-by-ignasi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/05-comprehensions-in-5-min-by-jordi-soucheiron-jordix.webp b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/05-comprehensions-in-5-min-by-jordi-soucheiron-jordix.webp new file mode 100644 index 000000000..24e155c24 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-04-21-python-april-meetup/05-comprehensions-in-5-min-by-jordi-soucheiron-jordix.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/01-machine-learning-for-dummies-with-python-by-javier.webp b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/01-machine-learning-for-dummies-with-python-by-javier.webp new file mode 100644 index 000000000..5fef917e0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/01-machine-learning-for-dummies-with-python-by-javier.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/02-geodjango-use-case-mapping-farmer-fields-all-over.webp b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/02-geodjango-use-case-mapping-farmer-fields-all-over.webp new file mode 100644 index 000000000..14f7a3052 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/02-geodjango-use-case-mapping-farmer-fields-all-over.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/03-how-to-solve-a-complex-problem-using-machine-learn.webp b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/03-how-to-solve-a-complex-problem-using-machine-learn.webp new file mode 100644 index 000000000..ef7ac9248 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-06-16-python-june-meetup/03-how-to-solve-a-complex-problem-using-machine-learn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/01-efficient-django-by-david-arcos-dzpm-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/01-efficient-django-by-david-arcos-dzpm-pybcn.webp new file mode 100644 index 000000000..bba3eba39 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/01-efficient-django-by-david-arcos-dzpm-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/02-kinto-a-minimalist-json-storage-service-by-mathieu.webp b/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/02-kinto-a-minimalist-json-storage-service-by-mathieu.webp new file mode 100644 index 000000000..e608eea1b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-07-28-python-july-meetup/02-kinto-a-minimalist-json-storage-service-by-mathieu.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/01-how-to-avoid-sql-with-dataset-pandas-and-blaze-by.webp b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/01-how-to-avoid-sql-with-dataset-pandas-and-blaze-by.webp new file mode 100644 index 000000000..16bb83692 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/01-how-to-avoid-sql-with-dataset-pandas-and-blaze-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/02-best-practices-for-a-python-project-by-enrique-sae.webp b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/02-best-practices-for-a-python-project-by-enrique-sae.webp new file mode 100644 index 000000000..0243a4f44 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/02-best-practices-for-a-python-project-by-enrique-sae.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/03-tornado-an-asynchronous-web-framework-and-network.webp b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/03-tornado-an-asynchronous-web-framework-and-network.webp new file mode 100644 index 000000000..ae4072b19 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/03-tornado-an-asynchronous-web-framework-and-network.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/04-about-to-start-october-s-meetup-full-house-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/04-about-to-start-october-s-meetup-full-house-pybcn.webp new file mode 100644 index 000000000..b73adfad2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-10-20-python-october-meetup/04-about-to-start-october-s-meetup-full-house-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/01-ajuntament-de-barcelona-inicia-el-desarrollo-de-su.webp b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/01-ajuntament-de-barcelona-inicia-el-desarrollo-de-su.webp new file mode 100644 index 000000000..787145691 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/01-ajuntament-de-barcelona-inicia-el-desarrollo-de-su.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/02-introduction-to-conda-by-ignasi-fosch-ifosch.webp b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/02-introduction-to-conda-by-ignasi-fosch-ifosch.webp new file mode 100644 index 000000000..23d9704b7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/02-introduction-to-conda-by-ignasi-fosch-ifosch.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/03-plone-server-rest-api-async-framework-for-cms-by-r.webp b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/03-plone-server-rest-api-async-framework-for-cms-by-r.webp new file mode 100644 index 000000000..367db4567 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2016-11-17-python-november-meetup/03-plone-server-rest-api-async-framework-for-cms-by-r.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/01-python-cryptography-101-by-giorgio-zoppi-jo-zoppi.webp b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/01-python-cryptography-101-by-giorgio-zoppi-jo-zoppi.webp new file mode 100644 index 000000000..41533672e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/01-python-cryptography-101-by-giorgio-zoppi-jo-zoppi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/02-modern-web-development-with-graphql-by-israel-saet.webp b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/02-modern-web-development-with-graphql-by-israel-saet.webp new file mode 100644 index 000000000..04d6b89f5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/02-modern-web-development-with-graphql-by-israel-saet.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/03-thanks-to-travelperk-for-providing-us-with-the-gre.webp b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/03-thanks-to-travelperk-for-providing-us-with-the-gre.webp new file mode 100644 index 000000000..229fb3035 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-02-16-python-february-meetup/03-thanks-to-travelperk-for-providing-us-with-the-gre.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-02-18-february-dojo-understanding-sockets/01-session-about-sockets-by-jaume-mila-at-pybcn-febru.webp b/themes/pybcn_theme/assets/images/photos/2017-02-18-february-dojo-understanding-sockets/01-session-about-sockets-by-jaume-mila-at-pybcn-febru.webp new file mode 100644 index 000000000..466c02712 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-02-18-february-dojo-understanding-sockets/01-session-about-sockets-by-jaume-mila-at-pybcn-febru.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/01-using-celery-for-bots-slack-and-telegram-by-xavier.webp b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/01-using-celery-for-bots-slack-and-telegram-by-xavier.webp new file mode 100644 index 000000000..0d1b8ce44 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/01-using-celery-for-bots-slack-and-telegram-by-xavier.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/02-data-visualisation-with-python-plotly-by-giovanni.webp b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/02-data-visualisation-with-python-plotly-by-giovanni.webp new file mode 100644 index 000000000..f9bd0e46a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/02-data-visualisation-with-python-plotly-by-giovanni.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/03-como-automatizamos-la-edicion-de-podcast-entredevy.webp b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/03-como-automatizamos-la-edicion-de-podcast-entredevy.webp new file mode 100644 index 000000000..84ec84e48 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-03-16-python-march-meetup/03-como-automatizamos-la-edicion-de-podcast-entredevy.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/01-python-performance-profiling-for-data-analysis-by.webp b/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/01-python-performance-profiling-for-data-analysis-by.webp new file mode 100644 index 000000000..3ee77b764 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/01-python-performance-profiling-for-data-analysis-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/02-when-your-dataframe-is-bigger-than-your-ram-what-s.webp b/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/02-when-your-dataframe-is-bigger-than-your-ram-what-s.webp new file mode 100644 index 000000000..6da72bfc7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-04-20-python-april-meetup/02-when-your-dataframe-is-bigger-than-your-ram-what-s.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/01-tiendeo-high-level-reporting-with-office-libraries.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/01-tiendeo-high-level-reporting-with-office-libraries.webp new file mode 100644 index 000000000..b86475e5c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/01-tiendeo-high-level-reporting-with-office-libraries.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/02-plenty-of-good-questions-for-antonio-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/02-plenty-of-good-questions-for-antonio-pybcn.webp new file mode 100644 index 000000000..efaca1a86 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/02-plenty-of-good-questions-for-antonio-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/03-deep-learning-for-signal-processing-by-marius-miro.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/03-deep-learning-for-signal-processing-by-marius-miro.webp new file mode 100644 index 000000000..c74903865 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/03-deep-learning-for-signal-processing-by-marius-miro.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/04-snakes-ladders-a-taste-of-scala-for-pythonistas-by.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/04-snakes-ladders-a-taste-of-scala-for-pythonistas-by.webp new file mode 100644 index 000000000..a7a53e9d5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/04-snakes-ladders-a-taste-of-scala-for-pythonistas-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/05-learn-some-scala-and-come-back-to-python-berenguel.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/05-learn-some-scala-and-come-back-to-python-berenguel.webp new file mode 100644 index 000000000..2d7c67ddb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/05-learn-some-scala-and-come-back-to-python-berenguel.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/06-post-meetup-networking-while-enjoying-awesome-view.webp b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/06-post-meetup-networking-while-enjoying-awesome-view.webp new file mode 100644 index 000000000..41a28e1f7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-06-15-python-june-meetup/06-post-meetup-networking-while-enjoying-awesome-view.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/01-python-for-robotics-a-quick-introduction-to-rospy.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/01-python-for-robotics-a-quick-introduction-to-rospy.webp new file mode 100644 index 000000000..ee1f1f0bc Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/01-python-for-robotics-a-quick-introduction-to-rospy.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/02-demo-face-detection-with-rospy.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/02-demo-face-detection-with-rospy.webp new file mode 100644 index 000000000..ad1199fd4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/02-demo-face-detection-with-rospy.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/03-fun-with-python-and-c-by-jomsdev-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/03-fun-with-python-and-c-by-jomsdev-pybcn.webp new file mode 100644 index 000000000..917fc04bd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/03-fun-with-python-and-c-by-jomsdev-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/04-live-demo.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/04-live-demo.webp new file mode 100644 index 000000000..6e6366640 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/04-live-demo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/05-tiendeo-geotracking-from-online-to-store-by-ernest.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/05-tiendeo-geotracking-from-online-to-store-by-ernest.webp new file mode 100644 index 000000000..238cb88bf Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/05-tiendeo-geotracking-from-online-to-store-by-ernest.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/06-lets-manage-lots-of-pickles-rick.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/06-lets-manage-lots-of-pickles-rick.webp new file mode 100644 index 000000000..af048dfd2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/06-lets-manage-lots-of-pickles-rick.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/07-about-to-start-september-s-python-meetup-at-tiende.webp b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/07-about-to-start-september-s-python-meetup-at-tiende.webp new file mode 100644 index 000000000..705419dc1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-09-21-python-september-meetup/07-about-to-start-september-s-python-meetup-at-tiende.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/01-introduction-to-dronekit-creating-apps-for-uavs-wi.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/01-introduction-to-dronekit-creating-apps-for-uavs-wi.webp new file mode 100644 index 000000000..6d3c81584 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/01-introduction-to-dronekit-creating-apps-for-uavs-wi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/02-python-memory-management-by-robert-kuska.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/02-python-memory-management-by-robert-kuska.webp new file mode 100644 index 000000000..88422ed1d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/02-python-memory-management-by-robert-kuska.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/03-the-secret-art-of-code-reviews-by-petr-joachim.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/03-the-secret-art-of-code-reviews-by-petr-joachim.webp new file mode 100644 index 000000000..ba6710017 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/03-the-secret-art-of-code-reviews-by-petr-joachim.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/04-hi-newcomers-check-https-pybcn-org-and-welcome-to.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/04-hi-newcomers-check-https-pybcn-org-and-welcome-to.webp new file mode 100644 index 000000000..b6abdc166 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/04-hi-newcomers-check-https-pybcn-org-and-welcome-to.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/05-dronekit-demo-time.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/05-dronekit-demo-time.webp new file mode 100644 index 000000000..47f846114 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/05-dronekit-demo-time.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/06-iveta-is-doing-a-quizz-and-giving-away-kiwi-com-vo.webp b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/06-iveta-is-doing-a-quizz-and-giving-away-kiwi-com-vo.webp new file mode 100644 index 000000000..b69107165 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-10-26-kiwi-com-python-meetup/06-iveta-is-doing-a-quizz-and-giving-away-kiwi-com-vo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/01-websockets-and-chatbots-by-cfenollosa-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/01-websockets-and-chatbots-by-cfenollosa-pybcn.webp new file mode 100644 index 000000000..34b587c7b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/01-websockets-and-chatbots-by-cfenollosa-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/02-cffi-interfacing-c-libraries-using-python-by-gerar.webp b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/02-cffi-interfacing-c-libraries-using-python-by-gerar.webp new file mode 100644 index 000000000..d61703bbe Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/02-cffi-interfacing-c-libraries-using-python-by-gerar.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/03-continuous-deployment-of-web-applications-the-trav.webp b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/03-continuous-deployment-of-web-applications-the-trav.webp new file mode 100644 index 000000000..dfaac0b5c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-11-23-python-november-meetup/03-continuous-deployment-of-web-applications-the-trav.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/01-why-lazy-developers-write-beautiful-code-by-javier.webp b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/01-why-lazy-developers-write-beautiful-code-by-javier.webp new file mode 100644 index 000000000..11cc061fd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/01-why-lazy-developers-write-beautiful-code-by-javier.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/02-catching-asteroids-and-tracking-satellites-with-py.webp b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/02-catching-asteroids-and-tracking-satellites-with-py.webp new file mode 100644 index 000000000..6faef83a2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/02-catching-asteroids-and-tracking-satellites-with-py.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/03-it-s-very-difficult-to-get-external-data-to-test-y.webp b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/03-it-s-very-difficult-to-get-external-data-to-test-y.webp new file mode 100644 index 000000000..b4b1875f4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2017-12-20-python-december-meetup/03-it-s-very-difficult-to-get-external-data-to-test-y.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/01-exploring-generators-and-coroutines-by-mariano-ana.webp b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/01-exploring-generators-and-coroutines-by-mariano-ana.webp new file mode 100644 index 000000000..14a462958 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/01-exploring-generators-and-coroutines-by-mariano-ana.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/02-python-vs-julia-by-jordi-deu-pons-elbioc.webp b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/02-python-vs-julia-by-jordi-deu-pons-elbioc.webp new file mode 100644 index 000000000..01950997a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/02-python-vs-julia-by-jordi-deu-pons-elbioc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/03-thanks-to-bynder-for-hosting-the-barcelona-python.webp b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/03-thanks-to-bynder-for-hosting-the-barcelona-python.webp new file mode 100644 index 000000000..aaa25b1d3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-01-17-python-january-meetup/03-thanks-to-bynder-for-hosting-the-barcelona-python.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/01-using-python-for-everything-pyot-by-the-worldsensi.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/01-using-python-for-everything-pyot-by-the-worldsensi.webp new file mode 100644 index 000000000..9e439cdfe Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/01-using-python-for-everything-pyot-by-the-worldsensi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/02-addressing-a-hard-graph-colouring-problem-in-pytho.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/02-addressing-a-hard-graph-colouring-problem-in-pytho.webp new file mode 100644 index 000000000..d94d95300 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/02-addressing-a-hard-graph-colouring-problem-in-pytho.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/03-about-to-start-today-s-meetup-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/03-about-to-start-today-s-meetup-pybcn.webp new file mode 100644 index 000000000..6bc241a51 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/03-about-to-start-today-s-meetup-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/04-first-meetup-at-worldsensing-is-starting.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/04-first-meetup-at-worldsensing-is-starting.webp new file mode 100644 index 000000000..cc6694706 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/04-first-meetup-at-worldsensing-is-starting.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/05-no-no-no-problem.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/05-no-no-no-problem.webp new file mode 100644 index 000000000..64af1de89 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/05-no-no-no-problem.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/06-do-we-need-a-serverless-framework-with-python-i-di.webp b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/06-do-we-need-a-serverless-framework-with-python-i-di.webp new file mode 100644 index 000000000..a6c896404 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-22-python-february-meetup/06-do-we-need-a-serverless-framework-with-python-i-di.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-02-24-february-dojo-web-spiders-with-scrapy/01-workshop-in-scrapy-by-dimitri-herrero-at-pybcn-doj.webp b/themes/pybcn_theme/assets/images/photos/2018-02-24-february-dojo-web-spiders-with-scrapy/01-workshop-in-scrapy-by-dimitri-herrero-at-pybcn-doj.webp new file mode 100644 index 000000000..5c1197d73 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-02-24-february-dojo-web-spiders-with-scrapy/01-workshop-in-scrapy-by-dimitri-herrero-at-pybcn-doj.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/01-we-are-starting-our-meetup-at-the-travelperk-offic.webp b/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/01-we-are-starting-our-meetup-at-the-travelperk-offic.webp new file mode 100644 index 000000000..8441caba4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/01-we-are-starting-our-meetup-at-the-travelperk-offic.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/02-our-last-talk-today-by-edu2b.webp b/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/02-our-last-talk-today-by-edu2b.webp new file mode 100644 index 000000000..2806bcbff Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-03-22-python-march-meetup/02-our-last-talk-today-by-edu2b.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/01-high-altitude-python-to-the-stratosphere-and-back.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/01-high-altitude-python-to-the-stratosphere-and-back.webp new file mode 100644 index 000000000..7b1212bdf Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/01-high-altitude-python-to-the-stratosphere-and-back.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/02-the-traffic-controllers-tell-the-planes-that-there.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/02-the-traffic-controllers-tell-the-planes-that-there.webp new file mode 100644 index 000000000..0531e6c5c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/02-the-traffic-controllers-tell-the-planes-that-there.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/03-linux-and-python-are-a-safe-bet-for-embedded-proje.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/03-linux-and-python-are-a-safe-bet-for-embedded-proje.webp new file mode 100644 index 000000000..963b352f1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/03-linux-and-python-are-a-safe-bet-for-embedded-proje.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/04-everything-is-ready-for-today-s-meetup.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/04-everything-is-ready-for-today-s-meetup.webp new file mode 100644 index 000000000..3e2820ff5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/04-everything-is-ready-for-today-s-meetup.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/05-ttn-3-python-by-xose-perez-xoseperez-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/05-ttn-3-python-by-xose-perez-xoseperez-pybcn.webp new file mode 100644 index 000000000..14ca3302c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/05-ttn-3-python-by-xose-perez-xoseperez-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/06-coverage-of-lora-networks-in-barcelona-europe-chec.webp b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/06-coverage-of-lora-networks-in-barcelona-europe-chec.webp new file mode 100644 index 000000000..785f3e67d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-04-19-python-april-meetup/06-coverage-of-lora-networks-in-barcelona-europe-chec.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/01-something-something-moving-data-by-lukas-kubis-unc.webp b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/01-something-something-moving-data-by-lukas-kubis-unc.webp new file mode 100644 index 000000000..25c4c8182 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/01-something-something-moving-data-by-lukas-kubis-unc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/02-telluric-manipulacion-interactiva-de-datos-geoespa.webp b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/02-telluric-manipulacion-interactiva-de-datos-geoespa.webp new file mode 100644 index 000000000..17ca2b2bb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/02-telluric-manipulacion-interactiva-de-datos-geoespa.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/03-starting-may-s-meetup-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/03-starting-may-s-meetup-pybcn.webp new file mode 100644 index 000000000..a7ed7d47b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/03-starting-may-s-meetup-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/04-building-python-friendly-scalable-reliable-busines.webp b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/04-building-python-friendly-scalable-reliable-busines.webp new file mode 100644 index 000000000..6f9ef8fd6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-05-24-python-may-meetup/04-building-python-friendly-scalable-reliable-busines.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/01-how-does-that-pyspark-thing-work-and-why-arrow-mak.webp b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/01-how-does-that-pyspark-thing-work-and-why-arrow-mak.webp new file mode 100644 index 000000000..ad845e1aa Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/01-how-does-that-pyspark-thing-work-and-why-arrow-mak.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/02-frozen-python-satice-ice-dataloggers-by-oriol-sanc.webp b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/02-frozen-python-satice-ice-dataloggers-by-oriol-sanc.webp new file mode 100644 index 000000000..d216e6ce6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/02-frozen-python-satice-ice-dataloggers-by-oriol-sanc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/03-of-course-the-cpu-used-uses-python-and-linux-pybcn.webp b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/03-of-course-the-cpu-used-uses-python-and-linux-pybcn.webp new file mode 100644 index 000000000..b27fac8ff Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/03-of-course-the-cpu-used-uses-python-and-linux-pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/04-starting-june-s-python-meetup-at-dow-jones-thanks.webp b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/04-starting-june-s-python-meetup-at-dow-jones-thanks.webp new file mode 100644 index 000000000..587e3e2cd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-06-21-python-june-meetup/04-starting-june-s-python-meetup-at-dow-jones-thanks.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/01-we-are-already-here-at-travelperk-waiting-for-our.webp b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/01-we-are-already-here-at-travelperk-waiting-for-our.webp new file mode 100644 index 000000000..f01730e9c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/01-we-are-already-here-at-travelperk-waiting-for-our.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/02-now-it-s-gabimaeztu-s-turn-with-practical-nlp.webp b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/02-now-it-s-gabimaeztu-s-turn-with-practical-nlp.webp new file mode 100644 index 000000000..587cf8252 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/02-now-it-s-gabimaeztu-s-turn-with-practical-nlp.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/03-today-we-had-a-nice-surprise-after-the-talks.webp b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/03-today-we-had-a-nice-surprise-after-the-talks.webp new file mode 100644 index 000000000..b3a8e3820 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-07-19-python-july-meetup/03-today-we-had-a-nice-surprise-after-the-talks.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/01-deep-learning-for-time-series-by-alexander-honchar.webp b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/01-deep-learning-for-time-series-by-alexander-honchar.webp new file mode 100644 index 000000000..908335549 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/01-deep-learning-for-time-series-by-alexander-honchar.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/02-classical-approaches.webp b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/02-classical-approaches.webp new file mode 100644 index 000000000..8acad931d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/02-classical-approaches.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/03-microservices-at-scale-by-jordi-soucheiron-jordixo.webp b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/03-microservices-at-scale-by-jordi-soucheiron-jordixo.webp new file mode 100644 index 000000000..a23671fc4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/03-microservices-at-scale-by-jordi-soucheiron-jordixo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/04-full-venue-at-today-s-meetup-thanks-skyscanner-for.webp b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/04-full-venue-at-today-s-meetup-thanks-skyscanner-for.webp new file mode 100644 index 000000000..1a2c01d80 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2018-09-20-python-september-meetup/04-full-venue-at-today-s-meetup-thanks-skyscanner-for.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/01-django-gone-clean-by-jairovadillo-at-21buttonseng.webp b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/01-django-gone-clean-by-jairovadillo-at-21buttonseng.webp new file mode 100644 index 000000000..2aa506240 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/01-django-gone-clean-by-jairovadillo-at-21buttonseng.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/02-machine-learning-and-time-series-analysis-for-brai.webp b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/02-machine-learning-and-time-series-analysis-for-brai.webp new file mode 100644 index 000000000..8c794b705 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/02-machine-learning-and-time-series-analysis-for-brai.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/03-building-glovo-s-own-spatial-analytics-tool-by-ale.webp b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/03-building-glovo-s-own-spatial-analytics-tool-by-ale.webp new file mode 100644 index 000000000..8a39ff4ca Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/03-building-glovo-s-own-spatial-analytics-tool-by-ale.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/04-about-to-start-today-s-meetup.webp b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/04-about-to-start-today-s-meetup.webp new file mode 100644 index 000000000..e9fb5f67d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-01-17-python-january-meetup/04-about-to-start-today-s-meetup.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/01-repository-templates-with-cookiecutter-by-hector-c.webp b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/01-repository-templates-with-cookiecutter-by-hector-c.webp new file mode 100644 index 000000000..0a7be0e05 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/01-repository-templates-with-cookiecutter-by-hector-c.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/02-recursive-generators-by-joan-vilaltella-joanvilalt.webp b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/02-recursive-generators-by-joan-vilaltella-joanvilalt.webp new file mode 100644 index 000000000..198fdfaa6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/02-recursive-generators-by-joan-vilaltella-joanvilalt.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/03-pipenv-python-dev-workflow-for-humans-by-andreu-va.webp b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/03-pipenv-python-dev-workflow-for-humans-by-andreu-va.webp new file mode 100644 index 000000000..040ac4d72 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-02-21-python-february-meetup/03-pipenv-python-dev-workflow-for-humans-by-andreu-va.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/01-welcome-to-pybcn-march-meetup-houston-we-have-a-sn.webp b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/01-welcome-to-pybcn-march-meetup-houston-we-have-a-sn.webp new file mode 100644 index 000000000..398e9773e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/01-welcome-to-pybcn-march-meetup-houston-we-have-a-sn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/02-pyspark-on-kubernetes-avoiding-the-pain-of-yarn-by.webp b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/02-pyspark-on-kubernetes-avoiding-the-pain-of-yarn-by.webp new file mode 100644 index 000000000..013308f3b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/02-pyspark-on-kubernetes-avoiding-the-pain-of-yarn-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/03-codificando-atomos-con-python-por-johanna-sanchez.webp b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/03-codificando-atomos-con-python-por-johanna-sanchez.webp new file mode 100644 index 000000000..332069399 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/03-codificando-atomos-con-python-por-johanna-sanchez.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/04-thanks-all-for-coming-and-satellogic-for-hosting-u.webp b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/04-thanks-all-for-coming-and-satellogic-for-hosting-u.webp new file mode 100644 index 000000000..eeece1e9a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-03-21-python-march-meetup/04-thanks-all-for-coming-and-satellogic-for-hosting-u.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/01-building-a-validation-scheme-for-a-rest-api-using.webp b/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/01-building-a-validation-scheme-for-a-rest-api-using.webp new file mode 100644 index 000000000..eb43ba713 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/01-building-a-validation-scheme-for-a-rest-api-using.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/02-does-django-scale-by-david-arcos-dzpm.webp b/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/02-does-django-scale-by-david-arcos-dzpm.webp new file mode 100644 index 000000000..399fe7be7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-04-25-python-april-meetup/02-does-django-scale-by-david-arcos-dzpm.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/01-mocking-and-patching-pitfalls-by-edwin-jung.webp b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/01-mocking-and-patching-pitfalls-by-edwin-jung.webp new file mode 100644 index 000000000..ace31b941 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/01-mocking-and-patching-pitfalls-by-edwin-jung.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/02-damegender-gender-detection-tool-experiments-with.webp b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/02-damegender-gender-detection-tool-experiments-with.webp new file mode 100644 index 000000000..10ba3c643 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/02-damegender-gender-detection-tool-experiments-with.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/03-chatops-101-with-python-and-opsdroid-by-angel-fern.webp b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/03-chatops-101-with-python-and-opsdroid-by-angel-fern.webp new file mode 100644 index 000000000..330de5fd5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-05-16-python-may-meetup/03-chatops-101-with-python-and-opsdroid-by-angel-fern.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/01-welcome-to-python-june-meetup-pybcn-https-www-meet.webp b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/01-welcome-to-python-june-meetup-pybcn-https-www-meet.webp new file mode 100644 index 000000000..f607a395e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/01-welcome-to-python-june-meetup-pybcn-https-www-meet.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/02-pytest-recomendaciones-paquetes-basicos-para-testi.webp b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/02-pytest-recomendaciones-paquetes-basicos-para-testi.webp new file mode 100644 index 000000000..b0cfc3b5a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/02-pytest-recomendaciones-paquetes-basicos-para-testi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/03-automatize-reports-using-google-slides-api-by-vict.webp b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/03-automatize-reports-using-google-slides-api-by-vict.webp new file mode 100644 index 000000000..f4ace1e0f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/03-automatize-reports-using-google-slides-api-by-vict.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/04-don-t-talk-scheme-make-service-integration-easier.webp b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/04-don-t-talk-scheme-make-service-integration-easier.webp new file mode 100644 index 000000000..745a8da85 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-06-20-python-june-meetup/04-don-t-talk-scheme-make-service-integration-easier.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/01-ml-against-fraud-catching-bad-guys-with-python-by.webp b/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/01-ml-against-fraud-catching-bad-guys-with-python-by.webp new file mode 100644 index 000000000..38d9a2394 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/01-ml-against-fraud-catching-bad-guys-with-python-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/02-python-on-ucontrollers-by-juan-biondi.webp b/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/02-python-on-ucontrollers-by-juan-biondi.webp new file mode 100644 index 000000000..718447c67 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-07-18-python-july-meetup/02-python-on-ucontrollers-by-juan-biondi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/01-data-quality-and-how-we-are-trying-to-break-the-80.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/01-data-quality-and-how-we-are-trying-to-break-the-80.webp new file mode 100644 index 000000000..02d5d3710 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/01-data-quality-and-how-we-are-trying-to-break-the-80.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/02-there-is-one-way-to-do-it-right-and-many-ways-to-m.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/02-there-is-one-way-to-do-it-right-and-many-ways-to-m.webp new file mode 100644 index 000000000..83c74b259 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/02-there-is-one-way-to-do-it-right-and-many-ways-to-m.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/03-it-started-as-fiction-and-now-it-seems-to-be-scien.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/03-it-started-as-fiction-and-now-it-seems-to-be-scien.webp new file mode 100644 index 000000000..5a43b5cb5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/03-it-started-as-fiction-and-now-it-seems-to-be-scien.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/04-python-for-the-management-of-iot-platforms-at-worl.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/04-python-for-the-management-of-iot-platforms-at-worl.webp new file mode 100644 index 000000000..1a6f10724 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/04-python-for-the-management-of-iot-platforms-at-worl.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/05-welcome-to-python-barcelona-by-nataliasirera.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/05-welcome-to-python-barcelona-by-nataliasirera.webp new file mode 100644 index 000000000..271ac21f6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/05-welcome-to-python-barcelona-by-nataliasirera.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/06-come-to-the-pydaybcn-send-proposals-join-us-at-the.webp b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/06-come-to-the-pydaybcn-send-proposals-join-us-at-the.webp new file mode 100644 index 000000000..3ba43cd22 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-09-19-python-september-meetup/06-come-to-the-pydaybcn-send-proposals-join-us-at-the.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-11-20-introduction-to-tackling-networks-in-python/01-we-have-the-pictures-of-the-event-will-post-them-s.webp b/themes/pybcn_theme/assets/images/photos/2019-11-20-introduction-to-tackling-networks-in-python/01-we-have-the-pictures-of-the-event-will-post-them-s.webp new file mode 100644 index 000000000..a334406f3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-11-20-introduction-to-tackling-networks-in-python/01-we-have-the-pictures-of-the-event-will-post-them-s.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/01-we-start-today-s-meetup-with-ismansiete-from-color.webp b/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/01-we-start-today-s-meetup-with-ismansiete-from-color.webp new file mode 100644 index 000000000..7cdcee2de Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/01-we-start-today-s-meetup-with-ismansiete-from-color.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/02-now-we-continue-with-gabimaeztu-from-iomed-ehr.webp b/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/02-now-we-continue-with-gabimaeztu-from-iomed-ehr.webp new file mode 100644 index 000000000..92e771f64 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2019-11-21-python-november-meetup/02-now-we-continue-with-gabimaeztu-from-iomed-ehr.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/01-welcome-to-python-january-meetup-pybcn-https-www-m.webp b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/01-welcome-to-python-january-meetup-pybcn-https-www-m.webp new file mode 100644 index 000000000..bf12f70af Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/01-welcome-to-python-january-meetup-pybcn-https-www-m.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/02-jazz-chord-generation-using-deep-learning-by-mateu.webp b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/02-jazz-chord-generation-using-deep-learning-by-mateu.webp new file mode 100644 index 000000000..39756385a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/02-jazz-chord-generation-using-deep-learning-by-mateu.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/03-using-pydantic-for-security-static-analysis-of-aws.webp b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/03-using-pydantic-for-security-static-analysis-of-aws.webp new file mode 100644 index 000000000..fec798aa0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/03-using-pydantic-for-security-static-analysis-of-aws.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/04-forbidden-toppings-on-pizza.webp b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/04-forbidden-toppings-on-pizza.webp new file mode 100644 index 000000000..77239f5b4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/04-forbidden-toppings-on-pizza.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/05-inversion-de-control-e-inyeccion-de-dependencias-t.webp b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/05-inversion-de-control-e-inyeccion-de-dependencias-t.webp new file mode 100644 index 000000000..dc12d1aa5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-01-23-python-january-meetup/05-inversion-de-control-e-inyeccion-de-dependencias-t.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/01-migracode-creating-a-migrant-tech-community-by-vin.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/01-migracode-creating-a-migrant-tech-community-by-vin.webp new file mode 100644 index 000000000..5caca267c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/01-migracode-creating-a-migrant-tech-community-by-vin.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/02-how-can-you-volunteer-with-migracodebcn.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/02-how-can-you-volunteer-with-migracodebcn.webp new file mode 100644 index 000000000..764c01f60 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/02-how-can-you-volunteer-with-migracodebcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/03-thanks-holaluzeng-for-the-venue-and-the-pizzas.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/03-thanks-holaluzeng-for-the-venue-and-the-pizzas.webp new file mode 100644 index 000000000..b294e92a0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/03-thanks-holaluzeng-for-the-venue-and-the-pizzas.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/04-about-to-start-today-s-meetup-thanks-holaluzeng-fo.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/04-about-to-start-today-s-meetup-thanks-holaluzeng-fo.webp new file mode 100644 index 000000000..5baaad7cb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/04-about-to-start-today-s-meetup-thanks-holaluzeng-fo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/05-automatically-intercepting-debugging-all-python-ht.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/05-automatically-intercepting-debugging-all-python-ht.webp new file mode 100644 index 000000000..6767af1fb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/05-automatically-intercepting-debugging-all-python-ht.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/06-it-s-magic.webp b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/06-it-s-magic.webp new file mode 100644 index 000000000..a6a2805fe Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2020-02-20-python-february-meetup/06-it-s-magic.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/01-property-based-testing-with-hypothesis-by-alberto.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/01-property-based-testing-with-hypothesis-by-alberto.webp new file mode 100644 index 000000000..d9c281630 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/01-property-based-testing-with-hypothesis-by-alberto.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/02-pip-install-hypothesis.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/02-pip-install-hypothesis.webp new file mode 100644 index 000000000..020433737 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/02-pip-install-hypothesis.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/03-serverless-webapp-using-googleappengine-by-victor.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/03-serverless-webapp-using-googleappengine-by-victor.webp new file mode 100644 index 000000000..0fd1354da Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/03-serverless-webapp-using-googleappengine-by-victor.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/04-advantages-and-disadvantages-of-google-datastore.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/04-advantages-and-disadvantages-of-google-datastore.webp new file mode 100644 index 000000000..9873b3146 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/04-advantages-and-disadvantages-of-google-datastore.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/05-demo.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/05-demo.webp new file mode 100644 index 000000000..1956aa5f5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/05-demo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/06-enough-talks-for-today-pizza-time.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/06-enough-talks-for-today-pizza-time.webp new file mode 100644 index 000000000..157d2feee Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/06-enough-talks-for-today-pizza-time.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/07-thanks-travelperk-for-hosting-python-barcelona.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/07-thanks-travelperk-for-hosting-python-barcelona.webp new file mode 100644 index 000000000..03a51c6c0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/07-thanks-travelperk-for-hosting-python-barcelona.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/08-welcome-to-november-s-python-meetup-https-www-meet.webp b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/08-welcome-to-november-s-python-meetup-https-www-meet.webp new file mode 100644 index 000000000..826663bac Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2021-11-25-python-november-meetup-in-person/08-welcome-to-november-s-python-meetup-https-www-meet.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/01-we-re-back-telegram-bots-from-idea-to-production-b.webp b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/01-we-re-back-telegram-bots-from-idea-to-production-b.webp new file mode 100644 index 000000000..9eead3774 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/01-we-re-back-telegram-bots-from-idea-to-production-b.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/02-we-need-to-talk-to-the-bot-father.webp b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/02-we-need-to-talk-to-the-bot-father.webp new file mode 100644 index 000000000..a39c63858 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/02-we-need-to-talk-to-the-bot-father.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/03-nice-bots-mrswats.webp b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/03-nice-bots-mrswats.webp new file mode 100644 index 000000000..1dbae5677 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/03-nice-bots-mrswats.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/04-pythin-bircilini-miitip.webp b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/04-pythin-bircilini-miitip.webp new file mode 100644 index 000000000..ddc7b77a5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-03-24-python-march-meetup-telegram-bots-from-idea-to-production/04-pythin-bircilini-miitip.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/01-shorter-feedback-loop-by-running-impacted-tests-on.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/01-shorter-feedback-loop-by-running-impacted-tests-on.webp new file mode 100644 index 000000000..71de64c65 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/01-shorter-feedback-loop-by-running-impacted-tests-on.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/02-pip-install-partialtesting-pytest-testmon.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/02-pip-install-partialtesting-pytest-testmon.webp new file mode 100644 index 000000000..bd640f4af Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/02-pip-install-partialtesting-pytest-testmon.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/03-current-limitations.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/03-current-limitations.webp new file mode 100644 index 000000000..d725dba82 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/03-current-limitations.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/04-aprendizaje-a-traves-de-grafos-graph-neural-networ.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/04-aprendizaje-a-traves-de-grafos-graph-neural-networ.webp new file mode 100644 index 000000000..62071af94 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/04-aprendizaje-a-traves-de-grafos-graph-neural-networ.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/05-estructura-regular-vs-irregular.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/05-estructura-regular-vs-irregular.webp new file mode 100644 index 000000000..6e38f89fd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/05-estructura-regular-vs-irregular.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/06-gnns.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/06-gnns.webp new file mode 100644 index 000000000..9a191e6ea Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/06-gnns.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/07-more-books-for-my-library.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/07-more-books-for-my-library.webp new file mode 100644 index 000000000..ca61e32f3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/07-more-books-for-my-library.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/08-finally-a-great-networking-we-missed-you-a-lot-tha.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/08-finally-a-great-networking-we-missed-you-a-lot-tha.webp new file mode 100644 index 000000000..de6b8ea01 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/08-finally-a-great-networking-we-missed-you-a-lot-tha.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/09-full-attendance-at-pybcn-s-meetup-thanks-backmarke.webp b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/09-full-attendance-at-pybcn-s-meetup-thanks-backmarke.webp new file mode 100644 index 000000000..39bf23e43 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-04-21-python-april-meetup-shorter-testing-feedback-aprendizaje-a/09-full-attendance-at-pybcn-s-meetup-thanks-backmarke.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/01-from-zero-to-hero-building-a-scalable-system-from.webp b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/01-from-zero-to-hero-building-a-scalable-system-from.webp new file mode 100644 index 000000000..ef03cbfb6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/01-from-zero-to-hero-building-a-scalable-system-from.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/02-introduction-to-pyscript-by-david-arcos-dzpm.webp b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/02-introduction-to-pyscript-by-david-arcos-dzpm.webp new file mode 100644 index 000000000..befc28e80 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/02-introduction-to-pyscript-by-david-arcos-dzpm.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/03-happy-to-be-back-to-offline-events-see-you-next-mo.webp b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/03-happy-to-be-back-to-offline-events-see-you-next-mo.webp new file mode 100644 index 000000000..d94eecb41 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/03-happy-to-be-back-to-offline-events-see-you-next-mo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/04-welcome-to-python-may-meetup-building-a-django-sca.webp b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/04-welcome-to-python-may-meetup-building-a-django-sca.webp new file mode 100644 index 000000000..f4012e29e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/04-welcome-to-python-may-meetup-building-a-django-sca.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/05-thanks-mundimoto-for-hosting-us-jacobcr.webp b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/05-thanks-mundimoto-for-hosting-us-jacobcr.webp new file mode 100644 index 000000000..753846742 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-05-19-python-may-meetup-building-a-django-scalable-system-intro/05-thanks-mundimoto-for-hosting-us-jacobcr.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/01-september-pybcn-meetup-crunching-data-to-catch-fra.webp b/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/01-september-pybcn-meetup-crunching-data-to-catch-fra.webp new file mode 100644 index 000000000..bcf0ca072 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/01-september-pybcn-meetup-crunching-data-to-catch-fra.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/02-and-now-qr-codes-let-us-make-some-gifs-with-ismans.webp b/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/02-and-now-qr-codes-let-us-make-some-gifs-with-ismans.webp new file mode 100644 index 000000000..b13cb3602 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-09-20-python-september-meetup-fraud-detection-qr-codes/02-and-now-qr-codes-let-us-make-some-gifs-with-ismans.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/01-smart-shop-populate-your-basket-with-one-click-by.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/01-smart-shop-populate-your-basket-with-one-click-by.webp new file mode 100644 index 000000000..6bb2ce84e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/01-smart-shop-populate-your-basket-with-one-click-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/02-they-use-python-to-orchestrate-the-ml-pipelines.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/02-they-use-python-to-orchestrate-the-ml-pipelines.webp new file mode 100644 index 000000000..2dbe7793b Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/02-they-use-python-to-orchestrate-the-ml-pipelines.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/03-biohacking-with-python-by-marina-moro-lopez-marina.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/03-biohacking-with-python-by-marina-moro-lopez-marina.webp new file mode 100644 index 000000000..c18e649f8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/03-biohacking-with-python-by-marina-moro-lopez-marina.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/04-nice-bottle-hello-pyladiesbcn.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/04-nice-bottle-hello-pyladiesbcn.webp new file mode 100644 index 000000000..0685523fd Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/04-nice-bottle-hello-pyladiesbcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/05-doing-crispr-from-python-the-full-code-is-availabl.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/05-doing-crispr-from-python-the-full-code-is-availabl.webp new file mode 100644 index 000000000..e8189b648 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/05-doing-crispr-from-python-the-full-code-is-availabl.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/06-thanks-ocadotechnology-for-hosting-the-python-barc.webp b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/06-thanks-ocadotechnology-for-hosting-the-python-barc.webp new file mode 100644 index 000000000..2564648ec Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-10-20-python-october-meetup-smart-shop-biohacking/06-thanks-ocadotechnology-for-hosting-the-python-barc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/01-today-we-are-enjoying-the-hospitality-of-thisisclo.webp b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/01-today-we-are-enjoying-the-hospitality-of-thisisclo.webp new file mode 100644 index 000000000..cdc8ace82 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/01-today-we-are-enjoying-the-hospitality-of-thisisclo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/02-first-talk-we-have-ferran-jimenez-talking-about-ja.webp b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/02-first-talk-we-have-ferran-jimenez-talking-about-ja.webp new file mode 100644 index 000000000..c5af8c964 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/02-first-talk-we-have-ferran-jimenez-talking-about-ja.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/03-and-now-we-have-pavel-lonkin-from-thisiscloudblue.webp b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/03-and-now-we-have-pavel-lonkin-from-thisiscloudblue.webp new file mode 100644 index 000000000..ef018ba94 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2022-11-24-python-november-meetup-jax-vs-numpy-microservices-and/03-and-now-we-have-pavel-lonkin-from-thisiscloudblue.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/01-cloud-infrastructure-the-software-way-by-joan-garc.webp b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/01-cloud-infrastructure-the-software-way-by-joan-garc.webp new file mode 100644 index 000000000..cf448a5ee Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/01-cloud-infrastructure-the-software-way-by-joan-garc.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/02-the-archival-datathon-ml-competition-tips-by-alber.webp b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/02-the-archival-datathon-ml-competition-tips-by-alber.webp new file mode 100644 index 000000000..eb01760d8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/02-the-archival-datathon-ml-competition-tips-by-alber.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/03-alberto-is-explaining-about-real-experience-of-par.webp b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/03-alberto-is-explaining-about-real-experience-of-par.webp new file mode 100644 index 000000000..ca91a56ea Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/03-alberto-is-explaining-about-real-experience-of-par.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/04-welcome-to-python-march-meetup-cloud-infrastructur.webp b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/04-welcome-to-python-march-meetup-cloud-infrastructur.webp new file mode 100644 index 000000000..073eedf70 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-03-30-python-march-meetup-cloud-infrastructure-ml-competition-tips/04-welcome-to-python-march-meetup-cloud-infrastructur.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/01-the-two-language-problem-in-vectorized-python-expr.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/01-the-two-language-problem-in-vectorized-python-expr.webp new file mode 100644 index 000000000..9bebcb553 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/01-the-two-language-problem-in-vectorized-python-expr.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/02-this-is-the-way.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/02-this-is-the-way.webp new file mode 100644 index 000000000..2d2e2dfac Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/02-this-is-the-way.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/03-ai-image-generative-algorithm-in-fashion-design-by.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/03-ai-image-generative-algorithm-in-fashion-design-by.webp new file mode 100644 index 000000000..71a4f74eb Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/03-ai-image-generative-algorithm-in-fashion-design-by.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/04-many-use-cases-in-fashion-design.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/04-many-use-cases-in-fashion-design.webp new file mode 100644 index 000000000..356b70026 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/04-many-use-cases-in-fashion-design.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/05-we-ve-seen-some-good-tips-on-prompt-engineering.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/05-we-ve-seen-some-good-tips-on-prompt-engineering.webp new file mode 100644 index 000000000..0b2d7e293 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/05-we-ve-seen-some-good-tips-on-prompt-engineering.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/06-during-the-intro-we-just-announced-a-new-pydaybcn.webp b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/06-during-the-intro-we-just-announced-a-new-pydaybcn.webp new file mode 100644 index 000000000..97d5e18d7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2023-09-28-python-september-meetup-back-to-school/06-during-the-intro-we-just-announced-a-new-pydaybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/01-launch-your-own-python-library-within-the-company.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/01-launch-your-own-python-library-within-the-company.webp new file mode 100644 index 000000000..2c3a2cd03 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/01-launch-your-own-python-library-within-the-company.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/02-live-demo-time-julian-is-creating-a-new-python-lib.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/02-live-demo-time-julian-is-creating-a-new-python-lib.webp new file mode 100644 index 000000000..6d606f800 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/02-live-demo-time-julian-is-creating-a-new-python-lib.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/03-and-after-a-few-minutes-it-s-done-if-you-want-to-r.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/03-and-after-a-few-minutes-it-s-done-if-you-want-to-r.webp new file mode 100644 index 000000000..bff50197f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/03-and-after-a-few-minutes-it-s-done-if-you-want-to-r.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/04-mastering-pdf-form-filling-with-pypdf-by-jordi-bos.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/04-mastering-pdf-form-filling-with-pypdf-by-jordi-bos.webp new file mode 100644 index 000000000..81842d381 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/04-mastering-pdf-form-filling-with-pypdf-by-jordi-bos.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/05-wow-thanks-martinthoma-the-maintainer-of-pypdf.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/05-wow-thanks-martinthoma-the-maintainer-of-pypdf.webp new file mode 100644 index 000000000..de0fa698f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/05-wow-thanks-martinthoma-the-maintainer-of-pypdf.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/06-today-i-learned-filigrana-watermark.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/06-today-i-learned-filigrana-watermark.webp new file mode 100644 index 000000000..de8ba5d47 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/06-today-i-learned-filigrana-watermark.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/07-it-worked.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/07-it-worked.webp new file mode 100644 index 000000000..c7b7ca960 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/07-it-worked.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/08-welcome-to-the-python-barcelona-january-meetup-htt.webp b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/08-welcome-to-the-python-barcelona-january-meetup-htt.webp new file mode 100644 index 000000000..21958dad1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-01-24-python-meetup-january-happy-new-year/08-welcome-to-the-python-barcelona-january-meetup-htt.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/01-pytest-a-short-hike-by-itxaso-aizpurua.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/01-pytest-a-short-hike-by-itxaso-aizpurua.webp new file mode 100644 index 000000000..9dd6ac3a6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/01-pytest-a-short-hike-by-itxaso-aizpurua.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/02-live-demo-with-cat-facts.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/02-live-demo-with-cat-facts.webp new file mode 100644 index 000000000..dcf6c87f9 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/02-live-demo-with-cat-facts.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/03-fyi-we-re-recording-the-talks-go-check-our-youtube.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/03-fyi-we-re-recording-the-talks-go-check-our-youtube.webp new file mode 100644 index 000000000..329ab87a3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/03-fyi-we-re-recording-the-talks-go-check-our-youtube.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/04-analysis-of-queering-the-map-by-marta-garcia.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/04-analysis-of-queering-the-map-by-marta-garcia.webp new file mode 100644 index 000000000..8f877deaa Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/04-analysis-of-queering-the-map-by-marta-garcia.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/05-today-s-meetup-is-surely-about-cats-if-you-also-lo.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/05-today-s-meetup-is-surely-about-cats-if-you-also-lo.webp new file mode 100644 index 000000000..3c1977319 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/05-today-s-meetup-is-surely-about-cats-if-you-also-lo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/06-thanks-servizurich-for-hosting-us.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/06-thanks-servizurich-for-hosting-us.webp new file mode 100644 index 000000000..539ef77b8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/06-thanks-servizurich-for-hosting-us.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/07-photo.webp b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/07-photo.webp new file mode 100644 index 000000000..96d5d7133 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-02-21-python-meetup-february-python-world-congress/07-photo.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/01-welcome-to-python-meetup-may-computer-vision-and-a.webp b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/01-welcome-to-python-meetup-may-computer-vision-and-a.webp new file mode 100644 index 000000000..76221e39e Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/01-welcome-to-python-meetup-may-computer-vision-and-a.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/02-using-opencv-in-ai-practical-image-processing-in-p.webp b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/02-using-opencv-in-ai-practical-image-processing-in-p.webp new file mode 100644 index 000000000..553471980 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/02-using-opencv-in-ai-practical-image-processing-in-p.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/03-what-s-more-practical-that-looking-at-the-source-c.webp b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/03-what-s-more-practical-that-looking-at-the-source-c.webp new file mode 100644 index 000000000..39a72eff0 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/03-what-s-more-practical-that-looking-at-the-source-c.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/04-cluster-experiments-a-simulation-library-to-design.webp b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/04-cluster-experiments-a-simulation-library-to-design.webp new file mode 100644 index 000000000..e0a2fdfe2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/04-cluster-experiments-a-simulation-library-to-design.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/05-hello-world.webp b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/05-hello-world.webp new file mode 100644 index 000000000..ff0590aa3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-05-23-python-meetup-may-computer-vision-and-a-b-testing/05-hello-world.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/01-welcome-to-the-python-meetup-june-pyments-and-open.webp b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/01-welcome-to-the-python-meetup-june-pyments-and-open.webp new file mode 100644 index 000000000..98dbdcb0c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/01-welcome-to-the-python-meetup-june-pyments-and-open.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/02-pyments-how-to-design-payment-applications-in-pyth.webp b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/02-pyments-how-to-design-payment-applications-in-pyth.webp new file mode 100644 index 000000000..f4cec3e1f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/02-pyments-how-to-design-payment-applications-in-pyth.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/03-good-reasons-against-outsourcing-their-payments.webp b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/03-good-reasons-against-outsourcing-their-payments.webp new file mode 100644 index 000000000..d0055b05d Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/03-good-reasons-against-outsourcing-their-payments.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/04-mastering-excel-automation-with-openpyxl-by-jordi.webp b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/04-mastering-excel-automation-with-openpyxl-by-jordi.webp new file mode 100644 index 000000000..7af20cd72 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/04-mastering-excel-automation-with-openpyxl-by-jordi.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/05-they-tried-to-automate-excel-with-phpexcel-but-php.webp b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/05-they-tried-to-automate-excel-with-phpexcel-but-php.webp new file mode 100644 index 000000000..5f4a02911 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-06-13-python-meetup-june-pyments-and-openpyxl/05-they-tried-to-automate-excel-with-phpexcel-but-php.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/01-welcome-to-python-meetup-september-ai-goes-back-to.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/01-welcome-to-python-meetup-september-ai-goes-back-to.webp new file mode 100644 index 000000000..00da2a0f6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/01-welcome-to-python-meetup-september-ai-goes-back-to.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/02-ragtime-an-approach-to-retrieval-augmented-generat.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/02-ragtime-an-approach-to-retrieval-augmented-generat.webp new file mode 100644 index 000000000..a8f2bd0c5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/02-ragtime-an-approach-to-retrieval-augmented-generat.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/03-what-is-retrieval-augmented-information.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/03-what-is-retrieval-augmented-information.webp new file mode 100644 index 000000000..03fff5e61 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/03-what-is-retrieval-augmented-information.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/04-wow-he-s-using-a-rag-to-figure-out-warhammer-rules.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/04-wow-he-s-using-a-rag-to-figure-out-warhammer-rules.webp new file mode 100644 index 000000000..a7472f2da Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/04-wow-he-s-using-a-rag-to-figure-out-warhammer-rules.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/05-from-text-to-actions-llms-as-the-new-software-cons.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/05-from-text-to-actions-llms-as-the-new-software-cons.webp new file mode 100644 index 000000000..7a39a818a Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/05-from-text-to-actions-llms-as-the-new-software-cons.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/06-doing-http-actions.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/06-doing-http-actions.webp new file mode 100644 index 000000000..c34811536 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/06-doing-http-actions.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/07-putting-everything-together-with-talk2apis.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/07-putting-everything-together-with-talk2apis.webp new file mode 100644 index 000000000..beab5344c Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/07-putting-everything-together-with-talk2apis.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/08-it-just-built-a-flask-app-with-html-js-frontend-in.webp b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/08-it-just-built-a-flask-app-with-html-js-frontend-in.webp new file mode 100644 index 000000000..6a39880d8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2024-09-26-python-meetup-september-ai-goes-back-to-school/08-it-just-built-a-flask-app-with-html-js-frontend-in.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/2026-04-30-python-meetup-april-back-to-school/01-first-talk-spec-driven-development-by-sergei-marty.webp b/themes/pybcn_theme/assets/images/photos/2026-04-30-python-meetup-april-back-to-school/01-first-talk-spec-driven-development-by-sergei-marty.webp new file mode 100644 index 000000000..3a3547cca Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/2026-04-30-python-meetup-april-back-to-school/01-first-talk-spec-driven-development-by-sergei-marty.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/assemblies/2019.webp b/themes/pybcn_theme/assets/images/photos/assemblies/2019.webp new file mode 100644 index 000000000..c2a60af33 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/assemblies/2019.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/assemblies/2021.webp b/themes/pybcn_theme/assets/images/photos/assemblies/2021.webp new file mode 100644 index 000000000..c38758a85 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/assemblies/2021.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/assemblies/2022.webp b/themes/pybcn_theme/assets/images/photos/assemblies/2022.webp new file mode 100644 index 000000000..345b63b35 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/assemblies/2022.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/assemblies/2023.webp b/themes/pybcn_theme/assets/images/photos/assemblies/2023.webp new file mode 100644 index 000000000..9e499f448 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/assemblies/2023.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/assemblies/2026.webp b/themes/pybcn_theme/assets/images/photos/assemblies/2026.webp new file mode 100644 index 000000000..bd0dc7e3f Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/assemblies/2026.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/canodrom_header.jpg b/themes/pybcn_theme/assets/images/photos/canodrom_header.jpg deleted file mode 100644 index 8c2d137a4..000000000 Binary files a/themes/pybcn_theme/assets/images/photos/canodrom_header.jpg and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/photos/group-pyday-2016.jpg b/themes/pybcn_theme/assets/images/photos/group-pyday-2016.jpg new file mode 100644 index 000000000..891987029 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/group-pyday-2016.jpg differ diff --git a/themes/pybcn_theme/assets/images/photos/meetups.jpg b/themes/pybcn_theme/assets/images/photos/meetups.jpg deleted file mode 100644 index ad4df7d4e..000000000 Binary files a/themes/pybcn_theme/assets/images/photos/meetups.jpg and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/photos/news_bkg.jpg b/themes/pybcn_theme/assets/images/photos/news_bkg.jpg deleted file mode 100644 index 8c5304cea..000000000 Binary files a/themes/pybcn_theme/assets/images/photos/news_bkg.jpg and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/photos/practice-sessions.jpg b/themes/pybcn_theme/assets/images/photos/practice-sessions.jpg deleted file mode 100644 index e4de173bc..000000000 Binary files a/themes/pybcn_theme/assets/images/photos/practice-sessions.jpg and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.png b/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.png deleted file mode 100644 index 156811e18..000000000 Binary files a/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.webp b/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.webp new file mode 100644 index 000000000..d13b89015 Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/pyday-2021/16-at-the-end-of-each-talk-please-use-the-post-its-to.webp differ diff --git a/themes/pybcn_theme/assets/images/photos/pyday_bcn_2019/22-thanks-to-all-the-sponsors-speakers-volunteers-coa.webp b/themes/pybcn_theme/assets/images/photos/pyday_bcn_2019/22-thanks-to-all-the-sponsors-speakers-volunteers-coa.webp new file mode 100644 index 000000000..ac9282fbf Binary files /dev/null and b/themes/pybcn_theme/assets/images/photos/pyday_bcn_2019/22-thanks-to-all-the-sponsors-speakers-volunteers-coa.webp differ diff --git a/themes/pybcn_theme/assets/images/social-card.png b/themes/pybcn_theme/assets/images/social-card.png new file mode 100644 index 000000000..526e4b785 Binary files /dev/null and b/themes/pybcn_theme/assets/images/social-card.png differ diff --git a/themes/pybcn_theme/assets/images/sponsors/21buttons.png b/themes/pybcn_theme/assets/images/sponsors/21buttons.png deleted file mode 100644 index 7efb67115..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/21buttons.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/21buttons.webp b/themes/pybcn_theme/assets/images/sponsors/21buttons.webp new file mode 100644 index 000000000..0e8a4937a Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/21buttons.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/Nuclia.png b/themes/pybcn_theme/assets/images/sponsors/Nuclia.png deleted file mode 100644 index f9d286cdf..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/Nuclia.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/Nuclia.webp b/themes/pybcn_theme/assets/images/sponsors/Nuclia.webp new file mode 100644 index 000000000..f1db82ee7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/Nuclia.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/Qida.png b/themes/pybcn_theme/assets/images/sponsors/Qida.png deleted file mode 100644 index 9177282e0..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/Qida.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/Qida.webp b/themes/pybcn_theme/assets/images/sponsors/Qida.webp new file mode 100644 index 000000000..feca65e7a Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/Qida.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/RakutenTV.png b/themes/pybcn_theme/assets/images/sponsors/RakutenTV.png deleted file mode 100644 index 929deea0f..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/RakutenTV.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/RakutenTV.webp b/themes/pybcn_theme/assets/images/sponsors/RakutenTV.webp new file mode 100644 index 000000000..d52f96c45 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/RakutenTV.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/affectv.png b/themes/pybcn_theme/assets/images/sponsors/affectv.png deleted file mode 100644 index a03c7a06a..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/affectv.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/affectv.webp b/themes/pybcn_theme/assets/images/sponsors/affectv.webp new file mode 100644 index 000000000..44fc63cba Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/affectv.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/aimsun.jpg b/themes/pybcn_theme/assets/images/sponsors/aimsun.jpg index 550f7e5f3..889299c8b 100644 Binary files a/themes/pybcn_theme/assets/images/sponsors/aimsun.jpg and b/themes/pybcn_theme/assets/images/sponsors/aimsun.jpg differ diff --git a/themes/pybcn_theme/assets/images/sponsors/apsl.png b/themes/pybcn_theme/assets/images/sponsors/apsl.png deleted file mode 100644 index 61101efe9..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/apsl.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/atlasense.png b/themes/pybcn_theme/assets/images/sponsors/atlasense.png deleted file mode 100644 index 4fa4c70bb..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/atlasense.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/atlasense.webp b/themes/pybcn_theme/assets/images/sponsors/atlasense.webp new file mode 100644 index 000000000..4ea71ca51 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/atlasense.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/backmarket.png b/themes/pybcn_theme/assets/images/sponsors/backmarket.png deleted file mode 100644 index e01c2dcda..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/backmarket.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/backmarket.webp b/themes/pybcn_theme/assets/images/sponsors/backmarket.webp new file mode 100644 index 000000000..e0e812200 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/backmarket.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/bitphy.png b/themes/pybcn_theme/assets/images/sponsors/bitphy.png deleted file mode 100644 index 383249976..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/bitphy.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/bitphy.webp b/themes/pybcn_theme/assets/images/sponsors/bitphy.webp new file mode 100644 index 000000000..1aed254ea Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/bitphy.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/bling.png b/themes/pybcn_theme/assets/images/sponsors/bling.png deleted file mode 100644 index a3a0c2139..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/bling.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/bling.webp b/themes/pybcn_theme/assets/images/sponsors/bling.webp new file mode 100644 index 000000000..b70043d89 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/bling.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/blueliv.webp b/themes/pybcn_theme/assets/images/sponsors/blueliv.webp new file mode 100644 index 000000000..6a296cb51 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/blueliv.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/business-insights.png b/themes/pybcn_theme/assets/images/sponsors/business-insights.png deleted file mode 100644 index f97786566..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/business-insights.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/business-insights.webp b/themes/pybcn_theme/assets/images/sponsors/business-insights.webp new file mode 100644 index 000000000..409af1999 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/business-insights.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/canodrom.png b/themes/pybcn_theme/assets/images/sponsors/canodrom.png deleted file mode 100644 index ae7e0f184..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/canodrom.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/canodrom.webp b/themes/pybcn_theme/assets/images/sponsors/canodrom.webp new file mode 100644 index 000000000..4ebced11a Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/canodrom.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg b/themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg index 5561bd9b1..d8f9bbb9b 100644 Binary files a/themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg and b/themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg differ diff --git a/themes/pybcn_theme/assets/images/sponsors/chartboost.webp b/themes/pybcn_theme/assets/images/sponsors/chartboost.webp new file mode 100644 index 000000000..c6c6a8bcf Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/chartboost.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/claranet.png b/themes/pybcn_theme/assets/images/sponsors/claranet.png deleted file mode 100644 index a931e9de5..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/claranet.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/claranet.webp b/themes/pybcn_theme/assets/images/sponsors/claranet.webp new file mode 100644 index 000000000..c881bc0c5 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/claranet.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/cloudblue.png b/themes/pybcn_theme/assets/images/sponsors/cloudblue.png deleted file mode 100644 index 6ef154b97..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/cloudblue.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/cloudblue.webp b/themes/pybcn_theme/assets/images/sponsors/cloudblue.webp new file mode 100644 index 000000000..1af4097b2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/cloudblue.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codely.png b/themes/pybcn_theme/assets/images/sponsors/codely.png deleted file mode 100644 index 6346b48f9..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/codely.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codely.webp b/themes/pybcn_theme/assets/images/sponsors/codely.webp new file mode 100644 index 000000000..8e19785ad Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/codely.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codeop.png b/themes/pybcn_theme/assets/images/sponsors/codeop.png deleted file mode 100644 index 4864bfca4..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/codeop.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codeop.webp b/themes/pybcn_theme/assets/images/sponsors/codeop.webp new file mode 100644 index 000000000..72834c89e Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/codeop.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codurance.png b/themes/pybcn_theme/assets/images/sponsors/codurance.png deleted file mode 100644 index c5c372e1f..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/codurance.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/codurance.webp b/themes/pybcn_theme/assets/images/sponsors/codurance.webp new file mode 100644 index 000000000..37580b356 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/codurance.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/digitalfems.png b/themes/pybcn_theme/assets/images/sponsors/digitalfems.png deleted file mode 100644 index 40cc076ba..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/digitalfems.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/digitalfems.webp b/themes/pybcn_theme/assets/images/sponsors/digitalfems.webp new file mode 100644 index 000000000..77773eb30 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/digitalfems.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/elastic.webp b/themes/pybcn_theme/assets/images/sponsors/elastic.webp new file mode 100644 index 000000000..21c4ca582 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/elastic.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/europython_society.png b/themes/pybcn_theme/assets/images/sponsors/europython_society.png deleted file mode 100644 index 1dc8675af..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/europython_society.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/europython_society.webp b/themes/pybcn_theme/assets/images/sponsors/europython_society.webp new file mode 100644 index 000000000..127946336 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/europython_society.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/flanks.png b/themes/pybcn_theme/assets/images/sponsors/flanks.png deleted file mode 100644 index 9f7a8c668..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/flanks.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/flanks.webp b/themes/pybcn_theme/assets/images/sponsors/flanks.webp new file mode 100644 index 000000000..0335a3abc Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/flanks.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/fundacion-ci.jpg b/themes/pybcn_theme/assets/images/sponsors/fundacion-ci.jpg new file mode 100644 index 000000000..de800dc76 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/fundacion-ci.jpg differ diff --git a/themes/pybcn_theme/assets/images/sponsors/gluecharm.png b/themes/pybcn_theme/assets/images/sponsors/gluecharm.png deleted file mode 100644 index 3a2cb639f..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/gluecharm.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/gluecharm.webp b/themes/pybcn_theme/assets/images/sponsors/gluecharm.webp new file mode 100644 index 000000000..d1205d26d Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/gluecharm.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/holaluz.png b/themes/pybcn_theme/assets/images/sponsors/holaluz.png deleted file mode 100644 index 654750094..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/holaluz.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/holaluz.webp b/themes/pybcn_theme/assets/images/sponsors/holaluz.webp new file mode 100644 index 000000000..208c31933 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/holaluz.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/hybridtheory.png b/themes/pybcn_theme/assets/images/sponsors/hybridtheory.png deleted file mode 100644 index 1afd5c06f..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/hybridtheory.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/hybridtheory.webp b/themes/pybcn_theme/assets/images/sponsors/hybridtheory.webp new file mode 100644 index 000000000..72b4c2e1e Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/hybridtheory.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/ikigai.jpg b/themes/pybcn_theme/assets/images/sponsors/ikigai.jpg index 25c869446..98632d517 100644 Binary files a/themes/pybcn_theme/assets/images/sponsors/ikigai.jpg and b/themes/pybcn_theme/assets/images/sponsors/ikigai.jpg differ diff --git a/themes/pybcn_theme/assets/images/sponsors/innoit.png b/themes/pybcn_theme/assets/images/sponsors/innoit.png deleted file mode 100644 index 95907fdfd..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/innoit.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/innoit.webp b/themes/pybcn_theme/assets/images/sponsors/innoit.webp new file mode 100644 index 000000000..54ddf909c Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/innoit.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/invisiblebits.webp b/themes/pybcn_theme/assets/images/sponsors/invisiblebits.webp new file mode 100644 index 000000000..73bbda7a6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/invisiblebits.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/iomed.png b/themes/pybcn_theme/assets/images/sponsors/iomed.png deleted file mode 100644 index 1cef2d91a..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/iomed.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/iomed.webp b/themes/pybcn_theme/assets/images/sponsors/iomed.webp new file mode 100644 index 000000000..e29a511b4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/iomed.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/isdi.png b/themes/pybcn_theme/assets/images/sponsors/isdi.png deleted file mode 100644 index 73efff1bf..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/isdi.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/isdi.webp b/themes/pybcn_theme/assets/images/sponsors/isdi.webp new file mode 100644 index 000000000..29495dde3 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/isdi.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/izi.png b/themes/pybcn_theme/assets/images/sponsors/izi.png deleted file mode 100644 index 6522407f2..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/izi.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/izi.webp b/themes/pybcn_theme/assets/images/sponsors/izi.webp new file mode 100644 index 000000000..fc8dc30d2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/izi.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/jobfluent.png b/themes/pybcn_theme/assets/images/sponsors/jobfluent.png deleted file mode 100644 index 6e3f6b2b9..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/jobfluent.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/jobfluent.webp b/themes/pybcn_theme/assets/images/sponsors/jobfluent.webp new file mode 100644 index 000000000..3bf88d942 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/jobfluent.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/kernel-analytics.webp b/themes/pybcn_theme/assets/images/sponsors/kernel-analytics.webp new file mode 100644 index 000000000..9d9fe9523 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/kernel-analytics.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/king.webp b/themes/pybcn_theme/assets/images/sponsors/king.webp new file mode 100644 index 000000000..284fd13e8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/king.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/kiwi.png b/themes/pybcn_theme/assets/images/sponsors/kiwi.png deleted file mode 100644 index 5bbd23c9a..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/kiwi.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/kiwi.webp b/themes/pybcn_theme/assets/images/sponsors/kiwi.webp new file mode 100644 index 000000000..66c2a8b02 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/kiwi.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/kschool.webp b/themes/pybcn_theme/assets/images/sponsors/kschool.webp new file mode 100644 index 000000000..efdbf98cc Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/kschool.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.png b/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.png deleted file mode 100644 index 3e728b235..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.webp b/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.webp new file mode 100644 index 000000000..1c54232de Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/letgo.png b/themes/pybcn_theme/assets/images/sponsors/letgo.png deleted file mode 100644 index 4365f31ac..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/letgo.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/letgo.webp b/themes/pybcn_theme/assets/images/sponsors/letgo.webp new file mode 100644 index 000000000..d29b9ac94 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/letgo.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/marfeel.png b/themes/pybcn_theme/assets/images/sponsors/marfeel.png deleted file mode 100644 index c330b1f48..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/marfeel.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/marfeel.webp b/themes/pybcn_theme/assets/images/sponsors/marfeel.webp new file mode 100644 index 000000000..0ac64f4c8 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/marfeel.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/mongodb.png b/themes/pybcn_theme/assets/images/sponsors/mongodb.png deleted file mode 100644 index 5d402d2cf..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/mongodb.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/mongodb.webp b/themes/pybcn_theme/assets/images/sponsors/mongodb.webp new file mode 100644 index 000000000..152b848ab Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/mongodb.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/mundimoto.png b/themes/pybcn_theme/assets/images/sponsors/mundimoto.png deleted file mode 100644 index a0f502a9b..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/mundimoto.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/mundimoto.webp b/themes/pybcn_theme/assets/images/sponsors/mundimoto.webp new file mode 100644 index 000000000..76088bd08 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/mundimoto.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/okta.png b/themes/pybcn_theme/assets/images/sponsors/okta.png deleted file mode 100644 index e8a1afffa..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/okta.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/okta.webp b/themes/pybcn_theme/assets/images/sponsors/okta.webp new file mode 100644 index 000000000..42cc20a43 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/okta.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/onna.png b/themes/pybcn_theme/assets/images/sponsors/onna.png deleted file mode 100644 index e1544c519..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/onna.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/onna.webp b/themes/pybcn_theme/assets/images/sponsors/onna.webp new file mode 100644 index 000000000..16e2987bd Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/onna.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/orpheus.png b/themes/pybcn_theme/assets/images/sponsors/orpheus.png deleted file mode 100644 index bc32c50db..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/orpheus.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/orpheus.webp b/themes/pybcn_theme/assets/images/sponsors/orpheus.webp new file mode 100644 index 000000000..54cfee1f1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/orpheus.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/preply.png b/themes/pybcn_theme/assets/images/sponsors/preply.png deleted file mode 100644 index e9a551c42..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/preply.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/preply.webp b/themes/pybcn_theme/assets/images/sponsors/preply.webp new file mode 100644 index 000000000..0e946c1b1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/preply.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/protopixel.png b/themes/pybcn_theme/assets/images/sponsors/protopixel.png deleted file mode 100644 index 09db4fd6d..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/protopixel.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/protopixel.webp b/themes/pybcn_theme/assets/images/sponsors/protopixel.webp new file mode 100644 index 000000000..ffc227f8d Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/protopixel.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/psf.png b/themes/pybcn_theme/assets/images/sponsors/psf.png deleted file mode 100644 index 74148778e..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/psf.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/psf.webp b/themes/pybcn_theme/assets/images/sponsors/psf.webp new file mode 100644 index 000000000..b285e67c1 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/psf.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.png b/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.png deleted file mode 100644 index e4031b290..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.webp b/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.webp new file mode 100644 index 000000000..bbb94f1e6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/punt-multimedia.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/pybcn.png b/themes/pybcn_theme/assets/images/sponsors/pybcn.png deleted file mode 100644 index 453e7ca67..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/pybcn.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/pybcn.webp b/themes/pybcn_theme/assets/images/sponsors/pybcn.webp new file mode 100644 index 000000000..4cb6aee4c Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/pybcn.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg b/themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg index cda5e4230..25b618e82 100644 Binary files a/themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg and b/themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg differ diff --git a/themes/pybcn_theme/assets/images/sponsors/pythonES.png b/themes/pybcn_theme/assets/images/sponsors/pythonES.png deleted file mode 100644 index 176a48435..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/pythonES.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/pythonES.webp b/themes/pybcn_theme/assets/images/sponsors/pythonES.webp new file mode 100644 index 000000000..2286ae88d Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/pythonES.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.png b/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.png deleted file mode 100644 index 4d8e817e3..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.webp b/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.webp new file mode 100644 index 000000000..4baa664c4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/quside.png b/themes/pybcn_theme/assets/images/sponsors/quside.png deleted file mode 100644 index 19025c243..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/quside.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/quside.webp b/themes/pybcn_theme/assets/images/sponsors/quside.webp new file mode 100644 index 000000000..38c891ed2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/quside.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/qustodio.png b/themes/pybcn_theme/assets/images/sponsors/qustodio.png deleted file mode 100644 index b7e457946..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/qustodio.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/qustodio.webp b/themes/pybcn_theme/assets/images/sponsors/qustodio.webp new file mode 100644 index 000000000..761dcc131 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/qustodio.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/rover.png b/themes/pybcn_theme/assets/images/sponsors/rover.png deleted file mode 100644 index 3720f78b5..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/rover.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/rover.webp b/themes/pybcn_theme/assets/images/sponsors/rover.webp new file mode 100644 index 000000000..ae97490a7 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/rover.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/satellogic.png b/themes/pybcn_theme/assets/images/sponsors/satellogic.png deleted file mode 100644 index eb23a2e6e..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/satellogic.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/satellogic.webp b/themes/pybcn_theme/assets/images/sponsors/satellogic.webp new file mode 100644 index 000000000..6101cad80 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/satellogic.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.png b/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.png deleted file mode 100644 index e029d7147..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.webp b/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.webp new file mode 100644 index 000000000..38ded9f6e Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/schibsted-spain.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/shimoku.png b/themes/pybcn_theme/assets/images/sponsors/shimoku.png deleted file mode 100644 index 3a760e4b5..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/shimoku.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/shimoku.webp b/themes/pybcn_theme/assets/images/sponsors/shimoku.webp new file mode 100644 index 000000000..500f3b308 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/shimoku.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/skyscanner.png b/themes/pybcn_theme/assets/images/sponsors/skyscanner.png deleted file mode 100644 index f73b1acf9..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/skyscanner.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/skyscanner.webp b/themes/pybcn_theme/assets/images/sponsors/skyscanner.webp new file mode 100644 index 000000000..7ea73e260 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/skyscanner.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/tecnologas.png b/themes/pybcn_theme/assets/images/sponsors/tecnologas.png deleted file mode 100644 index 6b90cce5f..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/tecnologas.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/tecnologas.webp b/themes/pybcn_theme/assets/images/sponsors/tecnologas.webp new file mode 100644 index 000000000..42a84e1b9 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/tecnologas.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/thoughtworks.webp b/themes/pybcn_theme/assets/images/sponsors/thoughtworks.webp new file mode 100644 index 000000000..fec41124a Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/thoughtworks.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/travelperk.png b/themes/pybcn_theme/assets/images/sponsors/travelperk.png deleted file mode 100644 index 812550aef..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/travelperk.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/travelperk.webp b/themes/pybcn_theme/assets/images/sponsors/travelperk.webp new file mode 100644 index 000000000..e9755ee01 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/travelperk.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/typeform.png b/themes/pybcn_theme/assets/images/sponsors/typeform.png deleted file mode 100644 index 7dd635e07..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/typeform.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/typeform.webp b/themes/pybcn_theme/assets/images/sponsors/typeform.webp new file mode 100644 index 000000000..f9917ef41 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/typeform.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/upcloud.webp b/themes/pybcn_theme/assets/images/sponsors/upcloud.webp new file mode 100644 index 000000000..d557660e2 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/upcloud.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/upf.png b/themes/pybcn_theme/assets/images/sponsors/upf.png deleted file mode 100644 index 203b97718..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/upf.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/upf.webp b/themes/pybcn_theme/assets/images/sponsors/upf.webp new file mode 100644 index 000000000..2f5645571 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/upf.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/veriff.png b/themes/pybcn_theme/assets/images/sponsors/veriff.png deleted file mode 100644 index acb86471b..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/veriff.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/veriff.webp b/themes/pybcn_theme/assets/images/sponsors/veriff.webp new file mode 100644 index 000000000..0cd3c84e6 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/veriff.webp differ diff --git a/themes/pybcn_theme/assets/images/sponsors/verse.png b/themes/pybcn_theme/assets/images/sponsors/verse.png deleted file mode 100644 index abf575f89..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/verse.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/xorq.png b/themes/pybcn_theme/assets/images/sponsors/xorq.png deleted file mode 100644 index fcbbc8838..000000000 Binary files a/themes/pybcn_theme/assets/images/sponsors/xorq.png and /dev/null differ diff --git a/themes/pybcn_theme/assets/images/sponsors/xorq.webp b/themes/pybcn_theme/assets/images/sponsors/xorq.webp new file mode 100644 index 000000000..2aa76c3e4 Binary files /dev/null and b/themes/pybcn_theme/assets/images/sponsors/xorq.webp differ diff --git a/themes/pybcn_theme/assets/js/search.js b/themes/pybcn_theme/assets/js/search.js new file mode 100644 index 000000000..5255156c3 --- /dev/null +++ b/themes/pybcn_theme/assets/js/search.js @@ -0,0 +1,313 @@ +/* The site search, on /search/ and on the 404 page. + * + * Reads the query and the filters from the form and from the address the + * page was opened with, loads the Pagefind engine the build wrote under + * /pagefind/ (bin/search, after Hugo), and draws the first 30 results. + * The engine downloads the index in pieces as it needs them: the + * alphabetical chunk the typed word falls in, one fragment per result + * drawn, never the whole index. + * + * Every result is drawn with textContent and never innerHTML. A talk + * description can carry raw HTML (unsafe=true in config.toml), and the + * excerpt Pagefind returns is parsed in an inert document so that only its + * text and its mark elements reach the page. + * + * A photo caption is indexed as part of the page of its event, at the + * figure that holds it (partials/photo_gallery.html). Pagefind records one + * result per page, so a caption is not a result of its own, but the + * fragment of a page records where each figure starts in its text and + * where each matched word is. A match inside a caption is drawn here as a + * Photo result that links to the figure; a match in the record of the day + * is drawn as the Event result. + * + * The dev server (bin/serve) has no index: the import fails, the page says + * so, and nothing is thrown. + */ +(function () { + "use strict"; + + var form = document.getElementById("search_form"); + if (!form) { + return; + } + var field = form.elements.q; + var kindSelect = form.elements.kind; + var yearSelect = form.elements.year; + var langSelect = form.elements.lang; + var newest = form.elements.newest; + var status = document.getElementById("search_status"); + var list = document.getElementById("search_results"); + var LIMIT = 30; + var LABELS = { talk: "Talk", event: "Event", person: "Person", photo: "Photo" }; + var onNotFound = form.hasAttribute("data-path-query"); + var pagefind = null; + + function setStatus(text) { + status.textContent = text; + } + + function el(tag, className, text) { + var node = document.createElement(tag); + if (className) { + node.className = className; + } + if (text !== undefined) { + node.textContent = text; + } + return node; + } + + /* The form from the address: a GET form does not refill itself on a + static page. On the 404 page the words of the missing address are the + query, less the section names and anything shorter than three + characters, which are the numbers of a date and the noise of a slug. */ + var params = new URLSearchParams(location.search); + if (params.has("q")) { + field.value = params.get("q"); + } else if (onNotFound) { + field.value = decodeURIComponent(location.pathname) + .replace(/\.html?$/, "") + .split(/[\/._\-+\s]+/) + .filter(function (word) { + return word.length > 2 && !/^(talks|events|people|meetups|index)$/.test(word); + }) + .join(" "); + } + kindSelect.value = params.get("kind") || ""; + newest.checked = params.has("newest"); + + function rememberAddress(term) { + if (onNotFound) { + return; + } + var next = new URLSearchParams(); + if (term) { + next.set("q", term); + } + [kindSelect, yearSelect, langSelect].forEach(function (select) { + if (select.value) { + next.set(select.name, select.value); + } + }); + if (newest.checked) { + next.set("newest", "1"); + } + var query = next.toString(); + history.replaceState(null, "", location.pathname + (query ? "?" + query : "")); + } + + function options() { + var wanted = { filters: {} }; + var kind = kindSelect.value; + if (kind === "photo") { + wanted.filters.kind = "event"; + } else if (kind) { + wanted.filters.kind = kind; + } + if (yearSelect.value) { + wanted.filters.year = yearSelect.value; + } + if (langSelect.value) { + wanted.filters.lang = langSelect.value; + } + if (newest.checked) { + wanted.sort = { date: "desc" }; + } + return wanted; + } + + /* The year and language selectors take their values from the index, so a + year with no page is not offered. The value the address asked for is + kept once the options exist. */ + function fillSelect(select, values, compare) { + var wanted = params.get(select.name) || ""; + Object.keys(values).sort(compare).forEach(function (value) { + var option = el("option", "", value); + option.value = value; + select.appendChild(option); + }); + select.value = wanted; + if (select.value !== wanted) { + select.value = ""; + } + } + + /* One page, one or more results. A page with figure anchors is an event + page with a gallery: a matched word at or after the position of a + figure, and before the next, is inside that caption. */ + function hits(page) { + var meta = page.meta || {}; + var figures = (page.anchors || []).filter(function (anchor) { + return anchor.element === "figure"; + }).sort(function (a, b) { + return a.location - b.location; + }); + var whole = { kind: meta.kind, url: page.url, title: meta.title, meta: meta, excerpt: page.excerpt }; + if (meta.kind !== "event" || figures.length === 0) { + return [whole]; + } + var words = (page.content || "").split(/\s+/); + var results = []; + var drawn = {}; + var inRecord = false; + (page.locations || []).forEach(function (location) { + var index = -1; + figures.forEach(function (figure, i) { + if (figure.location <= location) { + index = i; + } + }); + if (index < 0) { + inRecord = true; + return; + } + var figure = figures[index]; + if (drawn[figure.id]) { + return; + } + drawn[figure.id] = true; + var end = index + 1 < figures.length ? figures[index + 1].location : words.length; + var caption = words.slice(figure.location, end).join(" ").replace(/\.\s*$/, ""); + results.push({ kind: "photo", url: page.url + "#" + figure.id, title: caption, meta: meta, excerpt: "" }); + }); + if (inRecord || results.length === 0) { + results.unshift(whole); + } + return results; + } + + /* The excerpt comes as HTML with mark elements around the matched words. + It is parsed in an inert document and rebuilt as text nodes and marks, + so nothing else in it can reach the page. */ + function excerptNodes(html) { + var doc = new DOMParser().parseFromString(html, "text/html"); + var nodes = []; + Array.prototype.forEach.call(doc.body.childNodes, function (node) { + if (node.nodeName === "MARK") { + nodes.push(el("mark", "", node.textContent)); + } else { + nodes.push(document.createTextNode(node.textContent)); + } + }); + return nodes; + } + + function draw(hit) { + var item = el("li", "search_result search_result_" + hit.kind); + var title = el("p", "search_result_title"); + title.appendChild(el("span", "search_result_kind", LABELS[hit.kind] || hit.kind || "Page")); + var link = el("a", "", hit.title || hit.url); + link.href = hit.url; + title.appendChild(link); + item.appendChild(title); + var meta = hit.meta; + var facts = []; + if (hit.kind === "talk") { + if (meta.speakers) { facts.push("by " + meta.speakers); } + if (meta.event) { facts.push(meta.event); } + if (meta.date) { facts.push(meta.date); } + if (meta.lang) { facts.push(meta.lang); } + } else if (hit.kind === "event") { + if (meta.date) { facts.push(meta.date); } + if (meta.venue) { facts.push(meta.venue); } + } else if (hit.kind === "photo") { + facts.push("in the gallery of " + meta.title); + if (meta.date) { facts.push(meta.date); } + } else if (hit.kind === "person") { + if (meta.roles) { facts.push(meta.roles); } + } + if (facts.length) { + item.appendChild(el("p", "search_result_meta", facts.join(", "))); + } + if (hit.excerpt) { + var excerpt = el("p", "search_result_excerpt"); + excerptNodes(hit.excerpt).forEach(function (node) { + excerpt.appendChild(node); + }); + item.appendChild(excerpt); + } + return item; + } + + function show(items) { + list.replaceChildren(); + items.forEach(function (hit) { + list.appendChild(draw(hit)); + }); + } + + function run(now) { + var term = field.value.trim(); + rememberAddress(term); + if (!term) { + show([]); + setStatus("Type a word: a technology, a name, a venue, a year."); + return; + } + var wanted = options(); + var search = now ? pagefind.search(term, wanted) : pagefind.debouncedSearch(term, wanted); + search.then(function (found) { + if (found === null) { + return; /* a later keystroke replaced this search */ + } + var pages = found.results.slice(0, LIMIT); + return Promise.all(pages.map(function (result) { + return result.data(); + })).then(function (data) { + var items = []; + data.forEach(function (page) { + items = items.concat(hits(page)); + }); + if (kindSelect.value === "photo") { + items = items.filter(function (hit) { + return hit.kind === "photo"; + }); + } + show(items); + var total = found.results.length; + if (total === 0) { + setStatus("Nothing matches “" + term + "”."); + } else if (total > LIMIT) { + setStatus(total + " pages match “" + term + "”. The first " + LIMIT + " are shown: add a word to narrow them."); + } else { + setStatus(total + (total === 1 ? " page matches “" : " pages match “") + term + "”."); + } + }); + }); + } + + function start(engine) { + pagefind = engine; + return pagefind.filters().then(function (filters) { + fillSelect(yearSelect, filters.year || {}, function (a, b) { + return b.localeCompare(a); + }); + fillSelect(langSelect, filters.lang || {}, function (a, b) { + return a.localeCompare(b); + }); + field.addEventListener("focus", function () { + pagefind.preload(field.value); + }); + field.addEventListener("input", function () { + run(false); + }); + [kindSelect, yearSelect, langSelect, newest].forEach(function (control) { + control.addEventListener("change", function () { + run(true); + }); + }); + form.addEventListener("submit", function (event) { + event.preventDefault(); + run(true); + }); + run(true); + if (!onNotFound) { + field.focus(); + } + }); + } + + import("/pagefind/pagefind.js").then(start, function () { + setStatus("Search is not available on the dev server: the index is built after Hugo, by bin/search, and is on pybcn.org. Every talk is listed on /talks/ and every person on /people/."); + }); +})(); diff --git a/themes/pybcn_theme/assets/scss/agenda.scss b/themes/pybcn_theme/assets/scss/agenda.scss index a70d5f4fd..3a6e0f76b 100644 --- a/themes/pybcn_theme/assets/scss/agenda.scss +++ b/themes/pybcn_theme/assets/scss/agenda.scss @@ -70,6 +70,10 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 justify-content: start; flex-direction: column; padding: 0.5rem 1rem; + // The column can now be narrower than the longest word in the title + // (minmax(0, 1fr) in agenda.html), so a long one has to break + // rather than push the grid wider than the screen. Issue #212. + overflow-wrap: break-word; /* The fallback for an entry with no colour class. White text on the CSS orange was 1.97:1. #A15C00 is 5.19:1 on white, so an @@ -296,3 +300,53 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 } i.gold { color: #FFD700 } + + +/* + The schedule on a phone. + + The grid has one column per track, each one wide enough for a title, so + on a 360px screen the page was 704px wide and the reader had to drag it + sideways to read anything, including the parts that are not the + schedule. That is issue #212, and it is the page most likely to be + opened on a phone: the schedule of the event you are standing at. + + display: block makes every grid property on the container and on its + children inert, including the grid-template-areas that agenda.html + writes into the page body, so the whole generated block stops applying + without the template having to know about this. What is left is the + source order, which is the order of the agenda in the front matter, + which is the order of the day. Two talks in parallel come one after the + other, which is what a reader on a phone wants anyway. + + The column of times is then wrong twice: it is all of the times before + any of the sessions, because the grid is what interleaved them, and it + is an empty 5rem column. It is hidden, and each session prints its own + hours instead, which agenda.html puts in .event_time for this. +*/ +@media (max-width: 991.98px) { + .scheduleContainer { + display: block; + + .time { + display: none; + } + + .event { + margin-bottom: 0.4rem; + } + } +} + +/* + The hours of a session, printed inside the block. The grid answers the + question with the row the block sits on, so this is for the phone only. +*/ +.event_time { + display: none; + + @media (max-width: 991.98px) { + display: block; + font-weight: 600; + } +} diff --git a/themes/pybcn_theme/assets/scss/event.scss b/themes/pybcn_theme/assets/scss/event.scss index 7ec152865..a4db7a9fb 100644 --- a/themes/pybcn_theme/assets/scss/event.scss +++ b/themes/pybcn_theme/assets/scss/event.scss @@ -7,7 +7,20 @@ // larger than the body text, because it is the first fact of the page. .event_when { font-size: 1.15rem; - color: #51616e; + color: $text-grey; + margin-bottom: 1.2rem; + } + + // How many people came, under the day and reading as part of the same + // first fact, so the two lines do not pull apart. The day keeps the + // gap below both. + .event_when + .event_attendance { + margin-top: -1rem; + } + + .event_attendance { + font-size: 1.15rem; + color: $text-grey; margin-bottom: 1.2rem; } @@ -15,16 +28,37 @@ top:100px; } + // The side index, in the frame of every box of the site: the one + // border and the one radius, which Bootstrap's list group draws in + // its own grey otherwise. .list-group-item { + border-color: $rule-grey; + &.active { background-color: $blue-pybcn; border-color: $blue-pybcn; } } + // A block of the page: the target of the side index, and one step of + // the rhythm. scroll-margin-top clears the fixed navigation when the + // index jumps to it, the way .photo_gallery does; it was 80px of + // padding over 80px of negative margin, which started every block + // above its own first line and left the air between two blocks to + // runs of br elements in the template. The air is $block-gap now, the + // air between two blocks of the home page. .link_anchor { - padding-top: 80px; - margin-top: -80px; + scroll-margin-top: 80px; + margin-bottom: $block-gap; + } + + // The sponsors of the edition sit in the container of their grid, + // which pads them 15px in from the column; the text of the block + // above them reads at the left edge of the column, so the padding + // goes. + #sponsors_grid { + padding-left: 0; + padding-right: 0; } } diff --git a/themes/pybcn_theme/assets/scss/facts.scss b/themes/pybcn_theme/assets/scss/facts.scss index 81cf8046a..788ba9797 100644 --- a/themes/pybcn_theme/assets/scss/facts.scss +++ b/themes/pybcn_theme/assets/scss/facts.scss @@ -16,11 +16,10 @@ column-gap: 0.75rem; row-gap: 0.3rem; align-items: baseline; - padding: 0.7rem 1rem; - margin-bottom: 1.6rem; - border: 1px solid #dde3e8; - border-radius: 3px; - color: #51616e; + padding: 0.75rem 1rem; + margin-bottom: $title-gap; + @include site_frame; + color: $text-grey; .facts_row { display: contents; diff --git a/themes/pybcn_theme/assets/scss/footer.scss b/themes/pybcn_theme/assets/scss/footer.scss index f891013a5..a71233976 100644 --- a/themes/pybcn_theme/assets/scss/footer.scss +++ b/themes/pybcn_theme/assets/scss/footer.scss @@ -43,4 +43,95 @@ footer { } } -} \ No newline at end of file +} + + +// 8. The footer in four columns, the sub-list of the pages that Take part +// also links, the accounts on one line beside the name of the association, +// and the licence line. +.site_footer { + .site_footer_col { + margin-bottom: 1.5rem; + } + + .site_footer_heading { + margin-bottom: 0.5rem; + color: $yellow-pybcn; + font-weight: 700; + } + + ul { + margin: 0; + padding-left: 0; + list-style: none; + + li { + margin-bottom: 0.25rem; + } + + a { + color: #ffffff; + } + } + + .site_footer_sub { + margin: 0.25rem 0 0.35rem; + padding-left: 1rem; + border-left: 1px solid rgba(255, 255, 255, 0.25); + + a { + color: rgba(255, 255, 255, 0.85); + } + } + + .site_footer_bottom { + padding-top: 1rem; + border-top: 1px solid rgba(255, 255, 255, 0.2); + } + + .site_footer_name { + margin-bottom: 0; + } + + .site_social { + white-space: nowrap; + + a { + margin-right: 0.5rem; + } + } + + .site_licence { + margin: 0.75rem 0 0; + // Centred: it is the line that closes the page and it belongs to + // the whole of it, not to the column it happens to sit under. + text-align: center; + color: rgba(255, 255, 255, 0.7); + font-size: 0.8rem; + + a { + color: inherit; + text-decoration: underline; + } + } + + @media (max-width: 767.98px) { + .site_social { + margin-top: 0.75rem; + text-align: left; + } + } + + // The live footer centres everything under 576px. A vertical list + // reads from a left edge, and so does its sub-list, so the columns + // stay left; the name and the accounts take the centre. + @media (max-width: 576px) { + .site_footer_col { + text-align: left; + } + + .site_social { + text-align: center; + } + } +} diff --git a/themes/pybcn_theme/assets/scss/hero.scss b/themes/pybcn_theme/assets/scss/hero.scss deleted file mode 100644 index e8706d598..000000000 --- a/themes/pybcn_theme/assets/scss/hero.scss +++ /dev/null @@ -1,50 +0,0 @@ -.hero-image { - background-size: cover; - background-repeat: no-repeat; - background-position: center; - background-blend-mode: overlay; - background-color: $primary; - height: 400px; - position: relative; - padding-top: 50px; - margin-bottom: 20px; - .container { - height: 100%; - display: flex; - justify-content: center; - flex-direction: column; - } - .hero-text { - color: #ffffff; - h1 { - font-size: 3rem; - color: $yellow-pybcn; - background-color: transparent; - text-align: left; - margin-bottom: 0; - padding: 0; - } - h2 { - font-size: 2.2rem; - - } - p { - font-size: 1.6rem; - line-height: 1.3; - width: 60%; - } - } - -} - - -@media (max-width: 768px) { - .hero-image { - height: 250px; - .hero-text { - p { - font-size: 1.3rem; - } - } - } -} \ No newline at end of file diff --git a/themes/pybcn_theme/assets/scss/home.scss b/themes/pybcn_theme/assets/scss/home.scss index e5769aa6d..de9fa1048 100644 --- a/themes/pybcn_theme/assets/scss/home.scss +++ b/themes/pybcn_theme/assets/scss/home.scss @@ -1,145 +1,466 @@ -#home_top_section { - margin-top: 50px; -} +// The home page. Every selector starts with home_, and the blocks are the +// ones the proposal of 2026-10-16 arrived at: +// +// 1. the hero, the deep blue band with the h1 and the four Archive +// counts, each on one line +// 2. About Python Barcelona, the dark band with the video +// 3. the two Meetup groups +// 4. the recent events, the table of /events/ cut to ten +// 5. the photographs, the canonical photo of each event +// 6. About us, the faces of the board and the committee +// 7. Take part, the four ways in +// 8. Our friends +// +// The navigation bar and the footer of this design are the bar and the +// footer of the whole site now, so their rules live in navbar.scss and +// footer.scss and not here. +// The blocks of this page come from three proposals with three type scales +// and three spacings. What makes them one page is here: one h1, one h2 +// style for every section (.home_title) with a colour variant for a dark +// band, one card frame (.home_card) for the Meetup cards, the Take part +// boxes, and the friends, with the same border, radius, and hover, and +// one rhythm of 3rem between the sections. +// The colours and the figures of this design ($blue-deep, $rule-grey, +// $text-grey, $ink, $paper, $hover-blue, $card-radius, $block-gap, +// $title-gap) are in main.scss since 2026-10-17, next to $blue-pybcn, +// because every other page takes them from there now: the section title, +// the card, and the frame are mixins of that file, and this sheet includes +// them. -.color_box { - height: 100%; - padding: 25px; - background-color: $blue-pybcn; - background-image: url("../images/backgrounds/logo_mini_white.png"); - background-position: 140% 107%; - background-repeat: no-repeat; - background-size: 67%; +// The title of every block: the heading in the style of .items-title, a +// line under it, and an optional sentence that says what the block holds. +// On a dark band the same title in white. +.home_title { + margin-bottom: 1.5rem; + border-bottom: 1px solid $rule-grey; + // The section title of main.scss, with the line under it drawn by + // this wrapper and not by the h2, because the sentence under the h2 + // sits inside the line here. + h2 { + @include section_title; + margin-bottom: 0.5rem; + padding-top: 0.75rem; + padding-bottom: 0.25rem; + border-bottom: 0; + } - h1, .h1 { - color: white; - background-color: transparent; - text-align: center; - text-transform: uppercase; - font-size: 1.8rem; - margin: 0; - padding: 0; + p { + margin-bottom: 0.9rem; + color: $text-grey; + font-size: 1.05rem; } - a.btn { - width: 100%; - margin-top: 15px; - padding: 10px; - color: $blue-pybcn; - background-color: white; - border-color: $blue-pybcn; - font-weight: bold; - text-align: left; + &.home_title_dark { + border-bottom-color: rgba(255, 255, 255, 0.25); - &:hover { - background-color: $dark-grey; - color: white; + h2 { + color: #ffffff; } - i { - margin-right: 5px; + p { + color: rgba(255, 255, 255, 0.8); } } +} +// The card: one frame for every box that is a link. White, the rule grey +// of the site as the border, the blue of the site and a shadow on hover, +// the title underlined then. The title and the text inside are the same +// size in every block. The proportions are the ones of the tiles of the +// hero (the second review: "más rectangulares, como las de events / +// talks / people / sponsors"): the same 0.75rem over and under, the +// picture or the icon no taller than two lines, the title on the top +// edge, so a card is three to seven times wider than tall. +// The card is the mixin of main.scss, with home_card as the prefix of its +// three inner classes; .site_card is the same card on every other page. +.home_card { + @include site_card(home_card); } -#highlights { - margin: 50px 0; - padding: 50px; - background-color: $yellow-pybcn; /* $dark-grey; */ +// 1. The hero: the deep blue band of option 2 with the h1 and the four +// counts, one line each. The h1 is white on the blue, not the blue band of +// every other h1: the band is the whole section here. No buttons under +// the tiles, so the band is short and the About block is one screen away +// on a phone. +.home_hero { + padding: 2.5rem 0; + background-color: $blue-deep; + background-image: linear-gradient(135deg, $blue-deep 0%, $blue-pybcn 100%); + color: #ffffff; - h3 { - color: white; - text-transform: uppercase; + h1 { + margin-bottom: 0.75rem; + padding: 0; + background-color: transparent; + color: #ffffff; + font-size: 2.6rem; + font-weight: 600; + text-align: left; } - h4 { - i { - margin-right: 10px; + .home_lead { + max-width: 44rem; + margin-bottom: 1.75rem; + font-size: 1.2rem; + line-height: 1.45; + } + + // Four tiles in one row from lg, two by two from sm, one under the + // other on a phone. Each tile is one line: the glyph, the number in + // bold, the noun. + .home_stats { + display: grid; + grid-template-columns: 1fr; + gap: 0.75rem; + margin: 0; + padding-left: 0; + list-style: none; + + @media (min-width: 576px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 992px) { + grid-template-columns: repeat(4, 1fr); + gap: 1rem; } } - .item { - background-color: white; - padding: 10px; + .home_stat { + display: flex; + align-items: baseline; + // Centred in the tile. Left aligned, the four tiles of one row + // put their numbers at four different distances from their own + // left edge, because "281 Events" and "371 People" are not the + // same width, and the row read as crooked. + justify-content: center; + gap: 0.6rem; + height: 100%; + padding: 0.75rem 1.25rem; + border: 1px solid rgba(255, 255, 255, 0.35); + border-radius: 4px; + background-color: rgba(0, 0, 0, 0.2); + color: #ffffff; + white-space: nowrap; + text-decoration: none; + transition: background-color 0.15s linear, border-color 0.15s linear; + + .home_stat_glyph { + font-size: 1.35rem; + line-height: 1; + } + + .home_stat_n { + font-size: 1.75rem; + font-weight: 700; + line-height: 1.1; + font-variant-numeric: tabular-nums; + } - .btn-primary { - background-color: $dark-grey; + .home_stat_label { + font-size: 1.1rem; + } + + &:hover, + &:focus { + border-color: $yellow-pybcn; + background-color: rgba(0, 0, 0, 0.35); + text-decoration: none; + + .home_stat_label { + text-decoration: underline; + } } } -} + @media (max-width: 767.98px) { + padding-top: 2rem; -.banner { - color: white; - background-color: $blue-pybcn; - background-image: url("/archives/pybcn.org/pyday-bcn-2019/Foto%20de%20grup%20-%20small.jpg"); - background-position: center center; - background-repeat: no-repeat; - background-size: cover; - border-radius: 5px; - margin-top: 50px; - padding: 20px; - - h1, .h1 { - margin: 0; - padding-top: 10px; - background-color: transparent; + h1 { + font-size: 2rem; + } + + .home_lead { + font-size: 1.1rem; + } + + .home_stat .home_stat_n { + font-size: 1.5rem; + } } } -@media (max-width: 768px) { +// 2. About, on the dark band of option 3, right under the hero: the text +// at the left, the player at the right. The links in the text take the +// yellow, the one colour that reads on the dark grey beside white. +.home_story { + padding: 2.5rem 0 3rem; + background-color: $dark-grey; + color: #ffffff; + + .home_story_text { + font-size: 1.1rem; - #highlights { - .item { - margin-bottom: 20px; + .home_title { + margin-bottom: 1rem; + + h2 { + padding-top: 0; + } + } + + a { + color: $yellow-pybcn; + text-decoration: underline; } } - #meetup_events { - .events_list { - margin-bottom: 20px; + .home_video_link { + margin-bottom: 0; + font-size: 0.95rem; + + a { + color: #ffffff; } } + @media (max-width: 991.98px) { + .home_story_text { + margin-bottom: 1.5rem; + } + } +} + +// 3. The two Meetup groups on the paper band of option 2: the logo of the +// group at the left (the image the live block uses as background), the +// words at the right, the whole card the link. +.home_meetups { + padding: 2.5rem 0 1rem; + background-color: $paper; + + .home_group { + margin-bottom: 1.5rem; + height: calc(100% - 1.5rem); + + // The logo is the height of the card text, two lines, and no + // taller: it is what made the card tall before. + .home_group_logo { + flex: 0 0 5.5rem; + height: 3.25rem; + background-repeat: no-repeat; + // Flush with the top edge of the card, not floating in the + // middle of it: the two marks are drawn to sit on a line and + // centred they read as sliding down the card. + background-position: left top; + background-size: contain; + } + + &.home_group_pybcn .home_group_logo { + background-image: url("../images/backgrounds/pybcn_cut_transparent.webp"); + } + + &.home_group_pyladies .home_group_logo { + background-image: url("../images/backgrounds/pyladiesbcn_head_transparent.webp"); + } + + } } -@media (max-width: 576px) { +// 4. Recent events: the table of /events/, unchanged, and the button +// under it. +.home_latest { + margin-top: 3rem; - #home_top_section { - margin-top: 20px; + .home_more { + margin-top: 1rem; + text-align: center; + + .btn { + padding: 0.6rem 1.5rem; + font-size: 1.1rem; + } } +} - .home_carousel { +// 5. The photographs. The dark band of option 1, the carousel inside the +// container. Every slide is capped at 560px tall and the photograph is +// letterboxed inside it with object-fit, so a portrait and a landscape +// take the same height and the page does not jump between slides. The +// caption is the Bootstrap caption on a dark strip, the whole strip a link +// to the gallery of the event. +.home_photos { + margin-top: 3rem; + padding: 2rem 0 2.5rem; + background-color: $dark-grey; + .home_slide { width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; - padding-top: 15px; + height: 560px; + object-fit: contain; + background-color: #000000; + } - .transparent_caption { + .home_caption { + right: 0; + bottom: 0; + left: 0; + padding: 0.75rem 1rem; + background-color: rgba(0, 0, 0, 0.6); + text-align: left; - margin-bottom: -6px; + a { + color: #ffffff; + text-decoration: none; - h1, .h1 { - font-size: 1rem; - line-height: 1rem; - padding: 8px; + .h3 { + font-size: 1.3rem; + font-weight: 600; } - a.btn { - font-size: 0.7rem; - line-height: 0.7rem; - padding: .275rem .65rem + &:hover, + &:focus { + text-decoration: underline; } } - .carousel-indicators { - margin-bottom: 0; - bottom: 6px; + } + + .carousel-indicators { + bottom: -2rem; + } + + @media (max-width: 767.98px) { + .home_slide { + height: 320px; + } + + .home_caption .h3 { + font-size: 1.1rem; + } + } +} + +// 6. Take part: the boxes of option 3, two to a row, the icon at the left +// and the yellow edge. +.home_us { + margin-top: 3rem; + + .home_boxes { + padding-left: 0; + list-style: none; + + > li { + margin-bottom: 1.5rem; + } + } + + .home_boxes > li { + margin-bottom: 1rem; + } + + .home_box { + border-left: 5px solid $yellow-pybcn; + + i { + flex: 0 0 2rem; + margin-top: 0.2rem; + color: $blue-pybcn; + font-size: 1.6rem; + text-align: center; } } } + +// 7. Our friends: four cards on one line from xl, two by two from sm, +// one under the other on a phone. The logo is the height of two lines at +// the left, the name and the line under it at its right. +.home_friends { + margin-top: 3rem; + margin-bottom: 2rem; + + .home_friends_list { + display: grid; + grid-template-columns: 1fr; + gap: 1rem; + margin: 0; + padding-left: 0; + list-style: none; + + @media (min-width: 576px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 1200px) { + grid-template-columns: repeat(4, 1fr); + } + } + + // The mark: 56px square, the height of the name and the line under + // it. The four marks drawn are square, so the slot is too. + .home_friend_logo { + flex: 0 0 3.5rem; + width: 3.5rem; + height: 3.5rem; + object-fit: contain; + } + + .home_friend .home_card_title { + font-size: 1.1rem; + } +} + + +// 7b. About us: the faces of the people who run the association, in one +// row of circles over the ways of taking part. The home page had no link +// to the organizers page at all. +.home_about_us { + margin-bottom: 3rem; + + // The faces fill the row: a grid of equal tracks, as many as fit at + // 64px and the room shared between them, so eleven people are eleven + // circles of about 94px on the container and five on a phone. A + // fixed 64px left a third of the line empty. + .home_faces { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); + gap: 0.6rem; + margin: 0 0 0.9rem; + padding-left: 0; + list-style: none; + + li { + line-height: 0; + } + + a { + display: block; + } + } + + // The circle of every other listing of people, and the same hover: + // the face grows a little inside its own box. The file is 96px, and + // 192 for a 2x screen, which covers the widest the track can get. + .home_face, + .person_placeholder { + display: block; + width: 100%; + height: auto; + aspect-ratio: 1; + border-radius: 50%; + object-fit: cover; + transition: transform .2s linear; + } + + a:hover .home_face, + a:focus .home_face, + a:hover .person_placeholder, + a:focus .person_placeholder { + transform: scale(1.08); + } + + .home_about_us_more { + margin: 0; + font-weight: 600; + } +} diff --git a/themes/pybcn_theme/assets/scss/listing_table.scss b/themes/pybcn_theme/assets/scss/listing_table.scss index 86a971fc6..f993f1591 100644 --- a/themes/pybcn_theme/assets/scss/listing_table.scss +++ b/themes/pybcn_theme/assets/scss/listing_table.scss @@ -39,7 +39,7 @@ .listing_caption { caption-side: top; padding: 0 0 0.6rem; - color: #51616e; + color: $text-grey; font-size: 0.9rem; text-align: left; } @@ -82,20 +82,13 @@ } } - // The venue, in italics, the way the columns were asked for, and the - // short name with the full string as its title. The dotted underline - // is the one a browser draws under an abbr with a title, and it says - // the same thing here: there is more on hover. Without it the hover is - // a secret. + // The venue, in italics, as the column is specified. The cell + // used to carry a hover with the string of the source and a dotted + // underline to announce it; both are gone, so there is nothing to + // mark. .event_venue_cell { font-style: italic; - color: #51616e; - } - - .event_venue { - text-decoration: underline dotted; - text-underline-offset: 0.15em; - cursor: help; + color: $text-grey; } // The marker of a talk: the icon of its type, in the box of the @@ -105,7 +98,7 @@ display: inline-block; width: 1.75rem; margin-right: 0.35rem; - color: #51616e; + color: $text-grey; text-align: center; text-indent: 0; vertical-align: middle; @@ -129,7 +122,7 @@ // (partials/person_page_link.html) and read as the title link beside // them does: the link blue at rest, underlined under the pointer. They // were underlined at rest in the grey of the line, so they did not read - // as links and the pointer changed nothing (David Arcos, 2026-10-15). + // as links and the pointer changed nothing. // The "by" is italic and a lighter grey, $icon-grey, 4.68:1 on white, // and the names are upright: the slant is the second mark WCAG 1.4.1 // asks of a link inside a line of text, in place of the underline, and @@ -150,7 +143,7 @@ } .listing_day { - color: #51616e; + color: $text-grey; white-space: nowrap; } @@ -159,7 +152,7 @@ .listing_year, .listing_month { font-weight: 600; - color: #51616e; + color: $text-grey; } } @@ -274,7 +267,7 @@ grid-area: year; margin: 0.6rem 0 0.6rem; padding-bottom: 0.3rem; - border-bottom: 1px solid #dde3e8; + border-bottom: 1px solid $rule-grey; font-size: 1.5rem; color: inherit; } @@ -362,8 +355,8 @@ // column. At 0.8rem and 0.02em it takes 48px. thead th { padding-bottom: 0.4rem; - border-bottom: 2px solid #dde3e8; - color: #51616e; + border-bottom: 2px solid $rule-grey; + color: $text-grey; font-size: 0.8rem; font-weight: 600; text-transform: uppercase; @@ -382,7 +375,7 @@ tbody + tbody tr:first-child th, tbody + tbody tr:first-child td { - border-top: 1px solid #dde3e8; + border-top: 1px solid $rule-grey; } // Three narrow columns take their content width and the title diff --git a/themes/pybcn_theme/assets/scss/main.scss b/themes/pybcn_theme/assets/scss/main.scss index 175a49fc8..67131464f 100644 --- a/themes/pybcn_theme/assets/scss/main.scss +++ b/themes/pybcn_theme/assets/scss/main.scss @@ -1,5 +1,13 @@ $navbar-color: #FFFFFF; $blue-pybcn: #006c9b; + +// The same thing the meta tag of partials/head-meta.html says, where the +// stylesheet can be read by a browser that ignores the tag. The site is +// light, and a browser that darkens it by itself turns the white card of a +// sponsor dark under a logo drawn in black. +:root { + color-scheme: only light; +} // The rest colour of an icon that lights up under the pointer: a social // glyph on a card and in a modal. 4.68:1 on white, above the 3:1 WCAG // 1.4.11 asks of a graphic that carries meaning. @@ -11,6 +19,157 @@ $focus-ring: #0b0c0c; $primary: $blue-pybcn; +// The vocabulary of the home page, shared with every other page since +// 2026-10-17. home.scss declared these for /, and the rest of the site +// agrees with it: one type scale, one card, one rhythm, +// and one voice for secondary text. They live here, before every other +// sheet, so a rule on any page reads the same figure the home page does. +// +// Contrast, measured with the WCAG relative luminance formula: $text-grey +// on white is 6.39:1, $ink on white 13.56:1, $blue-pybcn on white 5.80:1, +// all above the 4.5:1 of WCAG 1.4.3 for normal text. +$blue-deep: #004d6f; +$rule-grey: rgb(230, 230, 230); +$text-grey: #51616e; +$ink: rgb(41, 47, 51); +$paper: rgb(245, 248, 250); +$hover-blue: rgb(240, 250, 255); +// The radius of every box that has one: the card, the pills of the bars, +// the frame of a photograph. +$card-radius: 4px; +// The rhythm: the air between two blocks of a page, and the air between +// the title of a block and what it holds. The figures of the home page. +$block-gap: 3rem; +$title-gap: 1.5rem; + +// The title of a block: an h2 at 27px, the normal weight, in the ink of +// the site, with a line under it. The style of .home_title h2 on the home +// page, which took it from .items-title; here as a mixin so the h2 of the +// section of a talk, of a meetup, of a person, of an edition, and the +// letter of /people/ read the same size with the same rule under them. +// The level is the outline and the size is the style: an h2 is an h2 +// wherever it sits, which is what one type scale means. +@mixin section_title { + margin-top: 0; + margin-bottom: $title-gap; + padding-top: 0; + // 12px between the text and the line: the 0.25rem of padding and the + // 0.5rem of margin the h2 of .home_title has above its wrapper's line. + padding-bottom: 0.75rem; + border-bottom: 1px solid $rule-grey; + background-color: transparent; + color: $ink; + font-family: Helvetica, Roboto, "Segoe UI", Calibri, sans-serif; + font-size: 27px; + font-weight: normal; + line-height: 1.2; + text-align: left; +} + +// The title under a title: an h3 at the size and the weight of the title +// of a card, in the ink. The Photos and Videos of a gallery, the levels of +// a sponsor grid, the h3 of a page body. +@mixin sub_title { + margin-top: 0; + margin-bottom: 0.75rem; + color: $ink; + font-size: 1.2rem; + font-weight: 600; + line-height: 1.25; +} + +// The frame: the border, the radius, and the white of a card, for a box +// that is not a link. The facts box, the pills of the bars, the frame of +// a photograph in a gallery. +@mixin site_frame { + border: 1px solid $rule-grey; + border-radius: $card-radius; + background-color: #ffffff; +} + +// The card: one frame for every box that is a link. White, the rule grey +// as the border, the blue of the site and a shadow under the pointer, the +// title underlined then. The picture or the icon at the left, the title +// and one line of text at the right, so a card is three to seven times +// wider than tall. The argument is the prefix of the three classes +// inside it: home_card on the home page (home.scss), site_card everywhere +// else. +@mixin site_card($p) { + display: flex; + align-items: flex-start; + gap: 1rem; + height: 100%; + padding: 0.75rem 1rem; + @include site_frame; + color: $ink; + text-decoration: none; + transition: border-color 0.15s linear, box-shadow 0.15s linear; + + .#{$p}_body { + display: block; + min-width: 0; + } + + .#{$p}_title { + display: block; + margin-bottom: 0.15rem; + color: $blue-pybcn; + font-size: 1.2rem; + font-weight: 600; + line-height: 1.25; + } + + .#{$p}_text { + display: block; + // No margin: the text is a p on the card of a person, a span on + // the home page, and the two have to sit alike. + margin-bottom: 0; + color: $text-grey; + font-size: 0.9rem; + line-height: 1.35; + } + + &:hover, + &:focus, + &:focus-within { + border-color: $blue-pybcn; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); + text-decoration: none; + + .#{$p}_title { + text-decoration: underline; + } + } +} + +.section_title { + @include section_title; +} + +.sub_title { + @include sub_title; +} + +.site_card { + @include site_card(site_card); +} + +// The headings written in the markdown of a page: the body of an edition +// page and its free text sections (layouts/_default/event.html), and the +// body of a page on layouts/_default/single.html, the association pages +// among them. Bootstrap draws an h2 there at 2rem and an h3 at 1.75rem, +// which is neither the h2 nor the h3 of any other block of the site. +.page_body { + h2 { + @include section_title; + } + + h3 { + @include sub_title; + margin-top: 1.5rem; + } +} + // Font Awesome 5.8.2 is older than the Twitter rename, so it carries no X // mark. This draws the mark from the Font Awesome 6 Free path (CC BY 4.0) as @@ -32,14 +191,32 @@ $primary: $blue-pybcn; mask-size: contain; } +// The Bluesky butterfly, the same way as .icon_x above and for the same +// reason: the vendored Font Awesome is version 5, which predates the icon +// (fa-bluesky arrived in 6.6). The mark is Bluesky's; the path is the one +// Simple Icons publishes, which is CC0, and it is used here to link to our +// own account. +.icon_bluesky { + display: inline-block; + width: 1em; + height: 1em; + vertical-align: -0.125em; + background-color: currentColor; + $bluesky-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037-.856 3.061-3.978 3.842-6.755 3.37 4.854.826 6.089 3.562 3.422 6.299-5.065 5.196-7.28-1.304-7.847-2.97-.104-.305-.152-.448-.153-.327 0-.121-.05.022-.153.327-.568 1.666-2.782 8.166-7.847 2.97-2.667-2.737-1.432-5.473 3.422-6.3-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026'/%3E%3C/svg%3E"); + -webkit-mask: $bluesky-mark no-repeat center; + mask: $bluesky-mark no-repeat center; + -webkit-mask-size: contain; + mask-size: contain; +} + // The mark of a link that leaves the site, printed by // partials/link_mark.html in front of the words of the link: the YouTube // mark, the GitHub mark, the X mark above, or the generic arrow. Grey at // rest, the $icon-grey of every icon of the site, and the colour of the // link under the pointer or the keyboard, which is the rule the social // glyphs of a person card follow. The YouTube mark took the blue of the -// link around it until 2026-10-15 while every other icon was grey; David -// Arcos asked for one colour. An inline-block, so the underline of the +// link around it until 2026-10-15 while every other icon was grey. They +// are one colour now. An inline-block, so the underline of the // link stops at the words and is not drawn through the glyph. The gap is // the one the credit of a gallery photo and the video line of a talk row // already set. @@ -206,44 +383,6 @@ button:focus:not(:focus-visible), padding: 50px; } -.objects_grid { - .row.level { - margin-bottom: 30px; - } - - .level_name { - text-align: center; - margin-top: 20px; - margin-bottom: 20px; - - h2 { - overflow: hidden; - text-align: center; - - &:before, - &:after { - background-color: #000; - content: ""; - display: inline-block; - height: 1px; - position: relative; - vertical-align: middle; - width: 50%; - } - - &:before { - right: 0.5em; - margin-left: -50%; - } - &:after { - left: 0.5em; - margin-right: -50%; - } - } - } -} - - .bordered_col { border: 1px solid #000; padding: 30px; @@ -270,6 +409,25 @@ button:focus:not(:focus-visible), text-decoration: underline; } +// The voice of that paragraph is the one of the sentence under a title of +// the home page (.home_title p): the muted grey, a step above the body +// text. It was the black of the body at 1rem on /events/, /talks/, +// /people/, and /sponsors/, and the muted grey on the home page, two +// answers to one question. The description of the page, which +// partials/hero_header.html prints right under the h1, is the same kind +// of sentence and takes the same voice. +.page_heading_text, +.section_intro, +.page-intro, +.sponsors_intro { + color: $text-grey; + font-size: 1.05rem; + + p:last-child { + margin-bottom: 0; + } +} + // The bar of links above a long index, one link per group: the letters of // /people/ and the years of /events/. It is the only way to reach the far // end of 169 or 279 rows without scrolling the lot. See @@ -286,7 +444,7 @@ button:focus:not(:focus-visible), margin-bottom: 1.8rem; // Pinned under the fixed navigation bar as the page scrolls, from the - // lg breakpoint and not below it (David Arcos, 2026-10-15). Measured + // lg breakpoint and not below it. Measured // in Chromium: at 1280px the bar is one line of 29px and /people/ // runs to 28107px, so a reader otherwise scrolls back up through 35 // screens to jump to another letter. At 390px the bar is three lines @@ -308,7 +466,7 @@ button:focus:not(:focus-visible), // at the top of the page: navbar.scss gives it the navbar_small class // on scroll and the logo drops to 40px. A bar pinned at 105 left a // 44px gap under the navigation through which whole rows showed, - // which is what David Arcos saw on 2026-10-15. Measured in Chromium: + // Measured in Chromium: // nav bottom 105px at scroll 0, 63px at 300, 61px from there on. position: sticky; top: 61px; @@ -330,13 +488,13 @@ button:focus:not(:focus-visible), display: inline-block; min-width: 2rem; padding: 0.1rem 0.35rem; - border: 1px solid #dde3e8; - border-radius: 3px; + border: 1px solid $rule-grey; + border-radius: $card-radius; font-weight: 600; text-align: center; } - // /people/ centres its letters (David Arcos asked for it); /events/ + // /people/ centres its letters; /events/ // keeps its years at the left, over the first column of its table. // The class is the optional argument of partials/jump_bar.html. &.jump_bar_centered ul { @@ -344,6 +502,76 @@ button:focus:not(:focus-visible), } } +// The tabs above a listing: one link per view of the list, the current +// one filled. See layouts/partials/filter_tabs.html, which /talks/ and +// /people/ draw it with, and which says why the tabs are links to pages +// and not a script. +// +// The same pills as .jump_bar, a little taller, so the two bars read as +// one family of controls: the tabs choose which rows the page holds, the +// bar under them jumps inside those rows. The list wraps, with no script, +// as the jump bar does: at 390px the six tabs of /talks/ take three lines +// and the ten of /people/ four, and the document stays 390px wide. +// +// The current tab is the one with aria-current, painted in the blue of the +// site with white text, which is the one pair of this stylesheet that is +// already used for a selected control (.btn-primary). It stays a link, so +// it keeps the focus ring of every link. +// +// The count sits in a lighter weight than the name, so the name is what +// the eye reads first and the number is a fact beside it; the glyph is +// upright and at line-height 1, as .marker_legend_glyph is, for the reason +// listing_table.scss gives. +.filter_tabs { + margin-bottom: 1rem; + + ul { + display: flex; + flex-wrap: wrap; + gap: 0.35rem; + padding-left: 0; + margin-bottom: 0; + list-style: none; + } + + a { + display: inline-block; + padding: 0.25rem 0.7rem; + border: 1px solid $rule-grey; + border-radius: $card-radius; + font-weight: 600; + text-align: center; + white-space: nowrap; + + &[aria-current="page"] { + background: $blue-pybcn; + border-color: $blue-pybcn; + color: #ffffff; + } + } + + .filter_tab_glyph { + display: inline-block; + margin-right: 0.3em; + font-size: 1.15em; + font-style: normal; + font-weight: normal; + line-height: 1; + vertical-align: middle; + } + + .filter_tab_icon { + display: inline-block; + width: 1.3em; + margin-right: 0.2em; + text-align: center; + } + + .filter_tab_count { + font-weight: normal; + } +} + // The legend above a long index: each marker the rows draw, with how many // rows carry it. One line that wraps, in the colour of the facts under a // row, so it reads as information about the list and not as a row of it. @@ -356,7 +584,7 @@ button:focus:not(:focus-visible), padding-left: 0; margin-bottom: 1.2rem; list-style: none; - color: #51616e; + color: $text-grey; font-size: 0.9rem; li { @@ -412,10 +640,10 @@ button:focus:not(:focus-visible), gap: 0 0.7rem; padding: 0.05rem 0.5rem; margin-bottom: 0; - border: 1px solid #dde3e8; - border-radius: 3px; + border: 1px solid $rule-grey; + border-radius: $card-radius; list-style: none; - color: #51616e; + color: $text-grey; font-size: 0.9rem; line-height: 1.5; white-space: nowrap; @@ -443,6 +671,124 @@ button:focus:not(:focus-visible), a { font-weight: 600; } .section_index_desc { display: block; - color: #51616e; + color: $text-grey; + } +} + + +// The listing a single page belongs to, inside its h1. +// See partials/page_parent.html. +h1 .page_parent { + // The size of the heading it sits in. At 0.55em it read as a label + // stuck to the front of the title rather than as the first step of + // one line, and the two baselines did not meet. One line, one size. + font-size: 1em; + + a { + // White on the blue band, like the heading it sits in. The + // underline is on the hover and the focus only: a permanent one + // under "People" at the size of the heading read as a mistake + // rather than as a link. What the link + // keeps is the pointer, the hover, the focus ring, and its place + // in the tab order, and a screen reader announces it as a link + // whatever it is painted like. + color: inherit; + text-decoration: none; + + &:hover, + &:focus { + text-decoration: underline; + } + } + + .page_parent_mark { + // No underline on the separator, which is not part of the link. + text-decoration: none; + } +} + + +// The width of the reading column follows the window. +// +// The Bootstrap container is a step function: 1140px from 1200px up, then +// 960px, then 720px, then 540px. The window is continuous, so dragging it +// narrower shrinks the margin smoothly and then throws it back out at every +// step. Measured on a person page: the margin goes 390px at 1920, 230 at +// 1600, 130 at 1400, 30 at 1200, and then back to 70 at 1100, 16 at 992, +// and back to 90 at 900. That pumping is what reads as "the margin is +// fixed and the content is not". +// +// The cap stays at 1140px, so nothing changes at 1200px and above, which +// is where the photo gallery breaks out of the column and where the +// measurements of the rest of this file were taken. Below it the container +// simply fills the window less its padding. +@media (max-width: 1199.98px) { + .container { + max-width: 100%; + } +} + + +// The assemblies of the association, on /pybcn_association/information/: +// one row per year, the photograph at the left and the minutes at the +// right. See layouts/shortcodes/assemblies.html. +.assemblies { + margin: 1rem 0 2rem; + padding-left: 0; + list-style: none; + + .assembly { + display: flex; + gap: 1rem; + align-items: flex-start; + padding: 0.75rem 0; + border-top: 1px solid $rule-grey; + + &:last-child { + border-bottom: 1px solid $rule-grey; + } + } + + // A year with no photograph keeps the text where the others have it, + // so the column of names does not step left and right down the list. + .assembly_bare .assembly_body { + margin-left: calc(150px + 1rem); + } + + .assembly_photo { + flex: 0 0 auto; + + img { + display: block; + width: 150px; + height: auto; + border-radius: $card-radius; + } + } + + .assembly_minutes { + font-weight: 600; + } + + .assembly_caption { + margin: 0.25rem 0 0; + color: $text-grey; + } + + .assembly_source { + margin: 0.15rem 0 0; + font-size: 0.85rem; + } +} + +// Under sm the photograph goes over the text, which is the only way a +// 150px picture and a line of Catalan share a 390px screen. +@media (max-width: 575.98px) { + .assemblies .assembly { + flex-direction: column; + } + + .assemblies .assembly_bare .assembly_body { + margin-left: 0; } } diff --git a/themes/pybcn_theme/assets/scss/meetup.scss b/themes/pybcn_theme/assets/scss/meetup.scss index 08fcbec0c..ed2fea14b 100644 --- a/themes/pybcn_theme/assets/scss/meetup.scss +++ b/themes/pybcn_theme/assets/scss/meetup.scss @@ -16,18 +16,18 @@ // facts, so it is a step larger than the box below it. .meetup_when { font-size: 1.15rem; - color: #51616e; + color: $text-grey; margin-bottom: 1.2rem; } - // Each block of the page gets the same air under its heading, and the h2 - // is the size of the h2 of the rest of the site. + // Each block of the page is a block of the home page: the section title + // of main.scss over it, with the title gap under the title, and the + // block gap under the block. section { - margin-bottom: 2rem; + margin-bottom: $block-gap; h2 { - font-size: 1.5rem; - margin-bottom: 0.8rem; + @include section_title; } } } diff --git a/themes/pybcn_theme/assets/scss/monthly_events.scss b/themes/pybcn_theme/assets/scss/monthly_events.scss index be69789bb..5d5d514e4 100644 --- a/themes/pybcn_theme/assets/scss/monthly_events.scss +++ b/themes/pybcn_theme/assets/scss/monthly_events.scss @@ -5,13 +5,13 @@ height: 100%; &.PyLadiesBCN-events { - background-image: url("../images/backgrounds/pyladiesbcn_head_transparent.png"); + background-image: url("../images/backgrounds/pyladiesbcn_head_transparent.webp"); background-repeat: no-repeat; background-position: top right; background-size: 50%; } &.PyBCN-events { - background-image: url("../images/backgrounds/pybcn_cut_transparent.png"); + background-image: url("../images/backgrounds/pybcn_cut_transparent.webp"); background-repeat: no-repeat; background-position: top right; background-size: 50%; diff --git a/themes/pybcn_theme/assets/scss/navbar.scss b/themes/pybcn_theme/assets/scss/navbar.scss index 86ee47e49..39bb019ac 100644 --- a/themes/pybcn_theme/assets/scss/navbar.scss +++ b/themes/pybcn_theme/assets/scss/navbar.scss @@ -79,3 +79,11 @@ @include transition(0.4s); } } + + +// The navigation bar: title case, not capitals. The live rule is +// `#mainNav li a { text-transform: uppercase }`, so this one has to be at +// least as specific. +#mainNav.site_nav li a { + text-transform: none; +} diff --git a/themes/pybcn_theme/assets/scss/people.scss b/themes/pybcn_theme/assets/scss/people.scss index 5920bb335..fdb546b26 100644 --- a/themes/pybcn_theme/assets/scss/people.scss +++ b/themes/pybcn_theme/assets/scss/people.scss @@ -53,11 +53,18 @@ // rule on .person_item still resolves. container-type: inline-size; container-name: person_card; - // One card a row on a phone, whatever the section asks for. This is - // what the old col-md-N classes did: md means the fraction applies - // from 768px up and the slot is full width below it. Four cards a - // row on a 390px screen is 63px of card. - width: 100%; + // Two cards a row on a phone, whatever the section asks for. One + // a row gives a 360px card with a 360px face on a 390px screen, + // which reads as a poster of one person and makes the board four + // screens long. Half of that is 175px, the size the card has on a + // tablet, and the whole board fits on one screen. Below 360px the + // slot goes full width, because two 140px cards leave no room for + // a name like "Alicia Morales Carrasco". + width: 50%; + + @media (max-width: 359.98px) { + width: 100%; + } } // Between the md and lg breakpoints the row is too narrow for the count @@ -104,11 +111,14 @@ width: 100%; - border: 1px solid black; - // No padding on the card itself: the photo has to reach the - // border. The text and the icons below set their own side - // padding. A padding here used to frame the photo in 10px of - // white, which on a card this narrow is a ninth of its width. + // No frame. The photograph is a circle, and a square box drawn + // around a circle is the worst of the two: the corner of a box + // against the arc of a face is what makes a grid of them read + // badly. What tells one card from the next is the space between + // them and the name under each. + border: 0; + // No padding either: the photo is the width of the card, and + // the text and the icons below set their own side padding. padding: 0; // A column, so every card in a row is as tall as the tallest and @@ -127,9 +137,9 @@ // keeps the colours of the card: the name is black at rest and // the PyBCN blue under the pointer or the keyboard, which the // rules of the card below set on the h3, and the link must not - // paint it the link blue over them or underline it. The border - // of the card and the colour photo are the hover and the focus - // signal, so the whole card reads as the target, as it did. + // paint it the link blue over them or underline it. The colour + // photograph and the blue name are the hover and the focus + // signal, so the whole card reads as the target. .person_card_link { display: block; color: inherit; @@ -146,6 +156,12 @@ position: relative; // Keeps the zoom on hover inside the frame. overflow: hidden; + // The circle of the rows of /people/ and of the page of a + // person, which this card borrows. It lives on the box that clips and not on + // the photograph: with the radius on the image, the square + // frame cuts the corners off the circle as it grows on + // hover. + border-radius: 50%; // The photo is cropped to a square by the image pipeline, so // the frame is square because its content is. This used to be @@ -162,11 +178,12 @@ display: block; width: 100%; - // Grey only where the pointer can hover. A touch screen - // has no hover, so the photos stayed grey for good. - @media (hover: hover) { - filter: grayscale(100%); - } + // In colour, at rest, as the rows of /people/ and the + // portrait of a person page are. The photographs used to be grey until + // the pointer was on them, which a touch screen never + // undid, and a grid of grey faces reads as an archive + // of people who left rather than as the board of this + // year. } } @@ -309,12 +326,11 @@ } } - // The border follows the hover and the focus, so the card that - // the pointer or the keyboard is on is obvious at a glance. - &:hover, - &:focus-within { - border-color: $blue-pybcn; - } + // With no border to colour, the hover and the focus are the + // photograph in colour and the name in blue, which the rules + // below and above set. The card has no outline of its own to + // give. + // Keyboard focus shows the colour photo too, because the card holds // two focusable triggers. @@ -325,7 +341,6 @@ transform: scale(1.2); -webkit-transition: -webkit-transform .2s linear; transition: transform .2s linear; - filter: none; } } h3 { diff --git a/themes/pybcn_theme/assets/scss/people_index.scss b/themes/pybcn_theme/assets/scss/people_index.scss index 3acc2a8b1..0dc8e970a 100644 --- a/themes/pybcn_theme/assets/scss/people_index.scss +++ b/themes/pybcn_theme/assets/scss/people_index.scss @@ -9,18 +9,18 @@ // The bar of letters above the list is .jump_bar in main.scss, which // /events/ draws as a bar of years from the same partial. -.people_letter_group { - margin-bottom: 2.5rem; +// A group of rows under its heading: a letter on /people/ and on the page +// of a role (partials/people_letters.html), a board or a committee on the +// organizers pages (layouts/_default/people.html). +.people_group { + margin-bottom: $block-gap; - // The letter is an h2 and reads as a divider, not as a page title, so - // it is smaller than the h2 of the rest of the site and carries a rule - // under it. The level is the outline and the size is the style: the two - // are set apart here the way event.html sets them apart with h2.h1. - .people_letter { - font-size: 1.5rem; - border-bottom: 1px solid #dde3e8; - padding-bottom: 0.3rem; - margin-bottom: 1.2rem; + // The heading is the section title of main.scss, the h2 of every block + // of the site, with its rule under it: a letter is a block of this page + // the way a year is a band of /events/. It was 1.5rem with a rule of its + // own until 2026-10-17. + .people_group_title { + @include section_title; } } @@ -49,7 +49,7 @@ // and the rows below stay where they are. The circle lives here, // on the box that clips, and not on the photograph: with the radius // on the image the square frame cut the corners off the circle as - // it grew, which is what David Arcos saw on 2026-10-15. + // it grew. overflow: hidden; border-radius: 50%; display: flex; @@ -91,9 +91,8 @@ // The zoom is the one the cards of /pybcn_association/organizers/ have // had for years (people.scss): the photograph grows inside its own // frame, which is clipped, so nothing moves on the page and no row - // below is covered. David Arcos asked for that one on 2026-10-15, - // after a first try that hung a 240px copy of the picture under the - // avatar: it read as a popup rather than as a zoom. + // below is covered. A first try hung a 240px copy of the picture + // under the avatar and read as a popup rather than as a zoom. // // The keyboard gets it through the name link of the row, because the // avatar repeats that link and is out of the tab order. prefers @@ -148,6 +147,20 @@ .person_name { font-size: 1.05rem; font-weight: 600; + // A name with no space in it breaks where it has to: a 390px + // window gives the name about 300px, and one row of a -D build + // (the canary of bin/check-rendered) carried a name wider than + // that, which pushed the page to 460px. + overflow-wrap: anywhere; + } + + // The post after the name on the organizers pages, "President", in the + // grey and the size of the sentence under it, so the name stays what + // the eye reads first (layouts/_default/people.html says when it is + // printed). + .person_position { + color: $text-grey; + font-size: 0.9rem; } // The sentence of the second line, "Speaker at 3 events:", in the grey @@ -155,8 +168,20 @@ // count are the markup of the row of the Events table of the person // page, so the two read alike; the count is in the colour of the text, // so the number stands out of the grey line. + // The glyph of a role, in front of the word it marks. Same box as the + // marker of a page below, so the two lines of a row hang alike. + .role_emoji { + display: inline-block; + margin-right: 0.25rem; + font-size: 1rem; + font-style: normal; + font-weight: normal; + line-height: 1; + vertical-align: -0.1em; + } + .person_meta { - color: #51616e; + color: $text-grey; font-size: 0.9rem; strong { @@ -224,12 +249,13 @@ } } -// The letter and the row are both link targets: /people/#M from the bar -// above the list, and /people/#marc-pous from anywhere. The navbar is fixed -// and 105px tall, so without this the target lands under it and the reader -// sees the row before the one they asked for. listing_table.scss does the -// same for a year. -.people_letter, +// The group heading and the row are both link targets: /people/#M from the +// bar above the list, /organizers/#permanent-committee, and +// /people/#marc-pous from anywhere. The navbar is fixed and 105px tall, so +// without this the target lands under it and the reader sees the row +// before the one they asked for. listing_table.scss does the same for a +// year. +.people_group_title, .person_row { scroll-margin-top: 65px; // the shrunk navigation, 61px, plus a little diff --git a/themes/pybcn_theme/assets/scss/people_page.scss b/themes/pybcn_theme/assets/scss/people_page.scss index 12828cf03..2632a4db2 100644 --- a/themes/pybcn_theme/assets/scss/people_page.scss +++ b/themes/pybcn_theme/assets/scss/people_page.scss @@ -17,7 +17,7 @@ flex-wrap: wrap; align-items: center; gap: 24px 32px; - margin-bottom: 1.6rem; + margin-bottom: $block-gap; } // A round frame at 240px: a portrait is what a person page opens with, @@ -37,9 +37,8 @@ // The zoom of the portrait: the photograph grows inside its own frame, // which is clipped, so nothing on the page moves. It is the zoom the // cards of /pybcn_association/organizers/ have had for years, in - // people.scss, and David Arcos asked for that one on 2026-10-15 after - // a first try hung a 400px copy of the picture under the portrait and - // read as a popup. + // people.scss, and this is the same one. A first try hung a 400px + // copy of the picture under the portrait and read as a popup. // // The portrait stays a link, so the keyboard has something to focus // and a touch screen, which has no hover, has somewhere to land: it @@ -100,8 +99,8 @@ // one link per line, each the mark of the host and the handle, in the // size of body text. No marker: the mark is the marker. They were one // line that wrapped: at 1280px three handles sat on the line and the - // site dropped under them, which read as misaligned, so David Arcos - // asked for one per line (2026-10-15), and the marks line up down the + // site dropped under them, which read as misaligned. One per line, + // and the marks line up down the // left. The handle of a site is a free URL, and one of them is 600px // of percent-encoded characters; it breaks where it has to. .person_links { @@ -160,11 +159,10 @@ // pages. Both kinds of block, the page's own and the three lists. .person_block, .person_section { - margin-bottom: 2rem; + margin-bottom: $block-gap; h2 { - font-size: 1.5rem; - margin-bottom: 0.8rem; + @include section_title; } } @@ -206,7 +204,7 @@ } .talk_meta { - color: #51616e; + color: $text-grey; font-size: 0.9rem; margin-bottom: 0; } @@ -217,7 +215,7 @@ // line of a meetup page does. A link inside a sentence needs a second mark besides the // colour (WCAG 1.4.1), the rule meetup.scss and talks.scss apply. .person_correction p { - color: #51616e; + color: $text-grey; font-size: 0.9rem; margin-bottom: 0; @@ -249,7 +247,7 @@ } figcaption { - color: #51616e; + color: $text-grey; font-size: 0.9rem; margin-top: 0.3rem; } @@ -402,7 +400,7 @@ // three wrap. Here a card holds at most one photo and one video, of // one talk, so the 128px column stood mostly empty and the Event // column wrapped 128px short of the right edge every other block - // reaches, which David Arcos read as a narrower table (2026-10-15). + // reaches, which reads as a narrower table. // 1% is the trick of the three narrow columns of that stylesheet: the // column is as wide as its widest card. Measured on // /people/david-arcos/ at 1280px: the table 825px before and after, diff --git a/themes/pybcn_theme/assets/scss/photo_gallery.scss b/themes/pybcn_theme/assets/scss/photo_gallery.scss index 0dc5f0b7d..4a73a550f 100644 --- a/themes/pybcn_theme/assets/scss/photo_gallery.scss +++ b/themes/pybcn_theme/assets/scss/photo_gallery.scss @@ -22,30 +22,21 @@ $quote-rule: #ced4da; // is taller than it. Measured over the 276 photographs of the archive on // 2026-10-14: 228 of the 251 landscapes are 4:3 or wider and keep their // size, the 23 taller ones, 6 of them square to the pixel, come down to -// 675px, and so do the 10 squares and the 15 portraits, which David Arcos -// asked for ("limite de alto, para que las fotos verticales no salgan -// demasiado grandes"). On a 390px phone the card is 358px wide and a +// 675px, and so do the 10 squares and the 15 portraits, so a portrait +// does not come out far taller than the card beside it. On a 390px phone the card is 358px wide and a // portrait 636px tall, under the cap, so nothing changes there. Measured // in Chromium on the first and the twenty-first photo of PyDay BCN 2022: // 900x506 and 379x675 at 1280px, 358x201 and 358x636 at 390px. $photo-max-height: 675px; -// The rule above the gallery, and the air above that. The gallery is the last -// section of an event page, after the sponsors and the people of the day, and -// it holds what the association published once the day was over. The rule -// and the gap are what say so to a reader who is scrolling: three sections -// of a programme in a row, and then something that is not one. -// -// There is no band of colour behind the section any more. The gallery sat on -// a light grey band, with every card on it, until David Arcos asked for a box -// per item on 2026-10-14 ("ahora están todos en una caja gris"): each figure -// is its own card, the border and the white body of the Bootstrap 4 card, on -// the white of the page, and the air between the cards is what separates -// them. The gap above and below the thread link is in .photo_thread. -.gallery_rule { - margin-top: 4rem; - margin-bottom: 0; -} +// There is no band of colour behind the section, and no rule above it any +// more. The gallery sat on a light grey band, with every card on it, until +// 2026-10-14. Each figure is its own card, on the white of the page, +// and the air between the cards is what separates them. The hr above the +// section went on 2026-10-17: the title of the gallery is the section +// title of main.scss, which draws its own rule, as every block of the +// page does now, and a second rule over it read as a mistake. The gap +// above and below the thread link is in .photo_thread. .photo_gallery { // The gallery is the last section and it is set apart from the @@ -61,9 +52,19 @@ $photo-max-height: 675px; // of an imported photograph is capped at 1000px, and a column wider than // that would make a normal screen scale the picture up, which looks // worse than any saving is worth. - // 992px is the lg breakpoint of Bootstrap 4, written out because this - // file is compiled without the Bootstrap mixins in scope. - @media (min-width: 992px) { + // 1200px is the xl breakpoint of Bootstrap 4, written out because this + // file is compiled without the Bootstrap mixins in scope. It was 992, + // the lg one, and that was too early: margin-left 50% centres the + // section on its containing block, which is the col-md-9 of the page + // and not the window, so between 992px and 1200px the 902px section + // landed off centre and ran past the right edge of the screen. Measured + // on the live site, the event page was 1067px wide on a 992px screen + // and 1083px on a 1024px one, which is the same sideways drag issue + // #212 reports for the schedule, on a different element and at a + // different size. At 1200px the container is 1140px and the breakout + // has the room it was designed for. Below it the gallery stays in the + // reading column, which is what it does on a phone already. + @media (min-width: 1200px) { width: 902px; max-width: calc(100vw - 3rem); margin-left: 50%; @@ -86,6 +87,9 @@ $photo-max-height: 675px; // grid, so a portrait photo and a landscape one sit in the same // column and keep their own shape. margin: 0 0 3rem; + // The frame of every card of the site over the one Bootstrap's + // .card draws: the rule grey and 4px, not rgba black and 0.25rem. + @include site_frame; // Every figure is a link target, #1 to #33, and the navigation bar // is fixed over the top 80px of the window. scroll-margin-top: 80px; @@ -133,7 +137,7 @@ $photo-max-height: 675px; // // Italic, as a quotation is set in print, so the words of the post read // as a quotation even where the rule down the left is easy to miss, on - // a narrow window with the border of the card beside it. David Arcos + // a narrow window with the border of the card beside it. The gallery // asked on 2026-10-14 ("el blockquote, tal vez en cursiva?"). The talk // line under it went upright at the same time: two italic blocks one // after the other read as one, and the line under the caption is this @@ -247,7 +251,12 @@ $photo-max-height: 675px; // was the photographs alone, for the one day of 2026-10-14. .gallery_photos, .gallery_videos { - margin-top: 1.5rem; + margin-top: 0; + } + + // The second subsection stands a block off the first. + .gallery_photos + .gallery_videos { + margin-top: $block-gap; } // The rows of the videos take .talk_rows of talks.scss unchanged; the diff --git a/themes/pybcn_theme/assets/scss/search.scss b/themes/pybcn_theme/assets/scss/search.scss new file mode 100644 index 000000000..80b1a7d27 --- /dev/null +++ b/themes/pybcn_theme/assets/scss/search.scss @@ -0,0 +1,174 @@ +// The site search: the form of the navbar (partials/nav.html), and the box +// and the results of /search/ and the 404 page (partials/search_form.html, +// drawn by assets/js/search.js). + +.nav_search { + margin-left: 1rem; + // The form is one line. Without this the button dropped under the + // field as soon as the navigation was tight. + flex-wrap: nowrap; + // It takes the width the menu and the logo leave, and no more. Without + // the shrink the button ran off the right edge of a 1200px to 1500px + // window: 149px past it at 1200, which is every laptop. + flex: 0 1 auto; + min-width: 0; + + input { + width: 10rem; + } + + .nav_search_button { + color: $blue-pybcn; + border: 1px solid $blue-pybcn; + margin-left: 0.25rem; + + &:hover, + &:focus { + color: white; + background-color: $blue-pybcn; + } + } +} + +// The glyph that stands in for the box where the box does not fit. One of +// the two is shown and never both: the navigation collapses at 1200px, so +// under it the form rides inside the open menu, where there is room, and +// between 1200px and 1500px only the glyph is on the bar. +.nav_search_link { + display: none; + align-self: center; + margin-left: 1rem; + color: $blue-pybcn; + + &:hover, + &:focus { + color: $yellow-pybcn; + } +} + +@media (min-width: 1200px) and (max-width: 1499.98px) { + .nav_search { + display: none; + } + + .nav_search_link { + display: inline-block; + } +} + +// The menu asks for its natural width before the search box gets the rest. +// The box took 136px off it, and the items were still laid out on one row: +// what broke was the text inside each one, so "The Association" and +// "Contact us" each read on two lines. +.navbar .navbar-nav .nav-link { + white-space: nowrap; +} + +.search_form { + margin-bottom: 1.5rem; + + label { + margin: 0; + font-weight: bold; + } +} + +.search_query { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + + input { + flex: 1 1 16rem; + } + + .search_button { + color: white; + background-color: $blue-pybcn; + border-color: $blue-pybcn; + } +} + +.search_filters { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 1rem; + margin-top: 0.75rem; + + label { + display: flex; + align-items: center; + gap: 0.4rem; + font-weight: normal; + } + + select { + width: auto; + } +} + +// The count of the results, in the muted voice of every secondary line +// of the site; it was #555, a grey of this file alone. +.search_status { + color: $text-grey; +} + +// The results stand a block off the form, as the blocks of every page do; +// the heading over them is the section title of main.scss. +.search_results_section { + margin-top: $block-gap; +} + +.search_results { + list-style: none; + padding: 0; + margin: 0; +} + +// One result under the other, a rule between them in the grey of every +// rule of the site. +.search_result { + border-top: 1px solid $rule-grey; + padding: 0.75rem 0; + + p { + margin: 0; + } +} + +.search_result_title { + font-weight: bold; +} + +// The kind of the result, in front of its title: the one word that says +// whether the link opens a talk, a day, a person, or a photograph. The +// pill of the filter tabs and the count card (main.scss): the one border +// and the one radius, the muted grey. +.search_result_kind { + display: inline-block; + font-size: 0.75em; + font-weight: normal; + text-transform: uppercase; + letter-spacing: 0.05em; + color: $text-grey; + border: 1px solid $rule-grey; + border-radius: $card-radius; + padding: 0 0.4em; + margin-right: 0.5rem; + vertical-align: middle; +} + +.search_result_meta { + color: $text-grey; +} + +.search_result_excerpt { + margin-top: 0.25rem !important; + + mark { + padding: 0 0.1em; + background-color: #fff3a0; + } +} diff --git a/themes/pybcn_theme/assets/scss/sponsors.scss b/themes/pybcn_theme/assets/scss/sponsors.scss index 250eda15c..e083eaab5 100644 --- a/themes/pybcn_theme/assets/scss/sponsors.scss +++ b/themes/pybcn_theme/assets/scss/sponsors.scss @@ -1,29 +1,165 @@ -// Sponsors CSS +// The sponsor grid: /sponsors/, /pyladies_bcn/sponsors/, and the level +// blocks of every edition page. See partials/sponsors-grid.html. +// +// Three sizes are fixed and do not move with the window: +// +// the card 180 x 110 px +// the box the logo 150 x 90 px +// sits in +// the gap 16 px +// +// What moves is how many cards fit on a line. A logo scaled by the +// viewport is unreadable on a phone and enormous on a desktop, and with 71 +// of them on one page the eye reads any difference in size as a difference +// in what the sponsor gave. They all gave something. +// +// Six to a line and not seven. The browser +// counts the tracks of an auto-fit grid with the minimum of the track, so +// the minimum is what decides the count: floor((W + gap) / (min + gap)). +// At the 1140px of the container, 165px gives 6; the 132px it was gave 7. +// The progression down the breakpoints is 6, 5, 4, 3, and 2, and one card +// under 320px. +// +// The padding is 0.35rem and not the 0.75rem of a card with words, so the +// logo takes the room instead of the card: most logos carry white space +// of their own, and two margins read as one too many. A logo smaller than the box is never +// scaled up: max-width and max-height cap a logo, they do not stretch it, +// so izi at 70x70 stays at 70x70 and only the big ones grow. + +$sponsor-card-width: 180px; +$sponsor-card-min: 165px; +$sponsor-card-height: 110px; +// The box of the logo fits inside the narrowest card the grid allows, not +// inside the widest: a track is 1fr, so a card is 165px on a line that +// holds six of 1140px and 180px where the line has room. 165 less the +// padding and the border leaves 152, so the box is 150 and a logo never +// spills over the padding on a narrow card. +$sponsor-logo-width: 150px; +$sponsor-logo-height: 90px; +$sponsor-card-padding: 0.35rem; +// The gap of the cards of the home page. +$sponsor-gap: 1rem; #sponsors_grid { - .sponsor { - text-align: center; + // One level under the other, a block and a half apart on an edition + // page, where the levels sit under one Sponsors title. No band behind + // them: the cards sat on a light grey band until 2026-10-17, because + // white cards on white read as floating logos, and the frame of every + // card of the site (main.scss, the rule grey) is what tells them apart + // now, as it does the four friends of the home page. + .sponsors_level { + margin-bottom: 1.5rem; + + &:last-child { + margin-bottom: 0; + } + } + + // The name of a level, Gold or Silver: the sub title of main.scss, at + // the left edge of its cards. It is an h2 for the outline and reads + // as the title under the title of the block, which is what it is. + .level_name { + @include sub_title; + } + + .sponsors_cards { + display: grid; + // As many cards as fit, each one the same width. The browser does + // the arithmetic, so there is no breakpoint to keep in step with + // the number of sponsors. + // The card may lose a few pixels of its own padding so that two + // of them fit on a 360px screen rather than one. The box the logo + // sits in does not move: 116px still fits inside the narrowest + // card this allows. + // 1fr and not the card width as the maximum: a track whose + // maximum is a definite length is what the browser counts with, + // so repeat(auto-fit, minmax(132px, 150px)) fitted one card on a + // 360px screen and not two. With 1fr it counts with the minimum + // and the card caps itself below. + grid-template-columns: repeat(auto-fit, minmax($sponsor-card-min, 1fr)); + justify-items: center; + justify-content: center; + gap: $sponsor-gap; + } + + // A named level says how many it wants on a line, which is how an + // edition page gives its Gold sponsors a line of their own. It is a + // cap and not a demand: a narrow window still fits what it fits. + // One rule per value instead of a custom property on the element: + // bin/check-rendered refuses an inline style that the stylesheet can + // carry, and the data asks for 2, 3 and 4. The loop goes to 8 so that + // a new value in a front matter gets its cap and does not lose it in + // silence. + @for $per-line from 1 through 8 { + .sponsors_cards_capped_#{$per-line} { + max-width: calc( + (#{$sponsor-card-width} + #{$sponsor-gap}) * #{$per-line} - #{$sponsor-gap} + ); + margin: 0 auto; + } + } + + .sponsor_card { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + max-width: $sponsor-card-width; + height: $sponsor-card-height; + padding: $sponsor-card-padding; + // The frame of every card of the site (main.scss): the rule grey + // at rest, the blue of the site under the pointer or with the + // keyboard on the link inside. + @include site_frame; + position: relative; + transition: transform .2s linear, border-color 0.15s linear, + box-shadow 0.15s linear; + + &:hover, + &:focus-within { + border-color: $blue-pybcn; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); + // The card lifts, the way the face of a person card grows: + // The hover is a zoom on this grid. The + // whole card scales and not the logo inside it, because a + // logo that grows alone spills over the padding and crosses + // the white edge onto the band. 7px of growth against a gap + // of 12px, so it never touches its neighbour. + transform: scale(1.04); + z-index: 1; + } + + a { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } .img-logo { - max-height: 150px; - max-width: 90%; - margin-bottom: 30px; + // The fixed box. Every logo is scaled to fit inside it and + // keeps its own shape, so a wide one and a square one take the + // same room. + max-width: $sponsor-logo-width; + max-height: $sponsor-logo-height; + object-fit: contain; } // Shown when a sponsor has no logo file. .sponsor-name { - display: inline-block; - max-width: 90%; - margin-bottom: 30px; + max-width: $sponsor-logo-width; font-weight: 600; - font-size: 1.1rem; + font-size: 0.95rem; line-height: 1.3; - } - - &.col-md-12 { - .img-logo { - max-width: 70%; - } + text-align: center; } } } + +// The line above the grid that says what the grid is a list of, in the +// voice of the sentence under a title (main.scss), a title gap over the +// cards. +.sponsors_intro { + margin-bottom: $title-gap; +} diff --git a/themes/pybcn_theme/assets/scss/style.scss b/themes/pybcn_theme/assets/scss/style.scss index 11a47ea42..b75752a94 100644 --- a/themes/pybcn_theme/assets/scss/style.scss +++ b/themes/pybcn_theme/assets/scss/style.scss @@ -2,7 +2,6 @@ @import 'main'; @import 'navbar'; @import 'footer'; -@import 'hero'; @import 'items_list'; @import 'sponsors'; @import 'contact'; @@ -21,3 +20,4 @@ @import 'facts'; @import 'meetup'; @import 'shortcodes'; +@import 'search'; diff --git a/themes/pybcn_theme/assets/scss/talks.scss b/themes/pybcn_theme/assets/scss/talks.scss index 7715aec3f..480dccaaf 100644 --- a/themes/pybcn_theme/assets/scss/talks.scss +++ b/themes/pybcn_theme/assets/scss/talks.scss @@ -7,14 +7,14 @@ // description, the photo, the video, and the links. .talk_page { - // Each block of the page gets the same air under its heading, and the - // h2 is the size of the h2 of the rest of the site. + // Each block of the page is a block of the home page: the section title + // of main.scss over it, with the title gap under the title, and the + // block gap under the block. section { - margin-bottom: 2rem; + margin-bottom: $block-gap; h2 { - font-size: 1.5rem; - margin-bottom: 0.8rem; + @include section_title; } } @@ -26,7 +26,7 @@ // body text stays, because the abstract is the body of this page. // Italic, as the caption is and as a quotation is set in print, so // the two blockquotes of the site read alike; it was upright and did - // not read as a quotation (David Arcos, 2026-10-15). + // not read as a quotation. .talk_abstract { margin: 0; padding-left: 0.75rem; @@ -66,6 +66,9 @@ // the section under it sets the gap. .talk_photo { margin-bottom: 1rem; + // The frame of every card of the site over the one Bootstrap's + // .card draws, as in the gallery. + @include site_frame; &:last-child { margin-bottom: 0; @@ -78,7 +81,7 @@ } figcaption { - color: #51616e; + color: $text-grey; } } } @@ -114,11 +117,23 @@ margin-left: calc(-1.5em - 8px); margin-right: 8px; text-align: center; - color: #51616e; + color: $text-grey; + } + + // The glyph of the speaker role, in front of the names, in the box + // the glyph of a role takes on /people/. + .talk_speaker_glyph { + display: inline-block; + margin-right: 0.25rem; + font-size: 1rem; + font-style: normal; + font-weight: normal; + line-height: 1; + vertical-align: -0.1em; } .talk_meta { - color: #51616e; + color: $text-grey; margin-bottom: 0; } diff --git a/themes/pybcn_theme/layouts/404.html b/themes/pybcn_theme/layouts/404.html index c65c44ef1..e35061ddf 100644 --- a/themes/pybcn_theme/layouts/404.html +++ b/themes/pybcn_theme/layouts/404.html @@ -1,11 +1,20 @@ +{{- /* + The page GitHub Pages serves for an address that is not here. The words + of the address are the first query of the search box, so an old link to + a talk, a person, or a day finds the page that holds it now: the box and + the results are partials/search_form.html, which assets/js/search.js + drives (loaded by partials/js.html on this page and on /search/). The + list of the menu stays under it for a reader with no JavaScript. +*/ -}} {{ define "main" }}
    -

    Page not found

    This page is not here. The link may be old, or the address may have a typo.

    -

    Try one of these:

    +

    The words of the address are searched below; change them if nothing matches.

    + {{ partial "search_form.html" (dict "path_query" true) }} +

    Or try one of these:

    • Home page
    • {{ range site.Menus.main }} diff --git a/themes/pybcn_theme/layouts/_default/baseof.html b/themes/pybcn_theme/layouts/_default/baseof.html index 830902d62..19eb97ae3 100644 --- a/themes/pybcn_theme/layouts/_default/baseof.html +++ b/themes/pybcn_theme/layouts/_default/baseof.html @@ -7,7 +7,13 @@ {{ end }} - +{{- /* The offset of the scrollspy of an edition page (its side index, + #index_sections): a block is the current one once its top is + 260px under the top of the window. It was 180 while every block + started 80px above its own first line (the padding trick of + .link_anchor, gone on 2026-10-17 for scroll-margin-top), so 260 + is the same moment as before. */ -}} + @@ -16,7 +22,11 @@
      - {{ partial "hero_header.html" . }} + {{- /* The heading of the page, unless the page draws its own: the + home page is the one, and its h1 is inside its first block. + See partials/hero_header.html, which was a band with a + photograph behind it until 2026-10-17. */ -}} + {{ if not .Params.no_page_heading }}{{ partial "hero_header.html" . }}{{ end }} {{ block "main" . }} {{ end }} diff --git a/themes/pybcn_theme/layouts/_default/contact.html b/themes/pybcn_theme/layouts/_default/contact.html index 90734d483..b15a957f5 100644 --- a/themes/pybcn_theme/layouts/_default/contact.html +++ b/themes/pybcn_theme/layouts/_default/contact.html @@ -9,7 +9,7 @@

      PyBCN

      - {{ range $.Site.Params.social_items }} + {{ range sort $.Site.Params.social_items "weight" }} {{ end }}


      @@ -18,7 +18,7 @@

      PyBCN

      PyLadiesBCN

      - {{ range $.Site.Params.social_items_pyladies }} + {{ range sort $.Site.Params.social_items_pyladies "weight" }} {{ end }}

      diff --git a/themes/pybcn_theme/layouts/_default/event.html b/themes/pybcn_theme/layouts/_default/event.html index 404cc3403..e65e1d675 100644 --- a/themes/pybcn_theme/layouts/_default/event.html +++ b/themes/pybcn_theme/layouts/_default/event.html @@ -23,6 +23,15 @@ them there instead). */ -}} {{ $gallery := partialCached "gallery_content.html" . .RelPermalink }} +{{- /* Every block of the column is a link_anchor: the target of the + side index, which event.scss clears off the fixed navigation with + scroll-margin-top, and one block of the rhythm of the page, with + the air of $block-gap under it. The h2 of each block is the + section title of main.scss, the h2 of every other page; the blocks + were spaced by runs of br elements and their h2 took the blue band + of the h1 until 2026-10-17. The body of the page and the free text + sections are page_body, so an h2 or an h3 written in their markdown + takes the same scale. */ -}}
      @@ -59,17 +68,61 @@ PyDay BCN 2016 "15 to 17 September 2016". Hacktoberfest 2018 carries no date and prints no line. */ -}} {{- $when := partial "event_date.html" (dict "date" .Params.date "end_date" .Params.end_date) -}} + {{- /* The record of the edition is what the site search indexes + of this page: the day line below, marked + data-pagefind-body, plus the h1 of the hero + (partials/hero_header.html, which also writes the + kind), plus the captions of the gallery, each at its + figure (partials/photo_gallery.html). The sections of + the page, the programme grid, the sponsors, and the + people grids are out: a talk and a person have pages of + their own, and a name indexed here as well would match + twice. The venue is not printed on this page (the row of + /events/ prints it), so it goes to the search as meta + only, written inline from the front matter: a meta value + is searched and returned with the result, so "Canòdrom" + finds PyDay BCN 2025 with no line added to the page. The + first day is the sort value for "newest first" and gives + the year filter; an edition with no date (Hacktoberfest + 2018) has its year from the front matter and no sort + value, and the newest-first order leaves it out. */ -}} + {{- $sort_date := "" -}} + {{- $year := "" -}} + {{- with $when.start -}} + {{- $sort_date = time.Format "2006-01-02" . -}} + {{- $year = time.Format "2006" . -}} + {{- end -}} + {{- if not $year }}{{ with .Params.year }}{{ $year = printf "%v" . }}{{ end }}{{ end -}} +
      {{- with $when.html }} -

      {{ . }}

      +

      {{ . }}

      {{- end }} + {{- /* How many people came, which is a count and not a + registration: AGENTS.md keeps the two words apart, and + the meetup pages say "Registrations" because an RSVP of + Meetup is an intention. An edition sold its tickets + elsewhere, so the only number it has is the one the + association counted and published on the day. The front + matter carries the figure and, in a comment, where it + was read. A page with no attendees field prints no + line. */ -}} + {{- with .Params.attendees }} + {{- $people := int . }} + {{- if gt $people 0 }} +

      {{ $people }} {{ cond (eq $people 1) "person" "people" }} attended

      + {{- end }} + {{- end }} + {{- with .Params.venue }} + + {{- end }} +
      {{ if .Params.content_columns }}
      {{ end }} {{ if .Content }} - {{ range $section := .Params.free_text_sections }} -
    + {{- end }} + + {{- /* About us: the faces of the people who run the + association, linked to the page that lists them. The + home page had no link to /organizers/ at all: the page is the + present of the association and the four tiles above are + its past, so it reads here, over the ways of taking + part, and not inside the Archive. + The people and their order are the ones of + content/pybcn_association/organizers.md, read through + its own front matter so the two pages cannot disagree. + Only the two bodies that run the association, the board + and the committee, which that file marks with + home_faces: the collaborators and the former board are + on the page the line below leads to. The file says which groups and not this + layout, so the year in the name of the board can change + without a template edit. The photograph is the + square of partials/image_square.html at 64px, the one + /people/ draws at 48 and the card of the organizers + page at 400, so the pipeline writes one more size of a + file it already has. Every face is lazy, because the + block is far below the fold. A person with no + photograph takes the initials of the rows of /people/, + through partials/person_placeholder.html. */ -}} + {{- with site.GetPage "/pybcn_association/organizers" }} + {{- $organizers := slice -}} + {{- $seen := dict -}} + {{- range .Params.people_levels -}} + {{- if not .home_faces }}{{ continue }}{{ end -}} + {{- range .people -}} + {{- $id := . -}} + {{- if reflect.IsMap . }}{{ $id = .id }}{{ end -}} + {{- /* One face per person, in the order of the page. + Two of them sit in two groups there, the former + president among the collaborators, and a face + printed twice in one row reads as a mistake. */ -}} + {{- if index $seen $id }}{{ continue }}{{ end -}} + {{- $seen = merge $seen (dict $id true) -}} + {{- with site.GetPage (printf "/people/%s" $id) -}} + {{- $organizers = $organizers | append . -}} + {{- end -}} + {{- end -}} + {{- end -}} +
    +
    +

    About us

    +

    A non-profit run by volunteers. These are the people behind it.

    +
    + +
    + {{- end }} + + {{- /* The four calls to action, two to a row, the icon at the + left. What the membership box says is what + content/pybcn_association/membership.md says a member + gets: the fee, a voice and a vote in the general + assembly. The venues, the pizza, and the PyDay are paid + by the sponsors, so no box says the fee pays them. */ -}} + {{- $boxes := slice + (dict "path" "/pybcn_association/membership" "icon" "fa-sign-in-alt" "text" "Join the association: 20 euros a year, and a voice and a vote in the general assembly.") + (dict "path" "/pybcn_association/organize-with-us" "icon" "fa-calendar-day" "text" "Help us run a meetup, or ask us to help with yours.") + (dict "path" "/pybcn_association/propose-a-talk" "icon" "fa-comment" "text" "Twenty minutes on something you built, learnt, or broke.") + (dict "path" "/contact" "icon" "fa-envelope" "text" "A question, an idea, a venue to offer: write to us.") -}} +
    +
    +

    Take part

    +
    +
      + {{- range $boxes }} + {{- $box := . }} + {{- with site.GetPage .path }} +
    • + + + + {{ .Title }} + {{ $box.text }} + + +
    • + {{- else }}{{ errorf "home: the page %q is missing" $box.path }}{{ end }} + {{- end }} +
    +
    + + {{- /* The friends: the first four of partials/friends.html, so + the line is exactly four from xl (the second review). + The fifth, the Python Software Foundation, stays in the + data and is not drawn. The logo is the height of two + lines, 56px, with the name and the line under it at its + right, the whole card the link. The mark is drawn here + and not through a partial of its own: a raster is + resized to 56px tall, and to + 112px for a 2x screen when the file has the pixels; an + SVG goes through untouched. The four marks are square, + so the slot is square too. */ -}} + {{- $friends := first 4 (partial "friends.html") -}} +
    +
    +

    Our friends

    +
    + +
    {{ end }} diff --git a/themes/pybcn_theme/layouts/_default/meetup.html b/themes/pybcn_theme/layouts/_default/meetup.html index a496017d9..2b61cbdd0 100644 --- a/themes/pybcn_theme/layouts/_default/meetup.html +++ b/themes/pybcn_theme/layouts/_default/meetup.html @@ -34,9 +34,8 @@ attendedCount is zero on almost every record and nobody counted the room. The row of the box says it in words as well, behind the disclosure of the number: it used to be the paragraph of a Source - block at the end of the page, and David Arcos asked on 2026-10-14 for - the source to join the box and that paragraph to go ("el texto del - source al final, desaparece"), with its detail kept where a touch + block at the end of the page until 2026-10-14, when the source joined + the box and that paragraph went, with its detail kept where a touch screen can reach it. The blocks under the box, each left out when the page has nothing for @@ -87,8 +86,29 @@ file carries a date today; a file with none still prints the rest of the page. */ -}} {{- $when := partial "event_date.html" (dict "date" .Params.date "end_date" .Params.end_date "weekday" true) -}} + {{- /* The record of the day is what the site search indexes of + this page: the day and the box of facts, in the div + below, marked data-pagefind-body, plus the h1 + (partials/hero_header.html, which also writes the + kind). The talks, the recordings, and the credit lines of + the gallery are out: a talk has a page of its own, and a + name indexed here as well would match twice. The + captions of the gallery are in, each at its figure (see + partials/photo_gallery.html). The day is returned with + the result as its date, and gives the year filter and + the sort value for "newest first" on /search/; the venue + is returned too; the group is a filter value and not a + searchable word, and the source row is the same sentence + on every page. */ -}} + {{- $sort_date := "" -}} + {{- $year_filter := "" -}} + {{- with $when.start -}} + {{- $sort_date = time.Format "2006-01-02" . -}} + {{- $year_filter = time.Format "year:2006" . -}} + {{- end -}} +
    {{- with $when.html }} -

    {{ . }}

    +

    {{ . }}

    {{- end }} {{- /* The box of facts, partials/facts_box.html: the place, the @@ -114,12 +134,13 @@ {{- $source := "" -}} {{- with .Params.meetup_url }}{{ $source = "The announcement of the day on Meetup" }}{{ end -}} {{ partial "facts_box.html" (dict "items" (slice - (dict "label" "Venue" "icon" "fa-map-marker-alt" "value" .Params.venue) - (dict "label" "Group" "icon" "fa-user-friends" "value" .Params.group) + (dict "label" "Venue" "icon" "fa-map-marker-alt" "value" .Params.venue "meta" "venue") + (dict "label" "Group" "icon" "fa-user-friends" "value" .Params.group "filter" "group" "ignore" true) (dict "label" "Registrations" "icon" "fa-user-check" "value" $registrations "note" "The people who said yes on Meetup. It is the only figure the record holds, so it is not a count of who came." "note_label" "Who is counted") - (dict "label" "Source" "mark_url" .Params.meetup_url "value" $source "url" .Params.meetup_url))) }} + (dict "label" "Source" "mark_url" .Params.meetup_url "value" $source "url" .Params.meetup_url "ignore" true))) }} +
    {{- with .Content }}
    {{ . }}
    diff --git a/themes/pybcn_theme/layouts/_default/search.html b/themes/pybcn_theme/layouts/_default/search.html new file mode 100644 index 000000000..5304b256d --- /dev/null +++ b/themes/pybcn_theme/layouts/_default/search.html @@ -0,0 +1,29 @@ +{{- /* + The search page, /search/: the one page of the site that runs the site + search, with the 404 page. The box and the results are + partials/search_form.html, the script is assets/js/search.js, loaded by + partials/js.html on these two pages and no other: a content page ships + no script for the search, only the GET form of the navbar. + + content/search.md is the page: its title is the h1 of the hero and its + body the line under it. It is built and not listed (list: never in its + front matter), so it is in no feed, no sitemap and no listing, and it + is reached from the navbar. + + The index the page reads is written after Hugo, by bin/search, so the + dev server has no index and the page says so (the catch of the import + in the script). bin/hugo --minify -d public && bin/search public, then + any static server over public/, is how to try it locally. +*/ -}} +{{ define "main" }} + +
    +
    +
    + {{ .Content }} + {{ partial "search_form.html" (dict "path_query" false) }} +
    +
    +
    + +{{ end }} diff --git a/themes/pybcn_theme/layouts/_default/single.html b/themes/pybcn_theme/layouts/_default/single.html index 97fc3d0e7..1674a58ba 100644 --- a/themes/pybcn_theme/layouts/_default/single.html +++ b/themes/pybcn_theme/layouts/_default/single.html @@ -10,7 +10,9 @@
    -
    + {{- /* page_body: an h2 or an h3 written in the markdown takes the + scale of every other block of the site (main.scss). */ -}} +
    {{ .Content }} diff --git a/themes/pybcn_theme/layouts/_default/sponsors.html b/themes/pybcn_theme/layouts/_default/sponsors.html index fc9d24877..70f55c21a 100644 --- a/themes/pybcn_theme/layouts/_default/sponsors.html +++ b/themes/pybcn_theme/layouts/_default/sponsors.html @@ -1,5 +1,36 @@ {{ define "main" }} -{{ partial "sponsors-grid.html" (dict "levels" .Params.sponsor_levels "Site" .Site)}} +{{- /* + A grid of sponsor logos. + + A page that declares sponsor_levels gets exactly those, in those levels: + that is content/pyladies_bcn/sponsors.md, which lists the sponsors of + PyLadies BCN, and every edition page. + + A page that declares none gets every sponsor the site holds a record of, + sorted by name, 4 to the line. That is /sponsors/, which used to carry + the list by hand in its own front matter and had drifted: 25 sponsors + were on their edition page and not there, among them 8 of the 12 of + PyDay 2025, 15 of PyDay 2024, and 2 of PyDay 2023. Reading + content/sponsors/ means a new sponsor reaches the page by existing. + + The list comes from partials/sponsor_ids.html, which is also what + partials/listing_total.html counts for the h1. +*/ -}} +{{- $levels := .Params.sponsor_levels -}} +{{- if not $levels -}} + {{- /* No sponsors_per_line: the grid fits as many cards on a line as + the window allows. A number here would cap it, which is what a + named level of an edition page wants and this page does not. */ -}} + {{- $levels = slice (dict "sponsors" (partial "sponsor_ids.html" site)) -}} +{{- end -}} + +{{- /* The body of the page, above the grid. It says what the grid is a list + of, which the logos cannot say by themselves: every one of them + supported an event of ours at some point, and none of them is a + current sponsor by being here. */ -}} +{{ with .Content }}
    {{ . }}
    {{ end }} + +{{ partial "sponsors-grid.html" (dict "levels" $levels "Site" .Site) }} {{ end }} diff --git a/themes/pybcn_theme/layouts/index.llms.txt b/themes/pybcn_theme/layouts/index.llms.txt index f4218551d..ee4e2c696 100644 --- a/themes/pybcn_theme/layouts/index.llms.txt +++ b/themes/pybcn_theme/layouts/index.llms.txt @@ -32,7 +32,13 @@ This file is generated from the site content on every build. {{- end }} ## People -Every person the archive credits has a page at {{ "people/" | absURL }}/, with their roles, their talks, the photos of those talks, their events, and their links. All of them are listed at {{ "people/" | absURL }}, where each row links to the page and is itself addressable as {{ "people/" | absURL }}#. The PyBCN organizers are listed with a photo and a bio at {{ "pybcn_association/organizers/" | absURL }}, the PyLadies BCN organizers at {{ "pyladies_bcn/organizers-and-speakers/" | absURL }}, and each event page lists its speakers. +Every person the archive credits has a page at {{ "people/" | absURL }}/, with their roles, their talks, the photos of those talks, their events, and their links. All of them are listed at {{ "people/" | absURL }}, where each row links to the page and is itself addressable as {{ "people/" | absURL }}#, and the same rows filtered by one role are at {{ "people/role/" | absURL }}/ (speaker, organizer, mentor, permanent-committee, and the rest; the tabs above the list name them). The people behind PyBCN are listed by group, the board, the committee, the collaborators, and the former board, at {{ "pybcn_association/organizers/" | absURL }}, the PyLadies BCN organizers at {{ "pyladies_bcn/organizers-and-speakers/" | absURL }}, and each event page lists its speakers. + +## Talks +Every talk, workshop, lightning talk, keynote and panel the archive holds has a page at {{ "talks/" | absURL }}//, with its speakers, its description, its video when there is one, and the photographs of it. All of them are listed at {{ "talks/" | absURL }}, and the same rows filtered by one kind are at {{ "talks/type/" | absURL }}/ (talk, workshop, lightning, keynote, panel). The photographs of a day are in the gallery at the end of the page of that day, and a photograph that shows a talk links to the page of that talk. + +## Search +{{ "search/" | absURL }} searches the events, the talks and the people. The index is built from these pages when the site is built and is served from this site, so a search asks no other service. An address that does not exist lands on a page that searches the words of the address itself. ## Sponsors The companies, organizations, and universities that supported an event are listed at {{ "sponsors/" | absURL }}. Each event page lists its own sponsors. diff --git a/themes/pybcn_theme/layouts/partials/agenda.html b/themes/pybcn_theme/layouts/partials/agenda.html index d7d3d03bc..3516fbad1 100644 --- a/themes/pybcn_theme/layouts/partials/agenda.html +++ b/themes/pybcn_theme/layouts/partials/agenda.html @@ -2,7 +2,12 @@