diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..b3c4ff13 --- /dev/null +++ b/404.html @@ -0,0 +1,903 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+

404, page not found (or moved to coderefinery.github.io)

+
+ +

+ Try going to NEWURL + instead. If this does not work, clear your browser cache. +

+ + + + +

+ We had to change URLs for the lessons. If you are looking for + one of the CodeRefinery lessons, try changing coderefinery.org to + coderefinery.github.io in the URL to find the page you want. +

+ + + +

+ This is not the page you are looking for ... return back to the + index page? +

+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..241b540e --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +coderefinery.org \ No newline at end of file diff --git a/Roboto.ttf b/Roboto.ttf new file mode 100644 index 00000000..3033308a Binary files /dev/null and b/Roboto.ttf differ diff --git a/about/code-of-conduct/index.html b/about/code-of-conduct/index.html new file mode 100644 index 00000000..415d7549 --- /dev/null +++ b/about/code-of-conduct/index.html @@ -0,0 +1,940 @@ + + + + Code of conduct - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Code of conduct + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Code of conduct

+ + + +

Introduction and source of inspiration

+

In any events or community space organized by CodeRefinery, we are committed to +creating a friendly and respectful place for learning, teaching and +contributing. All participants in our events and communications are expected to +show respect and courtesy to others.

+

We follow the Code of Conduct by the +Carpentries +as primary principles. Here is a summary of CodeRefinery's Code of Conduct +adapted from the Carpentries Code of Conduct:

+

Expected behaviors

+

We are dedicated to providing a welcoming and supportive environment for all +people, regardless of background or identity. By participating in any events or +community space organized by CodeRefinery, participants accept to abide by +CodeRefinery’s Code of Conduct and accept the procedures by which any Code of +Conduct incidents are resolved. Any form of behaviour to exclude, intimidate, +or cause discomfort is a violation of the Code of Conduct.

+

In order to foster a positive and professional learning environment we encourage the following kinds of behaviours in all platforms and events:

+ +

Unexpected behaviors

+

On the other hand, unexpected behaviors include but not limited to:

+ +

Consequence of violation of Code of Conduct

+

Participants who are asked to stop any inappropriate behaviour are expected to +comply immediately. This applies to any events and community space organized by +CodeRefinery, either online or in-person. If a participant engages in behaviour +that violates this code of conduct, the organiser of the event or CodeRefinery +core team member(s) may warn the offender, ask them to leave the event or +platform (without refund, if applicable), or set up an incident-specific +CodeRefinery Code of Conduct Committee to investigate the Code of Conduct +violation and impose appropriate sanctions.

+

Incidence report

+

If you feel that the Code of Conduct was violated in an event organized by +CodeRefinery, no matter if it is online or in physical space, please notify the +coordinator/host of the event (or Code of Conduct facilitator if there is a +dedicated person). If you feel uncomfortable directly notifying someone in the +workshop, use the form in the next paragraph.

+

If the incident happened in a community space organized by CodeRefinery, please +complete this form to report the +incident.

+

Designed CodeRefinery team members have access to reported incidents. We do not +yet have a separate Code of Conduct committee, but we may set up an +incident-specific committee, if reported incidence is deemed to require it.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/contact/index.html b/about/contact/index.html new file mode 100644 index 00000000..a8b89289 --- /dev/null +++ b/about/contact/index.html @@ -0,0 +1,899 @@ + + + + Contact CodeRefinery - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Contact CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Contact CodeRefinery

+ + + +

CodeRefinery is a small organization so far, and no matter who you +talk to, you are close to the core.

+

Chat: Zulip

+

We use Zulip to discuss within our team and community. +We discuss in the open and you can join us on +https://coderefinery.zulipchat.com: you can listen in, follow +certain threads, participate, and influence. Learn how CodeRefinery +uses it.

+

Email: Support line

+

To ask questions about workshops or services or to report issues: +support@coderefinery.org

+

Announcements: Newsletter

+

You can subscribe to the CodeRefinery newsletter +here.

+

Announcements and social media: Mastodon and Twitter

+

If you like what we do, please reach out: +Mastodon at +@coderefinery@fosstodon.org and +Twitter at @coderefine

+

Calendars

+

See calendars.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/contributors/index.html b/about/contributors/index.html new file mode 100644 index 00000000..aec6400b --- /dev/null +++ b/about/contributors/index.html @@ -0,0 +1,1886 @@ + + + + CodeRefinery contributors - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery contributors + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + +

CodeRefinery contributors

+ + + +

Below we list (hopefully) all speakers, instructors, hosts, helpers, and +team leaders of past CodeRefinery workshops, as well as CodeRefinery events +and shared events. Without these contributions, these events would not have been possible. +Thank you so much for your contributions!

+

You can join us too.

+

People who are or were part of the project

+

Here listing all persons who were part of the project as official staff or have +contributed a significant amount of volunteer work.

+ +

Instructors, helpers, and team leads

+ + + + +
+
+

Instructors/speakers

+
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • Anne Fouilloux
  • + +
  • Annika Rockenberger
  • + +
  • Björn Claremar
  • + +
  • Bjørn Lindi
  • + +
  • Dhanya Pushpadas
  • + +
  • Diana Iusan
  • + +
  • Enrico Glerean
  • + +
  • Gregor Decristoforo
  • + +
  • Hande Celikkanat
  • + +
  • Hossein Firooz
  • + +
  • Jarno Rantaharju
  • + +
  • Jens Wehner
  • + +
  • Johan Hellsvik
  • + +
  • Johan Hidding
  • + +
  • João M. da Silva
  • + +
  • Juho Lehtonen
  • + +
  • Jyry Suvilehto
  • + +
  • Leon Boschman
  • + +
  • Luca Ferranti
  • + +
  • Marijn van Vliet
  • + +
  • Mark Abraham
  • + +
  • Matias Jääskeläinen
  • + +
  • Matteo Tomasini
  • + +
  • Matus Kalas
  • + +
  • Max Roald Eckardt
  • + +
  • Max Schön
  • + +
  • N. D.
  • + +
  • Nico Reissmann
  • + +
  • Nils Charles Prieur
  • + +
  • Pavlin Mitev
  • + +
  • Pinja Koskinen
  • + +
  • Radovan Bast
  • + +
  • Raphaela Heil
  • + +
  • Richard Darst
  • + +
  • Sabry Razick
  • + +
  • Samantha Wittke
  • + +
  • Seija Sirkiä
  • + +
  • Simo Tuomisto
  • + +
  • Sri Harsha Vathsavayi
  • + +
  • Stefan Negru
  • + +
  • Teemu Ruokolainen
  • + +
  • Thomas Pfau
  • + +
  • Thor Wikfeldt
  • + +
  • Viktor Rehnberg
  • + +
  • Will Usher
  • + +
  • Yonglei Wang
  • + +
  • Yu Tian
  • + +
+
+ +
+

Hosts, helpers, and team leaders

+
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • Abel Carreras
  • + +
  • Agneta Ghose
  • + +
  • Aili Sarre
  • + +
  • Alberto Lazzarotto
  • + +
  • Aleksandra Wilczynska
  • + +
  • Amir Ebrahimi Fard
  • + +
  • Ankita Priya
  • + +
  • Annajiat Alim Rasel
  • + +
  • Anne Fouilloux
  • + +
  • Anni Järvenpää
  • + +
  • Annika Rockenberger
  • + +
  • Anthony Scemama
  • + +
  • Ashwin Vishnu
  • + +
  • Athanasios Protopapas
  • + +
  • Björn Claremar
  • + +
  • Bjørn Lindi
  • + +
  • Carolina Robustini
  • + +
  • Cristian Cira
  • + +
  • Dan Mønster
  • + +
  • Daniel Holmberg
  • + +
  • Devaraju Narayanappa
  • + +
  • Dhanya Pushpadas
  • + +
  • Diana Iusan
  • + +
  • Dmytro Fishman
  • + +
  • Dmytro Kryvokhyzha
  • + +
  • Ebrahim Afyounian
  • + +
  • Emilia Lipponen
  • + +
  • Emiliano Gelati
  • + +
  • Emiliano Molinaro
  • + +
  • Enrico Glerean
  • + +
  • Erika Yashiro
  • + +
  • Evelien Van Dijk
  • + +
  • Evgeny Posenitskiy
  • + +
  • Fabricio Oliveira
  • + +
  • Flavio Calvo
  • + +
  • Francesco Tabaro
  • + +
  • Giordano Lipari
  • + +
  • Hadrien Gourlé
  • + +
  • Harshit Agrawal
  • + +
  • Hasti Narimanzadeh
  • + +
  • Heather Andrews
  • + +
  • Heikki Lehväslaiho
  • + +
  • Hui Tang
  • + +
  • Ingrid Strandberg
  • + +
  • Inigo Aldazabal
  • + +
  • Ivan Kuzmin
  • + +
  • Jakob Sauer Jørgensen
  • + +
  • Janne Blomqvist
  • + +
  • Jannetta Steyn
  • + +
  • Jarno Rantaharju
  • + +
  • Jean Iaquinta
  • + +
  • Jens Wehner
  • + +
  • Joakim Löfgren
  • + +
  • Johan Hellsvik
  • + +
  • Johan Hidding
  • + +
  • Jose Carlos Llanusa
  • + +
  • João M. da Silva
  • + +
  • Juan Sebastian Diaz Boada
  • + +
  • Juho Lehtonen
  • + +
  • Kaveh Karimi
  • + +
  • Kerstin Lenk
  • + +
  • Lauri Neuvonen
  • + +
  • Leif Wigge
  • + +
  • Lesetja Lekoloane
  • + +
  • Lex Nederbragt
  • + +
  • Lora Armstrong
  • + +
  • Luc Girod
  • + +
  • Luca Ferranti
  • + +
  • Lucy Whalley
  • + +
  • Luis Amezcua
  • + +
  • Manana Koberidze
  • + +
  • Manuel Garcia Alvarez
  • + +
  • Marco Foscato
  • + +
  • Marijn Van Vliet
  • + +
  • Massimo Pizzol
  • + +
  • Matthew Morris
  • + +
  • Matúš Kalaš
  • + +
  • Maurits Kok
  • + +
  • Max Roald Eckardt
  • + +
  • Meron Vermaas
  • + +
  • Mika Jalava
  • + +
  • Mikael Djurfeldt
  • + +
  • Mikael Öhman
  • + +
  • Mikhail Papkov
  • + +
  • Mikko Heikkilä
  • + +
  • Naoe Tatara
  • + +
  • Narayan Puthanmadam Subramaniyam
  • + +
  • Nico Reissmann
  • + +
  • Niharika Gauraha
  • + +
  • Niket Agrawal
  • + +
  • Octavian Andrei
  • + +
  • Patric Holmvall
  • + +
  • Paula Martinez Lavanchy
  • + +
  • Pavlin Mitev
  • + +
  • Pedro Ojeda
  • + +
  • Pedro Ojeda May
  • + +
  • Pengfei Xu
  • + +
  • Peter Kjellström
  • + +
  • Philip Gjedde
  • + +
  • Pradeep Eranti
  • + +
  • Preethy Nair
  • + +
  • Qiang Li
  • + +
  • Radek Lonka
  • + +
  • Radovan Bast
  • + +
  • Raphaela Heil
  • + +
  • Raul Ortiz Merino
  • + +
  • Richard Darst
  • + +
  • Roberto Di Remigio
  • + +
  • Rohit Goswami
  • + +
  • Romain Caneill
  • + +
  • Ruslan Zhuravchak
  • + +
  • Sabry Razick
  • + +
  • Samantha Wittke
  • + +
  • Sebastian Schmidt
  • + +
  • Shashank Shekhar Harivyasi
  • + +
  • Shreyas Deshpande
  • + +
  • Simoneta Caño de Las Heras
  • + +
  • Sri Harsha Vathsavayi
  • + +
  • Stephan Smuts
  • + +
  • Stephanie van de Sandt
  • + +
  • Stig Rune Jensen
  • + +
  • Sunniva Indrehus
  • + +
  • Susan Branchett
  • + +
  • Ted Hsuan Yun Chen
  • + +
  • Thomas Arildsen
  • + +
  • Thor Wikfeldt
  • + +
  • Tobias Lindstrøm Jensen
  • + +
  • Toby Hodges
  • + +
  • Tomasz Kopec
  • + +
  • Tomi Häkkinen
  • + +
  • Tor Kjellsson Lindblom
  • + +
  • Tuomas Rossi
  • + +
  • Vang Que Le
  • + +
  • Vesa Vahermaa
  • + +
  • Will Usher
  • + +
  • Ygor Morais Jaques
  • + +
  • Zubair Maalick
  • + +
+
+
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/funding/asc.png b/about/funding/asc.png new file mode 100644 index 00000000..45e833fc Binary files /dev/null and b/about/funding/asc.png differ diff --git a/about/funding/chc.png b/about/funding/chc.png new file mode 100644 index 00000000..9f263eeb Binary files /dev/null and b/about/funding/chc.png differ diff --git a/about/funding/csc.png b/about/funding/csc.png new file mode 100644 index 00000000..3268bd81 Binary files /dev/null and b/about/funding/csc.png differ diff --git a/about/funding/deic.png b/about/funding/deic.png new file mode 100644 index 00000000..a591abf6 Binary files /dev/null and b/about/funding/deic.png differ diff --git a/about/funding/enccs.png b/about/funding/enccs.png new file mode 100644 index 00000000..88f0984b Binary files /dev/null and b/about/funding/enccs.png differ diff --git a/about/funding/index.html b/about/funding/index.html new file mode 100644 index 00000000..d7fbc4d9 --- /dev/null +++ b/about/funding/index.html @@ -0,0 +1,873 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/funding/naiss.jpg b/about/funding/naiss.jpg new file mode 100644 index 00000000..1f7805f2 Binary files /dev/null and b/about/funding/naiss.jpg differ diff --git a/about/funding/neic.png b/about/funding/neic.png new file mode 100644 index 00000000..a68367fc Binary files /dev/null and b/about/funding/neic.png differ diff --git a/about/funding/nris.svg b/about/funding/nris.svg new file mode 100644 index 00000000..9a312527 --- /dev/null +++ b/about/funding/nris.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/about/funding/sigma2.png b/about/funding/sigma2.png new file mode 100644 index 00000000..02eee75c Binary files /dev/null and b/about/funding/sigma2.png differ diff --git a/about/goodies.jpg b/about/goodies.jpg new file mode 100644 index 00000000..a77e1c11 Binary files /dev/null and b/about/goodies.jpg differ diff --git a/about/goodies/index.html b/about/goodies/index.html new file mode 100644 index 00000000..cba45ac6 --- /dev/null +++ b/about/goodies/index.html @@ -0,0 +1,888 @@ + + + + CodeRefinery goodies - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery goodies + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

CodeRefinery goodies

+ + + + CodeRefinery stickers, patches and t-shirt +

We have some goodies for you!

+

We rely on you to spread the word about CodeRefinery in your communities. For that we have got some goodies with our logo to wear or stick on your laptops:

+ +

All of those you can get at CodeRefinery events, if you meet us at conferences or upon request to support@coderefinery.org (on best effort basis).

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/history/index.html b/about/history/index.html new file mode 100644 index 00000000..dbadde26 --- /dev/null +++ b/about/history/index.html @@ -0,0 +1,912 @@ + + + + History of the project - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - History of the project + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

History of the project

+ + + +

The project idea/directive grew out of two courses given at PDC/KTH in 2014 +and 2015, which focused on research software engineering tools and techniques.

+

The courses were popular and it was clear that the demand is not +limited to the Stockholm region and we approached the Nordic +e-Infrastructure Collaboration (NeIC), a +state-funded Nordic public funding organization, to bring this +project to a Nordic level, both to have more impact, but also to +connect instructors across Nordic borders. The first grant was +2016--2018, with NeIC, CSC (Finland), SNIC (Sweden), DeIC +(Denmark), and UNINETT Sigma2 (Norway) as partners.

+

The first CodeRefinery workshop was given late 2016 and since then the lesson +material has evolved a lot and we have delivered many more workshops, both +in-person and online.

+

In 2018 the project has received follow-up funding from NeIC for 3 more years, +2018--2021. The partners were the same as the first phase, but now +including the University of Tartu (Estonia). Aalto University +(Finland) formally joined the last year after being a long-term +voluntary participant.

+

In 2020, COVID-19 hit, and everyone went online. We didn't take an +opportunity to do the same thing, but online, while waiting for things +to become normal. Instead, we took advantage of being equally close +to each other (online) as to our previous in-person teams (now online) +to work together much more closely than we used to. We developed an +extensive and unique CodeRefinery teaching +style which stayed with us even +post-Covid.

+

In 2021 the project successfully applied to the NeIC open call +for another 3 years, 2022--2025. The focus of this phase is to +produce a sustainable organization that can exist without NeIC's +funding. The partners at the beginning of the phase were NeIC, Aalto +University, Aarhus University CHCAA (Denmark), Aalborg University +CLAAUDIA (Denmark), CSC (Finland), DeiC (Denmark), ENCCS (Sweden), NAISS (formerly SNIC; Sweden), +Sigma2 (Norway), and the University of Oslo USIT (Norway).

+

CodeRefinery now welcomes other partners to join.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/impact/index.html b/about/impact/index.html new file mode 100644 index 00000000..5994451f --- /dev/null +++ b/about/impact/index.html @@ -0,0 +1,902 @@ + + + + Impact of online CodeRefinery workshops - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Impact of online CodeRefinery workshops + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Impact of online CodeRefinery workshops

+ + + +

Over 1700 people have attended a CodeRefinery workshop since the project started! Since the pandemic started, we shifted the gear towards online workshops. In total about 900 participated in online CodeRefinery workshops.

+

Along the change in tools and practices, we changed questions in pre-/post-workshop surveys. To provide the most consistent and recent picture of our participants and impact, the below is based on data provided by pre-/post-workshop surveys answered in relevance to only online workshops. (Note: pre-/post-workshops are opt-in.)

+

Participants' background

+

Results of pre-workshop surveys (answers given by 301 persons) show that our workshop participants range from undergraduate students to full +professors, and come from a variety of academic disciplines.

+

The chart below shows the result of a question asking about their job title, position or occupation.

+ +

alt text

+

The chart below shows the result of a question asking about their academic discipline.
+alt text

+

What is our impact?

+

The long-term impact of CodeRefinery workshops is measured through a +post-workshop survey which is sent out to all former participants 3 months to 1 year after attending a workshop. To date (12th Sep 2021) we received 80 voluntary responses to +a post-workshop survey by participants of an online workshop.

+

The heatmap below shows how former participants +use various software development tools after attending a workshop, and +how their code and collaboration with colleagues has changed.

+

Please note that a part of responses answered the specific tool to different types of impact, for example, there are cases where both "started using" and "using better" was chosen for "Version control".

+

alt text

+

The chart below shows fraction of former participants who feel their code and collaboration with colleagues has been improved. +alt text

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..8b37ef74 --- /dev/null +++ b/about/index.html @@ -0,0 +1,979 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

About the project

+ + +
+ +
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/newsletter/index.html b/about/newsletter/index.html new file mode 100644 index 00000000..8d77fdb9 --- /dev/null +++ b/about/newsletter/index.html @@ -0,0 +1,887 @@ + + + + Newsletter - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Newsletter + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Newsletter

+ + + +

Updates every month or two

+

If you would like to receive our newsletter, please subscribe here: +https://postit.csc.fi/sympa/subscribe/coderefinery

+

You can also read past newsletters in our archive.

+

Weekly chat summary

+

If you want to get weekly updates about what is happening in our chat, please subscribe to our "chat summary": +https://postit.csc.fi/sympa/subscribe/coderefinery-team

+

Thanks to CSC for hosting the mailing lists

+

The service is hosted by CSC - IT Center for Science, Finland.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/partners/index.html b/about/partners/index.html new file mode 100644 index 00000000..ca6d6959 --- /dev/null +++ b/about/partners/index.html @@ -0,0 +1,1065 @@ + + + + Partners and sponsors - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Partners and sponsors + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Partners and sponsors

+ + + +

Funding

+NeIC logo +

This project is funded by the Nordic e-Infrastructure Collaboration (NeIC). The +project is now in its third phase (2022--2025). NeIC directly funds a 50% +position for project management and a 40% position for workshop and training +coordination. NeIC also provides funding for travel, meetings, and conferences.

+

Organizations providing in-kind support

+

A number of organizations encourage their staff to teach and co-organize +CodeRefinery workshops as part of their work time.

+
+
+
+
+ + logo: Aalto Scientific Computing + +
+ +
+
Richard Darst
+
Enrico Glerean
+
Thomas Pfau
+
Jarno Rantaharju
+
+
+
+
+
+
+
+
+ + logo: CSC - IT Center for Science + +
+ +
+
Matias Jääskeläinen
+
Samantha Wittke
+
+
+
+
+
+
+
+
+ + logo: Center for Humanities Computing + +
+ +
+
Stephan Smuts
+
+
+
+
+
+
+ +
+
+
+
+
+
+ + logo: EuroCC National Competence Center Sweden (ENCCS) + +
+ +
+
Thor Wikfeldt
+
+
+
+
+
+
+
+
+ + logo: National Academic Infrastructure for Super­computing in Sweden (NAISS) + +
+ +
+
Diana Iusan
+
Johan Hellsvik
+
+
+
+
+
+
+
+ +
+ +

NRIS/Sigma2

+
+

Norway

+
+
+
Radovan Bast
+
Bjørn Lindi
+
Dhanya Pushpadas
+
+
+
+
+

If you would like to contribute to shaping the future of the project, please +encourage your organization to join as well. While it costs them your work time +it has also proven to increase cross-organisation and international +collaborations, not only for CodeRefinery workshops.

+

Partners providing local support

+

Our workshops are free to all, because why not. However, teaching doesn't end +after the class. Partners both help organize courses and provide support for +learners during and after the courses. See information for +organizations on how your organization can join.

+

Aalto University (Aalto Scientific Computing, ASC)

+logo: Aalto Scientific Computing +

ASC has been involved in CodeRefinery since 2017.

+ +

TU Delft

+

TU Delft has provided local breakoutrooms for many core workshops.

+

VU Amsterdam

+

VU Amsterdam has provided local breakoutrooms for many core workshops.

+

We are supported by Zulip

+Zulip logo +

Zulip is an open-source modern team chat app designed to keep both live and +asynchronous conversations organized. We very much appreciate their support by +hosting our chat for free.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/presentations/index.html b/about/presentations/index.html new file mode 100644 index 00000000..20250f13 --- /dev/null +++ b/about/presentations/index.html @@ -0,0 +1,985 @@ + + + + Presentations - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Presentations + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Presentations

+ + + +
+

Zenodo community

+

Recently we like to deposit our presentations in the Zenodo CodeRefinery +community. This way, +presentation slides don't disappear, they can be cited, and you can find them +all in one place.

+

You can also submit your own presentations or derivative work to the CodeRefinery community on Zenodo. +This community is not only for lessons but also presentations and reports.

+
+

CodeRefinery project presentation slides

+

For a quick overview and in case you would like to add some slides about the CodeRefinery project to your own presentations, +please check out our short slideset +and find the source in markdown and LibreOffice Impress odp format in our +presentation repository (named 2024-CodeRefinery-basic.*).

+

2024

+ +

2023

+ +

2022

+ +

2021

+ +

2020

+ +

2019

+ +

2017

+ +

2016

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/project/index.html b/about/project/index.html new file mode 100644 index 00000000..9022edf8 --- /dev/null +++ b/about/project/index.html @@ -0,0 +1,1051 @@ + + + + The CodeRefinery project - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - The CodeRefinery project + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

The CodeRefinery project

+ + + + + +

Objectives

+

CodeRefinery improves science by providing training and infrastructure +for researchers, who often need to use computational tools but have +little training in tools beyond basic programming. Our support allows +research to be more reproducible, open, and efficient and thus +promotes the goals of open science and FAIR data management - in +addition to making the lives of countless researchers better, since +they learn the tools needed to do their work with less trouble.

+

We are most known for our practical-level workshop +about base-level practices of software development tools for +researchers. We are also known for our +unique and engaging online teaching +style, and are building a community +around this type of shared teaching.

+

Through our spin-off project Nordic-RSE, we +serve as a hub for research software engineers in the Nordic +countries, namely in Iceland, Denmark, Norway, Sweden, Finland, and +Estonia. Research Software Engineers are basically the professional +level of what we teach, and the two-way collaboration is very +productive.

+

We are a community project seeking volunteers to sustain what we have +accomplished in the first five years.

+

Key facts

+ +

CodeRefinery and The Carpentries

+

We are basically intermediate-level +Carpentries lessons and would like to work +more closely with The Carpentries. Our in-person workshops are +basically "Carpentries-style", though our online workshops have +adopted our own unique style. Our +overall philosophy is similar. Our target audience is learners who +already have some experience with programming and would like to +develop software in a more efficient and sustainable way. We believe +that for many learners we can offer a good second step after their +Carpentries workshop.

+

We would like to work more closely with The Carpentries and offer our +lessons as intermediate-level carpentries. If you are reading this, +please get in touch.

+

Core Activities

+ +

Infrastructure services

+

Our code repository hosting service is open and free for all +researchers based in Nordic universities and research institutes. Please +contact us if you would like to use these services.

+

Training opportunities

+

We offer training opportunities to researchers from Nordic research groups and projects +to learn basic-to-advanced research computing skills and become confident in using +state-of-the-art tools and practices from modern collaborative software +engineering.

+

CodeRefinery Workshops

+

The key objective of CodeRefinery workshop is to grow researchers' software +best practices skills to facilitate open and reproducible research.

+ +

Instructor training workshops

+

One purpose of our Instructor training workshops is to train +CodeRefinery instructors, but being (or becoming) a CodeRefinery +instructor is not required. With the workshops we also aim at building +partnerships with research software engineers +and researchers who are willing to lead skills' transfer within their +local communities in the Nordics.

+ +

Other types of events

+

We have organized hackathons, get-together events and shorter workshops +customized for individual research groups. Regularly we also host +online Open House events where CodeRefinery instructors together with +a wider community of interested people work in sprints on topics +ranging from lesson development to website updates.

+

We're always interested in new collaborations, so if you would like to +co-organize an event with us or suggest a new type of event, don't +hesitate to get in touch!

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/reports/index.html b/about/reports/index.html new file mode 100644 index 00000000..acefb7b2 --- /dev/null +++ b/about/reports/index.html @@ -0,0 +1,927 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Articles and reports

+ + + +

Articles and blog posts about CodeRefinery

+ +

Mentions of the CodeRefinery project in other materials

+ +

Project proposals, reports, and documents

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/about/reports/open-call-2021-evaluation.pdf b/about/reports/open-call-2021-evaluation.pdf new file mode 100644 index 00000000..5c1a7609 Binary files /dev/null and b/about/reports/open-call-2021-evaluation.pdf differ diff --git a/about/reports/open-call-2021-proposal.pdf b/about/reports/open-call-2021-proposal.pdf new file mode 100644 index 00000000..edb74ccd Binary files /dev/null and b/about/reports/open-call-2021-proposal.pdf differ diff --git a/about/reports/phase-1-collaboration-agreement.pdf b/about/reports/phase-1-collaboration-agreement.pdf new file mode 100644 index 00000000..ff9d7a8d Binary files /dev/null and b/about/reports/phase-1-collaboration-agreement.pdf differ diff --git a/about/reports/phase-1-project-directive.pdf b/about/reports/phase-1-project-directive.pdf new file mode 100644 index 00000000..b851c0aa Binary files /dev/null and b/about/reports/phase-1-project-directive.pdf differ diff --git a/about/reports/phase-1-project-plan-v1.0.pdf b/about/reports/phase-1-project-plan-v1.0.pdf new file mode 100644 index 00000000..f0f88d35 Binary files /dev/null and b/about/reports/phase-1-project-plan-v1.0.pdf differ diff --git a/about/reports/phase-1-report.pdf b/about/reports/phase-1-report.pdf new file mode 100644 index 00000000..f4bbf29c Binary files /dev/null and b/about/reports/phase-1-report.pdf differ diff --git a/about/reports/phase-2-collaboration-agreement.pdf b/about/reports/phase-2-collaboration-agreement.pdf new file mode 100644 index 00000000..f5c2de6d Binary files /dev/null and b/about/reports/phase-2-collaboration-agreement.pdf differ diff --git a/about/reports/phase-2-mid-term-report.pdf b/about/reports/phase-2-mid-term-report.pdf new file mode 100644 index 00000000..04c95bed Binary files /dev/null and b/about/reports/phase-2-mid-term-report.pdf differ diff --git a/about/reports/phase-2-project-directive.pdf b/about/reports/phase-2-project-directive.pdf new file mode 100644 index 00000000..1ab63feb Binary files /dev/null and b/about/reports/phase-2-project-directive.pdf differ diff --git a/about/reports/phase-2-project-plan.pdf b/about/reports/phase-2-project-plan.pdf new file mode 100644 index 00000000..34308398 Binary files /dev/null and b/about/reports/phase-2-project-plan.pdf differ diff --git a/about/reports/phase-2-report.pdf b/about/reports/phase-2-report.pdf new file mode 100644 index 00000000..6f4a362a Binary files /dev/null and b/about/reports/phase-2-report.pdf differ diff --git a/about/reports/phase-3-collaboration-agreement.pdf b/about/reports/phase-3-collaboration-agreement.pdf new file mode 100644 index 00000000..60860df7 Binary files /dev/null and b/about/reports/phase-3-collaboration-agreement.pdf differ diff --git a/about/reports/phase-3-project-plan.pdf b/about/reports/phase-3-project-plan.pdf new file mode 100644 index 00000000..2eb20da9 Binary files /dev/null and b/about/reports/phase-3-project-plan.pdf differ diff --git a/about/statistics/index.html b/about/statistics/index.html new file mode 100644 index 00000000..7f9a09d8 --- /dev/null +++ b/about/statistics/index.html @@ -0,0 +1,5741 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + +

Registration statistics

+ + + +

This is mainly to simplify reporting to funding organizations. But maybe it is +also interesting otherwise.

+ + + + +

Standard CodeRefinery workshops

+ + +

+ Number of participants/registrants by country of affiliation. + When interpreting the number of twitch viewers, consider + that some exercise classroom join as one viewer. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventTimeSwedenNorwayFinlandDenmarkEstoniaIcelandNetherlandsOtherTotalTwitch viewersZoom
+ + Full online workshop (6 half-days) + + + + + Sep 10 + - + Sep 19, 2024 + + + + 46 + + + + + + 62 + + + + + + 125 + + + + + + 11 + + + + + + 16 + + + + + + + + 6 + + + + + + + + 90 + + + + + + 356 + + + + + 135—481 + + + +
+ + Gothenburg + + + + + Aug 27 + - + Aug 29, 2024 + + + + 9 + + + + + + + + + + + + + + + + + + + + + + + + 9 + + + + + + +
+ + Full online workshop (6 half-days) + + + + + Mar 12 + - + Mar 21, 2024 + + + + 38 + + + + + + 21 + + + + + + 111 + + + + + + 14 + + + + + + + + + + 13 + + + + + + + + 66 + + + + + + 263 + + + + + 39—107 + + + +
+ + Full online workshop (6 half-days) + + + + + Sep 19 + - + Sep 28, 2023 + + + + 31 + + + + + + 103 + + + + + + 100 + + + + + + + + + + + + 19 + + + + + + + + 107 + + + + + + 360 + + + + + 54—145 + + + +
+ + Full online workshop (6 half-days) + + + + + Mar 21 + - + Mar 30, 2023 + + + + 87 + + + + + + 43 + + + + + + 178 + + + + + + 19 + + + + + + + + + + 58 + + + + + + + + 108 + + + + + + 493 + + + + + 112—216 + + + +
+ + Uppsala + + + + + May 9 + - + May 11, 2023 + + + + 15 + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + +
+ + Full online workshop (6 half-days) + + + + + Sep 20 + - + Sep 29, 2022 + + + + 52 + + + + + + 50 + + + + + + 76 + + + + + + 7 + + + + + + + + + + 34 + + + + + + + + 43 + + + + + + 262 + + + + + 97—157 + + + + 25—59 + +
+ + Full online workshop (6 half-days) + + + + + Mar 22 + - + Mar 31, 2022 + + + + 46 + + + + + + 87 + + + + + + 54 + + + + + + 14 + + + + + + + + + + 55 + + + + + + + + 41 + + + + + + 297 + + + + + 144—215 + + + +
+ + Full online workshop (6 half-days) + + + + + May 10 + - + May 20, 2021 + + + + 21 + + + + + + 43 + + + + + + 24 + + + + + + 12 + + + + + + + + + + 16 + + + + + + + + 12 + + + + + + 128 + + + + + + +
+ + Online + + + + + Nov 17 + - + Nov 26, 2020 + + + + 27 + + + + + + 26 + + + + + + 3 + + + + + + + + + + + + + + + + 21 + + + + + + 77 + + + + + + +
+ + Online + + + + + Oct 20 + - + Oct 29, 2020 + + + + 19 + + + + + + 4 + + + + + + 22 + + + + + + 11 + + + + + + + + + + 43 + + + + + + + + 1 + + + + + + 100 + + + + + + +
+ + Online (Mega-CodeRefinery) + + + + + May 25 + - + Jun 4, 2020 + + + + 5 + + + + + + 16 + + + + + + 75 + + + + + + 2 + + + + + + + + 1 + + + + + + + + + + 3 + + + + + + 102 + + + + + + +
+ + Trondheim + + + + + Feb 25 + - + Feb 27, 2020 + + + + 1 + + + + + + 26 + + + + + + + + + + + + + + + + + + 1 + + + + + + 28 + + + + + + +
+ + Espoo + + + + + Dec 10 + - + Dec 12, 2019 + + + + + + + + 30 + + + + + + + + + + + + + + + + + + + + 30 + + + + + + +
+ + Lille + + + + + Nov 25 + - + Dec 5, 2019 + + + + + + + + + + + + + + + + + + + + 28 + + + + + + 28 + + + + + + +
+ + Stockholm + + + + + Nov 19 + - + Nov 21, 2019 + + + + 28 + + + + + + + + + + + + + + + + + + + + + + + + 28 + + + + + + +
+ + Trondheim + + + + + Oct 22 + - + Oct 24, 2019 + + + + + + 20 + + + + + + + + + + + + + + + + + + + + + + 20 + + + + + + +
+ + Aalborg + + + + + Jun 11 + - + Jun 13, 2019 + + + + + + + + + + 18 + + + + + + + + + + + + + + 2 + + + + + + 20 + + + + + + +
+ + Oslo + + + + + Jun 3 + - + Jun 5, 2019 + + + + 1 + + + + + + 18 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 20 + + + + + + +
+ + Helsinki + + + + + May 27 + - + May 29, 2019 + + + + 1 + + + + + + + + 26 + + + + + + + + + + + + + + + + + + + + 27 + + + + + + +
+ + Gothenburg + + + + + May 21 + - + May 23, 2019 + + + + 25 + + + + + + + + + + + + + + + + + + + + + + + + 25 + + + + + + +
+ + Tartu + + + + + Apr 2 + - + Apr 4, 2019 + + + + + + + + + + + + 25 + + + + + + + + + + + + 1 + + + + + + 26 + + + + + + +
+ + Stockholm + + + + + Mar 25 + - + Mar 27, 2019 + + + + 28 + + + + + + + + + + + + + + + + + + + + 2 + + + + + + 30 + + + + + + +
+ + Espoo + + + + + Dec 11 + - + Dec 13, 2018 + + + + + + + + 31 + + + + + + 1 + + + + + + + + + + + + + + 1 + + + + + + 33 + + + + + + +
+ + Uppsala + + + + + Dec 3 + - + Dec 5, 2018 + + + + 30 + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + 31 + + + + + + +
+ + Kiruna + + + + + Nov 21 + - + Nov 23, 2018 + + + + 36 + + + + + + 1 + + + + + + + + + + + + + + + + + + 1 + + + + + + 38 + + + + + + +
+ + Reykjavik + + + + + Aug 21 + - + Aug 23, 2018 + + + + 3 + + + + + + + + + + + + + + 22 + + + + + + + + + + 1 + + + + + + 26 + + + + + + +
+ + Oslo + + + + + Jun 12 + - + Jun 14, 2018 + + + + 3 + + + + + + 38 + + + + + + + + + + + + + + + + + + 1 + + + + + + 42 + + + + + + +
+ + Espoo + + + + + May 29 + - + May 31, 2018 + + + + + + + + 48 + + + + + + + + + + + + + + + + + + + + 48 + + + + + + +
+ + Lund + + + + + May 15 + - + May 17, 2018 + + + + 30 + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 31 + + + + + + +
+ + Turku + + + + + Mar 20 + - + Mar 22, 2018 + + + + 1 + + + + + + + + 22 + + + + + + + + + + + + + + + + + + + + 23 + + + + + + +
+ + Trondheim + + + + + Feb 27 + - + Mar 1, 2018 + + + + 1 + + + + + + 20 + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 22 + + + + + + +
+ + Espoo + + + + + Dec 14 + - + Dec 16, 2017 + + + + + + + + 40 + + + + + + + + + + + + + + + + + + + + 40 + + + + + + +
+ + Linköping + + + + + Nov 7 + - + Nov 9, 2017 + + + + 21 + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + 22 + + + + + + +
+ + Aarhus + + + + + Oct 24 + - + Oct 26, 2017 + + + + 3 + + + + + + + + + + 24 + + + + + + + + + + + + + + + + + + 27 + + + + + + +
+ + Tromsø + + + + + Jun 19 + - + Jun 21, 2017 + + + + 1 + + + + + + 21 + + + + + + + + + + + + + + + + + + 1 + + + + + + 23 + + + + + + +
+ + Copenhagen + + + + + May 9 + - + May 11, 2017 + + + + 3 + + + + + + + + + + 19 + + + + + + + + + + 1 + + + + + + + + + + + + 23 + + + + + + +
+ + Stockholm + + + + + Feb 20 + - + Feb 22, 2017 + + + + 34 + + + + + + + + + + + + + + + + + + + + + + + + 34 + + + + + + +
+ + Espoo + + + + + Dec 14 + - + Dec 16, 2016 + + + + + + + + 25 + + + + + + + + + + + + + + + + + + + + 25 + + + + + + +
+ Total + + 39 + + 646 + + 601 + + 990 + + 155 + + 41 + + 23 + + 245 + + 531 + + 3232 +
+ + +

Instructor training events

+ + +

+ Number of participants/registrants by country of affiliation. + When interpreting the number of twitch viewers, consider + that some exercise classroom join as one viewer. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventTimeSwedenNorwayFinlandDenmarkEstoniaIcelandNetherlandsOtherTotalTwitch viewersZoom
+ + Online (with FocusCoE) + + + + + Nov 2 + - + Nov 9, 2020 + + + + + + + + + + + + + + + + + + + + 14 + + + + + + 14 + + + + + + +
+ + Online (with TU Delft) + + + + + Jun 24 + - + Jun 25, 2020 + + + + + + 1 + + + + + + 1 + + + + + + + + + + + + 21 + + + + + + + + + + + + 23 + + + + + + +
+ + Stockholm + + + + + Nov 4 + - + Nov 5, 2019 + + + + 15 + + + + + + 8 + + + + + + 2 + + + + + + 2 + + + + + + 2 + + + + + + + + + + + + 1 + + + + + + 30 + + + + + + +
+ Total + + 3 + + 15 + + 9 + + 3 + + 2 + + 2 + + 0 + + 21 + + 15 + + 67 +
+ + +

Shorter workshops and other events

+ + +

+ Number of participants/registrants by country of affiliation. + When interpreting the number of twitch viewers, consider + that some exercise classroom join as one viewer. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventTimeSwedenNorwayFinlandDenmarkEstoniaIcelandNetherlandsOtherTotalTwitch viewersZoom
+ + CarpentryCon 2022: Online teaching strategies from CodeRefinery + + + + + Aug 3, 2022 + + + + + + + + + + + + + + + + + + + + 15 + + + + + + 15 + + + + + + +
+ + Community teaching mini-workshop + + + + + Jun 21, 2022 + + + + 5 + + + + + + 7 + + + + + + 5 + + + + + + 2 + + + + + + + + + + + + + + 3 + + + + + + 22 + + + + + + +
+ + Git workshop with Compex Systems Modelling group at UiT + + + + + Feb 16 + - + Feb 23, 2022 + + + + + + 19 + + + + + + + + + + + + + + + + + + + + + + 19 + + + + + + +
+ + Python for Scientific Computing + + + + + Oct 25 + - + Oct 28, 2021 + + + + + + + + + + + + + + + + + + + + + + + +
+ + CodeRefinery workshop with focus on Git and GitLab for Metacenter + + + + + Mar 25 + - + Apr 8, 2021 + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + +
+ + Online CodeRefinery Hackathon on Software Testing + + + + + Mar 17 + - + Mar 24, 2021 + + + + 16 + + + + + + 6 + + + + + + 4 + + + + + + 3 + + + + + + + + + + + + + + 4 + + + + + + 33 + + + + + + +
+ + Online CodeRefinery Workshop on Software Testing + + + + + Mar 17, 2021 + + + + 31 + + + + + + 14 + + + + + + 7 + + + + + + 5 + + + + + + + + + + 2 + + + + + + + + 10 + + + + + + 69 + + + + + + +
+ + Introduction to Shell, Computing resources for researchers, and HPC Kickstart (Aalto University and University of Oslo) (online) + + + + + Jan 29, 2021 + + + + + + 59 + + + + + + 71 + + + + + + + + + + + + + + + + + + + + 130 + + + + + + +
+ + Introduction to Conda for (Data) Scientists (online) + + + + + Jan 8, 2021 + + + + 1 + + + + + + 39 + + + + + + 5 + + + + + + + + + + + + 2 + + + + + + + + 1 + + + + + + 48 + + + + + + +
+ + Collaborative version control with Git (online) + + + + + Dec 10 + - + Dec 11, 2020 + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + +
+ + Version control (Karlstad/online) + + + + + Sep 22 + - + Sep 23, 2020 + + + + 11 + + + + + + + + + + + + + + + + + + + + 1 + + + + + + 12 + + + + + + +
+ + Python for Scientific Computing (online) + + + + + Sep 14 + - + Sep 23, 2020 + + + + 3 + + + + + + 24 + + + + + + 41 + + + + + + + + + + + + + + + + + + + + 68 + + + + + + +
+ + GitHub without command line (Tampere/online) + + + + + Aug 13, 2020 + + + + + + + + 16 + + + + + + + + + + + + + + + + + + + + 16 + + + + + + +
+ + Workshop for those familiar with Git (online) + + + + + May 18 + - + May 20, 2020 + + + + 20 + + + + + + 2 + + + + + + 1 + + + + + + + + + + + + + + + + 4 + + + + + + 27 + + + + + + +
+ + Collaborative Git (online) + + + + + May 6, 2020 + + + + 25 + + + + + + 5 + + + + + + 3 + + + + + + 4 + + + + + + + + + + + + + + + + + + 37 + + + + + + +
+ + GitHub without command line (online) + + + + + Apr 15 + - + Apr 22, 2020 + + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + +
+ + Introduction to Git (online) + + + + + Apr 7 + - + Apr 8, 2020 + + + + 19 + + + + + + + + 1 + + + + + + + + + + + + + + + + 2 + + + + + + 22 + + + + + + +
+ + Best Software Practices for the Norwegian Earth System Model (Oslo/Bergen/Online) + + + + + Feb 5, 2020 + + + + + + 30 + + + + + + + + + + + + + + + + + + + + + + 30 + + + + + + +
+ + Social coding and open software (Oslo) + + + + + Jan 9, 2020 + + + + + + 21 + + + + + + + + + + + + + + + + + + + + + + 21 + + + + + + +
+ + Hackathon (Stockholm) + + + + + Nov 6 + - + Nov 7, 2019 + + + + 4 + + + + + + 8 + + + + + + 3 + + + + + + 1 + + + + + + 1 + + + + + + + + + + + + 1 + + + + + + 18 + + + + + + +
+ + Reproducibility workshop (Stockholm) + + + + + Sep 9 + - + Sep 12, 2019 + + + + 12 + + + + + + + + + + + + + + + + + + + + + + + + 12 + + + + + + +
+ + Python for Dynamics and Evolution of Earth and Planets (Oslo) + + + + + Apr 1 + - + Apr 5, 2019 + + + + + + 12 + + + + + + + + + + + + + + + + + + + + + + 12 + + + + + + +
+ + Mixed Arts with CodeRefinery & Software Carpentry (Copenhagen) + + + + + Mar 5, 2019 + + + + + + + + + + 40 + + + + + + + + + + + + + + + + + + 40 + + + + + + +
+ + Git in practice (Oslo) + + + + + Feb 27, 2019 + + + + + + 18 + + + + + + + + + + + + + + + + + + + + + + 18 + + + + + + +
+ + Git workshop (Umeå) + + + + + Oct 16, 2017 + + + + 21 + + + + + + + + + + + + + + + + + + + + + + + + 21 + + + + + + +
+ + Workshop: Interfacing Fortran, C, C++, and Python (Manchester) + + + + + Sep 8, 2017 + + + + + + + + + + + + + + + + + + + + 15 + + + + + + 15 + + + + + + +
+ + Workshop: Mixed Martial Arts with CodeRefinery (Umeå) + + + + + May 29, 2017 + + + + + + + + + + + + + + + + + + + + 15 + + + + + + 15 + + + + + + +
+ + CodeRefinery get-together (Stockholm) + + + + + May 19, 2017 + + + + 15 + + + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + +
+ + CodeRefinery seminar (Oslo) + + + + + Apr 6, 2017 + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + +
+ Total + + 29 + + 183 + + 319 + + 157 + + 55 + + 1 + + 0 + + 4 + + 71 + + 790 +
+ + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000..4830f58d --- /dev/null +++ b/atom.xml @@ -0,0 +1,7799 @@ + + + CodeRefinery + Teaching essential tools so that researchers can make full use of software, computing, and data. + + + Zola + 2024-09-29T00:00:00+00:00 + https://coderefinery.org/atom.xml + + Upcoming and recent workshops and events + 2024-09-29T00:00:00+00:00 + 2024-09-29T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/workshops/upcoming/ + + <h2 id="upcoming-coderefinery-workshops">Upcoming CodeRefinery workshops</h2> +<!-- If you edit this section, also update the date on top of this page. This +is important for RSS feed. --> +<p>We don't want you to miss a workshop or event. The best +way to stay informed is to join <a href="https://coderefinery.org/about/newsletter/">our newsletter</a> +You can also subscribe to our <a href="/atom.xml">RSS feed</a>.</p> +<h2 id="upcoming-workshops-from-partner-organizations">Upcoming workshops from partner organizations</h2> +<p>Partners are invited to <a href="https://github.com/coderefinery/coderefinery.org/edit/main/content/workshops/upcoming.md">send a pull +request</a> +to list your workshop/event here.</p> +<h2 id="recent-workshops-and-events">Recent workshops and events</h2> +<ul> +<li><a href="https://www.aalto.fi/en/events/python-for-scientific-computing-5-7november2024">Python for Scientific Computing (online)</a> (Nov 5-7, 2024).</li> +<li><a href="https://github.com/PDC-support/build-systems-course">Build Systems Course and Hackathon (online)</a> (Oct 8-11, 2024).</li> +<li><a href="https://coderefinery.github.io/2024-09-10-workshop/">CodeRefinery tools workshop (online)</a> (Sep 10-12 &amp; 17-19, 2024).</li> +<li><a href="https://coderefinery.github.io/train-the-trainer/">CodeRefinery train the trainer workshop (online)</a> +(four Tuesdays between Aug 13 and Sep 3).</li> +<li><a href="https://coderefinery.github.io/2024-08-27-gothenburg/">CodeRefinery tools workshop (Gothenburg)</a> (Aug 27-29, 2024)</li> +<li><a href="https://coderefinery.github.io/mini-workshop/">Mini-workshop</a> at the <a href="https://elfi2024.eu/">European Light Field Imaging Workshop</a> (Jun 25-27, 2024).</li> +<li><a href="https://scicomp.aalto.fi/training/scip/ttt4hpc-2024/">Tuesday Tools &amp; Techniques for High Performance Computing (online)</a> (Mar and Apr, 2024)</li> +<li><a href="https://coderefinery.github.io/2024-03-12-workshop/">CodeRefinery tools workshop (online)</a> (Mar 12-14 &amp; 19-21, 2024).</li> +<li><a href="https://scicomp.aalto.fi/training/scip/python-for-scicomp-2023/">Python for Scientific Computing (online)</a> (Nov 7-10, 2023)</li> +<li><a href="https://coderefinery.github.io/2023-09-19-workshop/">CodeRefinery tools workshop, Sep 19-21 and 26-28, 2023</a></li> +<li><a href="https://scicomp.aalto.fi/training/scip/python-for-scicomp-2022/">Python for Scientific Computing (online)</a> (Nov 22-25, 2022)</li> +<li><a href="https://coderefinery.org/workshops/past/">All our past workshops and events</a></li> +</ul> + + + + + CodeRefinery train the trainer workshop + 2024-09-09T00:00:00+00:00 + 2024-09-09T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/train-the-trainer/ + + <p>Supported by the Nordic e-Infrastructure Collaboration (NeiC), CodeRefinery is dedicated to promoting +FAIR (Findable, Accessible, Interoperable, and Reusable) research software development. +Our workshops provide essential training in research software development, and we are constantly evolving our teaching methods to create an effective and inclusive learning environment.</p> +<p>Our Train the Trainer workshops are designed to share our best practices and provide insights into our approach. +The sessions are highly interactive, encouraging participants to share their own experiences. +While there’s no obligation to become a CodeRefinery instructor after attending, we warmly welcome anyone interested in joining our community of instructors.</p> +<p>This blog post serves as a report on the workshop and a compilation of the invaluable contributions made by participants throughout the sessions.</p> +<h2 id="workshop-setup">Workshop setup</h2> +<p>The August/September 2024 workshop was not our first time sharing our methods, but with the many changes over the years, +we updated the materials accordingly. We also introduced more exercises and discussions to help participants connect and learn from each other.</p> +<p>We spread the four half-day workshop sessions across four consecutive Tuesdays in an effort to make it more manageable and engaging.</p> +<h2 id="workshop-materials">Workshop materials</h2> +<p>All materials from the workshop are available with a DOI on <a href="https://zenodo.org/doi/10.5281/zenodo.13736614">Zenodo</a>). We chose not to record the sessions +to ensure a comfortable and open environment for interaction. However, you can find materials from +previous iterations of our <a href="https://coderefinery.github.io/train-the-trainer/branch/instructor-training/">CodeRefinery instructor training</a> +and <a href="https://coderefinery.github.io/train-the-trainer/branch/community-teaching/">Community teaching</a>. </p> +<p>The materials are licensed under Creative Commons Attribution 4.0 International, and we encourage anyone to reuse them. +If you do, let us know so we can help advertise your materials or course on our website!</p> +<p>You can also learn how to create your own lesson materials using the CodeRefinery lesson template in the episode +<a href="https://coderefinery.github.io/train-the-trainer/lessons-with-git/#coderefinery-lesson-template">Lessons with version control episode</a>. </p> +<h2 id="participants">Participants</h2> +<p>This workshop attracted record interest, with 82 registrations from 22 countries. The majority of participants were from +Finland, the United Kingdom, Norway, Sweden, the Netherlands, and Germany, with 10-40 attendees joining each session. +Since the sessions were standalone, participants could choose which ones to attend.</p> +<p>We gathered on Zoom, utilizing breakout rooms and collaborative notes for discussions and questions. +The notes are archived on the <a href="https://coderefinery.github.io/train-the-trainer/notes-archive/">materials web page</a>.</p> +<h2 id="workshop-themes-and-topics">Workshop themes and topics</h2> +<p>The main topics discussed in the workshop were:</p> +<ul> +<li>Session 1: About lesson design, deployment and iterative improvement (Aug 13)</li> +<li>Session 2: Tools and techniques adopted in CodeRefinery workshops (Aug 20)</li> +<li>Session 3: About teaching &amp; cool things we all would like to share (Aug 27)</li> +<li>Session 4: Workshop streaming practices and post-workshop tasks (Sep 3)</li> +</ul> +<h3 id="session-1-about-lesson-design-deployment-and-iterative-improvement">Session 1: About lesson design, deployment and iterative improvement</h3> +<p>In this session, we explored the evolution of CodeRefinery lesson materials and how anyone can contribute to their ongoing development. +A key aspect is version control, which ensures lessons are shareable and easy to contribute to. We discussed our preference for Sphinx with the sphinx-lesson extension.</p> +<p>We introduced &quot;backward lesson design,&quot; where we start from learning objectives and learner personas, and work backwards to create effective lessons. +Feedback collection, its conversion into actionable improvements, and the impact of these refinements were also key topics.</p> +<p>During group work, participants shared their methods for creating lesson materials and gathering feedback.</p> +<h3 id="session-2-tools-and-techniques-adopted-in-coderefinery-workshops">Session 2: Tools and techniques adopted in CodeRefinery workshops</h3> +<p>This session gave participants a behind-the-scenes look at how we run large CodeRefinery workshops. +We covered event setup, roles, and how we maintain interactivity through collaborative documents and &quot;bring your own classroom&quot; setups.</p> +<p>We discussed onboarding new instructors and helpers, teaching preparation (sound, screen sharing), +and the importance of teaching &quot;good enough&quot; practices in intermediate software development tools, given the difficulty of defining &quot;best practices.&quot; +Our workshops aim to cater to all skill levels, with a focus on competent practitioners.</p> +<p>Collaboration plays a key role in our workshops, and we highlighted the importance of assigning a Collaborative Document Manager +to handle questions and interactions. Participants practiced setting up effective screen shares, ensuring readability, +tested their sound levels and learned different ways to adjust it as well as ways of adjusting terminal prompts for teaching.</p> +<h3 id="session-3-about-teaching-cool-things-we-all-would-like-to-share">Session 3: About teaching &amp; cool things we all would like to share</h3> +<p>This session focused on teaching techniques, co-teaching models, and useful tools. We discussed Computational Thinking, +a framework that breaks problem-solving into four parts: decomposition, pattern recognition, abstraction, and algorithmic design.</p> +<p>We also examined the benefits of co-teaching, where complementary skills enhance the learning experience and reduce the workload +for individual instructors. Participants shared their perspectives on teaching and discussed how team teaching can improve lesson delivery.</p> +<p>In the &quot;cool gems&quot; session we had a few tool presentations:</p> +<ul> +<li><a href="https://www.thregr.org/wavexx/software/screenkey">Screenkey for showing keyboard shortcuts</a></li> +<li><a href="https://github.com/bast/teaching-setup">Containerized teaching setup</a></li> +<li>A DIY teaching clock, showing chunks of 5/10 minutes in black and white sections instead of numbers</li> +</ul> +<h3 id="session-4-workshop-streaming-practices-and-post-workshop-tasks">Session 4: Workshop streaming practices and post-workshop tasks</h3> +<p>In this session, we covered streaming and recording workflows, with a focus on using Open Broadcaster Software (OBS) and ffmpeg. +While managing a streaming setup can seem daunting, we broke down the process to show that each step is manageable. +We also discussed video editing as a valuable tool for improving teaching.</p> +<p>Participants had hands-on experience with OBS, a powerful but accessible tool, not just for workshops but for personal projects too. +While OBS may appear complex, once the pieces fall into place, it's an intuitive tool for enhancing online workshops.</p> +<h3 id="interested-in-joining-next-time">Interested in joining next time?</h3> +<p>We are still collecting full workshop feedback and link it here later. You can however already find all notes, +questions and single day feedbacks from the <a href="https://coderefinery.github.io/train-the-trainer/notes-archive">materials - notes archive</a>. +Through this Train the Trainer workshop, we hope to empower more instructors to contribute to CodeRefinery +and foster an inclusive community of practice around research software development. +We look forward to seeing how participants will apply these skills and insights in their own teaching endeavors.</p> +<p>No matter if you are an instructor or want to observe or support the project in some other way, you are very welcome. +Learn more about the project and available lesson materials by checking out <a href="https://coderefinery.org">CodeRefinery webpage</a> +and sign up for the <a href="https://coderefinery.org/about/newsletter">Coderefinery newsletter</a> to get to know about the next iteration. +If you do not have any resources to join, but would like to support the project, +please consider becoming a <a href="https://coderefinery.org/join/individuals/#coderefinery-ambassador">CodeRefinery ambassador</a>.</p> +<h2 id="collection-of-teaching-related-tips-and-tricks-gathered-throughout-the-workshop-through-questions-to-the-audience">Collection of teaching related tips and tricks gathered throughout the workshop through questions to the audience</h2> +<h3 id="what-is-the-hardest-thing-about-teaching-for-you">What is the hardest thing about teaching for you?</h3> +<ul> +<li>Knowing how &quot;it's going&quot;, whether learners are happy or not (especially when teaching online) :+1:</li> +<li>The preparation the night before. It is always much more that I would hope, no matter how prepared I want it to be :+1: :+1:</li> +<li>Managing groups with vastly different academic backgrounds</li> +<li>Teaching wide spectrum of skill level at the same time. :+1: :+1: :+1: :+1:</li> +<li>Time management! (Knowing how much can fit in a sessions) :+1: :+1: </li> +<li>General preparation time, how to fit it into the regular work schedule, and estimate how much time is needed for prep.</li> +<li>How to reduce too much text into just the right amount</li> +<li>Preparation of the session material and estimating the right amount of time for each section</li> +<li>Getting learners to take the first step: sign up for and attend a workshop, when they don't think programming is a skill they can learn</li> +<li>Getting learners to take the <em>second</em> step: translating what they've learned in a workshop into something they can apply </li> +<li>preparation and time management</li> +<li>Engaging with the students which was much easier for me when I used to coach</li> +<li>Finding the right depth for an unknown audience for &quot;my topic&quot;</li> +<li>education background of participants and their learning objectives</li> +</ul> +<h3 id="what-is-the-best-thing-about-teaching-for-you">What is the best thing about teaching for you?</h3> +<ul> +<li>Seeing when learner gets interested/curious about something and takes inspiration from the course. :+1:</li> +<li>Seeing it works and someone can do something new.</li> +<li>Motivated students grasping new stuff</li> +<li>Students picking up and running with the material and skills I give them and using it for their own work. :+1:</li> +<li>The &quot;ah-ha!&quot; moment when a student gets it! :+1::100: :+1:</li> +<li>Learning from students who know about some topic more than you do. :+1:</li> +<li>Being able to help people reach their goals, by showing them something new.</li> +<li>Teaching is optimism acted out in the hope of making a difference both ways I suppose.</li> +<li>The feeling of accomplishment when you see learning grow and implement the learnings :book: </li> +<li>mutual learning and impact on learners :+1:</li> +<li>Results and feedbacks / Mutual interests and interesting discussions</li> +<li>mutual learning and I can also learn lots of things and new ideas from participants</li> +</ul> +<h3 id="when-you-start-preparing-a-new-lesson-or-training-material-where-do-you-start">When you start preparing a new lesson or training material, where do you start?</h3> +<ul> +<li>I look at existing materials on the same topic, but chose/refine topics based on the perceived needs/interests of the presumed audience</li> +<li>Outline of structure and Material collection for a new lesson :+1:</li> +<li>What material I have already? (what other material is already out there?)</li> +<li>Start by looking for related resources (documents, videos, courses, etc) to have a base data and better understanding of what have been done around the topic</li> +<li>Know your audience</li> +<li>Review existing material</li> +<li>Think about learning objectives (to keep focus on essential things)</li> +<li>Think of three things simple enough that they will be remembered the next day. Design around that.</li> +<li>I write down the thoughts that I have and then go back and structure it.</li> +</ul> +<h3 id="what-tricks-help-you-with-writer-s-block-or-the-empty-page-problem">What tricks help you with “writer’s block” or the empty page problem?</h3> +<ul> +<li>Write anything down that comes to mind, sometimes draw something, looking out the window :)</li> +<li>Do a mind map - what concepts do I want to get across?</li> +<li>Starting small, for example a list of headings and then building around it. :+1:</li> +<li>What does one know about the target audience and why should they be spending longer than 1 minute listening to what they will eventually get to hear?</li> +<li>Get some inspiration from another source. </li> +<li>Start with the three things above</li> +<li>Start with the plan and the overview design </li> +<li>Some kind of outline / main message(s)</li> +<li>Start with three things. Three supporting points for each of these.</li> +</ul> +<h3 id="maybe-you-haven-t-designed-training-material-yet-but-how-do-you-start-when-creating-a-new-presentation">Maybe you haven’t designed training material yet. But how do you start when creating a new presentation?</h3> +<ul> +<li>Think about the learning objectives and try to break them down into steps</li> +<li>Title, Objectives, target audience and Plan</li> +<li>Some kind of outline / main message(s). Get as many images as I can, instead of words</li> +<li>Draft an outline and use chatgpt to fill in details</li> +<li>Example of how the teaching content is applied in a real-world context</li> +</ul> +<h3 id="if-your-design-process-has-changed-over-time-please-describe-what-you-used-to-do-and-what-you-do-now-instead">If your design process has changed over time, please describe what you used to do and what you do now instead.</h3> +<ul> +<li>I look more at existing materials and try to get more information about the audience. Unfortunately getting information about the audience before the event is hard</li> +<li>I used to start from the beginning and get from there but that often meant a very polished start and a rushed end. Now I try an overview first, then fill out sparse details at every section</li> +<li>Updating the data and tweak the presentation</li> +<li>If I am teaching a small group (or one to one) talk to them before hand - find out what they know already, what they want to learn. </li> +</ul> +<h3 id="what-do-you-know-now-about-preparing-lessons-training-presentations-that-you-wish-you-knew-earlier">What do you know now about preparing lessons/training/presentations that you wish you knew earlier?</h3> +<ul> +<li>less is more. It's better to have 2-3 main messages rather than trying to show everything in one go :+1: :+1: :+1: :+1:</li> +<li>how much practice time the learners need to master what's taught</li> +<li>Don't worry about something going wrong. It often makes the lesson (and thus the material) more persistent in memory. :+1:</li> +<li>Try and remove everything except what you want the person to learn +<ul> +<li>That's a very tough part for me in the sense that I never know how much of an underlying &quot;black box&quot; is still ok.... </li> +</ul> +</li> +<li>Designing intermediate materials is hard, and requires putting some &quot;gatekeeping&quot; making sure that learners are directed to appropriate courses</li> +<li>When I see a cool graphic, concept, slide, etc., download it and save it in my 'new-materials' folder to use later on!</li> +<li>I have come to the conclusion that perhaps a more &quot;agile&quot; approach to developing materials (try to do design/teaching iterations quickly) might be the best way to go, but there are risks with this approach too</li> +</ul> +<h3 id="what-tricks-techniques-have-you-tried-in-your-teaching-or-seen-in-someone-else-s-teaching-that-you-think-have-been-particularly-effective-in-collecting-feedback-from-learners">What tricks/techniques have you tried in your teaching or seen in someone else's teaching that you think have been particularly effective in collecting feedback from learners?</h3> +<ul> +<li>preparing a survey and emailing it to participants as soon as the event ends (usually get fewer than 50% of answers but it's a representative enough sample)</li> +<li>do engage with the audience, give them the time to get the courage to speak up</li> +<li>Be the audience yourself +<ul> +<li>yes! some problems/issues I don't notice as instructor, only as listener </li> +</ul> +</li> +<li>Have time (e.g. 5 min) in the session to fill out the feedback form</li> +<li>If the course/workshop has several days/sections do a couple questions every change, then a full one afterwards</li> +<li>&quot;Traffic light&quot; feedback (e.g. for pacing or progress on exercises): give each learner two different coloured post-it notes for in-person, or use emoji for online, to indicate a current status</li> +</ul> +<h3 id="do-you-teach-and-organize-teaching-alone-or-with-others-what-would-you-prefer-and-why">Do you teach and organize teaching alone or with others? What would you prefer and why?</h3> +<ul> +<li>Coming together is a beginning; keeping together is progress; working together is success. – Edward Everett Hale</li> +<li>These days always with others. Alone is easier to prepare but almost always is harder during it.</li> +<li>Teaching with very diverse partners, it can be challenging to find a common language with people very different than you.</li> +<li>I teach alone, in the future there will be more collaboration with multiple team members. Both approaches have their pros and cons. </li> +<li>Both has its own distinct advantages</li> +<li>Most of my teaching is on my own, as a freelancer its more expensive to work with colleagues than to deliver a course on my own.</li> +<li>Teaching together, learns from each other, feedbacks to improve</li> +<li>Not formally taught yet, only given presentations actually .</li> +<li>collective teaching would benefit the teachers with collaborative curriculum and experiences sharing. </li> +</ul> +<h3 id="if-applicable-have-you-seen-any-challenges-when-teaching-together-and-how-to-overcome-them">If applicable, have you seen any challenges when teaching together and how to overcome them?</h3> +<ul> +<li>It actually requires preparation, </li> +<li>Is it about teaching or about inspiring ? Discover the answer and get inspired ...</li> +<li>It's like being in a band: you might be great at improvising and your band-partners might be great at improvising too, but a bit of rehearsing makes even the impro gig much better</li> +<li>Need to plan before session, difficult if people don't 'plan' in the same way, e.g. with the same time frame.</li> +<li>Heterogeneity in learners make it impossible to get the same result from everyone. +<ul> +<li>In fact, the same applies to teachers :D</li> +</ul> +</li> +<li>Teaching together requires to have similar opinions on how to teach. I share views only with ~40% of my colleagues I think.</li> +<li>No Teaching experience but it is good to give the outline of the lessons beforehand and learning goals.</li> +</ul> +<h3 id="how-might-breaking-down-a-complex-problem-into-smaller-parts-change-your-approach-to-problem-solving-in-your-current-projects">How might breaking down a complex problem into smaller parts change your approach to problem-solving in your current projects?</h3> +<ul> +<li>Avoids cognitive overload </li> +<li>I used to give an example about this in workshops of cutting long tree into pieces from top to avoid that it falls and destroy a house bloc.</li> +<li>Easier to start on something small</li> +<li>Each individual part is familiar and can take existing solutions.</li> +<li>Only focus on the new things</li> +<li>One can lose oversight of where is supposed to be getting to due to problems with summation of biases introduced during the solving of the parts.</li> +</ul> +<h3 id="can-you-think-of-a-research-project-where-identifying-patterns-in-your-data-led-to-new-insights-or-breakthroughs">Can you think of a research project where identifying patterns in your data led to new insights or breakthroughs?</h3> +<ul> +<li>Multi-targeted drug design where you need to identify both chemical and biological pathways/patterns</li> +<li>Distilling complex physics problems into simpler 1D statistics is very often done.</li> +<li>I used to do bioinformatics, pretty much everything in biology is about patterns in strings of characters (DNA, proteins). Finding those patterns and using them is the way to go</li> +<li>Pattern recognition DOES NOT lead to new insight, it is new insight which allows for the recognition of a 'pattern', the latter being an allocation of possible bias.</li> +</ul> +<h3 id="what-challenges-do-you-face-when-trying-to-simplify-complex-concepts-in-your-field-and-how-do-you-decide-which-details-to-focus-on">What challenges do you face when trying to simplify complex concepts in your field, and how do you decide which details to focus on?</h3> +<ul> +<li>Absence of a terminology / jargon to describe a new idea. :+1:</li> +<li>Similar to above, when teaching often students know what they want to achieve, but don't have the terminology to express it, so working through what they want is helpful, after teaching them some terminology.</li> +<li>Whatever is most useful to the learner first?</li> +<li>I work with researchers in different fields. I don't always fully understand their domain knowledge but I can take the basics or generalities and get code that works for them</li> +<li>A very practical problem is trying to resist going for a coffee in the midst of taking a shot at a complex concept, in the hope that the true details are to be found in the coffee.</li> +<li>not all information is easy to find or a lot of conflicting information or even sometimes information explosion</li> +</ul> +<h3 id="how-do-you-determine-the-priority-of-tasks-when-designing-algorithms-for-your-academic-projects-and-what-criteria-do-you-use-to-ensure-that-the-most-critical-tasks-are-addressed-first">How do you determine the priority of tasks when designing algorithms for your academic projects, and what criteria do you use to ensure that the most critical tasks are addressed first?</h3> +<ul> +<li>Working chronologically when going through a problem - start at the beginning.</li> +<li>What gives the more insight with the least effort can be a nice start</li> +<li>Talk to colleagues and Subject matter experts to understand various perspective to decide and prioritize.</li> +<li>Logic will get you from A to B. Imagination will take you everywhere. - Albert Einstein.</li> +</ul> +<h3 id="has-anyone-found-a-nice-online-tool-to-draw">Has anyone found a nice online tool to draw?</h3> +<ul> +<li>I love this tool suite https://excalideck.com/ +<ul> +<li>For drawing https://excalidraw.com/ </li> +</ul> +</li> +<li>I have seen Miro ...</li> +<li>I think the Code Refineries use something for their graphics that looks a bit 'cartoony' - but I cannot remember what it is called! +<ul> +<li>Drawn on remarkable and then coloured and tidied up in Inkscape. :+1: +<ul> +<li>I am a big fan of remarkable. I think sharing option is fairly good. Unfortunately bit expensive tool.</li> +<li>true, for me it was worth it already for the pdf annotation for research papers, cannot read on computer screen</li> +</ul> +</li> +</ul> +</li> +<li>https://webwhiteboard.com/</li> +<li>https://www.youtube.com/watch?v=4-l8MY5kYGc</li> +<li>Figma and Kahoot are useful as well</li> +</ul> +<h3 id="showing-keyboard-shortcuts-on-screen">Showing keyboard shortcuts on screen</h3> +<ul> +<li>Screenkey: <a href="https://www.thregr.org/wavexx/software/screenkey">Screenkey for showing keyboard shortcuts</a> +<ul> +<li>Is there a Windows version people can recommend? +<ul> +<li>I found this list of alternative for windows users like me: https://alternativeto.net/software/screenkey/ :+1:</li> +<li>I sometimes use the on-screen keyboard already provided by the OS :+1:</li> +</ul> +</li> +</ul> +</li> +</ul> +<h3 id="what-s-the-most-interesting-or-useful-thing-you-ve-learned-from-an-online-workshop-not-specifically-this-one-and-how-have-you-applied-it-planning-to-apply-in-your-life-or-work">What’s the most interesting or useful thing you’ve learned from an online workshop (not specifically this one), and how have you applied it/planning to apply in your life or work</h3> +<ul> +<li>Having breaks every hour or so</li> +<li>New approach to screensharing, using the 'portrait' approach</li> +<li>Manage breathing: reduce stress and use silence to let the audience grasp what you're saying</li> +<li>Well, the most interesting or useful thing I've learned from online workshops is how not to conduct a workshop, or at least some elements of the same, and I have applied this understanding by engaging in the global effort to discover more about how not to conduct a workshop, or at least some elements of the same, with the motto: That's one small step for a man, one giant leap for mankind..</li> +</ul> +<h3 id="how-can-you-divide-teaching-into-separate-independent-tasks">How can you divide teaching into separate independent tasks?</h3> +<ul> +<li>By content blocks, having roles like main and assistant...</li> +<li>Having responsibility for different sections of the course.</li> +<li>Wow, now that's what we call a question... bravo... indeed, how does one separate sleeping and snoring into separate independent tasks...</li> +<li>Course, exercises, resources, tools and forms.</li> +<li>Different people teach different topics</li> +<li>CodeRefinery answer: the big logical blocks are instructors, in-person and breakout room helpers, and Notes-questions answers.</li> +</ul> + + + + + Bring your own classroom to a CodeRefinery workshop + 2024-08-19T00:00:00+00:00 + 2024-08-19T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/bring-your-own-classroom/ + + <img width="75%" src="/blog/BYOC.png" alt="Graphical representation of the possibilities of joining a CodeRefinery workshop: As individual learner, online classroom or local classroom, everyone watches the stream and interacts with the instructors via collaborative notes, learners in classrooms can in addition interact with each other and their team lead"> +<p>CodeRefinery, supported by the Nordic e-infrastructure collaboration (NeiC), is dedicated to enhancing FAIR (Findable, Accessible, Interoperable, and Reusable) +research software development practices. Our workshops aim to provide essential training in research software development, and we’re continually exploring +new methods to make this learning process effective and inclusive. </p> +<p><strong>A Collaborative Effort Across Borders</strong></p> +<p>CodeRefinery hosts two workshops annually, supported by a wide network of Nordic universities and organizations. +This collaboration helps us make Research Software Engineering (RSE) practices widely accessible and inclusive, reaching learners from varied academic backgrounds and levels. +While the current network is concentrated on the Nordics, we welcome learners, instructors and organizations from all over the world to join us.</p> +<p><strong>Open Source Learning Materials and Inclusive Workshops</strong></p> +<p>At CodeRefinery, we believe in open access to education. Our workshop materials are freely available online (<a href="https://coderefinery.org/lessons/">https://coderefinery.org/lessons/</a>), +and sessions are streamed live and recorded for on-demand access on the <a href="https://www.youtube.com/channel/UC47aupE7HKGduAjXKt1Gwrg">CodeRefinery YouTube channel</a>. +This supports that anyone, regardless of their location, can benefit from high-quality training.</p> +<p>During the workshops, we use a collaborative document that allows participants to interact with instructors in real-time. +For us, the collaborative document bridges the gap between traditional in-person instruction and the virtual environment, fostering an interactive learning experience for everyone.</p> +<p><strong>Scaling with Community Support: Bring your own classroom</strong></p> +<p>An innovative aspect of CodeRefinery's approach to online workshops is the collaboration with local partners to scale the workshop experience +while maintaining a sense of community. Local partners organize viewing rooms, either online or in-person, where <strong>learners can gather to watch the live stream, discuss the material, and collaborate on exercises</strong>. A local team leader facilitates discussions and provides learners with support and encouragement. </p> +<p>This setup not only scales the workshops to accommodate a larger number of learners but also preserves the interactive and community-centric +atmosphere of smaller workshops. It encourages learners to learn from each other, share their experiences, and apply the skills they are +acquiring in a supportive group environment. Through the support from a local team lead from the same organization, possibly even the same domain, +discussions can be more comfortable and targeted on learners own work. </p> +<p>Local partners have the flexibility to engage in the workshop preparation and organization as much as they wish, though it is not required. +This also means that a local partner can provide their learners with a full workshop experience, with possible tailored discussions, +without the need for local instructors or the organizational burden of organizing a full workshop. This way, &quot;bringing your own classroom&quot; to a CodeRefinery workshop can also serve as a testbed for offering this type of course; if a community responds well to certain topics of the workshop, an organization could expand their own course offering based on the experiences collected with us, e.g. by adapting CodeRefinery lesson materials to their own need. +We offer a one-hour onboarding session prior to the workshop to orient you on the workshop proceedings and share insights on managing a local team. +This session also provides ample opportunity for questions and discussions. Following the workshop, we actively seek feedback from both learners +and local hosts, including team leads. This iterative process has been invaluable in refining and enhancing the workshop experience over time.</p> +<p><strong>Bring Your Own Classroom Experiences from Previous Workshops</strong></p> +<p>Paula Martinez Lavanchy, TU Delft: </p> +<blockquote> +<p>Our collaboration with the CodeRefinery initiative started in 2020, when we collaboratively organised a Train-the-Trainer activity and co-organizing a CodeRefinery online workshop where TU Delft researchers joined as participants and our data stewards and research software engineers joined as helpers. Since then, we have been ‘bringing our own class’ to the CodeRefinery workshops by joining the streaming of the lessons from the classroom with our participants and helpers.</p> +</blockquote> +<blockquote> +<p>The CodeRefinery initiative has helped us and benefit TU Delft researchers in several ways:</p> +<ul> +<li>The possibility of joining the workshops allowed us to advance with the implementation of our Vision for Research Data &amp; Software management training and the implementation of TU Delft Research Software Policy by providing high quality and well-received training on FAIR software practices.</li> +<li>The involvement of our data stewards, software engineers and trainers as helpers in the CodeRefinery workshops have also provided them with a great opportunity to continuously improve their skills and learn from this great community.</li> +<li>The CodeRefinery learning materials are openly available and of excellent quality. We often refer our researchers to use them as consultation materials on our websites and/or guides.</li> +</ul> +</blockquote> +<p>Lisanna Paladin, EMBL: </p> +<blockquote> +<p>We represent an established training entity within our institute (EMBL), and decided to present your workshop in the same way we present ours: adding your event to our calendars, having an internal registration to sort out rooms, and explaining that we will have the only role of helpers during your streamed lessons. I think that this worked well in advertising the opportunity and providing locally the essential pre-workshop installation assistance, but it posed a significant challenge: those that didn’t read carefully the workshop description on our website expected us to be the instructors and higher levels of interactivity with them. +Besides this point on expectations management, I think your format really allows to reach the biggest possible audience, while also fostering the creation of local communities. We had in-room discussions during the breaks and created a local chat channel for the participants. That was used also in the following days while they were testing the skills learned on their setups. We were inspired by your format in designing ours for the BioNT project.</p> +</blockquote> +<p>Candy Eugenie Charlotte Anquetil Ep Deck, NTNU: </p> +<blockquote> +<p>First of all, I personally think that CodeRefinery is an excellent way to get familiar with Git. +I am myself an engineer working in academia and helping other in everyday task. +I took this course in 2021 and at first, I did not really know what to think about it ... I thought it was a lot of informations and I was a bit scared that I would have missed something. +However, because all the materials are available online, I knew it was possible to go back and redo things if needed. +As a person taking the course from home during the pandemic I thought it was a bit difficult to motivate myself all along the 6 half days. +This is probably why I thought it could be interesting to organize rooms here at NTNU in order to have people sitting, talking, sharing and helping each other, ... +One of the biggest challenge is to keep the whole classroom from first to last day ... I think it's impossible 🙂 +I think different reasons can be cited here :</p> +<ul> +<li>some people are going to conferences (I had the case where someone took the 2 first days and left afterwards)</li> +<li>some have teaching duties</li> +<li>some are taking other mandatory courses (This might be relevant to PhDs)</li> +<li>some people think they are too good and do not need to take the course and drop it (which I think is a mistake)</li> +<li>some people think they are not good enough (same remark here) ... they find the path too fast but they can easily catch up during the breaks when we help onsite.</li> +<li>some people here register and do not bother showing up (This is one of of the free workshop) ... or come the first day and leave then.</li> +</ul> +</blockquote> +<blockquote> +<p>6 half days is time demanding. I would assume the impact would be better if we sort of organise something like what is coming up in Gothenburg (August 27-29, 2024) +People taking the workshop here at NTNU ... from beginning to end (more or less) are usually super happy and enthusiastic when it ends [...] I really think people taking the course learned a lot. +I would assume that in person course would definitely be more successful ... However, I understand the difficulty when the instructors come from different countries and when you want to offer the workshop for free !</p> +</blockquote> +<p>Jakob Sauer Jørgensen, DTU:</p> +<blockquote> +<p>I am a Senior Researcher at the Technical University of Denmark (DTU). On two occasions I have participated in multi-day online CodeRefinery workshops as the local facilitator: In Oct. 2020 with a learner group of six and in Mar. 2024 with a learner group of seven, in both cases a mix of postdocs, PhD, MSc and BSc students. (I have also participated in two other CodeRefinery focused workshops on unit testing in 2021 and “Train the Trainer” in 2024.)</p> +</blockquote> +<blockquote> +<p>Both workshops were a great success. We organized a physical room with everyone around one big table attending together in a kind of hackathon style, with our employer kindly sponsoring lunch and coffee to keep us going. Through the CodeRefinery online training, my participants were taken from no or very basic knowledge of scientific coding tools and practices to using version control, unit tests and collaborative workflows in the scientific work. I can tell it has helped them in their individual projects and have also been instrumental for a joint effort of a python library we are developing together. The online lecture format with plenty of hands-on exercises worked really well. I had not tried the format with being a local facilitator before and on the first run was a bit nervous if I would be able to “answer everything” and make it a productive event. But it worked really well, there was a prep meeting before the event and lots of support throughout in the form of expert helpers checking in on us in our online breakout room as well as the ingenious collaborative document for asking questions and receiving answers live (I have adopted this technique in online workshops I have run since myself). This made my job as local facilitator very straightforward and it was my impression that participants also felt very well supported through the combination of the local facilitator as a first contact and then further online support. On the second run in 2024, there wasn’t a breakout room and no expert helper coming to see us due to a change in the teaching setup, but it wasn’t a problem as still the format with the collaborative document plus the local facilitator provided plenty of support. </p> +</blockquote> +<blockquote> +<p>I think the most challenging part for me was perhaps on the second run to facilitate the second of the two weeks, where the format had just been changed to less hands-on exercise based and more discussion based. I didn’t feel so well prepared for what was coming (to be fair I hadn’t had much time to prepare) and I think engagement from my team was a bit less that week. I think the material had perhaps just been reworked and there were some suggestions given and I could probably have prepared more – perhaps there is a way to facilitate this a bit more centrally.</p> +</blockquote> +<blockquote> +<p>In general, I believe attending these workshops as a group helped tremendously compared to attending individually (and compared to my fall back solution of teaching people individually which is always less effective due to other commitments, distractions etc.) due to being able to learn together and discuss in person with team mates.</p> +</blockquote> +<p>If YOU have hosted your own classroom or have attended a local classroom at a CodeRefinery workshop, please share your feedback with us via support@coderefinery.org. We will continuously add it to this blogpost.</p> +<p><strong>Many Ways to Join the Experience</strong></p> +<p>CodeRefinery’s workshops are more than just educational events — they are a step towards more open and collaborative research practices. +You can get involved as a learner, team leader, or local partner. We welcome your participation!</p> +<p>If you can’t join us directly but want to support our mission, consider becoming a <a href="https://coderefinery.org/join/individuals/#coderefinery-ambassador">CodeRefinery ambassador</a>. </p> +<p>To stay updated on upcoming workshops and opportunities, visit the <a href="https://coderefinery.org">CodeRefinery website</a> and/or subscribe +to the <a href="https://postit.csc.fi/sympa/subscribe/coderefinery">CodeRefinery newsletter</a>. Let’s work together to advance FAIR research software practices!</p> +<p>If you’re interested in bringing your own classroom to our next workshop, contact us at support@coderefinery.org .</p> +<p>References to previous blog posts discussing the approach:</p> +<ul> +<li><a href="https://coderefinery.org/blog/workshop-plan/">Workshop format development discussion</a></li> +<li><a href="https://coderefinery.org/blog/2022/11/28/teams/">Teams in CodeRefinery workshops</a></li> +<li><a href="https://coderefinery.org/blog/2022/11/07/reverse-hybrid/">Discussion on the &quot;reverse hybrid&quot; approach</a></li> +</ul> + + + + + Results from our 2024 post workshop survey + 2024-08-10T00:00:00+00:00 + 2024-08-10T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/08/10/post-workshop-survey/ + + <!-- toc --> +<h2 id="about-this-survey">About this survey</h2> +<p>In early 2024 we sent out a survey to participants of our workshops from 2022 and 2023. +We received 129 responses and this blog post summarizes the findings.</p> +<p>You can also browse the +<a href="https://github.com/coderefinery/2024-post-workshop-survey/blob/main/form.pdf">survey questions</a> +and the +<a href="https://github.com/coderefinery/2024-post-workshop-survey">Jupyter notebook</a> which generated the plots. +We have archived the results <a href="https://doi.org/10.5281/zenodo.13292363">on Zenodo</a>.</p> +<p>For each plot we will also provide a summary in text form right below each +plot. Further below you can find answers to free-form questions as well as +suggestions for improvement which we received from the survey participants.</p> +<p>One thing we did not do with the answers was to try to cross-correlate +questions (for instance to correlate feedback with career stage or academic +discipline).</p> +<p>We are very grateful for the feedback and suggestions and we will use them to +improve our workshops in the future. We also appreciate very valuable +input on how to improve survey questions by experts at +RISE Research Institutes of Sweden.</p> +<h2 id="how-much-time-have-you-saved">How much time have you saved?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/time-saved.png" alt="Plot estimating time saving" /></p> +<p>In your estimate, how much time per month have you saved as a result of attending a CodeRefinery workshop?</p> +<ul> +<li>No time saved: 20</li> +<li>Minutes: 32</li> +<li>Hours: 59</li> +<li>Days: 17</li> +</ul> +<h2 id="is-your-code-more-reusable">Is your code more reusable?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/reusable.png" alt="Plot about whether code is more reusable" /></p> +<p>After attending the workshop, would you judge your code to be more reusable or not more reusable?</p> +<ul> +<li>My code is more reusable: 90</li> +<li>My code is not more reusable: 9</li> +<li>Not sure: 30</li> +</ul> +<h2 id="has-it-become-easier-to-collaborate">Has it become easier to collaborate?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/collaboration.png" alt="Plot about whether collaboration is easier" /></p> +<p>After attending the workshop, has it become easier or not for you to collaborate on software development with your colleagues and collaborators?</p> +<ul> +<li>Collaboration is easier: 91</li> +<li>Collaboration is not easier: 6</li> +<li>Not sure: 32</li> +</ul> +<h2 id="have-you-introduced-your-colleagues-to-new-tools-and-practices">Have you introduced your colleagues to new tools and practices?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/colleagues.png" alt="Plot about whether colleagues have been introduced" /></p> +<p>Have you introduced one or more of your colleagues to new tools or practices as a result of the workshop?</p> +<ul> +<li>I have introduced one or more of my colleagues to new tools or practices: 79</li> +<li>I have not introduced one or more of my colleagues to new tools or practices: 33</li> +<li>Not sure: 16</li> +</ul> +<h2 id="how-likely-are-you-to-recommend">How likely are you to recommend?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/recommending.png" alt="How likely are you to recommend?" /></p> +<p>How likely is it that you would recommend CodeRefinery workshop to a friend or colleague?</p> +<ul> +<li>10: 64</li> +<li>9: 21</li> +<li>8: 24</li> +<li>7: 11</li> +<li>6: 3</li> +<li>5: 1</li> +<li>4: 1</li> +<li>3: 3</li> +<li>0: 1</li> +</ul> +<h2 id="pre-recorded-lectures-live-online-teaching-or-in-person-teaching">Pre-recorded lectures, live online teaching, or in-person teaching?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/pre-recorded-or-live-or-in-person.png" alt="Would you prefer pre-recorded lectures, live online teaching, or in-person teaching?" /></p> +<p>Would you prefer pre-recorded lectures, live online teaching, or in-person teaching?</p> +<ul> +<li>I would prefer pre-recorded lectures combined with live discussions: 36</li> +<li>I would prefer online teaching (lectures are live): 62</li> +<li>I would prefer in-person teaching: 30</li> +</ul> +<h2 id="what-would-be-the-ideal-format">What would be the ideal format?</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/format.png" alt="What would be the ideal format for you?" /></p> +<p>What would be the ideal format for you?</p> +<ul> +<li>One week with half days (3 or 4 half-days): 32</li> +<li>One week with full days (3 or 4 full days): 13</li> +<li>Two weeks (6 half-days): 25</li> +<li>Two weeks (6 half-days) but split into two separate logical courses: 24</li> +<li>Lesson series over 6 weeks with one session per week: 17</li> +<li>Lessons are available in a catalogue of videos and can be followed anytime: 18</li> +</ul> +<h2 id="participation-style">Participation style</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/participation-style.png" alt="Participation style" /></p> +<p>Participation style</p> +<ul> +<li>Individual learner: 95</li> +<li>Learner in a team: 15</li> +<li>Team leader/ helper (online): 9</li> +<li>Team leader/ helper (in person): 8</li> +</ul> +<h2 id="career-stage">Career stage</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/career-stage.png" alt="Career stage" /></p> +<p>Career stage</p> +<ul> +<li>Undergraduate student: 3</li> +<li>Graduate student/ PhD student: 63</li> +<li>Postdoc: 18</li> +<li>Researcher: 19</li> +<li>Professor: 4</li> +<li>Research software engineer/ Scientific programmer: 12</li> +<li>Industry: 4</li> +<li>Other: 6</li> +</ul> +<h2 id="academic-discipline">Academic discipline</h2> +<p><img src="https://raw.githubusercontent.com/coderefinery/2024-post-workshop-survey/main/notebook/academic-discipline.png" alt="Academic discipline" /></p> +<p>Academic discipline</p> +<ul> +<li>Physical Sciences: 30</li> +<li>Earth and Related Environmental Sciences: 18</li> +<li>Biological Sciences: 13</li> +<li>Chemical Sciences: 11</li> +<li>Computer and Information Sciences: 11</li> +<li>Other Engineering and Technologies: 6</li> +<li>Health Sciences: 5</li> +<li>Psychology: 4</li> +<li>Mathematics: 4</li> +<li>Mechanical Engineering: 3</li> +<li>Civil Engineering: 3</li> +<li>Environmental Engineering: 3</li> +<li>Medical Engineering: 2</li> +<li>Medical Biotechnology: 2</li> +<li>Clinical Medicine: 2</li> +<li>Other Medical and Health Sciences: 2</li> +<li>Other: 2</li> +<li>Other Social Sciences: 2</li> +<li>Chemical Engineering: 1</li> +<li>Electrical Engineering, Electronic Engineering, Information Engineering: 1</li> +<li>Economics and Business: 1</li> +<li>History and Archaeology: 1</li> +<li>Nano-technology: 1</li> +<li>Other Natural Sciences: 1</li> +</ul> +<h2 id="has-anything-else-changed-in-how-you-write-code-for-your-research-after-attending-the-workshop">Has anything else changed in how you write code for your research after attending the workshop?</h2> +<ul> +<li> +<p>I started doing documentation in Read the Docs and it really makes the +difference. Thank you!</p> +</li> +<li> +<p>Usage of documentation with sphinx to pages planned, not done for now.</p> +</li> +<li> +<p>I learned to use Git and GitHub.</p> +</li> +<li> +<p>Optimized coding.</p> +</li> +<li> +<p>Modularity, smaller functions.</p> +</li> +<li> +<p>I use Git extensively since attending the workshop.</p> +</li> +<li> +<p>GitHub, Bash, Python, and others were very useful even if many things I did +already know in advance.</p> +</li> +<li> +<p>Especially code documentation improved a lot as a consequence of the course.</p> +</li> +<li> +<p>I use Git for myself and it is nice, but I think so much depends on your +supervisors, so ... there is little leverage for me to change things.</p> +</li> +<li> +<p>When I don't know how to do something, I use your lesson material as a +reference.</p> +</li> +<li> +<p>I think I am a lot more confident when writing code now.</p> +</li> +<li> +<p>I write my code so that it is more easier to read by others.</p> +</li> +<li> +<p>I write more cleaner code, I think. I have a better understanding of testing +routines, though haven't incorporated them yet myself.</p> +</li> +<li> +<p>Commenting and code structure.</p> +</li> +<li> +<p>My code is more streamlined and elegant when it comes to reproducibility.</p> +</li> +<li> +<p>More comments, splitting files in separate notebooks, etc.</p> +</li> +<li> +<p>Learned to use Git and GitHub better.</p> +</li> +<li> +<p>I have changed some of my earlier code to be more &quot;modular&quot;, that it is easier +and quicker to run. At least that. Workshop has also made some changes in how I +think about coding, that will probably show in my future work. So, the workshop +felt very useful.</p> +</li> +<li> +<p>Give more emphasis to code structure (architecture) and adopting a consistent +way of writing code.</p> +</li> +<li> +<p>I have gotten better at using functions in code, previously it was much more +script-esque. I have referred several junior colleagues to your workshops as +well (and they've also found them valuable).</p> +</li> +<li> +<p>I try to be tidier but it is hard.</p> +</li> +<li> +<p>Started using Git.</p> +</li> +<li> +<p>I have improved my reusability and documentation of my codes.</p> +</li> +<li> +<p>I thank my past self for writing such clear codes now.</p> +</li> +<li> +<p>Considering the latest workshop, the most important topic for me is the &quot;How +to document your research software&quot;. After the workshop, I have used &quot;GitHub +Pages&quot; and &quot;GitHub Actions&quot; for the main documentation of the project that I +am currently working on.</p> +</li> +<li> +<p>I document my code more thoroughly.</p> +</li> +<li> +<p>I didn't know how to use git version control before. Now I find it so useful!</p> +</li> +<li> +<p>Better documentation + Easier to test.</p> +</li> +<li> +<p>I have started writing more modular code and I use git more diligently, too.</p> +</li> +<li> +<p>I use Git in much more sophisticated way and enjoy it!</p> +</li> +<li> +<p>I think more on the potential reader of my code and make it more comprehensible.</p> +</li> +<li> +<p>It is hard to tell, since I took CodeRefinery in the beginning in my PhD. I +think the focus on tests and test-driven development has had a good impact on +my coding.</p> +</li> +<li> +<p>The most important outcome I got from CodeRefinery was learning version control.</p> +</li> +<li> +<p>I am way more careful to commit regularly to my repositories and keep track of changes better.</p> +</li> +<li> +<p>No. But I am mainly an experimental scientist. Coding isn't a big part of my work.</p> +</li> +<li> +<p>I use Git more consistently and I learned that making my code more easily +understandable does not in fact cost me as much more time as it saves. I have +known that I have room to grow for a long time, but would like to mention +that just the fact that I finally made time for the workshop and I focused on +developing my coding for a few days helped as well.</p> +</li> +<li> +<p>I try to write more functions to reuse code for multiple purposes. +Furthermore, I've started using virtual engines.</p> +</li> +<li> +<p>Haven't coded a lot since then so hard to say.</p> +</li> +<li> +<p>I write self explanatory commit messages.</p> +</li> +<li> +<p>I back up in git repositories almost all my code.</p> +</li> +<li> +<p>I try to document my code as I am writing it.</p> +</li> +<li> +<p>I am just starting to apply the information from &quot;HPC Best Practices.&quot; From +previous workshops, it has been a useful reference point to discuss +collaborative workflow with colleagues.</p> +</li> +<li> +<p>My code was always a mess that was meant to be solely my personal playground. +The workshop definitely changed my mindset about it - now I think in the +process of what is the best way to write the code (and comment it) so it can +be used by other people without any (or at least, big) difficulties. I don't +use Git actively at the moment, but it was great to receive the necessary +toolkit for efficiently working with it. I think I will definitely need it at +some point!</p> +</li> +<li> +<p>I've been trying to use Git for all of my projects.</p> +</li> +<li> +<p>A lot has changed on the way how I run code and test it. I attended code +refinery while I was still new to programming so it was difficult to put into +use the learning from code refinery. Now that I actually do coding for my +research, I expect to make the most of the workshop.</p> +</li> +<li> +<p>I am using Snakemake now. Right now I think it might not speed up my work +because I am still learning, but I think the benefits will come over time.</p> +</li> +<li> +<p>Making my codes easier to share, comment them and version control.</p> +</li> +<li> +<p>It maybe not directly related to the code itself but I've learned a lot of new +what is always very beneficial in this area.</p> +</li> +<li> +<p>Slightly. I was aware of much already in the course.</p> +</li> +<li> +<p>I don't have a lot of versions of my code anymore. I have my codes in a Git +repository that can be shared with my publications.</p> +</li> +<li> +<p>I can write code more compactly and with high performance.</p> +</li> +<li> +<p>I tend to write more functions with documentation and test units.</p> +</li> +<li> +<p>More testing and better documentation.</p> +</li> +<li> +<p>I try to create new Git branch for every new line of development to always +have a working version of the code.</p> +</li> +<li> +<p>I haven't been writing a lot of code since the workshop so I haven't really +had a chance to put everything into practice, but I'm trying to create a +project environment for each project and I have been documenting my working +process in RMarkdown notebooks. The notebooks have been really helpful for my +research process.</p> +</li> +<li> +<p>I am trying to keep good practices in mind. I am trying to use proper workflows +(raise issue ==&gt; create branch ==&gt; deploy fix ==&gt; push ==&gt; merge request), etc.</p> +</li> +<li> +<p>Not after this workshop just when I tried it in my own projects.</p> +</li> +<li> +<p>I use more arrays, which speeds up my work a lot.</p> +</li> +<li> +<p>I try to use GitHub now. try to do at least some version control.</p> +</li> +<li> +<p>Better commenting.</p> +</li> +<li> +<p>It has been easier to get to know other's code projects because I have +learned some of the conventions eg. in naming.</p> +</li> +<li> +<p>Now I use Git for managing the code folders.</p> +</li> +<li> +<p>I tried to follow the rules to make it more reusable.</p> +</li> +<li> +<p>I am more organised thanks to the use of Git.</p> +</li> +<li> +<p>No.</p> +</li> +<li> +<p>More focus on version control and testing.</p> +</li> +<li> +<p>My code is still so bad that I haven't benefited from it yet. But I am +definitely going to integrate it. Actually, thanks for asking, I will just +get a few words of advice from my colleague on how best to apply what I +learned at your workshop! :)</p> +</li> +<li> +<p>Made life easier when I work with git tool.</p> +</li> +<li> +<p>For me trying to write more readable and reusable code is taking a bit more +time at the moment, but that is because I do not write code very much so I +take a lot of time planning the code and the parts and how they are most +fluently glued together. So I expect it to become easier and take less time +with practice.</p> +</li> +<li> +<p>I'm actively trying to use Git, and back-up my projects (code, useful +articles) in my personal GitHub. I try to update it and, though I've not done +so yet, I intend to use tags to keep track of milestones along the project.</p> +</li> +<li> +<p>I started using Git on all my projects.</p> +</li> +<li> +<p>I started using renv to track which version of packages I am using.</p> +</li> +<li> +<p>Forcing myself to write function description prior to actually writing the function.</p> +</li> +<li> +<p>Creating all code under Git control.</p> +</li> +<li> +<p>Trying more modular approaches.</p> +</li> +<li> +<p>I think my code now is modular. The way I organize my repositories reflects +it too.</p> +</li> +</ul> +<h2 id="what-topic-s-should-we-add-to-our-workshops">What topic(s) should we add to our workshops?</h2> +<p>[Answers like &quot;None&quot;, &quot;Nothing&quot;, &quot;Everything was on point&quot;, etc., are not shown +in the results below.]</p> +<ul> +<li> +<p>More advanced topics on GitLab.</p> +</li> +<li> +<p>Hands-on with setting up, training and running AI-models.</p> +</li> +<li> +<p>Java APIs.</p> +</li> +<li> +<p>Java for beginners.</p> +</li> +<li> +<p>Automation with Azure.</p> +</li> +<li> +<p>OOP with Python.</p> +</li> +<li> +<p>Xarray and/or similar useful libraries</p> +</li> +<li> +<p>Some stuff related to Quantum Computing could be quite interesting. Also some +more &quot;technical computer skills&quot; (how its works by inside, compilations..) +could be interesting.</p> +</li> +<li> +<p>It would be good if in the workshop you also showed how to connect GIT to a +private repository on GitHub and later how to synchronize such a connection +with VS Code or RStudio.</p> +</li> +<li> +<p>I have not managed, unfortunately, to make git a regular part of my workflow. +For that, I find that a short revision few weeks after the course would be +useful.</p> +</li> +<li> +<p>Linting/debugging and maybe more time for testing.</p> +</li> +<li> +<p>Besa training.</p> +</li> +<li> +<p>Matlab training.</p> +</li> +<li> +<p>Python training.</p> +</li> +<li> +<p>Visualisation with Python, Matplotlib of gridded data (thinking about maps, +projections). And also setting up figures with multiple plots. Smart ways to +get reusable code for creating figures.</p> +</li> +<li> +<p>Processing of non-linear timestamp data; Combination of float, string, object data in the same data analysis.</p> +</li> +<li> +<p>The actual pieces of code shown were minimal and went quite fast whereas +there was a lot of discussion in very general analogy level which wasn't so +helpful.</p> +</li> +<li> +<p>Could mention VSCode's version control instead of just using the terminal.</p> +</li> +<li> +<p>Git (always useful).</p> +</li> +<li> +<p>Python: managing problem with installation packages.</p> +</li> +<li> +<p>Python: debug (within some environment: Spyder (?).</p> +</li> +<li> +<p>How to use Google Colab.</p> +</li> +<li> +<p>Maybe: Docker / code ocean ...</p> +</li> +<li> +<p>Maybe more on organizing &quot;analysis script&quot; type projects - at least where I +am this is a more common than developing software packages.</p> +</li> +<li> +<p>I think the program was good, but the Git part was most useful.</p> +</li> +<li> +<p>I think the current topics are very good. I felt like the course was a nice +introduction to all the topics, even for the length of it it felt a bit +crowded, so I think it is good as it is.</p> +</li> +<li> +<p>VS Code and GitHub Copilot or using AI for coding.</p> +</li> +<li> +<p>I know that GitLab Pages and GitLab CI have similar workflows but you might +also consider creating some examples for those alternatives as well.</p> +</li> +<li> +<p>Maybe something about reproducibility (like Docker containers etc.) or code +publications beyond Zenodo.</p> +</li> +<li> +<p>A small note on how to correctly version-control Jupyter notebooks would be +useful.</p> +</li> +<li> +<p>It would have been nice to spend a couple of minutes on GitHub Desktop (not +all of us are Terminal fans).</p> +</li> +<li> +<p>Build systems: For example Make or CMake.</p> +</li> +<li> +<p>HPC: What are supercomputers and how to use them. What are GPUs, how to program and use them.</p> +</li> +<li> +<p>Object Orient Programming (for Python).</p> +</li> +<li> +<p>Use of AI tools for coding.</p> +</li> +<li> +<p>Perhaps package building for Python? Or a practical example of Docker +application? But this is more for a subsequent workshop, I would not remove +anything from the workshop as I attended it.</p> +</li> +<li> +<p>Go further on how to browse some else's code.</p> +</li> +<li> +<p>Further on recovery options of erroneous commits.</p> +</li> +<li> +<p>A bit on debugging.</p> +</li> +<li> +<p>More than additional topics, interactive/exercise segments should be added +after topics to reinforce learning. This was more the case in earlier workshops +than the day 1 HPC best practices workshop.</p> +</li> +<li> +<p>In terms of content covered, although challenging, more concrete examples on +how to find the right amount of memory and CPUs to allocate a job would be +incredibly valuable.</p> +</li> +<li> +<p>For the general CodeRefinery workshop, I think a &quot;putting it all together&quot; +unit, including hands-on exercises, would be incredibly helpful, and almost +essential, to see the extent of a baseline application of the knowledge +included.</p> +</li> +<li> +<p>Since Visual Studio code is quite popular editor it would be good to teach +running Jupyter notebooks in Visual Studio Code.</p> +</li> +<li> +<p>The courses are very complete, perhaps something about dataset sharing.</p> +</li> +<li> +<p>ML maybe =)</p> +</li> +<li> +<p>Something about docker maybe? It's used more and more in my experience.</p> +</li> +<li> +<p>Perhaps a couple of more advances focused workshops of advances git to save +time and make it easier to manage code and collaborating.</p> +</li> +<li> +<p>Code for publishing.</p> +</li> +<li> +<p>PEP 8 style.</p> +</li> +<li> +<p>Maybe for more advanced courses: Object based coding.</p> +</li> +<li> +<p>Functionalizing a code.</p> +</li> +<li> +<p>I think it is just right. Adding more may be too overwhelming for a beginner.</p> +</li> +<li> +<p>Testing.</p> +</li> +<li> +<p>Refactoring.</p> +</li> +<li> +<p>Management in general (partly done already).</p> +</li> +<li> +<p>I would have liked to spend more time on reproducible environments.</p> +</li> +<li> +<p>Difficult to know. I recently would have benefited from knowing more about +(c)cmake, but this becomes very specific. Git is likely the one thing that +has most general applicability from your education suite.</p> +</li> +<li> +<p>More focus on writing statistical code (as opposed to software).</p> +</li> +<li> +<p>The topics look fine the overall organization of the workshop was a limiting +factor. There were too many participants and it got chaotic due to the +limited number of teachers. Maybe CodeRefinery should focus on quality rather +than on quantity, for instance deliver courses with reduced number of +participants on-line. Also, CodeRefinery can coordinate with universities +where local instructors could teach the courses locally.</p> +</li> +<li> +<p>Conda environments.</p> +</li> +<li> +<p>Using pycharm for some code development and version control.</p> +</li> +<li> +<p>More testing and how to switch from chaotic version control to a good one. +Now there is only from scratch, but it would be helpful to go over from +midpoint.</p> +</li> +<li> +<p>How to use Chatgpt to assist coding.</p> +</li> +<li> +<p>Using a IDE for Python programming: Notebook &amp; Git/Github integration, debugging, etc.</p> +</li> +<li> +<p>Docker or containerization in general.</p> +</li> +<li> +<p>How about software design for research? How to write reusable and +maintainable code when you don't know today what you need tomorrow, or when +students, who may have been sole authors, move on.</p> +</li> +<li> +<p>More examples of Pull requests, forks and upstream repositories or local +repositories.</p> +</li> +<li> +<p>More advanced topics on git collaboration.</p> +</li> +<li> +<p>Since I work with R I would have liked to get more R specific information. +But I can see how it can be difficult to add specific info if everyone uses a +different language.</p> +</li> +<li> +<p>Conda vs mamba, module management?</p> +</li> +<li> +<p>Code architecture and data repository architecture and management.</p> +</li> +</ul> +<h2 id="what-topic-s-should-we-remove">What topic(s) should we remove?</h2> +<p>[Answers like &quot;None&quot;, &quot;Nothing&quot;, &quot;Everything was on point&quot;, &quot;All the topics are +relevant&quot;, etc., are not shown in the results below.]</p> +<ul> +<li> +<p>The course is very good as it is ... +However, The 6 half days over 2 consecutive weeks is not very convenient for some people here ... +However, I understand the difficulty to bring together online helpers and instructors. +You are doing a good job ! Keep going !</p> +</li> +<li> +<p>Reproducible research and social coding are a little vague for my taste. So if you need more time, I'd skip them.</p> +</li> +<li> +<p>Jupyter</p> +</li> +<li> +<p>The Open Science workshop day has a lot of potential, but there is too little +time with too few interactions with too many topics to make a difference. The +exercises are not very engaging and you did not go deep enough in the aspects +you try to cover.</p> +</li> +<li> +<p>Jupyter notebook, because Python is too slow.</p> +</li> +<li> +<p>I attended the workshop about Git and was surprised that also other topics +were covered. Maybe have shorter, more focused courses instead of the current +format.</p> +</li> +<li> +<p>In the first workshop I attended, the general code refinery workshop, I did +not get enough of a grasp on Snakemake, and other tools I understood well +mainly because of prior experience. I think this was a wonderful workshop +that I have repeatedly recommended to my colleagues, but I think more time +should be given to fully try out and cement each tool introduced. I would +roughly add 50-100% more time to the course and spend all the added time on +more live exercise walk-through and coaching while people work on exercises +individually. I would not remove any topics.</p> +</li> +<li> +<p>I found the basic Git introduction to be rather tedious, so I lost my focus +and motivation. This made it difficult to prioritize attending the final +parts of the workshop over other duties, so I eventually opted out +completely.</p> +</li> +<li> +<p>I would much prefer an approach were participants are assumed to be at a +somewhat competent level from the get-go. Preparation material could be +provided ahead of time for the beginners.</p> +</li> +<li> +<p>Maybe automated testing and modular coding to put that in a separate workshop about improving coding practices.</p> +</li> +<li> +<p>Documentation was a lot of things in a very short time. I say just choose one +of the documentation options to explain.</p> +</li> +<li> +<p>None of them. Or split the topic of collaborative programming (Day 1 to 3) +and documentation (Day 4 to 6) to two separate courses.</p> +</li> +<li> +<p>I don't think anything should be removed...maybe a second workshop that goes into more depth on reproducibility?</p> +</li> +<li> +<p>How about you ask registrants to pick their three/five/x favorite topics from +a list upon registration, and you select the N most popular ones? Perhaps +makes it more difficult to prepare, and perhaps makes it more difficult for +participants to commit, but since participation (at least online) is a +relatively low commitment, maybe it is okay anyway?</p> +</li> +<li> +<p>Maybe a small practice session for some of the presenters - a few of the +presenters could improve their communication skills. I know it is a small +thing, but just adding 10-20% humor or more energy into a presentation can +really significantly affect the learning output for students.</p> +</li> +<li> +<p>For me personally the Jupyter notebooks session was less helpful. But that +doesn't mean it should necessarily be removed.</p> +</li> +</ul> +<h2 id="other-feedback">Other feedback</h2> +<ul> +<li> +<p>Let me highlight it here: your format is great! +The features I liked in particular:</p> +<ul> +<li>HackMD and very high quality feedback there</li> +<li>type-along sessions</li> +<li>dialogue between the two teachers as a format of the lecture. +Many thanks for your effort!</li> +</ul> +</li> +<li> +<p>It was great that I could watch the few sessions that O unfortunately couldn't attend on video.</p> +</li> +<li> +<p>Thanks a lot for organizing these super useful workshops +and for promoting/creating a environment very relaxed and inclusive +learning environment.</p> +</li> +</ul> + + + + + Citation Information for Open Source Lessons + 2024-07-30T00:00:00+00:00 + 2024-07-30T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/07/30/lesson-cffs/ + + <div class="uk-alert-danger" uk-alert> +<p>This post was originally published on the <a href="https://carpentries.org/blog/2024/07/lesson-cffs/">Carpentries blog</a> and is cross-posted here.</p> +</div> +<!-- toc --> +<p>In this post, co-authored by members of the CodeRefinery project and The +Carpentries Curriculum Team, we discuss the current state and potential future +applications of the Citation File Format (CFF) for open source lesson projects. +The post concludes with a set of recommendations for what information should be +captured in a <code>CITATION.cff</code> and how.</p> +<h2 id="what-is-the-citation-file-format-cff">What is the Citation File Format (CFF)?</h2> +<p>The <a href="https://citation-file-format.github.io/">Citation File Format</a> is a +plain-text human- and machine readable citation information metadata for +software and datasets. The text files contain standardized fields and use the +<a href="https://en.wikipedia.org/wiki/YAML">YAML</a> serialization language. These fields +are listed in a <code>CITATION.cff</code> text file, including but not limited to authors, +title, version, identifiers, and type. Type is currently restricted to software +and dataset. While lessons are neither software nor a dataset, the metadata +collected in the CFF file represents well everything needed in order to also +cite lesson materials.</p> +<p>Popular tools and platforms like GitHub, Zenodo, and Zotero integrate with the +Citation File Format and understand and use <code>CITATION.cff</code> files.</p> +<img width="80%" src="/blog/cite-this-repository.png" alt="GitHub displays a 'Cite this repository' pop-up on projects containing a CITATION.cff file."> +<p>Creating a new <code>CITATION.cff</code> file is easy with the initializer +<a href="https://citation-file-format.github.io/cff-initializer-javascript/">CFF-init</a>, +but fields need to be filled with care. The webtool can also be used to update +an existing CFF: the current version is uploaded to the site, pre-populating +fields in the form with the information in the file.</p> +<p>CFF can be converted to other formats (APA-like plaintext, BibTeX, CodeMeta, +EndNote, RIS, schema.org JSON, .zenodo.json) using +<a href="https://github.com/citation-file-format/cffconvert">cffconvert</a>. This tool +can also be used to validate the CFF file on the command line to make sure that +all fields are valid and all required fields are present. The validation step +can be automated and part of code review using the +<a href="https://github.com/marketplace/actions/cff-validator">cff-validator</a> GitHub +Actions workflow.</p> +<h2 id="why-we-want-to-make-lessons-citable">Why we want to make lessons citable</h2> +<p>The motivation to adopt and integrate CFF into lesson metadata and to make +lessons citable is first and foremost to give the many contributors, editors, +and lesson maintainers credit and hopefully more visibility for their work +(which is sometimes paid but often on volunteer basis). Lessons can then be +cited and their contributors can point to these on their CVs to highlight their +work and the reach of their work.</p> +<p>The second motivation is that by assigning a digital object identifier to +lessons we have a chance to make the material more persistent and findable +beyond the lifetime of projects. Many projects are limited in time and we wish +to avoid that knowledge and lessons simply disappear when a project website is +discontinued.</p> +<p>Citation File Format was conceived to describe software and data, and it is +sometimes not obvious how it should translate to &quot;creative&quot; outputs like +lessons. Nevertheless, Open Source lessons like those created by the +CodeRefinery and Carpentries communities are similar to software projects in +many of the ways that matter for CFF: they have a commit history, an open +license, multiple versions, publicly-accessible repositories, etc. Another +similarity to software and data projects is that it is often not clear how Open +Source lessons should be cited by those who have used and benefited from them. +The growing ecosystem of tools and platforms that support CFF lead us to +conclude that adopting the format is the sensible choice when providing +citation information for our lessons.</p> +<h2 id="towards-fair-metadata-for-lessons">Towards FAIR metadata for lessons</h2> +<p>In future, we hope to establish a yearly release cycle for stable lessons. +Lessons in the early stages of development, which can be expected to undergo +relatively frequent and dramatic changes, may be released more often and less +regularly. Before each release, we plan to verify the <code>CITATION.cff</code> file, and +then create a new release with the version tag in the form <code>YYYY-MM-DD</code>.</p> +<p>Ideally, the CFF file is continuously modified with pull requests (or merge +requests) that bring in lesson changes. With pull/merge requests as the main +mechanism to suggest changes, updating the author information becomes part of +code/lesson review, and is ideally not postponed to the time when we finalize a +new release.</p> +<p>A successful adoption of the CFF metadata in lessons could bring us one step +closer to have a well-defined FAIR metadata for lessons by reusing some of the +information captured in the CFF metadata. For this, we will need to compare +metadata specifications of related efforts (e.g. <a href="https://bioschemas.org/profiles/TrainingMaterial/1.0-RELEASE">the TrainingMaterial +specification from +BioSchemas</a>, <a href="https://schema.org/Course">the +Course specification from schema.org</a>) to find and +define a common overlap (however, we might explore this in more detail in a +future blog post).</p> +<h2 id="next-steps">Next steps</h2> +<p>We will start integrating the CFF first into few of our lessons (in order to +test and debug the process and to collect more experience and possibly identify +new problems that we did not anticipate). Eventually, we will roll this out to +all our lessons. Our hope is, that other projects will then follow our example +and also contribute to the process itself.</p> +<p>The first step towards making a lesson citable is often to collect a list of +all contributors and to reach out to them to get their consent to be listed. +CodeRefinery plans to do this through GitHub issues tracked close to the +corresponding lesson repositories (<a href="https://github.com/coderefinery/documentation/pull/270#issuecomment-1673439760">review an example from +CodeRefinery</a>). +The Carpentries already records community members' consent to be included in +lesson publications as part of their profile in the community database, +<a href="https://amy.carpentries.org/">AMY</a>. (You can log in an update your content +preferences any time!)</p> +<p>In order to simplify the process of uploading release artifacts to Zenodo we +will create a GitHub Actions workflow which will upload the data and the +metadata to Zenodo using the Zenodo API. Although further development is +required to implement this workflow, <a href="https://project.software-metadata.pub/">the HERMES +tool</a> may be pivotal in the retrieval, +collation, processing, and publication of the relevant metadata.</p> +<p>What should be the release artifacts? Our plan is to upload both the lesson +sources as well as a generated PDF/HTML from the lesson sources. This workflow +will be run on each release creation. Using the Zenodo API rather than +uploading the lessons manually offers several advantages, foremost that we can +avoid the situation that future updates to a lesson record would be tied to the +person who uploaded the first version. By the time we will want to upload the +next version, that person might have already left the organization or project. +Instead, we should be able to share the permission to update the lesson record +and metadata within organizations, projects, and research groups (where +applicable).</p> +<p>Thanks for reading this far! Do you have ideas for how citation information +could be used in our lessons, or feedback about the proposed implementation +above? If so, we would be delighted to <a href="mailto:tobyhodges@carpentries.org">discuss it +further</a>. For those interested in the finer +details of CFF for lesson projects, the remainder of this post describes the +specific information that we recommend to include in the <code>CITATION.cff</code> of an +open source lesson.</p> +<hr /> +<h2 id="what-information-should-be-captured-in-a-cff-for-a-lesson">What information should be captured in a CFF for a lesson?</h2> +<p>Based on previous experience and discussions at various conferences and events, +we have developed the following list of information that should be captured in +the CFF of an open source lesson.</p> +<h3 id="authorship-information">Authorship information</h3> +<p>Lessons are usually the product of numerous and diverse contributions from a group of people. Contributions can be made in a wide variety of different ways: most directly by writing and committing content to the default branch of the project, but also by providing feedback on pull requests, contributing to discussions on issues and elsewhere that influence the content, and/or providing input during the initial planning/ideation of the project. The list of authors should aim to include everyone who has contributed to the project, <em>whether or not they are represented in the commit history</em>. Although some omissions are inevitable, especially on large/long-established projects, capturing all of these contributions in the author list best represents the open and collaborative nature of such projects. This aligns with one of <a href="https://carpentries.org/values/">the core values of The Carpentries community</a>: <em>valuing all contributions</em>.</p> +<p>Inclusion of non-committing contributors complicates the definition of an order of authors in the list. Furthermore, we feel that any order based solely on the commit history of the project -- whether by number of commits or number of lines added/deleted -- are imprecise proxies to the magnitude and importance of contributions. Therefore, our recommendation is to provide a list of authors ordered alphabetically by last name.</p> +<p>At the time of writing, the Citation File Format specification does not provide a way to describe different types of contribution (e.g. according to <a href="https://credit.niso.org/">the CRediT framework</a>). Where a subset of authors should be given further prominence, we recommend capturing this in a published record of the lesson e.g. on Zenodo, where more fine-grained definition of contributor roles is possible. For example, The Carpentries lists lesson Maintainers as Editors in the related Zenodo records. For CodeRefinery, everyone is currently added as Creator.</p> +<h3 id="the-project-type">The project <code>type</code></h3> +<p>At time of writing, <a href="https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md">the CFF +specification</a> +only provides for two types of project: software and dataset. It may not be +immediately clear which of these categories a lesson falls into. However, <a href="https://github.com/carpentries/sandpaper/issues/508#issuecomment-1700592304">the +CFF team recommends that lesson projects specify <code>&quot;dataset&quot;</code> as the <code>type</code> in +their <code>CITATION.cff</code> +file</a>.</p> +<h3 id="references">References</h3> +<p>The <code>references</code> field in a CFF can be used to recognise and credit resources +that your lesson is based on/draws from/is inspired by. This is a great way to +provide attribution to other Open Source content that has been modified/adapted +for inclusion in your lesson, literature cited in your lesson, etc.</p> +<h3 id="abstract">Abstract</h3> +<p>The <code>abstract</code> field of the <code>CITATION.cff</code> should be used to provide a brief +description of the lesson, including its target audience and a list of its +learning objectives/intended learning outcomes.</p> +<h3 id="doi">DOI</h3> +<p>A <a href="https://the-turing-way.netlify.app/communication/citable/citable-steps.html#dois">Digital Object +Identifier</a> +(DOI) provides a permanent record of your lesson, usually associated with a +particular version published online. It should be included in the lesson CFF, +and updated regularly as the lesson evolves, so that any citation made from it +will include information about exactly which incarnation of the lesson was +used. You might receive a DOI when the lesson is published e.g. in <a href="https://jose.theoj.org/">The Journal +of Open Source Education</a> and you can also obtain one +yourself by creating a Zenodo record for the lesson. We recommend that you +publish a lesson to Zenodo early, e.g. when you are ready to teach it for the +first time (to use The Carpentries terminology, when it enters alpha testing), +and release new versions on the same Zenodo record as the lesson develops.</p> +<p>The CFF specification allows for a DOI to be included with the <code>doi</code> field, or +as one entry in the <code>identifiers</code> array. Either method is valid -- <code>doi</code> being +simpler and more concise, but <code>identifiers</code> being produced when using <code>cffinit</code> +to create/update the CFF -- and we make no specific recommendation either way.</p> +<h3 id="other-information">Other information</h3> +<p>The following fields should also be included in a lesson's <code>CITATION.cff</code>:</p> +<ul> +<li>license</li> +<li>cff-version - use the latest version whenever possible</li> +<li>title: descriptive of the content, if possible specifying that this is lesson material</li> +</ul> +<h3 id="examples">Examples</h3> +<ul> +<li>Example in a CodeRefinery lesson: +<ul> +<li><a href="https://zenodo.org/records/8280235">Zenodo</a></li> +<li><a href="https://github.com/coderefinery/documentation/blob/main/CITATION.cff">CFF</a></li> +</ul> +</li> +<li>Example in The Carpentries Collaborative Lesson Development Training repository: +<ul> +<li><a href="https://github.com/carpentries/lesson-development-training/blob/main/CITATION.cff">CFF</a></li> +</ul> +</li> +</ul> + + + + + Summary of business and financing models -planning session Tromsø 2024 + 2024-06-17T00:00:00+00:00 + 2024-06-17T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/06/17/finance-models/ + + <h1 id="summary-of-business-and-financing-models-planning-session-tromso-2024">Summary of business and financing models -planning session Tromsø 2024</h1> +<!-- toc --> +<h2 id="financing-coderefinery-from-reality-to-expectations">Financing CodeRefinery - from reality to expectations</h2> +<p>CodeRefinery is receiving funding from the parent organisation <a href="https://neic.no">NeiC</a>. That covers two half-time personnel and some operational costs, like travelling. +Apart from those two project people, the activities and products of CodeRefinery are largely run and produced by people from organisations who see the value of letting their employees to spend time on CodeRefinery activities. This in-kind model has made all CodeRefinery work possible.</p> +<p>CodeRefinery is a project, not a company or organisation (situation Feb 2024). This means we cannot invoice for our work. If some company would like to have tailored training form us and is willing to pay forit, we have no way to handle the transactions.</p> +<p>During our meetup at Tromsø Feb 2024 we held a session to brainstorm possible ways to let CodeRefinery operations continue. </p> +<ul> +<li>We would need a way to invoice.</li> +<li>We would not want people to work for free</li> +<li>We should be able to accept grant funding</li> +<li>Many CodeRefinery team members would like to continue in-kind work</li> +<li>People would like multiple different ways of working: in-kind, freelancer, direct employment to name a few</li> +</ul> +<h3 id="open-source-open-core">Open source – open core?</h3> +<p>CodeRefinery is an open project and the outputs are openly licensed with distributed copyright. If we are to introduce paid products and/or services we need to be very transparent of the guiding principles and the business model. One example is the open-core model in software industry, where basic functionality is offered open source and free, but premium features are behind a paywall.</p> +<p>Our warm-up exercise in the workshop session was to gather ideas what CR should offer for free, and what possibly could be behind paywall. This is not a definitive list, but something to start the discussions with.</p> +<p><strong>CR could offer for free:</strong></p> +<ul> +<li>General or introductory course and lesson materials, possibly without integration</li> +<li>General CR workshop in some format</li> +<li>Tutorial videos eg. in YouTube</li> +</ul> +<p><strong>CR could charge a fee for:</strong></p> +<ul> +<li>Advanced courses</li> +<li>Customised training</li> +<li>Courses for private sector</li> +<li>Training for organisations that do not contribute to CodeRefinery but want the training</li> +<li>In-person events like summer schools</li> +<li>Workshop collaborative notes access</li> +<li>Technical consultation for research</li> +</ul> +<h3 id="towards-a-business-model">Towards a business model</h3> +<p>For a business model one needs to consider for example the following questions: &quot;Who are our customers?&quot;, &quot;What services we offer?&quot;, &quot;What are the potential sources of income?&quot;, &quot;Who are the other operators in the field?&quot;. We filled in a flowchart consisting of Customers, Service Providers and the flows of value in both directions. </p> +<p><strong>Potential customer segments</strong></p> +<ul> +<li>Organisations that want to build the employee competence eg. in version control</li> +<li>PhD students and researchers</li> +<li>Universities that want to include our topics in their curricula</li> +<li>Research projects that want to outsource training work packages</li> +<li>Small SaaS startups</li> +</ul> +<p><strong>Potential services</strong></p> +<ul> +<li>Courses, workshops or summer schools</li> +<li>A lecturer for an university course</li> +<li>Bootcamps for companies' new employees</li> +<li>Consultation of technical support for research teams or companies</li> +<li>Consultation for individuals eg. a monthly zoom call</li> +</ul> +<p><strong>Potential service providers</strong></p> +<ul> +<li>A freelancer trainer or RSE</li> +<li>An in-kind employee from a partner organisation</li> +</ul> +<p><strong>Potential income/resources</strong></p> +<ul> +<li>A partner organisation lets people to work for CR = in-kind contribution</li> +<li>Funding from EU or a funding agency +<ul> +<li>Funding agencies could require projects to get training in reproducible research</li> +</ul> +</li> +<li>Subscriptions eg. Patreon</li> +<li>Course/workshop fees</li> +<li>Service fees (from eg. consultation)</li> +<li>YouTube ad revenue</li> +<li>Sponsorships: we advertise a product we think is worth it to our target groups and get paid to do it</li> +</ul> +<h3 id="next-steps">Next steps</h3> +<p>Some of these listed items have more potential than the others – and some of them might have synergies together. Then it comes to the decisions about our vision and guiding principles. Those can indicate whether some of the options listed here don't represent what we want CodeRefiery to be. +We (CodeRefinery) could formulate a business plan as a tool to refine the ideas and find out the most feasible solution. </p> + + + + + Why should your organization support CodeRefinery and how? + 2024-06-07T00:00:00+00:00 + 2024-06-07T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/06/07/organisation-info-support-cr-how/ + + <h1 id="why-should-your-organization-support-coderefinery-and-how">Why should your organization support CodeRefinery and how?</h1> +<p>There are many courses at universities and on the internet about learning how to code for researchers. But not many teach about sustainable software development or how to collaborate with others.</p> +<p>The consequences of this gap are that researchers tend to start from scratch, code on their own, or that a lot of time is spent on figuring out old codes by onself or others instead of spending that valuable time on research.</p> +<p>The idea of the CodeRefinery project is to help researchers that already know how to code (in any language) to increase their codes reproducibility and show some tools that can help on this journey. </p> +<p>CodeRefinery is a growing training network. We try to make this project more accessible and inclusive. We developed public and freely available and reusable learning and teaching materials on many topics around research software development in order to improve its FAIR-ness (Findable, Accessible, Interoperable, Reusable).</p> +<p>Our workshops foster collaborative research/work environment to increase productivity and efficiency. +The workshops themselves are interactive online events, to which participants can join individually or in team. +Teams usually have some kind of advanced person with them to guide through the exercise sessions.</p> +<p>From our point of view, organizations can support the CodeRefinery project in many different ways, as can be seen from the following figure:</p> +<p><img src="/blog/CR_organization.png" alt="Figure showing different possibilities for organizations to support the project, description below" /></p> +<h3 id="advertise">Advertise</h3> +<p>The easiest way to support us is to advertise the workshop to your network. In that way, you can get people that know about FAIR software development back and can start implementing it in their work creating a more collaborative working environment regarding research software. By participating, your organization contributes to improving research software quality.</p> +<h3 id="observe">Observe</h3> +<p>If you are curious about how these workshops work, you can always send observers: a CodeRefinery workshop is a special event, let your teachers observe how we do things and maybe we can learn a thing or two from each other.</p> +<h3 id="teach-with-us">Teach with us</h3> +<p>The most valuable contribution for us is to let your experienced employees work on lesson development, or be an instructor on worktime (&quot;contribute in kind&quot;). That way we can learn from each other and everyone can bring in their expertise to make the project sustainable. In-kind contribution can be facilitated by including it as apart of your organisation's culture to develop employee's competence and accelerate knowledge transfer.</p> +<h3 id="provide-a-local-team-space">Provide a local team space</h3> +<p>If you want to provide a better way of learning together in a CodeRefinery workshop, provide a (virtual or real) room for a team from your institution to join the workshop together (&quot;bring your own classroom&quot;). This facilitates collaborative learning. You can make use of our central registration system or use your own (if you need control over own registration, credits, schedule).We mention all &quot;local breakout rooms&quot; on our webpage, if wished, to maximize outreach for these possibilities.</p> +<h3 id="collaborative-workshops">Collaborative Workshops</h3> +<p>Within the CodeRefinery community an organization can also collaborate with CodeRefinery partner organizations on other trainings that otherwise could not happen due to missing resources for. In that way we can share the &quot;burden&quot; of teaching. One example for such collaboration: Aalto university HPC kickstart with participants from all over Nordics, partners contribute to teaching and cluster specific instructions</p> +<h3 id="user-community">User Community</h3> +<p>If you are a part of a specific user community or a project, you can benefit similarly by supporting CodeRefinery.</p> +<p>The CodeRefinery team is happy to discuss these or other possibilities further via email or arrange a meeting. Please contact support@coderefinery.org, if you are interested.</p> +<p><em>Together we can improve research software practices, promote collaboration, develop expertise, and establish an inclusive training network!</em></p> + + + + + In-person meeting summary: Community + 2024-04-20T00:00:00+00:00 + 2024-04-20T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/10/writing-retreat-community.md/ + + <p>As mentioned in a previous blog post on social media strategy, it is our desire to build and expand the CodeRefinery community around our shared interest in FAIR research software practices. +currently, the CodeRefinery community mainly lives in the Zulip chat, which is something we want to expand to our various social media platforms. People that mainly engage in our chat are spread all over the Nordics. +Some of these people are even located in the same country, but can live hundreds of kilometers apart. +In order to bring the community together and develop an onboarding strategy to the community, we first need to look at what the CodeRefinery community actually is.</p> +<h2 id="the-coderefinery-community">The CodeRefinery community</h2> +<p>The first question we asked to the participants of the in-person meeting in Tromsø was &quot;What is the CodeRefinery community to you?&quot;. +Answers:</p> +<ul> +<li>A place where it feels safe to ask questions around the coderefinery workshop, but also beyond</li> +<li>A place to get some interesting tips that i didn't know i needed to know (TIL)</li> +<li>RSE (Research Software Engineers) that like teaching</li> +<li>A small group of people that found each other and want to make the (research)world a better place + a slightly larger group of people that find the topics more or less interesting and more or less follow what is happening</li> +<li>A place to share working experience and interactions with those having similar interest +<ul> +<li>Brainstroming discussion on varied topics</li> +</ul> +</li> +<li>Place to get feedback and input on ideas and tasks</li> +<li>Place to learn things and ask for help</li> +<li>Place where there is a lot of discussions going on</li> +</ul> +<h2 id="zulip-chat">Zulip chat</h2> +<p>The level of engagement in the community is largely tied to how much time people spend in the chat, which often is not too much. Everyone already has their own work chat, that needs to be followed, and having all the different chats and platforms can easily get overwhelming.</p> +<p>The main reason to engage in the chat is to ask questions and read the answers as well as coordinate CodeRefinery and other than CodeRefinery workshops (often around High Performance Computing (HPC)). +The &quot;monday morning hello&quot; (in #general stream) was mentioned as one way of feeling engaged with and welcome by the community. </p> +<p>Apart from &quot;not enough time&quot; to follow the chat, also its unorganized nature was mentioned as a reason not to engage. +We briefly disucussed that this can partly be solved by using the chat differently, following/unfollowing topics and streams that are of interest to oneself and setting up notifications properly. Another way to limit the information overflow could be to take better care of marking topics as &quot;resolved&quot;, when there is nothing to be discussed anymore.</p> +<p>We have since been discussing a chat cleanup and reorganization/renaming strategy (to be implemented in early summer '24) and will be sharing tips on how to use Zulip efficiently as blog, event or video. In addition to that, admins will try to be more active in managing the chat. +After the reorganization and the addition of an events channel will also try to share more events of interest to the community via chat and our <a href="https://coderefinery.org/calendars/">calendars</a> where appropriate. </p> +<p>We already implemented a &quot;CodeRefinery for busy people&quot; weekly chat summary, which anyone can sign up to here: <a href="https://postit.csc.fi/sympa/subscribe/coderefinery-team">https://postit.csc.fi/sympa/subscribe/coderefinery-team</a>. In addition to that, we will also continue the less frequent (~one email every one/two months) <a href="https://postit.csc.fi/sympa/subscribe/coderefinery">newsletter</a>.</p> +<h2 id="sharing-the-work">Sharing the work</h2> +<p>One big ask from the community was to share the work/tasks more open and completely. We used to have a large list of tasks sorted by amount of time a community member has to spare. While this was considered a good idea, the tasks often lacked description, and so were not taken over by the community. We have therefore started to move the tasks back to the github organization, where all open tasks are assigned to repositories and described in enough detail that anyone in the community could pick up the task. The tasks are also labelled by the time it approximately takes to fulfill the task and urgency. Anyone can find the board under the <a href="https://github.com/orgs/coderefinery/projects/7">Coderefinery GitHub organization</a>.</p> +<h2 id="community-calls">Community calls</h2> +<p>An additional request by the participants for more community engagement, was to restart community calls. So we decided to have some more and more regularly in the future. A challenge to ourselves will be to also make those engaging and worth of spending ones time. These community calls can have a specific topic and/or serve as Q&amp;A and discussion sessions for the community. It is important to us that the community gets something out from them. We also invite the community to shape these calls, by suggesting topics or take over the organization of a call. In order to attract people to the community calls, the topics and dates should be set as early as possible.</p> +<h2 id="extending-the-instructor-helper-organizer-pool">Extending the instructor/helper/organizer pool</h2> +<p>We also brainstormed ideas for attracting more people to be instructors/helpers/organizers of the CodeRefinery workshop. Since we upscaled the workshop from ~20 people in person workshops to ~200 online participants, being an instructor or helper in the workshop has become more complex. It is less interesting to teach to the stream, which on our end is just a pretty empty Zoom call. Our co-teaching model ensures that the instructor is never alone and the collaborative document is used to influence the teaching, but that does not replace a room full of learners. The current workshop format also seems very complex for newcomers and we have not been offering a train-the-trainer program lately (planned for fall 2024 now! - stay tuned). Due to the sometimes a little bit chaotic planning phase and usually enough team members signing up for the workshop we have not done much active outreach for the workshops lately. For this to work it might be required to contact possible instructors more directly and offer direct mentoring. Which is something we are very keen on providing and making it fun and interesting for everyone to contribute. Again, people need to get something out from it.</p> +<h2 id="other-ideas">Other ideas</h2> +<p>In order to engage with the community a few other ideas were discussed as well: +We could approach different domain communities by visiting their events and presenting CodeRefinery. In addition, we could organize our own info events, targeting different groups to engage more directly. Here, also our close connection to the RSE community could be used more. Another idea was to offer further BYOC (bring your own code) sessions to provide the possibility of interacting with CodeRefinery instructors and asking for support.</p> + + + + + In-person meeting summary: Onboarding + 2024-04-20T00:00:00+00:00 + 2024-04-20T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/10/writing-retreat-onboarding.md/ + + <p>In order to provide newcomers to the CodeRefinery community a good experience that inspires them to stay we need to create a welcoming atmosphere and provide a good onboarding.</p> +<h2 id="coderefinery-onboarding">CodeRefinery onboarding</h2> +<p>Currently, our onboarding procedure varies from case to case. The team at in-person meeting are mainly in-kind contributions to the project that joined the project on own incentive (usually after a workshop) or by being sent by their managers. Everyone got at least one personal meeting with the project manager, which introduced them to whatever was needed at the time. One thing that many of the team mentioned was that they wish they had gotten more introduction to the Zulip chat. ( More on improvement suggestions in the &quot;community&quot; blog post).</p> +<p>Team members generally agreed that active participation an interest in strategy and availability to help/teach makes them part of the CodeRefinery team. +Everyone present felt well onboarded.</p> +<h2 id="roles">Roles</h2> +<p>We currently have a few different roles a community member fits into: </p> +<ul> +<li>team (mostly in-kind contributions and highly motivated individuals, onboarding via team meeting and personal chat with the project manager),</li> +<li>instructors (Workshop team leader onboarding or personal onboarding by co-instructor or the workshop organizer, often no further community engagement), </li> +<li>helper / team leader (onboarding before each workshop, often no further community engagement), </li> +<li>&quot;everyone in chat&quot; (no specific onboarding, unless they use #new-members stream; info from website)</li> +</ul> +<h2 id="where-to-find-information">Where to find information</h2> +<p>We discussed what information potential future community members should get from the website and what should be made available later:</p> +<ul> +<li>What do I get in return?</li> +<li>How do I get started, show me the steps</li> +<li>What kind of responsibilities/roles are there in the community</li> +<li>How can I help or &quot;I have only half a day this month, where can I help which will be meaningful?&quot;</li> +</ul> +<p>All those are very good points which we will make sure to inlcude on the website, our project board and the chat redesign (see community blog).</p> +<h2 id="the-perfect-onboarding">The perfect onboarding</h2> +<p>We also asked the question: &quot;In a perfect world where everything is possible, money and time is not an issue, how would onboarding look?&quot; to see what the ideal onboarding for participants of the meeting would look like. These were the answers:</p> +<ul> +<li>Join community call -&gt; We have more community calls and better advertising of them planned in the future</li> +<li>One manual page which gives overview -&gt; We since created: https://coderefinery.github.io/manuals/onboarding/</li> +<li>A video that explains how to join </li> +<li>Each new member gets a mentor/buddy who mentors for a while and is their main contact and who connects them to other people</li> +<li>In person event</li> +<li>Co-teaching with a mentor (as one option)</li> +</ul> +<p>The mentor system we will try to implement better in the future also beyond the workshop.</p> +<h2 id="new-roles">New roles</h2> +<p>We also asked if we need to add more roles in the community and what those would be. Most CodeRefinery team members do not have specific roles unless they decide so themselves. Roles that we do not currently have in the community:</p> +<ul> +<li>Ambassadors; people that could already be called ambassadors are local organizers of teams to watch the CodeRefinery workshop stream and do the exercises together and training coordinators in organizations or projects that help advertising the workshops -&gt; We have since started to implement the <a href="https://coderefinery.github.io/manuals/ambassadors/">CodeRefinery ambassador program</a> and plan to invite our known suspects soon. If you want to become an ambassador, please check out the <a href="https://coderefinery.org/join/individuals/#coderefinery-ambassador">ambassador section on our website</a>.</li> +<li>Board; in order to continue working on CodeRefinery after the project funding ends we need to define who can make decisions</li> +<li>Contributors; e.g. lesson material contributors need to acknowledged better (citation file format (.cff) in progress) and</li> +<li>Heroes.</li> +</ul> +<p>We are currently working on fleshing out what it would mean to be a CodeRefinery ambassador, what they can get out from it and how we can support future ambassadors. This could be similar to onboarding a new team member, e.g. via a community call, mentoring or some kind of a welcome package. Whenever we reach out to different research communities and during our workshops we could advertise this role. In the end it should be easy to become an ambassador and people should be able to make it whatever they need it to be.</p> + + + + + Drafting a governance structure for 2025 and beyond + 2024-04-19T00:00:00+00:00 + 2024-04-19T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/19/drafting-a-governance/ + + <!-- toc --> +<h2 id="executive-summary">Executive summary</h2> +<p>CodeRefinery's NeIC sponshorship may be coming to an end, and the feeling is +that partners want the collaboration to continue with some sort of structure. +In short, we propose to organize as a community project with a steering group +of interested partners that could take over CodeRefinery management on +2025-01-01:</p> +<ul> +<li>CodeRefinery continues with roughly the same vision and mission as now: +<ul> +<li>We want to promote reproducible science by training and community.</li> +<li>We will continue giving courses like we have been doing (but with more +possibility of new partners joining and custom teaching styles, including small local +courses).</li> +</ul> +</li> +<li>Board: a steering group of organizational partners and some community representatives. +<ul> +<li>The steering group will meet occasionally to discuss high-level matters and the broad direction.</li> +<li>The steering group can make agreements on behalf of CodeRefinery.</li> +<li>Updates the governance documents and accepts new organizational partners via majority vote.</li> +</ul> +</li> +<li>Community managers: Coordinate the project on a day-to-day basis. +<ul> +<li>Appointed by the steering group (with consultation of the community).</li> +<li>Handle most of the day-to-day organizational activities (or delegate them).</li> +<li>Report to and work with the board.</li> +</ul> +</li> +<li>Community: +<ul> +<li>Operated as an open-source project with an open community membership of individuals.</li> +<li>The board can work with organizational partners to define in-kind contributions and roles.</li> +<li>Recognized as decided by board/community managers.</li> +</ul> +</li> +<li>We don't currently plan a separate legal entity just for CodeRefinery.</li> +</ul> +<p>There are ideas on these matters is below, but there will be much more among +the &quot;founding board&quot; as it works towards formally defining a collaboration +agreement.</p> +<h2 id="mission-vision-and-guiding-principles-early-draft">Mission, vision, and guiding principles (early draft)</h2> +<p>(when thinking of these, think &quot;what makes us different from others?&quot;)</p> +<p><strong>Mission</strong> (what we do and why we do it¸ 2025):</p> +<ul> +<li>CodeRefinery improves science and research by providing education in the tools of computational science to a diverse audience. +<ul> +<li>CR empowers XX by providing skills needed for achieving YY through providing training on practical skills.</li> +</ul> +</li> +<li>Fill gaps between academia's lack of training in certain areas.</li> +<li>Preparing people and communities for high-performance computing and AI.</li> +<li>Foster a culture of FAIR, collaboration and openness in research software practices.</li> +</ul> +<p><strong>Vision</strong> (what we want to achieve):</p> +<ul> +<li>We create a highly skilled academic community who can do better, more reproducible science.</li> +<li>Our core workshops are a regular recommendation for any students or researchers who does computational research.</li> +<li>We have a wide variety of other rotating workshops, organized by partners but with contribution by many.</li> +<li>When research projects need extra training, they think of us and our team.</li> +<li>Skilled trainers and build knowledge transfer and build competence.</li> +<li>Highly skilled researchers and staff.</li> +<li>Create a group of good trainers in partner institutes.</li> +<li>Bringing academia into digital age.</li> +<li>Equip society with tools for collaborative and reusable research.</li> +</ul> +<p><strong>Guiding principles</strong> (when a difficult decision needs to be made, we invoke the following guiding principles):</p> +<ul> +<li>At our core, we are an open project and structure our working methods like one. Our outputs are openly licensed with distributed copyright.</li> +<li>We optimise for practical usability for those who lack skills in reproducible computational work. We don't try to replace career-oriented IT training.</li> +<li>Make people's lives easier (but we need to make this more tangible).</li> +<li>When in doubt, do what makes science/research/academics more reproducible.</li> +<li>Make it easier for people and organizations to participate.</li> +<li>Encourage collaboration when possible to do so.</li> +</ul> +<h2 id="structure-and-responsibilities">Structure and responsibilities</h2> +<h3 id="project-governance-2016-2024">Project governance 2016 - 2024</h3> +<ul> +<li>Initially: NeIC board</li> +<li>NeIC board transfers management to steering group via project directive</li> +<li>Project partners each appoint a steering group member</li> +<li>Steering group meets 2-3 times per year and makes big picture decisions</li> +<li>Day to day decisions by project manager in communication with steering group and project owner (NeIC)</li> +<li>Project manager reports to NeIC and project owner and steering group</li> +<li>Project manager is responsible for the project budget</li> +<li>Project manager tries to get support and consensus from the project team and community</li> +</ul> +<h3 id="scope-and-responsibilities-for-future-board">Scope and responsibilities for future board</h3> +<ul> +<li>Strategic and organisational planning</li> +<li>Ensuring the effective implementation of community objectives</li> +<li>Financial oversight</li> +<li>Business plan and budget plan</li> +<li>Capacity plan</li> +<li>Fostering collaboration among members</li> +<li>Name, brand, and public image</li> +<li>Steering the lesson portfolio</li> +<li>Coordinate community initiatives</li> +<li>Manage accounts: Freshdesk, Twitter, Fosstodon, GitHub, domain name, HackMD, Indico, chat, mailing list, GitLab, YouTube</li> +<li>Manage the data and data sharing policies</li> +<li>Contact point</li> +<li>GitLab (maybe)</li> +<li>Intellectual property</li> +</ul> +<h3 id="outline-of-the-structure">Outline of the structure</h3> +<ul> +<li>Partners: the institutions that collaborate, and unaffiliated individuals.</li> +<li>Board: high-level strategy and help. Can be consulted on big decisions and +for tricky trade-offs. Within mission statement, delegates all other +decisions to community managers.</li> +<li>Community managers: Manage day-to-day work and connection with steering +group. Build consensus among those doing the actual work for the day-to-day +operations.</li> +<li>Community: does work</li> +</ul> +<h3 id="board">Board</h3> +<ul> +<li>Initial board is one person per organization of the NeIC project.</li> +<li>Board decides its future composition, probably once a year.</li> +<li>Board confirms partner-level contributions.</li> +<li>Board confirms community managers (likely with the community's input) and delegates most daily operation to them.</li> +</ul> +<h3 id="community-managers">Community managers</h3> +<ul> +<li>Coordinate most of the day-to-day work.</li> +<li>Are responsible to the board, but mainly lead the community in doing the work.</li> +<li>Ensure rough consensus and push things forward if it can't be done.</li> +<li>Can appoint (=recognize on the website) leads in different areas.</li> +</ul> +<h3 id="community">Community</h3> +<ul> +<li>Community doe most of the work, and should be recognized as decided by the community managers and board.</li> +<li>This is a volunteer organization, no person has any requirement to do anything.</li> +<li>Members are expected to abide by our community standards of cooperation and respect.</li> +</ul> +<h2 id="working-methods">Working methods</h2> +<h3 id="code-of-conduct">Code of conduct</h3> +<p>We take our <a href="https://coderefinery.org/about/code-of-conduct/">code of conduct</a> as starting point but suggest to adapt it to +the governance structure and decision making process.</p> +<h3 id="conflict-resolution">Conflict resolution</h3> +<p>Questions to be worked out:</p> +<ul> +<li>What to do if there is conflict within leadership?</li> +<li>Conflict within community?</li> +<li>Conflict between leadership and community?</li> +<li>What if a collaboration partner becomes problematic? (mission, guiding principles, code of conduct)</li> +</ul> +<h3 id="community-meetings-communication-and-reporting-mechanisms">Community meetings, communication, and reporting mechanisms</h3> +<p>This needs to be worked out. +Data sharing policy needs to be worked out.</p> +<h3 id="amendments-to-the-governance-document">Amendments to the governance document</h3> +<p>Board can change based on majority vote.</p> +<h3 id="periodic-review-and-evaluation">Periodic review and evaluation</h3> +<ul> +<li>How often do we review the governance document?</li> +<li>How do we evaluate the success of the community and project?</li> +</ul> +<h2 id="discussion-points-during-the-in-person-meeting-in-february-2024">Discussion points during the in-person meeting in February 2024</h2> +<ul> +<li>Mission, vision, guiding principles: what is missing?</li> +<li>Initial board composition? The NeIC project partners? What if they prefer not to or are inactive? +<ul> +<li>proportional to activity 2023-2024?</li> +</ul> +</li> +<li>What if a board member leaves?</li> +<li>Can community elect a board member? +<ul> +<li>Should be able to, yes.</li> +</ul> +</li> +<li>What decision necessitates board input? +<ul> +<li>Initially guiding principles (part of foundation document), in principle anything they haven't delegated to a community manager.</li> +</ul> +</li> +<li>At which level of support should a partner be offered a board seat? +<ul> +<li>Board decides. Initial principle is &quot;those with in-kind work&quot;.</li> +</ul> +</li> +<li>&quot;This is a volunteer organization, no person has any requirement to do anything.&quot; - this is currently not the case but maybe we want this to be the case? +<ul> +<li>I guess that's more for community, rather than paid staff. Paid staff do what their employer says.</li> +</ul> +</li> +<li>Responsibilities for future board: what should be left out or added?</li> +<li>Who/what has ownership over intellectual property (IP)? Maybe case-by-case? +<ul> +<li>case: teaching material publicly available – CC-licence?</li> +<li>Transferring IP is probably very hard. Distributed IP is probably needed.</li> +</ul> +</li> +<li>Independent non-profit organization</li> +<li>Find the carpentries cooperation model and propose them to be in the board +<ul> +<li>E.g. Science library of University of Oslo</li> +</ul> +</li> +</ul> +<h2 id="inspirations-for-this-document">Inspirations for this document</h2> +<ul> +<li>NeIC/NICEST2 project governance draft (big thanks to A. Fouilloux)</li> +<li><a href="https://carpentries.org/blog/2024/02/revisions-to-the-carpentries-governance-structure/">https://carpentries.org/blog/2024/02/revisions-to-the-carpentries-governance-structure/</a></li> +<li><a href="https://hackclub.com/team/">https://hackclub.com/team/</a></li> +<li><a href="https://jupyterhub-team-compass.readthedocs.io/">https://jupyterhub-team-compass.readthedocs.io/</a></li> +</ul> + + + + + We have completely changed our Git lessons. Hopefully to the better. + 2024-04-19T00:00:00+00:00 + 2024-04-19T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/19/git-lesson-rewrite/ + + <!-- toc --> +<img width="50%" src="/blog/git-lesson-rewrite.jpg" alt="photo of a white board where we planned the first three workshop days"> +<h2 id="status-and-big-picture-summary-of-changes">Status and big picture summary of changes</h2> +<p>We have completely changed our Git lessons before the <a href="https://coderefinery.github.io/2024-03-12-workshop/">March +workshop</a> in which we +taught the new format:</p> +<ul> +<li>Start from GitHub instead of on the command line.</li> +<li>Start from an existing repository instead of with an empty one.</li> +<li>Only on second course day we move to local work on the laptop.</li> +<li>Offer several tracks to participate in the lesson (GitHub, VS Code, and +command line) and learners can choose which one they want to follow.</li> +<li>Use a new example where we collaboratively edit a cooking recipe book.</li> +</ul> +<p>You can also have a look at the +<a href="https://github.com/coderefinery/git-intro/issues/430">issue</a> where these +changes were discussed and tracked.</p> +<h2 id="motivation-for-this-change">Motivation for this change</h2> +<ul> +<li>Learners are more likely to start from an existing repo or to already have some project that is not yet on Git</li> +<li>Might feel more motivating to see something &quot;real&quot; instead of starting from something empty</li> +<li>Many do not work in the terminal but rather in an IDE or editor</li> +<li>Making a terminal available on Windows is not always easy</li> +<li>Previously we tried to explain basic concepts in a terminal but they might be easier to explain in a web interface</li> +<li>It should be possible to participate and learn without a functioning local installation of Git and Bash</li> +<li>Give everybody the feeling of accomplishment and everybody should be able to +do the most basic Git/GitHub tasks after the 2-3 half days</li> +<li>Avoid troubles with main/master naming</li> +<li>We introduce forks and pull requests already on day 1: this can free up time for day 3 to do more interesting things there</li> +<li>Also the &quot;non-programmers&quot; can benefit from this course</li> +<li>In future we might not need &quot;Collaborating and sharing using GitHub without command line&quot; as standalone lesson anymore</li> +<li>Gives more opportunity to &quot;sneak in&quot; some branch design discussions</li> +<li>Might make the lesson more interesting and fun for new instructors and helpers to join</li> +</ul> +<h2 id="discussion-points-during">Discussion points during</h2> +<p>Metaphors should be so generic that they can apply to literally everyone e.g. +inheritance in object-oriented programming can be explained using a family +tree. Some potential metaphors: Time machine, photo album, or a detailed diary +that documents your project (you can go back to any page to see what you did +there). We need to be able to explain git in a short introduction so that +people not familiar with git at all. Tie in with a metaphor (as previously +mentioned) then create a visual (ideally a video, but could also be an image) +to explain that metaphor.</p> +<p>We have also discussed whether instead of providing a single course for all, we +should have at least two introductions and classify materials into different +levels (introductory, intermediate, advanced). +For &quot;coders&quot; and future Git power users we might need a &quot;Git masterclass&quot; with +all scenarios and command line. For general learners who are interested in +version control, we might need a course that focuses on concepts, empowering +them, and providing visuals. +However, are learners able to self-assess their level?</p> +<p>We also noted that it could be +useful to modularize the first two days so that they could be swapped without +friction.</p> +<p>We discussed the risk of oversimplifying the lesson.</p> +<p>Executive summary from our discussion session was:</p> +<ul> +<li>We found the suggested changes would be an improvement but they would need to be worked out in more detail.</li> +<li>We were concerned about whether this is doable in terms of preparation time and in doubt post-pone to future.</li> +<li>We recommended to modularize to make it possible to re-shuffle and choose.</li> +<li>We noted the need to think and elaborate a bit more before we commit to implement this change.</li> +</ul> +<h2 id="how-did-it-go">How did it go?</h2> +<p>We decided to go ahead and implement the change in a massive sprint. It would +be nice to be able to post-pone to later &quot;when we have more time&quot; but from the +past we know that that time never comes.</p> +<p>We were very happy with the new format for days 1 and 2 but then we realized +that day 3 also needed to be adjusted to not feel disconnected and repetitive.</p> +<p>The new lessons are available at:</p> +<ul> +<li><a href="https://coderefinery.github.io/git-intro/">https://coderefinery.github.io/git-intro/</a></li> +<li><a href="https://coderefinery.github.io/git-collaborative/">https://coderefinery.github.io/git-collaborative/</a></li> +</ul> +<p>The feedback was generally positive both from learners and co-organizers. As an +instructor I had the feeling that we managed to cover more ground and more +exercises in this edition of the workshop than in past years.</p> +<p>One downside of the change which happened over two weeks just before the workshop was +that it was more difficult for co-instructors and team leaders to prepare since the lesson +received changes until the day before the event.</p> + + + + + The Modular Code Developement Lesson + 2024-04-19T00:00:00+00:00 + 2024-04-19T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/19/in-person-modular-code-development-lesson/ + + <h2 id="introduction">Introduction</h2> +<p>Currently we do a lesson on Modular Code Development. We start out with a simple plotting script and end up with a +script which is more general and have a wider use. The script move from a Jupyter Notebook to the command line. In +parallel there is ongoing discussion on what to do next with the script in the shared HackMD document.</p> +<p>The challenge with the current lesson is that it is python based. Mostly python users are engaged in the discussion. +How can we engaged a larger part of the audience, and how can we cater for the non-python users?</p> +<p>To cater for the non-python user we can have several streams where one stream is dedicated to a programming language.</p> +<p>There were people who like the lesson as it is. The question about AI was raised. Shold we mention GitHub Copilot or ChatGPT? This feels natural as tools are used more and more for support in the code development process. We did not conclude.</p> +<h2 id="conclusion">Conclusion</h2> +<p>We had a hard time of finding a way to make it more engaging, in a way that everyone could follow along. +The conclusion was to add tabs for R, Matlab, Julias in the &quot;instructor guide&quot;.</p> + + + + + CodeRefinery Social Media Strategy + 2024-04-19T00:00:00+00:00 + 2024-04-19T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/19/in-person-social-media-strategy/ + + <h2 id="introduction">Introduction</h2> +<p>We looked at our social media strategy and discussed to improve it to engage our audience and cultivate our brand presence during our in-person meeting in Tromsø (26 Feb-1 Mar, 2024).</p> +<p>We have already documented CodeRefinery outreach and marketing plan. Link <a href="https://coderefinery.github.io/manuals/outreach/">here</a>.</p> +<h2 id="discussion">Discussion</h2> +<h3 id="why-do-we-need-a-social-media-strategy">Why do we need a social media strategy?</h3> +<p>We need a good social media strategy to:</p> +<ul> +<li>reach wider audience</li> +<li>to establisg CodeRefinery(CR) brand beyond nordic</li> +<li>to build an engaged community</li> +<li>let the world know about the good work we do</li> +<li>expand our training network</li> +</ul> +<h3 id="our-targeted-audience">Our targeted audience</h3> +<ul> +<li>Students, researchers</li> +<li>Possible future CodeRefinery Teachers</li> +<li>University teachers, who then steer students to us </li> +</ul> +<h3 id="our-social-media-platforms">Our Social media platforms</h3> +<p>Currently we are using following platforms:</p> +<ul> +<li><a href="https://www.linkedin.com/company/coderefinery-research-software-development/?viewAsMember=true">Linkedin</a></li> +<li><a href="https://fosstodon.org/@coderefinery">Mastodon</a></li> +<li><a href="https://twitter.com/coderefine">Twitter X</a></li> +<li><a href="https://www.youtube.com/@coderefinery3414">YouTube</a></li> +<li><a href="https://coderefinery.zulipchat.com">Zulip Chats</a></li> +</ul> +<p>We paln to continue using these platforms and we decided that we don't need a complicate things by adding more platforms for our social media activities.</p> +<p>It seems to be possible to post in multiple some at once + schedule posts with eg. </p> +<ul> +<li>https://www.socialchamp.io/blog/post-to-all-social-media-at-once/</li> +<li>https://go.loomly.com/schedule-social-media-posts/</li> +<li>https://blog.hootsuite.com/post-to-all-social-media-at-once/</li> +</ul> +<h3 id="our-smart-goals">Our SMART Goals</h3> +<p>We defined our SMART(Specific, Measurable, Attainable, Relevant &amp; Time-based) goals to help us to ensure that our objectives are attainable within a certain time frame. +Our SMART Goals are:</p> +<ul> +<li>To onboard <a href="https://coderefinery.github.io/manuals/ambassadors/">CodeRefinery ambassadors</a></li> +<li>Frequent actions on social media (not limited to the workshops)</li> +<li>Add video/visual contents to social media posts to get more visibility</li> +<li>Improve outreach/publicity/webinars to various research community and encourage engagement on social media</li> +<li>Tagging: Tag CodeRefinery when it is relevant, and use hashtags when posting on social media</li> +<li>Promote user generated content campaigns</li> +<li>Post behind the scene contents</li> +<li>Boost our brand awareness</li> +<li>Coordinate the timing of announcement </li> +<li>Encourage institutions to mention CodeRefinery in there posts when it is relevant.</li> +</ul> +<p>We have our own challenges to achieve our social media strategy goals as most of us are not major social media people, but we'd like to try to be more engaging.</p> +<p>Our desire is to build and expand CodeRefinery community around our shared interest in FAIR research software practices globally. It will take time to reach our desired goal, but we are optimistic and proud of our work. We can definitly achieve our desired goals wih the support of our community members/ambassadors and partner organisations.</p> +<h2 id="epilogue">Epilogue</h2> +<p>We are acting on these ideas and it looks promising as our increased visibility in social media platforms is evident. </p> + + + + + Asynchronous vs. Live Online Teaching: Understanding the Pros and Cons + 2024-04-18T00:00:00+00:00 + 2024-04-18T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/18/in-person-asynchronous-versus-live-online-teaching/ + + <h2 id="introduction">Introduction</h2> +<p>The comparison of asynchronous and live (synchronous) online teaching highlights key benefits and drawbacks that suit different learning preferences and logistical needs.</p> +<h2 id="asynchronous-teaching-pros-and-cons">Asynchronous Teaching: Pros and Cons</h2> +<h3 id="pros">Pros:</h3> +<ol> +<li>Flexibility in scheduling</li> +<li>Self-paced learning</li> +<li>Access to a broad range of resources</li> +</ol> +<h3 id="cons">Cons:</h3> +<ol> +<li>Limited real-time interaction</li> +<li>Requires significant self-discipline</li> +<li>Delayed feedback, though mitigatable via Q&amp;A sessions</li> +</ol> +<h2 id="live-teaching-online-pros-and-cons">Live Teaching Online: Pros and Cons</h2> +<h3 id="pros-1">Pros:</h3> +<ol> +<li>Immediate interaction and feedback</li> +<li>Structured learning schedule</li> +<li>Enhanced engagement and motivation</li> +</ol> +<h3 id="cons-1">Cons:</h3> +<ol> +<li>Reduced flexibility in scheduling</li> +<li>Potential technical and connectivity issues</li> +<li>Limited access to past session materials</li> +</ol> +<h2 id="coderefinery-q-a-sessions">CodeRefinery Q&amp;A Sessions</h2> +<p>Utilize pre-recorded lectures for content delivery, supplemented by regular, shorter live Q&amp;A sessions for interactive engagement and query resolution.</p> +<h2 id="preparation-for-live-sessions">Preparation for Live Sessions</h2> +<p>Efficiency in Q&amp;A sessions is improved by having students submit questions in advance, allowing instructors to concentrate on prevalent issues and intricate questions.</p> +<h2 id="summaries-from-discussion">Summaries from discussion</h2> +<p>The discussion delved into various strategies to enhance student engagement in asynchronous learning environments, emphasizing the importance of certificates coupled with challenging exercises. The exercises should be designed to be sufficiently difficult to maintain engagement, and personalized projects can further enhance involvement. Additionally, the possibility of automating exercise evaluation and certificate issuance was explored, with considerations on how this could be implemented efficiently across platforms. Other engagement tactics included incorporating polls, Kahoot-like feedback, utilizing chat platforms like Zulip for topic-wise discussions, and potentially establishing a public, moderated forum like CodeRefinery for peer-reviewed evaluations.</p> +<p>Addressing technical and connectivity issues in live online teaching was another focal point. Strategies discussed included integrating tech checks into registration processes in a gamified manner, recording lectures for later viewing to accommodate technical difficulties, and providing support from helpers in breakout rooms during live sessions. The integration of asynchronous and live teaching methods was also considered, acknowledging that while some students require direct instruction, others may thrive in self-directed environments. The suggestion to guide students to platforms like Zulip for questions and incorporating alternative session formats during sign-up highlighted a flexible approach to accommodate diverse learning preferences. Additionally, the discussion emphasized the importance of facilitating interactive and responsive learning experiences in both asynchronous and live settings, recognizing the challenges of maintaining momentum and support for learners with limited continuous study time.</p> +<h2 id="platforms">Platforms</h2> +<p>In addition to discussing engagement strategies and technical considerations, various platforms were mentioned as potential tools which provide a proof of concept for asychronous learning. These included well-known platforms like Coursera, Udemy, and edX, which offer a wide range of courses and educational resources. Additionally, the discussion touched upon MOOC platforms like mooc.com and Moodle, with the recognition that many universities have their own Moodle instances for course management. The conversation also briefly explored specialized platforms such as LeetCode for coding practice, as well as the possibility of building custom platforms like IQMAcademy.</p> +<h4 id="notes-on-platforms">Notes on platforms</h4> +<p>If we opt to create our own platform, it's advisable to keep it lightweight, considering options like hosting videos on YouTube or utilizing tools like HedgeDoc for documentation. Utilizing Moodle might be too heavyweight for our needs. The decision to develop our own platform would primarily hinge on the necessity for automated exercises and certifications. However, existing platforms offer the advantage of providing tools to structure learning paths, though developing a course on such platforms requires substantial upfront effort. Nonetheless, prioritizing modularity and content reusability could lead to universities integrating our materials into their courses, thereby handling their own exercises and certifications.</p> +<h2 id="summary">Summary</h2> +<p>This is an ongoing question with regards to what is the best way for students to learn and instructors to teach. Given that CodeRefinery is spread across the whole world, the online space has many possibilities, so it's not an easy decision because there are pros and cons to both options. With the above-mentioned information, we have more insights into those pros and cons which can be taken into future discussions on the topic.</p> + + + + + In-person meeting: install instructions update + 2024-04-04T00:00:00+00:00 + 2024-04-04T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/04/in-person-install-instructions-session/ + + <p>This session of our 2024 February in-person meeting focused on the +install instructions. By it's nature, it related to how we were going +to teach the lessons (would we offer multiple paths? Would the second +week be active or passive?)</p> +<h2 id="the-core-problem">The core problem</h2> +<p>Using git and computational tools can be hard. It can be made even +harder by the long steps needed to install the tools - which has to +happen <em>before</em> we get contact with the learners.</p> +<p>But, not everything is hard. Many commercial tools are easy to use. +For example, VS Code came up many times. VS Code is easy to install, +and (on Windows) will automatically prompt you to install Git when +needed. But it goes beyond that: VS Code provides some sort of +out-of-the-box working authenciton to GitHub, even on Windows, that's +based on SSO or OAuth, that &quot;just works&quot;. There isn't any extra need +for another page on setting this up. This kind of usability is what +we need, though unfortunately this is often only present in these +high-level tools (which we don't want to favor only one or the +other).</p> +<p>So, what do we do? Keep up with our strategy of universal, low-level +tools, or recommend some high-level that make installation (and use) +easy?</p> +<h2 id="what-we-did">What we did</h2> +<p>For this session itself, most of it was discussion of both the tools +and the idea above, trying to decide what to do. We had practically +already decided to teach the 2024 March workshop this way:</p> +<ul> +<li>Week 1: day 1 through GitHub web interface, day 2-3 has options for VS +Code, command line, and maybe others (RStudio) (but day2-3 would +only be demonstrated with VS Code).</li> +<li>Week 2: Would be all demo-based, we wouldn't expect any installation +or exercises from users.</li> +</ul> +<p>With this, for week 1, we could take advantage of VS Code's ease of +use to handle the difficult setup (we could tell people &quot;just install +VS Code. It provides the terminal, Git authentication, and editor, +all together&quot;. For Windows, Git had to be installed separately but +that is fairly easy). We skipped requiring installing Conda and the +conda environment and getting it working for week 2 (many things could +go wrong here).</p> +<p>We made a <a href="https://coderefinery.org/blog/2024/02/29/install-instructions/">blog post</a> and +posted about our ideas on social media to try to get feedback. We +didn't get much.</p> +<p>As of mid-2024, this can be seen at our <a href="https://coderefinery.github.io/installation/">installation +instructions</a>.</p> +<h2 id="detailed-notes">Detailed notes</h2> +<p>Below is pasted our raw detailed notes, for archival purposes.</p> +<p>Current state:</p> +<ul> +<li>Mostly works (but every time needs updates)</li> +<li>There is much there, it's hard to know what to focus on depending on how you want to attend</li> +<li>VSCode and other editors mostly missing.</li> +</ul> +<p>Suggestions</p> +<ul> +<li>Think about the table on the main page</li> +<li>Make an &quot;editors&quot; section, get an expert in each IDE to contribute</li> +<li>Some ideas in issues: <a href="https://github.com/coderefinery/installation/issues">https://github.com/coderefinery/installation/issues</a></li> +<li>Think about <em>usability</em>: get experts in each OS/editor to contribut.</li> +</ul> +<p>Discussion:</p> +<ul> +<li>It would take ~1 day to go through all these and get set up.</li> +<li>For week 2, how to communicate &quot;you don't have to do this.&quot; +<ul> +<li>Remove &quot;what to do&quot; table on the front page. Move install to-do list to the front page.</li> +<li>Install instructions should say &quot;Week 1: do this [list]. Week 2: optional, [list]&quot;</li> +</ul> +</li> +<li>Can we do everything by docker/container? What if we containerize everything?</li> +</ul> +<p>To do:</p> +<ul> +<li>GitHub account: shorten</li> +<li>Shell and git: +<ul> +<li>Windows: vscode instead</li> +<li>MacOS: developer tools, or xcode</li> +<li>Linux: install package (use package manager)? +<ul> +<li>Fresh instaltions no Git</li> +</ul> +</li> +<li>remove &quot;set default branch (move it to lesson)&quot;</li> +<li>check if two more windows settings are needed</li> +</ul> +</li> +<li>SSH connection to GitHub: Add &quot;VSCode&quot; tab to install instructions</li> +<li>Remove git-bash from windows</li> +<li>Redo/change install verification videos</li> +<li>Post to CR chat/social media and ask &quot;For [operating system x], what's the easiest way to get started with an editor and git. This is for a person new to scientific computing and doesn't have extensive command line experience. Usability is more important than perfection here. They should have git, authentication to clone/push/pull from github, edit files, and commit them.&quot;</li> +</ul> +<h2 id="epilogue">Epilogue</h2> +<p>We applied these ideas for our 2024 March workshop, and it worked out +quite well. We were happy with both the lesson redesign, and the new +install instructions. We didn't notice any major problems with the +installation (and we seemed to get fewer live questions about problems +with software installation, and more questions about the main topic. +This was a big win).</p> + + + + + In-person meeting summary: video production + 2024-04-04T00:00:00+00:00 + 2024-04-04T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/04/04/in-person-video-production-session.md/ + + <p>This session, on the first day, went over the basics of video +production. Richard has handled video production (streaming, +producing videos after the event), and this provided a much-needed +introduction to what happens behind the scenes.</p> +<p>The initial goals were to:</p> +<ul> +<li>allow others to help with video processing during workshops</li> +<li>allow others to use our best practices.</li> +</ul> +<h2 id="video-editing">Video editing</h2> +<p>First, we practiced video editing with +<a href="https://github.com/coderefinery/ffmpeg-editlist">ffmpeg-editlist</a> +really nice and easy to use. It allows powerful-enough editing for +splicing without learning a full editor, and storing the progress in +git. This can allow distribution of the work, too - even to those who +don't know all the details but can write descriptions or find cut +points by playing the file.</p> +<p>The exercise we did are located <a href="https://coderefinery.github.io/community-teaching/video-editing/">in the Video editing section of the +Community teaching +lesson</a>. +There is a demonstration of the video releasing process +<a href="https://piped.video/watch?v=_CoBNe-n2Ak">here</a>.</p> +<p>The conclusion was that video editing wasn't <em>that</em> hard and more +people should know about the possibilities. However, it still is more +work and for workload reasons needs someone other than main +instructors to do it. (Richard's rule of thumb is &quot;do it the same +night, or it will never get done&quot; - ffmpeg-editlist makes it easy to +do a bad-enough job to accomplish that.)</p> +<h2 id="livestreaming">Livestreaming</h2> +<p>As for streaming, we brainstormed ideas on how to make the workshop +easier to follow (&quot;where are we right now?&quot;, &quot;what are we supposed to +do right now?&quot;) and easier to video-edit afterwards. Ideas included:</p> +<ul> +<li>status bar overlay that shows the breadcrumb including where we are at the lesson</li> +<li>status text overlay that shows whether the workshop is in exercise or lesson etc.</li> +</ul> +<p>Both of these require some work, but more importantly someone to watch +over it and make sure it's up to date. Our notes-based system is at +least the same tool for everything.</p> +<p>We got overview of OBS settings: the setting files are in <a href="https://github.com/coderefinery/obs-config">obs-config +repo</a>. They can be +downloaded and imported to the OBS Studio. This is a bit harder to +use in practice, since it requires understanding about OBS, but it's +definitely doable. We have a <a href="https://coderefinery.github.io/manuals/obs/">long description of OBS +theory</a>. The +participants left more prepared to get involved with streaming.</p> +<h2 id="epilogue">Epilogue</h2> +<p>Based on these discussions, we made an <a href="https://github.com/coderefinery/obs-coderefinery-control">OBS control +panel</a> which +was used in the 2024 March workshop to allow others to manage the +stream some. It's still in development, but could allow us to go to +the next stage of large-scale collaboration.</p> +<h2 id="see-also">See also</h2> +<ul> +<li><a href="https://coderefinery.github.io/community-teaching/video-recording/">Community teaching, Video Recording</a></li> +<li><a href="https://coderefinery.github.io/community-teaching/video-editing/">Community teaching, Video editing</a></li> +<li><a href="https://coderefinery.github.io/community-teaching/livestreaming/">Community teaching, Livestreaming</a></li> +<li><a href="https://coderefinery.github.io/manuals/coderefinery-mooc/">CR manuals, MOOC strategy</a></li> +<li><a href="https://coderefinery.github.io/manuals/obs/">CR manuals, OBS theory</a></li> +<li><a href="https://coderefinery.github.io/manuals/video-editor/">CR manuals, Video editor role +description</a></li> +<li><a href="https://coderefinery.github.io/manuals/broadcaster/">CR manuals, Broadcaster role description</a></li> +</ul> + + + + + Help us do the next CodeRefinery workshop (2024 H2) + 2024-03-25T00:00:00+00:00 + 2024-03-25T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/03/25/next-cr-workshop-help-needed/ + + <p>As usual, our workshop in 2024 March has worked very well, and our +feedback is as positive as ever. The technical setup worked smoothly, +and <a href="https://coderefinery.org/blog/2024/03/17/streaming-training-workshop/">we are working to share our livestreaming technique with +others</a>. But +there's another thing we need: the mere fact we have hundreds of +registrations, multiple partners, and more than 10 instructors means +<strong>we need more help to keep these going</strong>.</p> +<p><strong>We won't schedule another very large CodeRefinery workshop until we can be sure +we have enough people to distribute the load widely enough to make it +worth it. If we don't get that, we'll scale down to what is +manageable. Your help is essential. We give an initial deadline of +the end of April to figure out our status and do rough timetabling.</strong></p> +<p>The good thing is that instructors and helpers are not what is in +short supply, but something more about bigger picture stuff. We've +developed good processes and pretty well know what works, but as we +move to the sustainability phase, we can't do everything ourselves. +For example, we would be happy to have:</p> +<ul> +<li> +<p><strong>Instructor coordinator</strong>, who can keep track of all of our +instructors and make sure the necessary onboarding and all is done.</p> +</li> +<li> +<p><strong>Registration coordinator</strong>, who can help manage all of the +registrations and communication.</p> +</li> +<li> +<p><strong>Partner coordinator</strong> who can help with outreach to partners +(other universities for example) who advertise our workshop and +organize local sessions.</p> +</li> +</ul> +<p>None of these are exactly hard, and we can help you learn what is +needed (but also there is a lot that can be improved for the future - +new visions are welcome).</p> +<p>Our vision is that our commonly shareable online, live-streamed course +can be used by as many organizations and learners as possible. We +have the base and now we need the communication and outreach to make +that possible. (If you can't help directly, but want to be part of +this vision, also let us know) Whoever joins would basically become +part of CodeRefinery for the purposes of organization - your voice +would matter as much as anyone else.</p> +<p>TODO who to contact.</p> +<p>See also</p> +<ul> +<li>(manuals links? website links?)</li> +</ul> + + + + + Anyone want a streaming training workshop? + 2024-03-17T00:00:00+00:00 + 2024-03-17T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/03/17/streaming-training-workshop/ + + <p>If you haven't noticed, CodeRefinery livestreams it's workshops (see +refs below). We can reach a virtually unlimited number of people and +easily make recordings for later, yet our co-teaching and Collab notes +system still makes a workshop that feels interactive and fun to +attend. <strong>Does anyone want to learn how to do this yourselves?</strong></p> +<h2 id="a-workshop-idea">A workshop idea</h2> +<p>Richard Darst has been doing most of the streaming and would like to +teach others. Richard can host people in Helsinki, Finland for some +workshop, or if people fund travel somewhere else we can host it +there. A workshop would include:</p> +<ul> +<li>Basic streaming theory</li> +<li>Setting up <a href="https://obsproject.com/">OBS-Studio</a> for streaming</li> +<li>Recording and publishing videos rapidly (by the same night, every +time).</li> +<li>How to make a livestream course lively (co-teaching, Collab Notes, +lesson design, screenshare style)</li> +<li>Time to test and practice all of the above.</li> +<li>Improving our documentation</li> +</ul> +<p>Most of the above is in theory documented in the <a href="https://coderefinery.github.io/manuals/">CodeRefinery +manuals</a>, but reading is hard +and seeing by example with mentoring is easy.</p> +<p>An ideal host would be an EU or regional computing competence center, +open science organization, or someone interested in teaching innovation, +who can host a public workshop, and be able to help in advertising the +workshop to other interested parties. (This could be tried online, but +when we are setting up computers to do the screencapture of a meeting, +while also doing another meeting to share that screen capture... it +might get a bit complex.)</p> +<p>Contact us at scip@aalto.fi or support@coderefinery.org, or via the +<a href="https://coderefinery.github.io/manuals/chat/">CodeRefinery chat</a>.</p> +<h2 id="gallery">Gallery</h2> +<p>How the MOOC stragegy works:<br> +<img alt="Schematic diagram of the MOOC strategy. Streaming to Twitch, and watching, feedback by collaborative notes." src="https://coderefinery.github.io/manuals/_images/mooc-diagram.png" style="max-width: 420px"></p> +<p>A usable view from the learner side:<br> +<img alt="Screenshot of a desktop with half the screen for instructor screenshare and the other half for the learns to work." src="https://coderefinery.github.io/manuals/_images/layout--learner-livestream-sidebyside-onebrowser.png" style="max-width: 500px"></p> +<p>An extremely high-quality screen sharing setup:<br> +<img alt="A 840 wide x 1080 tall screenshot or instructors, web browser, and terminal" src="https://coderefinery.github.io/manuals/_images/s10-kickstart-prompt-log.png" style="max-width: 420px"></p> +<p>OBS isn't that hard:<br> +<img alt="OBS screenshot with labels of some key points" src="https://coderefinery.github.io/manuals/_images/obs--controls.png" style="max-width: 420px"></p> +<p>Our recently-created streaming control panel:<br> +<img alt="Screenshot of a small control-panel looking window" src="https://coderefinery.github.io/manuals/_images/obs--controlpanel-1.png" style="max-width: 420px"></p> +<h2 id="see-also">See also</h2> +<ul> +<li>CodeRefinery &quot;Community teaching&quot; training: <a href="https://coderefinery.github.io/community-teaching/">https://coderefinery.github.io/community-teaching/</a></li> +<li>CodeRefinery manuals: <a href="https://coderefinery.github.io/manuals/">https://coderefinery.github.io/manuals/</a></li> +<li>CodeRefinery MOOC strategy: <a href="https://coderefinery.github.io/manuals/coderefinery-mooc/">https://coderefinery.github.io/manuals/coderefinery-mooc/</a></li> +<li>OBS theory: <a href="https://coderefinery.github.io/manuals/obs/">https://coderefinery.github.io/manuals/obs/</a></li> +<li>Many other articles in <a href="https://coderefinery.org/blog/2024/03/17/streaming-training-workshop/@blog/_index">this blog</a></li> +</ul> + + + + + Recap of the first week of the spring 2024 workshop + 2024-03-15T00:00:00+00:00 + 2024-03-15T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/03/15/week1-march-workshop-rework/ + + <p>What an exciting first 3 days of the CodeRefinery workshop we had!</p> +<p>Our Git lesson got fully rewritten right before the workshop to make it more welcoming to beginners and closer to how researchers would encounter Git in their work. And that without the need for any coding: All our Git exercises are around a recipe book.</p> +<h3 id="week-1-recap">Week 1 recap</h3> +<p>We start with the GitHub web interface, explore existing repositories, making our own fork of an existing repository, committing our own contributions to our own branch and merge it to the main content by pull request.</p> +<p>Only on day 2 we switched from working in the GitHub web interface to working locally. Here we provided 2-4 tracks: Working on the command line , in VScode, RStudio or staying in the web interface.</p> +<p>We cloned a repository and repeated the actions from before locally: committing, branching, merging. Then we also checked how we can inspect the history of existing projects and how commit messages can help us understand how a repository has developed over time.</p> +<p>At the end of day 2, we also learned to estimate how much Git is necessary or helpful for different types of projects.</p> +<p>Day 3 was all about collaboration and it got a bit chaotic, but the good kind of chaotic. We first learned about the basic workflow of contributing when multiple people are working on the same repository. Writing issues, suggesting changes via pull requests and connecting the two. Then we went on to code review, and practiced that on our recipe book, we don't want any typos there!</p> +<p>In the afternoon we also practiced how to contribute to projects that we are not a part of via forks and pull requests as well as how automated tests can help the code review.</p> +<h3 id="thank-you">Thank you!</h3> +<p>Now we have a nice recipe base for our next CodeRefinery in person meeting. And participants have hopefully learned something along the way.</p> +<p>The downside of changing the entire week right before the course however made it possibly more difficult for team leaders and volunteers to prepare and it was a difficult choice to make and we appreciate their patience and flexibility and trust.</p> +<p>Thanks to everyone involved!</p> +<h3 id="materials-and-recordings">Materials and recordings</h3> +<p>You can watch the recordings of the first 3 days of the workshop <a href="https://www.youtube.com/watch?v=9eUUd40HkYI&amp;list=PLpLblYHCzJADIsbUhXSrC0qW5wDsH-F9U">on YouTube</a>, reuse the lesson materials for your own course if you like (<a href="https://coderefinery.org/lessons/core/">https://coderefinery.org/lessons/core/</a>) and check out one of the resulting collaborative <a href="https://github.com/cr-workshop-exercises/centralized-workflow-exercise-recorded">recipe books of this course</a> for cooking inspiration.</p> +<p>Next week (Tue 19.03.24- Thu 21.03.24) we will continue with other topics around FAIR research software development; event page with materials, questions and answers and more information: <a href="https://coderefinery.github.io/2024-03-12-workshop/">https://coderefinery.github.io/2024-03-12-workshop/</a></p> +<p>See you there or in one of our future workshops!</p> + + + + + Help us make usable IDE/git install instructions + 2024-02-29T00:00:00+00:00 + 2024-02-29T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/02/29/install-instructions/ + + <p>At the current CodeRefinery meeting, we had a session on installation +instructions. It was clear that the instructions, and really +everything we teach, needs to be tied to what is easy to install and +set up these days (not just because it's easy to teach, but because if +it's easy to install that's what most people use). <strong>Help us to +figure out what current best practices are.</strong></p> +<p>We've mostly taught git from the command line so far. That's going to +change when we go web-first (to explain concepts). But, as one +example, when looking at ways to simply command line linking, there +are lots of modern tools such as the &quot;git credential manager&quot;, which +make linking remotes more automatic than SSH keys. IDEs make it easy +to clone, commit, and push. We should use all the modern work - but +what to recommend? There are so many operating systems and IDEs, we +can't know them all.</p> +<h2 id="our-question-to-the-world">Our question to the world</h2> +<p>Imagine someone new to scientific computing, using your operating +system. They aren't a developer, they are a scientist (broadly +defined) or similar, trying to get some other stuff done. What do you +recommend to them to install and use? Are there special instructions +on configuring it?</p> +<p>Usability is more important than perfection here. You want them to +get started without major problems, so that they can be happy now and +be motivated to learn more later. You aren't there to teach them +every step of the way. They should have some editor to use, <em>git</em>, +<em>git authentication to Github</em>, be able to edit files, add them, +commit them, and get them to appear on Github? They should be able to +access the shell some way, but it doesn't have to be the main feature +(an editor's terminal is OK, as long as it probably works with Git, +including whatever config and auth is needed).</p> +<p>We want some <em>common</em> solutions, even if not perfectly free/open +source (though of course that is preferable). We will likely +recommend VSCode/VSCodium since it's most used by our communities, but +would like to provide instructions for other IDSs as well.</p> +<h2 id="how-to-respond">How to respond</h2> +<p>We recommend to respond to one our social medias or Github repos:</p> +<ul> +<li><a href="https://fosstodon.org/@coderefinery">Mastodon</a></li> +<li><a href="https://twitter.com/coderefine">Twitter</a></li> +<li><a href="https://www.linkedin.com/company/coderefinery-research-software-development/?viewAsMember=true">LinkedIn</a></li> +<li><a href="https://github.com/coderefinery/installation/">Github issues in coderefinery/installation</a></li> +</ul> +<h2 id="see-also">See also</h2> +<ul> +<li><a href="https://coderefinery.github.io/installation/">Our current installation instructions</a></li> +</ul> + + + + + Workshop format + 2024-02-27T00:00:00+00:00 + 2024-02-27T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/workshop-plan/ + + <h1 id="possible-workshop-formats-v-1-0">Possible workshop-formats [V 1.0]</h1> +<p>During the CodeRefinery writing retreat in Tromsø, we tried to formulate the best workshop format +considering following factors.</p> +<ol> +<li>Best way to reach the audience. </li> +<li>Best use of available resources to CR and foreseen challenges due to end of funding period.</li> +<li>Best value for host institutes, of CR staff and CR workshop participants</li> +</ol> +<p>We evaluated four possible formats. </p> +<ol> +<li>In-person workshops</li> +<li>Small scale online workshop</li> +<li>Large scale online workshops</li> +<li>Large scale workshop with local in-person meetups</li> +</ol> +<h2 id="summary">Summary</h2> +<h3 id="in-person-workshops">In-person workshops</h3> +<p>the host institution invites participants and covers the costs associated with the workshop, including travel expenses for speakers. CodeRefinery workshops can add value to the competence of employees, and the training can be included as part of grant proposals. In-person workshops require high-quality courses and may involve training the trainers. In-person workshops have a maximum attendance limit of around 40 participants and offer benefits such as better feedback, increased learner commitment, improved evaluation of productivity, and individualized help. </p> +<h3 id="small-scale-online-workshop">Small scale online workshop</h3> +<p>Sustainability of the program relies on effective publicity and promotional activities. Small scale online workshops can be initiated by the host or organization and offer flexibility in terms of spreading content, providing continuous feedback, and offering individualized help. </p> +<h3 id="large-scale-online-workshops">Large scale online workshops</h3> +<p>Large scale online workshops initiated by the CodeRefinery require more organizational work and face challenges in receiving continuous feedback, learner commitment, and individualized help. </p> +<h3 id="large-scale-workshop-with-local-in-person-meetups">Large scale workshop with local in-person meetups</h3> +<p>Large scale workshops with local in-person meetups offer better individualized help and continuous feedback but require logistical coordination. The cost per learner can be estimated, and the physical space should accommodate breaks and exercise sessions for collaboration. Local in-person meetups have shown benefits, particularly on day 3, while the impact decreases in later days.</p> +<h2 id="details-of-the-discussions">Details of the discussions</h2> +<ol> +<li> +<p>In-person workshops</p> +<ul> +<li>Invited by host</li> +<li>Costs reimbursed by host (Travel money etc.), maybe speaker paid by host +<ul> +<li>Host institution facilitate employee competence</li> +<li>Make it easy for people to add this to their grant proposals (give them template text)</li> +</ul> +</li> +<li>More obligations for CR (high-quality course) +<ul> +<li>We should train the trainers</li> +<li>We have co-teaching which gives added value</li> +</ul> +</li> +<li>More work delegation to host</li> +<li>Needs some limit of attendance eg. Max 40 per class +<ul> +<li>Usually not everyone show up -&gt; Tweak the maximum so that it is manageable but no-shows bring some added comfort</li> +</ul> +</li> +<li>Benefits of in-person +<ul> +<li>Better continues feedback</li> +<li>Better commitment by learners</li> +<li>Better evaluation of productivity</li> +<li>Better individual help</li> +<li>Can do few days longer sessions</li> +</ul> +</li> +<li>Sustainability in a long run comes down to publicity +<ul> +<li>This model is very localised -&gt; we need to have the networks up in various places +<ul> +<li>Current staff is localised in nordics</li> +</ul> +</li> +<li>Teasers of the workshop in conferences</li> +<li>Webpages should be rewritten to accomodate and advertise the new model</li> +<li>Other webinars and talks to advertise more</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Small scale online workshop</p> +<ul> +<li>Initiated by host or CR +<ul> +<li>If initiated by a host as tailored workshop then should be possible to reimburse for the speaker </li> +</ul> +</li> +<li>Less costs +<ul> +<li>No travel funding required </li> +</ul> +</li> +<li>Benefits of small online +<ul> +<li>Can be spread across multiple days with shorter courses</li> +<li>Good continues feedback</li> +<li>Good commitment by learners +<ul> +<li>if active participation</li> +</ul> +</li> +<li>Good evaluation of productivity</li> +<li>Good individual help +<ul> +<li>more helpers with expertise in using windows os, linux, and mac os</li> +<li>in-person helpers are more difficult to arrange anyway</li> +</ul> +</li> +</ul> +</li> +<li>Max 40 participants +<ul> +<li>effective interactions with participents</li> +</ul> +</li> +</ul> +</li> +<li> +<p>Large scale online workshops</p> +<ul> +<li>Initiated by CR</li> +<li>More organizational work for CR</li> +<li>Low level of obligation (by learners)</li> +<li>Can accommodate 100s of participants</li> +<li>Inadequate continues feedback</li> +<li>Hard to judge learner commitment</li> +<li>Harder to evaluate productivity</li> +<li>Harder and not scalable to provide individual help</li> +<li>All questions are documented and answers reusable</li> +<li>More prone to technical issues</li> +<li>Technical problems of learners become more visible as events get larger</li> +<li>Can be spread across multiple days with shorter courses</li> +<li>It became harder to motivate persons to join as instructors</li> +<li>Communicating pre-requisites becomes harder, pre-requisites less likely followed</li> +<li>More questions get asked and more answers get seen</li> +</ul> +</li> +<li> +<p>Large scale workshop with local in-person meetups</p> +<ul> +<li>Better Individual help</li> +<li>Better continuous feed back issues +<ul> +<li>Continous quizzes after each exercise to gauge in real-time how the students understand the material. (must be anonymous)</li> +</ul> +</li> +<li>More than one host needs to handle logistics</li> +<li>Disparate learner competence groups</li> +<li>Better commitment by hosts</li> +<li>Better commitment by learners</li> +<li>Possible distraction due to technical issues</li> +<li>Better to confine to few longer days</li> +<li>What has the highest cost, physical courses or online courses? Can we estimate cost per learner in different scenaria?</li> +<li>The room requires breaks and exercise session so that they have enough room/time to work together.</li> +<li>Based on personal experience, day 3 benefited from local in-person meetups, the remaining days (especially week 2) barely did.</li> +</ul> +</li> +</ol> + + + + + Summary from a brainstorming meeting about the project future + 2024-01-24T00:00:00+00:00 + 2024-01-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2024/01/24/project-future-concept-board/ + + <p>On January 23, 2024, we held a meeting where we wanted to explore <strong>ideas for +the future of the CodeRefinery project</strong> from team members and the community.</p> +<p>In most meetings only very few people speak and most participants don't say +anything. We wanted to change this and tried to create a welcoming meeting +environment with a facilitator who hopefully only facilitates and meeting +participants where hopefully everybody gets the chance to contribute. We used a +concept board and collected ideas visually (screenshots are below).</p> +<p>In this post we summarize our findings and lessons learned. If you only have 3 +minutes, then read the summary (first section).</p> +<!-- toc --> +<h2 id="summary-of-ideas-that-were-voted-as-most-important">Summary of ideas that were voted as most important</h2> +<p>We provide more details in screenshots below. Here we only summarize the points +that received votes answering the question: &quot;which ideas are most +important for you&quot;. The ideas are summarized here without being commented. +They of course need to be followed-up somehow but this we will do in future +meetings and events.</p> +<h3 id="needs">Needs</h3> +<p>In your current position, what do you need in order to be able to contribute to +the project 1 year from now (in terms of work time, financing, governance, +administration, accounting, leadership, credit)?</p> +<p><strong>Recognition and credit</strong> (12 votes combined):</p> +<ul> +<li>Strong publication or white paper about CR and its importance/benefits</li> +<li>Recognition of our good teaching practices</li> +<li>Collect and showcase where else our materials are used</li> +<li>Formalize credit to outside contributors</li> +</ul> +<p><strong>Collaboration and experimentation</strong> (12 votes combined):</p> +<ul> +<li>Collaboration with passionate people who enjoy teaching</li> +<li>Two-way learning</li> +<li>More opportunities for future development</li> +<li>Experiment beyond the usual tools workshop</li> +</ul> +<p><strong>Overlap with high-performance computing</strong> (6 votes):</p> +<ul> +<li>Subject overlap with skills and tools of relevance for HPC</li> +</ul> +<p><strong>Roadmap</strong> (6 votes combined):</p> +<ul> +<li>Statement how CodeRefinery fits into the FAIR ecosystem</li> +<li>Concrete and public roadmap for the future</li> +</ul> +<p><strong>Administrative/financial needs</strong> (6 votes combined):</p> +<ul> +<li>Tasks that have a clear work-time estimation</li> +<li>Cost projects also for in-kind work</li> +<li>Home organization securing funding</li> +<li>If outside regular job, then compensated for the work</li> +</ul> +<h3 id="wants">Wants</h3> +<p>What do you wish from the project in terms of lesson portfolio, format, and +collaboration in order to still be around 1 year from now?</p> +<p><strong>Topics and target audience</strong> (22 votes combined):</p> +<ul> +<li>Stronger integration with HPC - if CR should &quot;belong&quot; somewhere, it should be HPC</li> +<li>New topics on AI and ML</li> +<li>New training material topics&quot;</li> +<li>Think about new topics for training via discussion &amp; collaboration</li> +<li>Develop training material for GPU computing</li> +<li>Programming lessons to go hand-in-hand with software engineering lessons</li> +<li>Create new lessons based on needs and existing expertise</li> +<li>Focus on academic users to make it more valuable to [academic] management</li> +<li>Material suitable for the &quot;phone generation&quot;</li> +</ul> +<p><strong>Self-learning vs. real-time</strong> (11 votes combined):</p> +<ul> +<li>Self learning materials/courses/ asynchronous learning: some researchers +don't have time for long workshops and don't wanna know all the details</li> +<li>MOOC as basic service, interaction/teams delegated</li> +<li>Collaboration on video material</li> +</ul> +<p><strong>External collaboration and conferences</strong> (5 votes combined):</p> +<ul> +<li>Stronger connection to other similar projects, like BSSW, INTERSECT, etc.</li> +<li>Regular BoF sessions at conferences like ISC, SC, PyCon, JuliaCon, etc.</li> +<li>Keep/improve connection to RSE community</li> +</ul> +<p><strong>Collaboration and co-hosting</strong> (5 votes combined):</p> +<ul> +<li>Course collaborations of courses that already exist, like currently done with Aalto HPC kickstart</li> +<li>National course/workshop collaborations, offering in-person specialized short workshops</li> +<li>Co-hosting of events, and co-developing of lessons</li> +</ul> +<p><strong>Social events and keeping up-to-date</strong> (5 votes combined):</p> +<ul> +<li>Social events where team members get an overview of activities in each partner organization (e.g. monthly &quot;zoomffee&quot;)</li> +<li>Easy way to follow what is going on and when to step in (something else than scrolling all chat)</li> +</ul> +<p><strong>Workshop format</strong> (5 votes combined):</p> +<ul> +<li>Smaller, shorter workshops</li> +<li>Have more formalized possibility of using ready-made computing environment (&quot;executable website&quot;)</li> +</ul> +<p><strong>Administration and governance</strong> (3 votes combined):</p> +<ul> +<li>Formalized and more official course request form, to show organizations (in +and outside of CR) that this is &quot;a thing&quot;</li> +<li>Mechanism/support for creating new &quot;refineries&quot; (HPC Refinery, AI Refinery, ...)</li> +<li>Delegate non-profit side to DRA (for example)</li> +</ul> +<p><strong>Credit</strong> (3 votes):</p> +<ul> +<li>Official network of teachers, public on webpage, with skills</li> +</ul> +<p><strong>Workshop preparation</strong> (3 votes combined):</p> +<ul> +<li>Less lesson revision each workshop</li> +<li>Up-to-date and maintained lessons</li> +</ul> +<h3 id="general-suggestions-for-future-meetings">General suggestions for future meetings</h3> +<ul> +<li>Restart monthly community chats around specific topics where one can get +updates without reading all chat.</li> +<li>Separate on-boarding meetings for friends and future instructors (community +calls could be on-boarding meetings).</li> +<li>More social media presence and dissemination.</li> +<li>Create tasks forces or work packages so that others can help better and to +have fewer bottlenecks in the project.</li> +</ul> +<hr /> +<h2 id="meeting-format-and-goals">Meeting format and goals</h2> +<p>To facilitate a meeting where we collect ideas from everybody but without +judging them, we used a concept board and virtual sticky notes and divided the +session into 3 parts:</p> +<ul> +<li>Start with everybody taking notes by themselves (&quot;me&quot;; for ourselves).</li> +<li>Second step: formalize and place on concept board (&quot;we&quot;; randomized 1-1 +pairs).</li> +<li>Third step: we review and discuss as a group (&quot;us&quot;). Make sure that the +facilitator understood what the group wanted.</li> +</ul> +<p>13 persons participated in this meeting (one of them, the author of this blog +post, was the facilitator): +<img width="100%" src="/blog/project-future-concept-board/participants.jpg" alt="screenshot of sticky notes with participant names"></p> +<h2 id="timeline">Timeline</h2> +<ul> +<li>5 min: welcome and getting started</li> +<li>5 min: everyone adds themselves to the board</li> +<li>10 min &quot;me&quot; time: work on your own on the two boards below, without sharing your thoughts yet</li> +<li>15 min &quot;we&quot; time: 1-1 work with a randomized partner; put ideas on the board(s)</li> +<li>10 min &quot;us&quot; time: we cluster and organize</li> +<li>10 min: voting on which ideas are most important for you (everybody got 10 votes to distribute)</li> +<li>follow-up: blog post summarizing this</li> +</ul> +<p>Here is a screenshot from the session: +<img width="100%" src="/blog/project-future-concept-board/timeline.jpg" alt="screenshot of the meeting timeline and meeting suggestions"></p> +<h2 id="concept-boards-where-we-explored-what-project-members-need-and-want-from-the-project">Concept boards where we explored what project members need and want from the project</h2> +<p>Meeting participants were asked to answer two questions with sticky notes +(sticky note color has no meaning):</p> +<ul> +<li><strong>&quot;Needs&quot;</strong>: In your current position, what do you need in order to be able +to contribute to the project 1 year from now? (in terms of work time, +financing, governance, administration, accounting, leadership, credit)</li> +<li><strong>&quot;Wants&quot;</strong>: What do you wish from the project in terms of lesson portfolio, +format, and collaboration in order to still be around 1 year from now?</li> +</ul> +<p>We did not have enough time to cluster the notes better but to summarize the +findings I have later manually clustered related votes and summed them up.</p> +<img width="100%" src="/blog/project-future-concept-board/vote.jpg" alt="screenshot of the sticky notes with ideas and number of votes"> +<p>The comment note that is outside that screenshot to the bottom and looks a bit +cut off says: +&quot;I agree with this a way that CR should have a more defined brand - be it HPC or something else&quot;.</p> +<p>Below we list the ideas also in text format.</p> +<ul> +<li> +<p><strong>Needs</strong>: In your current position, what do you need in order to be able to contribute to the project 1 year from now? (in terms of work time, financing, governance, administration, accounting, leadership, credit)</p> +<ul> +<li>Company internal cost object for in-kind contribution</li> +<li>Staff in my own project that are interested in working on CR</li> +<li>A project in my organisation  that somehow includes CR</li> +<li>Official statement of how CR fits in the ecosystem of FAIR X, to help convincing management if they say &quot;we do already Y&quot;</li> +<li>collaborations with different people on varied topic for training and workshop, and also seeking more opportunities for future development</li> +<li>Measurable benefit to Aalto (continued enrollment numbers)</li> +<li>formalize contribution to the outside (credit to contributors)</li> +<li>Subject overlap with skills and tools of relevance for HPC</li> +<li>HPC connection</li> +<li>Possibility to allocate (more) worktime for this</li> +<li>&quot;cost object&quot; either via project funding or formalized &quot;in-kind&quot;</li> +<li>Collaboration with passionate people who enjoys delivering, two way learning</li> +<li>&quot;Project&quot; that includes CR as a job</li> +<li>a strong publication or white paper about CR and its importance/benefits</li> +<li>Plans for the future public and concrete, roadmap</li> +<li>Tasks that have clear work-time estimations</li> +<li>UPPMAX &amp; NAISS provide in-kind support: this has worked really well up to now, but it is dependent on the home organization to have a secure funding</li> +<li>(this is a need/want) New content? New formats? Experiment beyond the usual tools workshop</li> +<li>If outside regular job then some other compensation for my time</li> +<li>Permission from supervisor</li> +<li>possibility to join as &quot;oneself&quot;,without organization that is &quot;part of CR&quot;</li> +<li>collect and showcase where else than within the CR project, the materials are used -&gt; show benfit, visibility to employer</li> +<li>Recognition of our good teaching practices</li> +</ul> +</li> +<li> +<p><strong>Wants</strong>: What do you wish from the project in terms of lesson portfolio, format, and collaboration in order to still be around 1 year from now?</p> +<ul> +<li>UPPMAX &amp; NAISS perspective: In terms of collaboration, the fact that this is a collaboration among people from several supercomputing centers makes it more valuable / &quot;sells&quot; better to higher ups. That is not to exclude industry, but main target audience for us/UPPMAX is academic users.</li> +<li>More frequent social events eg. monthly zoomffee / networking events</li> +<li>thinking more topics for training via discussion &amp; collaboration</li> +<li>Self learning materials/courses/ asynchronous learning: some researchers don't have time for long workshops and don't wanna know all the details</li> +<li>social events where team members get an overview of activities in  each partner organization</li> +<li>CR MOOC as basic service, interaction/teams delegated</li> +<li>smaller shorter workshops</li> +<li>New training material topics</li> +<li>Have &quot;phone generation&quot; suitable materials , eg IQM academy style</li> +<li>National course/workshop collaborations, offering in -person specialized short workshops</li> +<li>more in-person teaching</li> +<li>New topics on AI and ML can be added to CR lesson portfolio</li> +<li>official network of teachers, public on webpage, with skills</li> +<li>stronger integration with HPC - if CR should &quot;belong&quot; somewhere, it should be HPC</li> +<li>UPPMAX &amp; NAISS perspective: In terms of lessons, the base workshop is great. I think new lessons should be created in terms of needs and existing/wish-for expertise. CR has enabled collaboration on additional courses that are complimentary to the ones of the home institution - added value.</li> +<li>co-organizing events</li> +<li>course collaborations of courses that already exiost, like currently done with Aalto HPC kcikstart</li> +<li>formalized and more official course request form, to show organizations (in and outside of CR) that this is &quot;a thing&quot;</li> +<li>Have more formalized possibility of using readymade computing environment &quot;executable website&quot;</li> +<li>regular BoF sessions at conferences like ISC, SC, PyCon, JuliaCon, etc</li> +<li>programming lessons to go hand-in-hand with software engineering lessons</li> +<li>Co-hosting of events, and co-developing of lessons, with PDC/NAISS</li> +<li>mechanism/support for creating new &quot;refineries&quot; (HPC Refinery, AI Refinery, ...)</li> +<li>Develop training material for GPU computing</li> +<li>volunteer instructors for CR and instructor training workshops</li> +<li>Easy way to follow what is going on and when to step in. (Something else than scrolling all chat)</li> +<li>stronger connection to other similar projects, like BSSW, INTERSECT, etc</li> +<li>UPPMAX &amp; NAISS perspective: As for the format, in my opinion going even +larger in attendance would imply using a platform like LinkedIn or similar. +But it does require additional effort, at least in the setup phase. This +would allow for asyncrohonous learning. The danger I see with it is that it +may not be appealing for the home institution.</li> +<li>maintenance and further development of sphinx-lesson</li> +<li>Collaborators on video-material (should we choose to make some)</li> +<li>collaboration &amp; flexibility, promote two way learning</li> +<li>Connection to RSE community somehow</li> +<li>Delegate nonprofit side to DRA (for example)</li> +<li>Denmark could use with another CR person</li> +<li>Less lesson revision each workshop</li> +<li>up-to-date and maintained lessons</li> +</ul> +</li> +</ul> +<h2 id="what-we-learned-about-the-meeting-format">What we learned about the meeting format</h2> +<p>The format felt like the right choice. However we noted few suggestions +for how we can improve such meetings in future:</p> +<ul> +<li>Allocate 1.5 hours instead of 1 hour.</li> +<li>Add a break so that facilitator can organize boards to make it easier for all.</li> +<li>Add example sticky notes.</li> +<li>Suggest to make text short (some sticky notes contained too many words and +were possibly not read during the 5 minute voting session).</li> +</ul> + + + + + Lessons learned from the September 2023 online workshop + 2023-12-05T00:00:00+00:00 + 2023-12-05T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2023/12/05/lessons-learned-sep-2023/ + + <p>After each workshop we try to collect feedback and lessons learned from team +members, learners, local organizers, and stakeholders. These documents help us +preparing future workshops and events and serve as our <strong>organizational +memory</strong> so that we don't forget important observations six months later. Below +we summarize our lessons learned from our <a href="https://coderefinery.github.io/2023-09-19-workshop/">September 2023 +workshop</a>.</p> +<p>But let us first start with a nice feedback we received:</p> +<div class="uk-child-width-expand@s" uk-grid> + <div class="uk-width-1-4@m"> + </div> + <div class="uk-text-muted"> + "I've been on many courses, I organize some bioinformatics courses myself, but + it was certainly one of the best if not the best course I've attended. Thank + you for your time and engagement :)" + </div> +</div> +<!-- toc --> +<h2 id="material">Material</h2> +<p>The team has done amazing work preparing a high-quality material:</p> +<ul> +<li>&quot;We've really enjoyed the material (even without the video, it was good to +follow all the tutorials you provided. Some coworkers could not attend the +workshop but did the exercises on their own. They found the material so +nice that they've shared it to their students.).&quot;</li> +<li>&quot;The written course materials are really fantastic. I had to review some +aspects of Git/GitHub myself before the session, and the online notes made +that much more efficient.&quot;</li> +</ul> +<h2 id="role-of-helpers-exercise-leaders">Role of helpers/ exercise leaders</h2> +<ul> +<li>The role of local helpers seems more crucial before and after, than during the workshop.</li> +<li>The bigger the course, the more likely we will see questions that are +answered in install instructions. This supports the previous point.</li> +<li>Local groups see the benefit from nurturing a local community of +trainees of the CodeRefinery courses.</li> +<li>&quot;During the course I think you are already doing a wonderful job.&quot;</li> +</ul> +<h2 id="how-to-improve-exercises">How to improve exercises</h2> +<ul> +<li>Consider collecting some feedback between the explanation and start of the +exercise. For example, having the attendees take part in one of these +interactive online group quizzes. That provides some immediate review of the +ideas and gives you feedback on anything that needs clarified.</li> +<li>For the GitHub forking exercise, consider demonstrating using a split-screen +simultaneously showing the two roles on one screen.</li> +</ul> +<h2 id="providing-a-zoom-to-work-on-exercises-together">Providing a Zoom to work on exercises together</h2> +<p>This time we have again decided to provide a central Zoom for learners who are +not part of a team to work on exercises together with others. However, this +was mostly unused and we were unsure why precisely.</p> +<ul> +<li>Idea for next time: instead of us providing Zoom where nobody shows up, we +offer that we can be invited to local group Zoom and they call us in.</li> +<li>With self-organised Zoom: we got no contact to those who indicate &quot;interest +in being an EL/TL but don't have team ready”. If we keep the Zoom, those +people could be instructed to go straight to that Zoom + usual mention about +the on-boarding.</li> +<li>Consider providing Zoom only after the streaming has stopped for end of the +day live clarifications, Q&amp;A, etc. This in practice already happened in the live +room where after the streaming people had more questions. Downside: It can +be tiring after a long day.</li> +</ul> +<h2 id="helping-learners-to-navigate-and-find-where-we-are">Helping learners to navigate and find where we are</h2> +<p>When following the different windows and at the same time listening to the +stream it is easy to get distracted for a minute and miss where we are right +now.</p> +<ul> +<li>Each exercise/type along on a new topic can start with &quot;Check your current +directory. Decide where you want to be for the next part.&quot;</li> +<li>We should have a graphical prompt/box on the stream somewhere which says what +people should do: &quot;watch&quot;, &quot;type along&quot;, &quot;continue with XYZ&quot;.</li> +</ul> +<h2 id="technical-setup">Technical setup</h2> +<ul> +<li>Don't use new streaming setup without good advance practice. We had some behind-the-scenes +hiccups the first day, but without impact on learners or the course quality.</li> +<li>Self-hosted HedgeDoc seems to work really well. We observed no technical +issues.</li> +</ul> +<h2 id="audio-quality-is-super-important">Audio quality is super important</h2> +<ul> +<li>Use a headset. Podcast-quality microphone on the desk was +not enough and when switching to a headset, quality improved significantly.</li> +<li>Headset should be wired or via a dedicated dongle (Bluetooth has too much +latency).</li> +</ul> +<h2 id="using-main-as-the-default-branch">Using &quot;main&quot; as the default branch</h2> +<p>This was our first workshop where we have asked participants to configure Git +to use <code>main</code> as the default branch instead of <code>master</code> to avoid confusion when +moving from laptop to GitHub. We did this after a lot of thinking and waiting +because we knew that some learners have old versions of Git and sometimes no +possibility to upgrade. Trying to make sure that our instructions and exercises +work on &quot;all&quot; Git versions we chose to initialize Git using <code>git init -b main</code>. +However, that command unfortunately failed on older Git versions to our +surprise. We did not consider that possibility when testing and preparing.</p> +<ul> +<li>For the next workshop reconsider the default and provide a safety net. But +also see the discussion +below about &quot;Should we start with the command line?&quot; which might make this +problem go away in a different way.</li> +</ul> +<h2 id="using-git-switch-restore-instead-of-checkout">Using git switch/restore instead of checkout</h2> +<p>This change seems to have worked without problems.</p> +<h2 id="should-we-start-with-the-command-line">Should we start with the command line?</h2> +<ul> +<li>Command line seems to be a too big of a barrier to install and learn. We are +wondering whether command line should not be a separate course and we should +try to not expect it.</li> +<li>Consider starting the Git lesson not from the command line but from an IDE or from the web.</li> +<li>Consider starting with cloning and improve a repo first (instead of <code>git init</code> as the first step).</li> +<li>Already for this workshop we have provided a &quot;web-based track&quot; parallel to +the command line track as safety net in case command line does not work. This was +useful and should be developed further.</li> +</ul> +<h2 id="timetable">Timetable</h2> +<p>Here is a list of suggestions we got on how to improve the selection of topics +and the timetable.</p> +<p>To improve:</p> +<ul> +<li>Day 1 felt too slow. Idea: &quot;if you are able to do X and Y and Z, you can join +from day 2&quot;.</li> +<li>Sometimes it was too slow, too long to explain concept.</li> +<li>Modular code part too much demo, too little participation, not practical enough.</li> +<li>Snakemake part did not seem to fit into the flow, it felt out of place (good +to know that it exists but might not use it in future; same feeling for +helpers).</li> +<li>It would be interesting to hear about best practices about how to write code +(in a way that others can understand it).</li> +<li>Idea: colorize an example code to identify room for improvement, e.g. +repetition (but that is difficult to do online).</li> +<li>During demo-heavy lessons it is difficult to have interaction and discussion +in the room (contributes to the feeling that it is not practical).</li> +<li>Git collaboration: instead of discussing the collaboration figures, show an +animation or steps or visual aids - otherwise it can be confusing trying to +grasp it all.</li> +<li>Day 2 felt like lots of downtime (long exercises, breaks, too little time &quot;real lesson&quot;).</li> +<li>Streaming and in-person interaction is not easy to manage.</li> +<li>More practical exercises needed in second week.</li> +<li>&quot;On the second week, it was a bit more difficult to know if the tools +presented would be useful for us.&quot;</li> +<li>Stream/exercise-combo works well for Git (first week) but less well for second week.</li> +</ul> +<p>To keep:</p> +<ul> +<li>&quot;The first week on Git was very good, all the people that attended were +already familiar with Git (they've at least heard of it or used a bit). We +still have discovered some tips and now we have a better foundation about +Git.&quot;</li> +<li>Which days most useful? Documentation and Jupyter, then followed by Git intro day 2.</li> +<li>In-person participation was appreciated.</li> +<li>It was appreciated to see that programming is not just about programming +(also about documentation and communication).</li> +<li>The lunch break division was globally an improvement (although it also made +some days feel like there were too many breaks).</li> +<li>Longer break between sessions makes sure that session 1 does not eat time +away from session 2.</li> +</ul> +<h2 id="mooc-ify-the-workshop">MOOC-ify the workshop?</h2> +<p>We are considering pre-recording sessions in smaller chunks and also pre-record +exercise solutions. We still want to provide an event-feeling but perhaps this +can be done with a MOOC, a &quot;flipped-classroom approach&quot;, and more focus on +answering questions and bring-your-own-code sessions (see also below)?</p> +<ul> +<li>Streaming workshop was excellent solution during pandemic but we need to check whether this is still good fit.</li> +<li>MOOC could be an interesting format.</li> +<li>It could relieve some organization effort during the event at the cost of +spreading the preparation over a longer time period.</li> +</ul> +<h2 id="bring-your-own-code-sessions">Bring-your-own-code sessions</h2> +<p>This was the first workshop where we scheduled two follow-up sessions, one week +after and two weeks after, where learners could bring their own code and ask +questions about how to apply the course to their code and research. +Unfortunately no learners showed up to these sessions. Our recommendations:</p> +<ul> +<li>Schedule bring your own code session already in week 2 and then with more +time after the workshop.</li> +<li>More active advertising, earlier in the workshop.</li> +<li>Give examples for problems to bring</li> +<li>Offer at different time slots.</li> +<li>Consider coupling advertising with workshop survey.</li> +</ul> + + + + + What we plan to improve for the September 2023 workshop + 2023-06-25T00:00:00+00:00 + 2023-06-25T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2023/06/25/planning-sep-workshop/ + + <p>In this post we wish to share our ideas for what we want to change and improve +for the for the <a href="https://coderefinery.org/workshops/upcoming/">upcoming September 2023 +workshop</a>. This is based on +<a href="https://coderefinery.org/blog/2023/04/12/lessons-learned-mar-2023/">lessons learned from the March 2023 +workshop</a> and on two meetings we +had two weeks ago with the CodeRefinery team.</p> +<div class="uk-alert-primary" uk-alert> +<p>We encourage the community to give us feedback on these ideas either <a href="https://coderefinery.org/join/chat/">via +chat</a> or via email to +<a href="mailto:support@coderefinery.org">support@coderefinery.org</a>. +We are particularly curious to hear what you think about the section +<a href="https://coderefinery.org/blog/2023/06/25/planning-sep-workshop/#keep-two-weeks-or-split-in-two-or-more-parts">&quot;Keep two weeks or split in two or more parts?&quot;</a>.</p> +</div> +<!-- toc --> +<h2 id="keep-two-weeks-or-split-in-two-or-more-parts">Keep two weeks or split in two or more parts?</h2> +<ul> +<li>Problems with current set-up (6 half-days): +<ul> +<li>Second week has different software requirements and is rather different from first week (git)</li> +<li>It could use more exercises but there is currently not much time</li> +<li>It is dense</li> +<li>Not each lesson feels relevant/interesting for all</li> +</ul> +</li> +<li>We are considering keeping first week focused on Git over 3 days as we have +now, but to <strong>spread the second week over a longer time frame (one or two +sessions per week)</strong>.</li> +<li>Advantages of splitting it off: +<ul> +<li>More time per lesson</li> +<li>More focused preparation</li> +<li>More time between lessons (more time to prepare for us, more time to digest and apply for learners)</li> +<li>Possibility to add hackathons/ more personalized Q&amp;A</li> +<li>Attracting different and more interested audiences</li> +<li>The second half could become more research-software-hour-y</li> +<li>Enables to do more around the second weeks topics, like adding a hackathon +or some panel discussion or a seminar where we could invite previous CR +participants/teachers or other people to talk about cool stuff they have +been doing around the topic.</li> +<li>Collaborative document might be enough and Zoom rooms might not be needed.</li> +</ul> +</li> +<li>Downsides: +<ul> +<li>Less cohesive workshop</li> +<li>Maybe more difficult to schedule although it might be easier to commit time both for organizers and for learners (two instructors would be able to deliver the entire workshop, if needed)</li> +<li>Credits? But can be solved by giving recommendations to local organizers (learning diary, quiz, git log)</li> +</ul> +</li> +<li>It could make it more difficult for: +<ul> +<li>Scheduling other workshops that build on top of this workshop.</li> +<li>For those who organize the streaming and video production.</li> +<li>For local organizers (<strong>we are particularly interested in their feedback about this idea</strong>).</li> +</ul> +</li> +<li>The first week part could also be extended with a hackathon (3 half-days +teaching, followed by a session e.g. one week later).</li> +<li>Advertise sessions with a more descriptive title (not &quot;Jupyter&quot;, but &quot;How to +prototype in Python&quot; or something like that).</li> +<li><strong>Concrete suggestion</strong>: keep first week as is (3 half-days) but split second +week into 6 two-hour to half-day sessions (reproducible research, software licensing and +citation, prototyping in Python, documentation, software testing, modular +code development)</li> +<li><strong>UPDATE</strong>: after a lot of thinking we decided to keep two weeks this time +and perhaps try a more extended format in 2024 +but to separate sessions a bit during week two in order to give few +sessions more time but also to make it easier for participants to only join +for a specific session. In addition, we consider offering additional debrief +sessions a la &quot;research software hour&quot; where we can go more in-depth.</li> +</ul> +<h2 id="creating-a-more-motivating-environment-for-volunteers">Creating a more motivating environment for volunteers</h2> +<ul> +<li>Improve focus so that we can improve the quality and avoid that most time +dissolves in coordinating efforts that could be more focused.</li> +<li>Having few days of focused time for preparation. Otherwise with 25% or less +in-kind involvement, other day-to-day tasks take over.</li> +<li>Organize an <strong>online writing/preparation retreat</strong> (with buddy-system, +meeting times booked early).</li> +<li>Keep half-day format.</li> +<li>Clear session structure and clear commitment (put names behind lessons as +early as possible).</li> +<li>Knowing who from organizers to contact with questions.</li> +</ul> +<h2 id="improve-the-experience-for-helpers-exercise-leads">Improve the experience for helpers/ exercise leads</h2> +<ul> +<li>In the last few versions we had trouble engaging volunteer exercise leads +since we either had trouble predicting and planning a central exercise zoom +room, or tried without providing one. While this simplifies workshop +coordination and planning, it &quot;optimized away&quot; helpers who came to the +workshop without own team or local exercise room.</li> +<li>This time we will try with a central exercise room (see next section) and try +to engage them again.</li> +</ul> +<h2 id="workshop-format-keep-the-stream-format-but-also-provide-a-central-but-self-organized-exercise-room">Workshop format: keep the stream format but also provide a central but self-organized exercise room</h2> +<ul> +<li>Continue offering the hybrid format: people joining from class rooms.</li> +<li>Again offer centrally managed exercise rooms for learners without own teams. +Even if this means &quot;binding&quot; one person to manage that space.</li> +<li>However, we need an easily organizable way.</li> +<li>Previously it was tricky to manage central exercise rooms: +<ul> +<li>Rooms became imbalanced (no-shows, empty / overfull rooms) and some exercise leads had then nothing to do.</li> +<li>Pre-allocating persons to rooms has previously failed: Some learners selected the &quot;wrong&quot; option or did not show up.</li> +<li>People were confused about the model.</li> +</ul> +</li> +<li>What we will try this time: +<ul> +<li>Self-organized central zoom with free-floating helpers (&quot;expert helpers&quot;).</li> +<li>We communicate clearly expectations: that we don't really know who shows up.</li> +<li>Also communicate meaning of rooms (topical rooms) .</li> +<li>Split on-boarding into 2: in-person helpers and Zoom helpers need different info.</li> +<li>No exercise below 15 mins, otherwise no time to have discussions with helpers.</li> +<li>Communicate that groups can pause the stream and ask questions later in the +notes - they do not have to interrupt discussions or mute the stream.</li> +</ul> +</li> +</ul> +<h2 id="lesson-development-without-last-minute-stress">Lesson development without last-minute stress</h2> +<ul> +<li>Organize a 2-day online writing retreat and also a one-week in-person writing +retreat later this year.</li> +</ul> +<h2 id="instructor-on-boarding">Instructor on-boarding</h2> +<ul> +<li>In past editions the instructor coordinator has met with all instructor pairs +and went with them through the checklist. We will keep this.</li> +<li>Tech-setup could be done all together.</li> +<li>Invite past instructors who have taught the lesson in question earlier to +those meetings to provide background and their experiences.</li> +<li>Check questions and feedback from last time.</li> +<li>Switch instructors less often? Maybe always have one person who has done the lesson before.</li> +<li>Plan for an instructor training workshop after the autumn workshop and offer +it also at conferences.</li> +</ul> +<h2 id="what-organizational-changes-are-most-important">What organizational changes are most important?</h2> +<p>What would simplify coordination and planning for all involved?</p> +<ul> +<li>Current playbook: https://coderefinery.github.io/manuals/workshop-playbook/</li> +<li>Early role decisions (commitment).</li> +<li>All roles using the checklist (it is good to know what is going on in all roles).</li> +</ul> +<h2 id="most-important-lesson-course-changes">Most important lesson/course changes</h2> +<ul> +<li>We need to re-think exercises for the second week to make them more +interesting. Learners sometimes don't get the point of them.</li> +</ul> +<h2 id="simpler-registration-form">Simpler registration form</h2> +<ul> +<li>Keep registration form simple but communicate the different options +elsewhere, not in the form. Previously we have tried +to use form questions to also communicate the options.</li> +<li>Remove the &quot;might&quot; questions. Rather clarify participation options and give +participants the flexibility to decide.</li> +<li>Remove the question whether somebody is interested in following in person. +Rather provide overview about local events, and have links available to +local rooms on the workshop page.</li> +<li>Link to partner local rooms in registration form, as a possibility for learners.</li> +<li>Add an option about central zoom room.</li> +<li>Record and add short video explaining the options.</li> +<li>Instead of separate observer registration encourage observers to register the same way learners do.</li> +<li>Try to arrive at clearer and more consistent naming for &quot;in-person&quot;, +&quot;breakout rooms&quot;, &quot;exercise rooms&quot;, &quot;satellite events&quot;, ... +Names need to be clarified, check also other places and choose commonly used name.</li> +<li>For on-boarding we need to know if somebody is interested in being a team-lead/helper: +<ul> +<li>Ask whether local or central exercise room.</li> +<li>Make it clearer that they can change registration.</li> +<li>Communicate why we ask for this info.</li> +</ul> +</li> +<li>Learners do not need to be asked whether alone/zoom/local.</li> +<li>Do not try a two-step registration process.</li> +</ul> +<p>The form options will be simplified to:</p> +<ul> +<li><input disabled="" type="checkbox"/> +learner or observer</li> +<li><input disabled="" type="checkbox"/> +helper at central exercise room</li> +<li><input disabled="" type="checkbox"/> +helper at local group</li> +<li><input disabled="" type="checkbox"/> +organizer of local group</li> +<li><input disabled="" type="checkbox"/> +instructor (I would like to teach a lesson)</li> +<li>free text to share additional information with organizers</li> +<li>consider asking which sessions the participant is interested in attending</li> +<li>contact email for questions</li> +</ul> +<p>We plan to open registration before end of June 2023.</p> + + + + + Lessons learned from the March 2023 online workshop + 2023-04-12T00:00:00+00:00 + 2023-04-12T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2023/04/12/lessons-learned-mar-2023/ + + <p>March 21-23 and 28-30, 2023, we held again our <a href="https://coderefinery.github.io/2023-03-21-workshop/">CodeRefinery online +workshop</a> (6 x 3.5 hours) +with 493 individual registrants and 100-200 views on average in Twitch. +Here we wish to share with the community and our future selves our lessons +learned: What worked well and what we need and plan to improve.</p> +<p>If you think you might have solutions for us or want +to discuss about the topic, please <a href="https://coderefinery.org/organization/contact/">reach out to +us</a>. This complements our +lessons learned from <a href="https://coderefinery.org/blog/2020/04/14/first-online-workshop/">our first online workshop +2020</a>, the +<a href="https://coderefinery.org/blog/2021/11/25/lessons-learned-may-2021/">May 2021 +workshop</a>, +and the <a href="https://coderefinery.org/blog/2022/11/08/lessons-learned-Sep-2022/">Sep 2022 workshop</a>.</p> +<p><strong>We have identified the following main issues that we want to address for future events</strong>:</p> +<ul> +<li>Speaking more clearly, improving mic quality, and recommending participants to get familiar with Vim, Nano, etc. before the workshop starts.</li> +<li>Some attendees expressed confusion with some exercises and recommended more +repetition of basic commands and more concrete examples of solutions in +exercises.</li> +<li>Some attendees suggested improving the teaching style by doing exercises +while explaining each step, while others preferred doing the exercises +themselves for better learning.</li> +<li>Provide more support for online participants and having more, smaller repositories for exercises.</li> +<li>Some participants found certain aspects of the training confusing, such as the merging process.</li> +<li>Provide clearer instructions.</li> +<li>Some participants wanted more hands-on exercises and more information on specific topics like environments, MATLAB, and good documentation and attribution practices.</li> +<li>The participants suggested expanding the course duration or offering a series of mini workshops.</li> +<li>They also suggested covering ethics and copyright law and providing solutions to exercises directly under each question.</li> +<li>There are suggestions for improvement, including making the content more linear, explaining concepts in more detail, and providing more examples.</li> +<li>The use of Sphinx, a documentation tool, was discussed, and some participants were unsure of its value.</li> +<li>Suggestions for improvements included providing more information on common practices and beginner's mistakes, as well as offering more focused mentorship and help sessions after the course.</li> +<li>Some participants felt that the daily schedule could be shorter or more compact.</li> +<li>Cheat sheets or code checkpoints could be provided to help with finding information quickly.</li> +</ul> +<h2 id="daily-summaries">Daily summaries</h2> +<h3 id="day-1">Day 1</h3> +<ul> +<li>The workshop was just right in terms of pace and highly recommendable to others.</li> +<li>Participants appreciated the hands-on experience, type-along exercises, +availability of workshop material, and the responsiveness of the +collaborative document.</li> +<li>Some participants suggested speaking more clearly, improving mic quality, and +recommending participants to get familiar with Vim, Nano, etc. before the +workshop starts.</li> +<li>Overall, participants enjoyed the workshop and would like to join more like this.</li> +</ul> +<h3 id="day-2">Day 2</h3> +<ul> +<li>The speed and level of the workshop were appropriate and engaging.</li> +<li>Several positive comments on the commands and examples covered, the breaks provided, and the helpfulness of the instructors.</li> +<li>Some attendees expressed confusion with some exercises and recommended more +repetition of basic commands and more concrete examples of solutions in +exercises.</li> +<li>Some attendees suggested improving the teaching style by doing exercises +while explaining each step, while others preferred doing the exercises +themselves for better learning.</li> +<li>Technical questions were asked about the official Git documentation, the use +of Overleaf, and the concept of stash, which were addressed by the +instructors.</li> +<li>Some attendees provided personal comments and suggestions for future +workshops, including the possibility of working on a test project together +and adding prompts to show the branch in Git repositories.</li> +</ul> +<h3 id="day-3">Day 3</h3> +<ul> +<li>General consensus that the pace of the training was appropriate.</li> +<li>Many participants found the hands-on work helpful.</li> +<li>Some participants encountered technical difficulties.</li> +<li>Suggestions for improvements, such as providing more support for online participants and having more, smaller repositories for exercises.</li> +<li>Some participants found certain aspects of the training confusing, such as the merging process.</li> +<li>Suggestion for instructors to provide clearer instructions.</li> +<li>Overall, a positive response to the training.</li> +<li>Many participants indicated that they learned useful skills that they can apply in their work.</li> +</ul> +<h3 id="day-4">Day 4</h3> +<ul> +<li>The participants found the speed of the course to be appropriate.</li> +<li>They appreciated learning about containers, as well as Snakemake, licensing, and R examples.</li> +<li>Some participants wanted more hands-on exercises and more information on +specific topics like environments, MATLAB, and good documentation and +attribution practices.</li> +<li>The participants suggested expanding the course duration or offering a series of mini workshops.</li> +<li>They also suggested covering ethics and copyright law and providing solutions to exercises directly under each question.</li> +<li>Overall, the participants enjoyed the course and found it to be informative and useful.</li> +</ul> +<h3 id="day-5">Day 5</h3> +<ul> +<li>Participants have varying opinions on the pace, level, and usefulness of the workshop.</li> +<li>Some participants found the tools introduced to be too advanced, while others found them to be a good challenge.</li> +<li>There are suggestions for improvement, including making the content more linear, explaining concepts in more detail, and providing more examples.</li> +<li>The use of Sphinx, a documentation tool, was discussed, and some participants were unsure of its value.</li> +<li>Overall, participants found the workshop to be informative and inspiring, with some planning to spend additional time reviewing the content.</li> +</ul> +<h3 id="day-6">Day 6</h3> +<ul> +<li>The course was generally well-received and appreciated.</li> +<li>Many participants felt that they learned useful skills and would recommend the course to others.</li> +<li>Suggestions for improvements included providing more information on common practices and beginner's mistakes, as well as offering more focused mentorship and help sessions after the course.</li> +<li>Some participants felt that the daily schedule could be shorter or more compact.</li> +<li>Cheat sheets or code checkpoints could be provided to help with finding information quickly.</li> +<li>Technical concerns included difficulty with using the automatic debugging tool in GitHub.</li> +<li>There were also some questions about how to receive course credits or certificates.</li> +</ul> +<h2 id="registration">Registration</h2> +<ul> +<li>The registration process has definitely been improved, but we have identified that it could be further streamlined.</li> +<li>Our initial ambition was to register participants in two steps: in the first step to make sure they get all following +information, and in the second step signing up more concretely to a specific format. But during the registration we +decided to not ask all registrants to update their registrations. For future we wish to make this one-step.</li> +</ul> +<h2 id="zoom-and-twitch">Zoom and Twitch</h2> +<ul> +<li>Before this workshop we had decided to do away with the group Zoom rooms +because it proved to be a lot of work for inconsistent results. +In previous workshops we found that the problems start to mount when +members don't show up for the group they signed up for. As the workshop +progresses, there is a drop in attendance and this affects the Zoom +breakout rooms. This in and of itself is not a big problem, but we found +that we get some rooms that are completely empty; some rooms are at full +capacity; and some rooms have 1 or 2 people. We then have to asses each day +and rearrange people together with expert helpers. This proved to be more +work for little improvement in the quality of the workshop. So, we decided +to do away with the group rooms for this workshop and focus only on the +collaborative document.</li> +</ul> +<h2 id="collaborative-notes">Collaborative notes</h2> +<ul> +<li>As was mentioned above, we had more hands on the collaborative document since +we did away with the Zoom rooms. This proved to work well because we had a +lot more people answering questions, so the document was kept updated and +archived for maximum performance and accuracy.</li> +</ul> +<h2 id="installation-and-tools">Installation and tools</h2> +<ul> +<li>We could have a demo exercise (or some) that people can test before the +workshop: &quot;If you feel comfortable with this you’re gonna be fine during the +workshop&quot;.</li> +</ul> +<h2 id="lesson-content">Lesson content</h2> +<ul> +<li>We could shorten the lecture-part by moving exercises to the end. </li> +<li>Longer exercises would benefit in on-site rooms.</li> +<li>We are constantly looking at improving the quality of the lessons we provide, +so this is an ongoing process. We take into consideration all the feedback +that is given through the collaborative document to inform our decisions on +where we should focus for lesson improvement.</li> +</ul> +<h2 id="communication-with-participants">Communication with participants</h2> +<ul> +<li>Add all sessions to the <a href="https://coderefinery.org/calendars/">CodeRefinery calendar</a>.</li> +<li>Link all relevant repositories in one place (i.e. this calendar and anything +that needs attention near a workshop). Make sure those repositories have good +instructions in READMEs.</li> +</ul> + + + + + CodeRefinery workshop, 21-23 and 28-30 March 2023 + 2023-02-14T00:00:00+00:00 + 2023-02-14T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2023/02/14/march-workshop/ + + <p>Our March workshop is soon. By now, many of you know what a +CodeRefinery workshop is - git (intro and collaborative), social +coding, reproducible research, Jupyter, documentation, testing, and +modular code development (<a href="https://coderefinery.org/lessons/">check all +material</a>). But what's less +known is all the new ways to take part.</p> +<p><strong><a href="https://coderefinery.github.io/2023-03-21-workshop/">Workshop page</a> +and <a href="https://indico.neic.no/e/coderefinery-march-2023">Register</a></strong></p> +<p>In case you didn't know, we teach via livestream - which means anyone +can attend and we have unlimited capicity. Our <a href="https://coderefinery.org/workshops/teaching-style/">teaching +style</a> (as far as we can tell, quite +unique to us!) makes the courses still engaging while allowing us to +reach a much larger audience than we could otherwise. We also offer +some in-person or Zoom attendance options.</p> +<p>As an <strong>individual</strong>, you can attend - by yourself watching the +livestream, apply to work together in a Zoom team we organize, or some +local partners will even have in-person rooms to attend. Registration +is <strong>not</strong> binding, sign up for information and come when you can (you +won't take a seat from others). <strong>To simplify registration, you can +just sign up and you'll get contacted about Zoom/in-person +possibilities later.</strong></p> +<p><strong>If you have some friends, work together!</strong> Book your own meeting +room and watch the livestream together. We provide hands-on exercises +that on which you can work together - or even try to apply the +techniques to your own projects during this exercise time. Working +with a friend seriously improves learning and uptake after the +workshop.</p> +<p><strong>If you've been to CodeRefinery before, why not volunteer?</strong> (For any +of these, sign up in the normal registration form and tick the +interested in being staff/observer box):</p> +<ul> +<li>Be a team leader to allow us to support more teams (register in the +normal form and indicate this interest there).</li> +<li>Be a co-instructor: thanks to our +<a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">co-teaching</a>, we've reduced the +barrier to get started. In fact, someone that has taken +CodeRefinery once would make a perfect co-instructor for a lesson, +since you'll remember what it was like to be a learner and act.</li> +<li>We can always use volunteers to follow up on HackMD questions, help +manage Zoom, communications, and generally all the other little +things that need doing.</li> +</ul> +<p>Why volunteer? You'll learn more of the workshop contents and get +involved in our teaching network - really good for both your career +and your organization.</p> +<p>More than anytime before, CodeRefinery is about being accessible to as +many learning styles as possible. Anyone can register and you'll get +information, you can decide if you want to watch the livestream, +review videos later, or just be aware of what happened and check again +later.</p> +<p>We hope to see you there!</p> + + + + + Learner teams in courses + 2022-11-28T00:00:00+00:00 + 2022-11-28T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/28/teams/ + + <p><em>Part of a series on the <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a></em></p> +<p>In April/May 2020, when we started doing &quot;large&quot; (~100 people) online +courses, we wanted a way to be more interactive. This was before the +time of <a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">co-teaching</a> and +barely at the start of <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel +chat</a>, so we were focused +on the personal experience. Our solution was <strong>learner teams</strong>.</p> +<h2 id="how-it-worked">How it worked</h2> +<p>The basic mechanics was this:</p> +<ul> +<li>Learners are grouped into teams of ~5 people each. (We try no more +than 6 people that don't know each other already, if a team already +knows each other then we take whatever size they came with).</li> +<li>Some learners registered as teams (in this case, we kept them +together).</li> +<li>We would also accommodate individual learners by finding suitable +teams for them - and this did work well.</li> +<li>Each team has an <strong>exercise leader</strong> assigned to it. It might be +someone who separately volunteered, or it might be someone who is +already part of the group.</li> +<li>Teams are pre-assigned and static over the entire workshop. This +takes more work, but means that a community forms - randomly +assigning teams each day would <em>not</em> work as well.</li> +<li>There are lecture parts, and there are exercise parts. During the +exercise parts, everyone is moved to a breakout room. The exercise +leaders work with their team to do the exercises and in general be +friendly.</li> +<li>We have other course staff around (&quot;expert helpers&quot;) and they rotate +between different rooms and make sure the expert helpers are doing +well, if they need any help, and if they are keeping a safe and +welcoming course environment.</li> +</ul> +<p>We have a short <a href="https://coderefinery.github.io/manuals/team-leaders/">~1-hour training course for the exercise +leaders</a>, +where we try to motivate their value, give hints on promoting +interaction, hints on what happens if things go badly, and especially +about motivation of learners and safe learning environments.</p> +<p>We would encourage entire groups to sign up together as a team. +Research has shown that when two people (instead of one) learn some +new skill, it is much more likely to be adopted by a group. This is +the natural extension of that, and it becomes very easy to take entire +groups into a course.</p> +<p>For exercise leaders, detailed knowledge about the course material +wasn't needed, exercise leaders could come by and help with that. The +more important role of the exercise leader was social: being able to +keep everyone engaged and make sure that no one felt left out. +Knowing a little bit about command line interfaces and not being +scared of reading error messages is a nice bonus, but not strictly +needed.</p> +<p><strong>Teams seemed to work best when it was actively managed.</strong> This +doesn't mean forcing everyone to be a part of a team, but if someone +is on a team, it's clear they are expected to take part in it. There +should be a clear &quot;do you want to take part in a team?&quot; during the +registration phase.</p> +<h2 id="evaluation">Evaluation</h2> +<p>Teams worked great for us to scale to ~100-120 people. We could have +one instructor per lesson with plenty of staff to support the teams. +We could scale up the number of people we could teach at once much +more than the traditional 3-instructor model in a classroom.</p> +<p>In principle, this is a lot like &quot;work tables in a classroom&quot;. In +some ways, it wasn't as nice since it was online. But in other ways, +screensharing can allow everyone to see the active screen - something +not easily possible with this sized groups in a classroom. Everyone +had a clear team, and exercise leaders were clearly responsible for +the people on their teams - which meant that fewer people were at a +table but not really participating in the group.</p> +<p>When teams already knew each other in advance, it worked exceptionally +well. They would usually speak the same domain language and +programming language, and use the same tools. Often, one team member +had more experience and became the exercise leader. Even when teams +didn't know each other in advance, if we could try to put people +together based on these criteria, by day 2 they were working very well +together.</p> +<h2 id="benefits">Benefits</h2> +<p>Teams allowed us to scale to an even larger number of people. Our +registration was: &quot;We take people up to the capacity of exercise leaders we +have. However, we take any team that comes with their own exercise +leader, even if we are over our basic capacity&quot;. This worked well.</p> +<h2 id="decrease-of-teams-with-the-rise-of-livestreaming">Decrease of teams with the rise of livestreaming</h2> +<p>By 2022, the roles of teams has been decreasing (though this isn't +exactly a good thing). Our developments in +<a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">co-teaching</a>, <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel +chat</a>, and +<a href="https://coderefinery.org/blog/2022/11/28/teams/2022-11-14-livestreaming-courses.md">livestreaming</a> allows us to +break free of the limits of zoom. Co-teaching provides engagement +without needing two-way communication, parallel chat allows a way for +everyone to ask questions at the same time, and with that +livestreaming goes bigger than even the team-based approach. In our +recent attempts at teams, even when we provided an in-person team room +with staff, there were very few attendees. After spending large +amounts of time setting up the teams, this was a bit disappointing. +Still, this doesn't discourage us overall - if people find the mass +communication to work better, that's fine! We can be available for +those who want something else. Thus, or latest strategy is +&quot;livestream for the masses, higher-quality teams for those who want +them.&quot;</p> +<h2 id="downside-amount-of-organizational-work">Downside: amount of organizational work</h2> +<p>The biggest downside is the overwhelming amount of effort needed to +assign and manage teams. The more work done to make good teams, the +more effort needed, and it almost needs a full-time person to manage +it. This means we need to re-think our registration to make it more +sustainable in the long-term.</p> +<p>The advance assignment was doable, but handling last-minute changes to +keep the teams balanced, or handling no-shows, was the worst part. In +order for the team concept to work best, we needed to handle these +cases, since a team of too few people, or without an exercise leader, +or changing every day didn't work well.</p> +<h2 id="summary">Summary</h2> +<p>In summary, teams allowed us to make a more interactive and engaging +course than many others could online. It's similar to how tables +organized themselves in groups in classrooms, but by putting more +attention to the arrangement, we could ensure fewer people were left +out than in-person. Yet, practical difficulties and the benefits of a +livestream strategy mean that teams have a less central role than they +used to. In the near future, we will put extra effort into +simplifying the registration system so that they can co-exist with the +large livestream courses, since they are worth it when they work.</p> +<h2 id="see-also">See also</h2> +<ul> +<li><a href="https://coderefinery.github.io/manuals/team-leaders/">CodeRefinery manuals: Exercise +leaders</a></li> +<li><a href="https://coderefinery.github.io/manuals/expert-helpers/">Expert helpers and their role in helping exercise +leaders</a></li> +<li>Series index: <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of Teaching</a></li> +</ul> + + + + + Livestreaming courses + 2022-11-14T00:00:00+00:00 + 2022-11-14T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/14/livestreaming-courses/ + + <p><em>Part of a series on the <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a></em></p> +<p>The idea of livestreamed courses came in early 2022, during the early +phase of remote work and teaching. Everyone started online courses +and events, but immediately stared hiding their connection information +behind registrations because &quot;someone might do something bad if they +could join&quot;[1]. While there was a valid short-term reason for this, +something seemed wrong: the promise of the internet was that we can +reach everyone. Yet here we are making things closed by default.</p> +<h2 id="start-of-the-livestream-idea">Start of the livestream idea</h2> +<p>I got to thinking about this, and realized we needed to re-think what +it means to interact online. Our first courses used the &quot;meeting&quot; +concept - everyone talks to everyone. But online activities with +large audiences aren't like that - common mass engagement models +include things like TV broadcasting, posting videos, forums, +livestreams, and news articles.</p> +<p>So once I understood the conceptual problem with Zoom meetings, I knew +what to do. We started working towards disconnecting the core +teaching parts from the meeting parts. That resulted in developments +like <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat (&quot;HackMD&quot;) for +questions</a> and +<a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">co-teaching</a>, and lots more things +which you will see later such as learner teams. Basically, it was a +systematic process of re-thinking teaching until we <em>could</em> move on to +the next step without losing essential points like interactivity or +engagement.</p> +<h2 id="how-livestreaming-works-for-our-courses">How livestreaming works for our courses</h2> +<p>Then came <strong>livestreaming</strong>. Livestream is a fancy way of saying +live video, in this context as a public broadcast over the internet. +We had a few first pilots made by having Zoom do the livestreaming +directly to Twitch (there is something built-in, but I didn't like it +very much) - at least this let us say &quot;anyone who wasn't able to +register can watch the stream&quot;. We also got a lot of experience with +streaming in our project <a href="https://researchsoftwarehour.github.io">Research Software +Hour</a>.</p> +<p>The fully &quot;proper&quot; livestreamed course was 2021 February, our <a href="https://scicomp.aalto.fi/training/scip/winter-kickstart-2021/">Intro +to scientific computing/HPC +Kickstart</a>, +and was great! There were no major problems, and it actually felt +pretty refreshing because for once, everything felt like it was under +control. It was too early to livestream every single course, but by +late 2022 we are using it for most of our capstone courses.</p> +<p>How do we actually do it? Instructors teach by Zoom, but there are +no learners or helpers there. The Zoom windows are captured by <a href="https://obsproject.com/">OBS +(Open Broadcaster Software)</a>, which +livestreams to Twitch. Course staff can broadcast to everyone, but +the audience can't interfere with each other, except through our +(moderated) channels. This lets us scale far more than we could +otherwise.</p> +<blockquote> +<p>Livestreaming is made possible by strategies like parallel chat and +co-teaching. Because we livestream, we can now do reverse hybrid, +be more open, produce videos immediately, work together, and +simplify registration. Livestreaming is the mediator of all of our +strategies - even if it's not technically required.</p> +</blockquote> +<h2 id="evaluation">Evaluation</h2> +<blockquote> +<p>I attended several &quot;top&quot; conferences/workshops/seminars as well as +videolectures this past year in their virtual implementations, and this +event is easily the best out of all of them when it comes down to +presentations and audience participation!</p> +<ul> +<li>Feedback from Summer 2021 HPC Kickstart</li> +</ul> +</blockquote> +<p>In general, feedback was positive.</p> +<p>Let's just say there was one surprising thing we noticed: since the +audience isn't in the Zoom, during breaks (when the livestream is +muted and video off), the co-instructors are free to discuss without +disrupting the course. This actually is great for the co-instructors +to manage the flow of the course - and students can continue +interacting via <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat</a> +anyway. And when the audience is not in the stream, you can publish +videos immediately with no privacy risk - which is great for +accessibility.</p> +<p>Livestreamed courses aren't exactly perfect, but they are pretty good +and I think they should be considered more. It does take some tech +setup and some time to get used to them. Most people probably +wouldn't want to use it for small courses, so there is some threshold +of being worth it. Whatever the case, I think it's something that +everyone teaching online should think about.</p> +<h2 id="see-also">See also</h2> +<ul> +<li><a href="https://www.youtube.com/watch?v=WjmttAniZX8">Demo of livestream +teaching</a> (check the +video description to know what is going on).</li> +<li><a href="https://coderefinery.github.io/manuals/livestream-teaching/">Teaching via +livestreaming</a> +in the community-teaching guide.</li> +<li><a href="https://coderefinery.github.io/manuals/coderefinery-mooc/">CodeRefinery +MOOC</a>, +which is mainly about livestreaming.</li> +</ul> +<hr /> +<p>[1] Incidentally, since 2020 we have had a daily online meeting, our +Scientific Computing Garage help session, with the Zoom link online, +and have never had any problems. My hypothesis is that if you don't +have an exact data listed along with the Zoom information, it's not +found by those that want to troll.</p> + + + + + Lessons learned from the Sep 2022 online workshop + 2022-11-08T00:00:00+00:00 + 2022-11-08T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/08/lessons-learned-Sep-2022/ + + <p>September 20-22 and 27-29, 2022, we held again our <a href="https://coderefinery.github.io/2022-09-20-workshop/">CodeRefinery online +workshop</a> (6 x 3.5 hours) +with 204 individual registrants plus 10 teams with a total of 47 participants. +Here we wish to share with the community and our future selves our lessons +learned: What worked well and what we need and plan to improve. We use bullet +point format for brevity. If you think you might have solutions for us or want +to discuss about the topic, please [reach out to +us(https://coderefinery.org/organization/contact/). This complements our +lessons learned from <a href="https://coderefinery.org/blog/2020/04/14/first-online-workshop/">our first online workshop +2020</a> and the +<a href="https://coderefinery.org/blog/2021/11/25/lessons-learned-may-2021/">May 2021 +workshop</a>.</p> +<p><strong>We have identified the following main issues that we want to address for future events</strong>:</p> +<ul> +<li>Registration process is still too complicated.</li> +<li>We are asking ourselves how to further scale without being completely overwhelmed by coordination/communication/synchronization.</li> +<li>There are not enough exercises, especially in the later workshop days and exercise leads often feel that they don't have enough to do so we need to improve the experience for exercise leads.</li> +<li>Lots of effort goes into recruiting exercise leads but then it may be demotivating for some to participate if there are no-shows or not enough interaction in the breakout rooms.</li> +</ul> +<h3 id="registration">Registration</h3> +<ul> +<li>We still need a more lightweight system registration. +<ul> +<li>This is a balancing act between guiding people and trusting them to self-organise.</li> +</ul> +</li> +<li>Could we actually get away with no registration at all? How to get stats then? +<ul> +<li>Zoom and Twitch give data like the number of persons viewing. One may ask in the HackMD about the country of origin and additional information for the statistics. +<ul> +<li>Part of it can be via the icebreaker questions.</li> +</ul> +</li> +</ul> +</li> +<li>If we offer a central registration and partner registration sites, they ideally need to open at the same time, otherwise +participants sign up in the &quot;wrong&quot; one.</li> +<li>We could have registration but let people self-organise more: +<ul> +<li>Offer HackMD, exercise lead zoom, exercise Zoom, stream and inform people about those resources.</li> +<li>Give hints about different ways to participate but no rigid instructions.</li> +</ul> +</li> +<li>We could leave team registration completely to the partners or participants to handle: +<ul> +<li>Tell that they could summon teams in their organisation communication channels.</li> +<li>They could indicate somewhere that they are open for managing additional teams.</li> +<li>Tell organisations that they can organise their own registration.</li> +</ul> +</li> +<li>Exercise leader registration was confusing (too many forms to fill out).</li> +<li>We could ask for participants' consent to be contacted for future events organized by us to allow past participants to inform their colleagues about an upcoming workshop.</li> +<li>How to deal with late registrants? +<ul> +<li>Should they get the Zoom link or only HackMD? +<ul> +<li>If not we should take those options away from the registration form. Maybe have a last minute registration form as a separate one.</li> +</ul> +</li> +</ul> +</li> +<li>Consider adding others who are helping to Indico (our registration system) as managers :grin:.</li> +<li>We could communicate clearer that also participating part of the workshop is possible and encouraged.</li> +</ul> +<h3 id="workshop-format">Workshop format</h3> +<ul> +<li>We noticed that most participants were interested in the Git part and after the Git lessons the interest was smaller. But it could also be that the Git lessons were the first lessons and then work load increased or interest decreased or participants found it too difficult.</li> +<li>Communicate better that even if the Git part gets too difficult, the second week may still be worth watching and again easier to comprehend.</li> +<li>Generally we observed a significant no-show rate (over 50%).</li> +<li>Maybe this format is too big for the resources/time that we have as organisers. +<ul> +<li>Maybe the task distribution was not clear/visible.</li> +<li>It at least difficult to get enough instructors to commit</li> +</ul> +</li> +<li>Learners were not that motivated in joining the Otaniemi in-person (daily decreasing numbers).</li> +<li>Is September too crowded with other events?</li> +<li>Have we saturated the local market?</li> +<li>Workshop going over lunch time (until 13:30 local time) was an issue at least in JYU and CSC, +<ul> +<li>People managed when topic to come after break was announced before break so that they knew if they could skip without losing the thread.</li> +</ul> +</li> +<li>We could try flipped learning: have people watch videos / read the docs and then come on-site/online to discuss and solve problems</li> +<li>Should we do more asynchronous teaching/learning?</li> +</ul> +<h3 id="coordination">Coordination</h3> +<ul> +<li>Establish the process according to the experience gained from this and previous workshops: +<ul> +<li>Make step-by-step instructions in manuals on how to arrange such events.</li> +<li>Put everything that participants will need for the workshop already into the Indico confirmation message. +<ul> +<li>Info from emails sent could be also in manuals except for the links.</li> +</ul> +</li> +</ul> +</li> +<li>It might be interesting to count the number of hours/emails/euros/zooms spent per participant showing up since also in this course we struggle to some extent with no-shows.</li> +</ul> +<h3 id="zoom-and-twitch">Zoom and Twitch</h3> +<ul> +<li>Ask exercise leads (ELs) not to speak in learners Zoom while lecturers speak in Twitch.</li> +<li>The goal was to have Zoom instructions about breakout rooms and open breakout rooms well before the stream starts but we didn't manage that this time. We opened them ~10 minutes before exercises.</li> +<li>Utilise Zoom annotate in co-teaching.</li> +<li>Exercise Zoom rooms: +<ul> +<li>Tech questions room: difficult to follow if someone actually goes there. +<ul> +<li>It would be better to join the tech room during breaks, or before/after the lectures.</li> +</ul> +</li> +<li>Quiet room had 1-3 participants always.</li> +</ul> +</li> +<li>Exercise room instructions screen-share: We did it from separate device so we had the host computer free to operate stuff.</li> +<li>We could share the Zoom link as well and consider having a password and/or waiting room (but then somebody would have to manage that).</li> +<li>More interaction in video room: +<ul> +<li>Since there was so little interaction and not enough exercise time: some ELs felt that they &quot;are not needed&quot;</li> +<li>Too few exercises or too short exercise time and hence not enough possibility for interaction.</li> +</ul> +</li> +<li>Exercises felt too short (because many participants were software-unprepared).</li> +<li>Navigation problems among different webpages continues to be an issue. Few suggestions on how we could solve it have been and are being discussed <a href="https://github.com/coderefinery/coderefinery.org/issues/697">here</a>.</li> +</ul> +<h3 id="collaborative-notes">Collaborative notes</h3> +<ul> +<li>HackMD goes to Twitch chat anyway so maybe no point in keeping it as a secret. +<ul> +<li>Add HackMD link to the workshop page and use the workshop page as main entry point so that participants don't have to hunt for links in email inboxes.</li> +</ul> +</li> +<li>HackMD started to be slow even if it should not with ~100 participants. +<ul> +<li>Numbering questions adds confusion -&gt; keep bullets and change to numbers in archive if needed. But this problem was only there because the document was sluggish at times.</li> +<li>Note for future: when pre-seeding the question numbers, leave a line between them. Then, when someone pushes enter after a number to add a new line, it doesn't increment the future numbers. Just saw this, this solves a big problem with numbering.</li> +</ul> +</li> +<li>Later in the workshop we deployed our own HedgeDoc instance, which worked quite well.</li> +</ul> +<h3 id="installation-and-tools">Installation and tools</h3> +<ul> +<li>Many did not install software beforehand. Either we haven't communicated clearly enough that this is needed or the install sessions were not recognized and not taken up. Very few people showed up at the install help sessions.</li> +</ul> +<h3 id="lesson-content">Lesson content</h3> +<ul> +<li>More big picture cohesion between exercises: It has been suggested to have a better connection between lessons and work on one repository that is continuously improved.</li> +<li>Provide snapshots and starting points for those who have not done the previous exercises.</li> +<li>Topics in Day 4 (at least) would deserve a longer lesson.</li> +<li>We can try to communicate better that after the Git lessons it can be OK and also useful to join only for the lessons of interest (to motivate people to pop in also for 1 or 2 lessons).</li> +<li>Especially in in-person: the Twitch sessions felt long (since there was so little interaction in the in-person rooms).</li> +</ul> +<h3 id="communication-with-participants">Communication with participants</h3> +<ul> +<li>Add all sessions to the <a href="https://coderefinery.org/calendars/">CodeRefinery calendar</a>.</li> +<li>Link all relevant repositories in one place (i.e. this calendar and anything that needs attention near a workshop). Make sure those repositories have good instructions in READMEs.</li> +</ul> + + + + + CodeRefinery Mastodon account + 2022-11-08T00:00:00+00:00 + 2022-11-08T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/08/mastodon/ + + <p>For the obvious reasons, CodeRefinery is looking into a Mastodon +account. You can now find us at +<a href="https://fosstodon.org/@coderefinery">@coderefinery@fosstodon.org</a>.</p> +<p>We will try to mirror to both, at least for the time being. If anyone +has ideas about how balance the two, please let us know. We will have +the CodeRefinery account follow other staff and interesting people +related to CodeRefinery's mission, so if you are looking for other +interesting people to follow to seed your network, check that out, +too.</p> +<p>Mastodon is part of a federated social network, open source, and not +under the influence of big companies - just what we should be +supporting more of. Interested in joining yourself?</p> +<ul> +<li><a href="https://mastodon.help">https://mastodon.help</a> gives a basic introduction of the how and +why. <a href="https://fedi.tips/">https://fedi.tips/</a> gives a longer FAQ (and a separate +introduction).</li> +<li>Usernames are like emails with a username and a server name, +<code>@username@server.name</code>.</li> +<li>To join, you choose a server that you feel comfortable in, and they +all communicate. Some recommendations are below.</li> +<li>You can follow anyone regardless of their server, but the server you +choose might affect what you see in the local timelines (for +example, an art-focused server will probably have more stuff +interesting to artists). Later, it's easy to move and automatically +redirect your followers.</li> +<li>When in doubt, just join somewhere that looks reasonable - don't let +the Paradox of Choice hold back progress!</li> +</ul> +<p>If you are just joining, you can start out by following CodeRefinery - +copy <code>@coderefinery@fosstodon.org</code> to your search and follow it. You +may be interested in following some of the people that we follow to +seed your list.</p> +<p>Deciding a server:</p> +<ul> +<li>We chose <a href="https://fosstodon.org">https://fosstodon.org</a> (FOSS = &quot;free and open source +software&quot;) to focus on the software and technology side of things.</li> +<li>For others in academia or research, +<a href="https://fediscience.org/server-list.html">https://fediscience.org/server-list.html</a> is a very nice list of +other interesting servers.</li> +<li><a href="https://mastodon.social/">https://mastodon.social/</a> is run by the non-profit that coordinates +the Mastodon open-source project, but that does <em>not</em> mean you +should necessarily prefer it.</li> +<li>Do a web search for server lists. There are both news articles with +broad recommendations, and searchable lists with many servers for +specialized topics.</li> +</ul> +<p>What you should know about Mastodon (especially vs. Twitter):</p> +<ul> +<li>It isn't designed to feed you content via internal algorithms: you +have a much more active role in determining what you see. You need +to find some people to follow, follow who they follow, and develop +your network. At the same time, boost (&quot;reblog&quot;) things that are +good so that your network can see them.</li> +<li>It's not designed for low-effort replies (quote-replies) since it +makes engagement farming and negative attention. You <em>can</em> reply to +posts with the reply button on each post. (don't forget you can +click on post to see the thread).</li> +<li>Use hashtags to make things searchable, there is no full-text search +(to make it harder for random attacks based on opinions)</li> +<li>&quot;Fediverse&quot; (&quot;federated universe&quot;) is the term used to refer to the +entire network of Mastodon servers (and more) that can communicate. +It's not just Mastodon - +<a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub</a> can +communicate across different types of servers, such as image +hosting, video, blogging, etc. - in theory avoiding lock-in.</li> +<li>The Mastodon network is currently absorbing millions of new users in +a matter of days. Especially the popular servers can be a bit +behind in all of the hidden network synchronization work.</li> +</ul> +<p>We hope to see you there!</p> +<h3 id="see-also">See also</h3> +<ul> +<li><a href="https://fediscience.org/server-list.html">Academia/research server list</a></li> +<li><a href="https://mastodon.help">https://mastodon.help</a></li> +<li><a href="https://fedi.tips/">https://fedi.tips/</a></li> +<li><a href="https://www.pwnallthethings.com/p/twitter-was-special-but-its-time">About engagement farming</a></li> +</ul> + + + + + Video publishing supports more learning styles + 2022-11-08T00:00:00+00:00 + 2022-11-08T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/21/video-publishing/ + + <p><em>Part of a series on the <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a></em></p> +<p>What if all the talking in a course didn't disappear right after the +course was over?</p> +<p>When we went online, many people thought: avoid recording courses, +that's a privacy risk for participants. I firmly think this is the +right choice: I don't think any privacy risk to participants is worth it, and &quot;don't +say anything if you don't want to be recorded&quot; isn't good enough, +either - I don't want to push &quot;publish&quot; and have to <em>hope</em> that no one +missed the warning. I don't want to motivate participants to be +silent. Editing videos takes a long time and is hardly worth it.</p> +<p>This is part of why we developed <a href="https://coderefinery.org/blog/2022/11/14/livestreaming-courses/">livestream teaching</a>: we want to +separate the instructor interaction from learner interaction, so that +there is <em>no privacy risk whatsoever when recording</em>. This only works if the +livestream is engaging enough, but our previous posts show how we +handled that problem.</p> +<p>In order for a video to be useful, it has to be published <em>quickly</em>. +Watching videos months later isn't that engaging[1], but as a immediate +follow-up for things you missed, or catching up if you had to miss a +day, it is <em>extremely</em> useful. We can't have a long publishing +process with this.</p> +<p>So, with livestreaming, what do we get?</p> +<ul> +<li>The livestreaming platform usually records the video, making it +immediately available in raw form. This usually gets a lot of +views, even if it is raw.</li> +<li>Extensive editing isn't needed, since you aren't looking for +privacy issues in the stream - just making it &quot;good enough&quot; in the +amount of time you have.</li> +<li>Learners can catch up immediately or refresh themselves on what they +saw going off into the future.</li> +<li>If learners know videos will be available, they +are suddenly much more free to go with the flow of the course.</li> +</ul> +<p>We actually made our own tool, +<a href="https://github.com/coderefinery/ffmpeg-editlist">ffmpeg-editlist</a>, +that allows us to define cut points in YAML file, and then run a +process to do the editing. This allows us to distribute the editing +via git, and copy-and-paste from previous years to save time. Thanks +to this, it's our standard to have videos published by midnight the +day of the course.</p> +<p>Overall, this works well. We seem to get lots of views with the +Twitch automatic video (which lasts for 7 days): the same day as the +course, usually 1-2 +times the number attending the livestream (<a href="https://github.com/coderefinery/workshop-stats/blob/main/data/python-for-scicomp-2022/README.md#twitch-video-views">stats from Python for +Scientific Computing 2022</a>). The YouTube +videos tend to get much fewer, since it's not ready on time for people +catching up the same day. I'm still the main one making the videos, +but it's simple enough that others could do so. I think I put in too +much effort, and if I wanted it could be much faster - say, take only +an hour per day.</p> +<p>I wouldn't recommend everyone try to make perfect videos for +everything, but it's a nice advantage of livestreaming, and if you +want text-based video editing for other events, ffmpeg-editlist might +make it possible.</p> +<p>In short, I don't think the point of video publishing is to make a +high-quality standalone production (although we can do that, and it +can work well, especially with co-teaching). The most direct impact +is supporting diverse teaching styles in the short term.</p> +<p>Read more:</p> +<ul> +<li><a href="https://youtu.be/thvMNTBJg2Y">video demonstration of ffmpeg-editlist</a></li> +<li><a href="https://coderefinery.github.io/manuals/video-editor/">Video editor</a> +role description in the CodeRefinery manuals</li> +<li><a href="https://github.com/coderefinery/ffmpeg-editlist">ffmpeg-editlist</a></li> +<li><a href="https://github.com/AaltoSciComp/video-editlists-asc/blob/master/kickstart-2022-summer.yaml">Sample ffmpeg-editlist +file</a>, +very well done (perhaps too much).</li> +</ul> +<p>[1] Before remote teaching in 2020, an argument against recording the +teaching was &quot;it won't be interesting for others to watch later&quot;. +This post also shows how that's the wrong perspective: the videos +aren't only for random people later, but people in the course already.</p> + + + + + Reverse hybrid teaching + 2022-11-07T00:00:00+00:00 + 2022-11-07T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/11/07/reverse-hybrid/ + + <p><em>Part of a series on the <a href="/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a></em></p> +<p>In 2020, we went to remote teaching. In 2022, we are talking about +hybrid so that we can keep accessibility benefits of being online, +while returning to some of the benefits of interaction. But does this +work? There are plenty of issues with hybrid, mainly the inequality +of the people in-person and those who are remote. What can we do +about this?</p> +<p>We've found a surprising solution which we call <strong>reverse hybrid</strong>. +Surely others have thought of this, and maybe there is even a proper +name.</p> +<p>Let's do a thought experiment in a large course. There is one teacher +and hundreds of students. What's the benefit to students doing this +in-person? It's probably not being in the same room as the teacher, +since most students don't have time to ask a question, or even +approach the teacher after the course. The benefit is how students +can interact with each other beside the lecture. The downside is that +making good, accessible online material in a lecture room is hard.</p> +<p>I wouldn't quite say it's accidental, but we have started this reverse +hybrid strategy: the teachers are online, and students can be +in-person in small groups. We started this by encouraging students to +meet up with their friends or colleagues to work on exercises, while +we teach online. As things became more relaxed, we had some staff +organize official in-person exercise sessions - while the current +instructors kept teaching online. This has worked surprising well - +students who want interaction can get it (and actually interact, +without disrupting the whole course), and those that don't can still +attend no matter where they are.</p> +<p>But what do we lose? Do we lose interaction with instructors? As +our posts on <a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">co-teaching</a> and <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat</a> show, no! When you get to these large +courses, students can't interact with instructors without technology +anyway. In-person interactions aren't as anonymous, so that solution doesn't +motivate all learners to be active.</p> +<p>And what do we gain? The course isn't bound to one location, +literally anyone in the world can attend. There are high-quality +materials that everyone can review afterwards, so that the audience +has the time to relax and interact. By being able to scale up, we can +have more staff, which allows us to interact more via <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat</a> or +co-instructors. It's even possible to go as far as we go and make +each course an international collaboration with local breakout rooms, +and plenty of staff to manage everything.</p> +<p>Is &quot;reverse hybrid&quot; for everyone? Clearly not. I think it could work +for small courses too if a teacher really promotes the use of +technology to make interaction, but it might feel a bit weird - though +I think it's worth trying! I think the biggest advantage is that it +allows you to scale up in a way that you are <em>no longer have to teach +alone</em>, which is a mindset change more than anything.</p> +<p>In practice, does it work? In several cases where we had a structured +in-person session, it has worked well. We know of cases of groups of +friends or colleagues joining together to watch and do exercises for +each of our courses, but we don't have a way to say just how many. We +do have a report of it not working so well - because the online +interaction dominated the in-person interaction. But is that really a +negative about in-person, or an overwhelming message about how +engaging our online courses are?</p> +<p>See also</p> +<ul> +<li><a href="https://coderefinery.github.io/manuals/co-instructors/">CodeRefinery manuals on +co-instructors</a></li> +<li><a href="https://coderefinery.github.io/manuals/hackmd-mechanics/">CodeRefinery manuals on how we do parallel chat, &quot;HackMD&quot;</a></li> +<li>Series index: <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of Teaching</a></li> +</ul> + + + + + Co-teaching and scaling up + 2022-10-31T00:00:00+00:00 + 2022-10-31T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/10/31/co-teaching/ + + <h1 id="co-teaching">Co-teaching</h1> +<p>So you are trying to teach a large online course. Everyone knows this +will be boring and monotonous, right? What if we told you that our +large, online, livestreamed courses feel more interactive than our old +small in-person courses? Part of that is due to the +<a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat</a>, +but a significant part also comes from co-teaching, the topic +of this article.</p> +<p>The basic idea is that we accept that the audience is probably going +to be quiet, and plant someone to interact with the instructor. This +person doesn't pretend to be a student, but directly acts as a +co-instructor and the course becomes a discussion between them. This +is different than having two instructors who alternate teaching, or an +instructor or helper. It's more like a pilot-co-pilot situation, +where both pilots have a certain focus, but the flying is a continual +team process with each having a focus (flying and monitoring) but both +constantly providing information to each other.</p> +<p>Doing co-teaching in practice requires some care, but isn't that hard. +There are different models, usually we try to designate a primary who +is going over the course material, and the other co-instructor acts as +a learner, asking questions and engaging by being the &quot;voice of the +audience&quot;. The co-instructor who isn't most actively talking spends +some time watching the <a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">parallel chat</a> and raising these questions. During +demo times, one common strategy is that one person is guiding and +explaining the big picture and the other person is typing and +explaining the small picture. Whatever happens, it works. And +usually very well.</p> +<p>Besides the much greater interaction, there are other benefits. It's +much easier to onboard a new instructor - one can almost go straight +from advanced learner to co-instructor, since &quot;asking questions a +learner might have&quot; is enough to start. Co-teaching also reduces the +stress of preparation: the instructors still have to prepare, but +with two people, by simply pausing or asking a question to the other +person, any gaps can be filled in.</p> +<p>Perhaps the biggest disadvantages are the need for more people and to +coordinate. But, there is probably less preparation total needed. It +requires more staff, but we need a continual flow of instructors +coming in anyway - so this helps us long-term.</p> +<p>What's the minimum size course where this makes sense? In theory, it +could work for very small courses, but at that size you would probably +hope that the audience interacts directly. At a few tens of students, +it might work, if you can keep the co-instructor discipline working +well - but that might easily be forgotten if there are many questions +from the audience. But I personally think that even small courses +benefit from two brains, and it worth trying co-teaching at any size.</p> +<p>Overall, co-teaching has revolutionized our teaching: we can feel more +interactive in large courses, we can bring in new instructors more +quickly, and we can teach better. It really seems to solve the boring +&quot;500-person lecture&quot; problems that I had when I was in university. We +now use co-teaching for anything that needs to seem &quot;professional&quot;, +from 20-person instructor training via Zoom to our 500-person +livestreamed Python for Scientific Computing courses.</p> +<p>See also:</p> +<ul> +<li><a href="https://coderefinery.github.io/manuals/team-teaching/">Co-teaching in CodeRefinery +manuals</a></li> +<li><a href="https://coderefinery.github.io/community-teaching/team-teaching/">Co-teaching in Community +Teaching</a></li> +<li>Series index: <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of Teaching</a></li> +</ul> + + + + + Parallel chat ("HackMD") and scaling teaching + 2022-10-24T00:00:00+00:00 + 2022-10-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/10/24/parallel-chat/ + + <p><em>Part of a series on the <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a></em></p> +<p>One of the most common complaints when moving online was the amount of +interaction and feedback possible. How often have you heard &quot;please +turn on your cameras so I can see how it's going&quot; - only to have no +one do that. You might be surprised to learn that CodeRefinery's +online courses have an order of magnitude more interaction than our +in-person courses.</p> +<p>Our solution is &quot;parallel chat&quot;, or as we typically call it &quot;HackMD&quot; +after the service we started using, <a href="https://hackmd.io">hackmd.io</a> - although it's not really specific +to that HackMD, and neither is it a chat platform. Basically, it's on online document (think +etherpad/Google Docs/etc) that everyone can see and edit at the same +time. Instead of asking question by voice or via classic (linear) chat, +people write new questions as a bullet point in the bottom of the +parallel chat. Our team of helpers answers them in sub-bullet +points - and a whole discussion can happen in these bullet points.</p> +<p><img src="https://coderefinery.github.io/manuals/_images/hackmd--questions2.png" alt="Demonstration of HackMD" /></p> +<p>There are a variety of reasons this is so good:</p> +<ul> +<li>You can have multiple people asking and answering at the same time +(not possible with voice, and linear chat gets confusing with)</li> +<li>At the end of the course, we have a beautiful Markdown document to +revise and publish. We can make sure that all questions get an +complete, accurate answer.</li> +<li>People can ask anonymously - which encourages questions from those +who would usually be silent in courses.</li> +<li>Equally, questions don't distract everyone, so there is no pressure +to be quiet to let the course go on.</li> +<li>You can get multiple diverse answers to the same question, showing +that the instructors aren't one homogeneous group and to give multiple different solutions, when &quot;one right answer&quot; does not exist or is more a matter of taste.</li> +<li>By having more questions asked, you can get much more feedback while +teaching - so much you have to be careful to not be overloaded!</li> +<li>It's fun: parallel chat via a text document isn't perfect, but it's +pretty good. It allows some creativity in asking, answering, and +giving feedback. +For example polls can be conducted as &quot;+&quot; or &quot;-&quot; or &quot;o&quot; added after the options.</li> +</ul> +<p>Just look at the number of questions in our old courses, <a href="https://coderefinery.github.io/2022-03-22-workshop/questions/day1/">one 3.5-hour +day of our May 2022 +workshop</a> - +and this is day 1, when people didn't yet know how it worked.</p> +<p>But there are some disadvantages:</p> +<ul> +<li>An absolute flood of information, which <em>will</em> be distracting to +anyone trying to follow it. We warn people at the start to be +careful about this, and it's mostly OK. It's anyway archived for +follow-up later at one's convenience.</li> +<li>Another window for people follow. Like above, we warn people to +focus on the learning and parallel chat only when there is time.</li> +<li>It's different, so needs some explanation (but we've seen people +catch on very quickly once they see it).</li> +</ul> +<p>So, just how does this work? Well, we create the text document with +some standard notes at the top and bottom. It's made freely editable +without any login, shared to everyone in the workshop. All learners +are told to ask every new question in +list item at the bottom of the document - <em>always</em> the bottom, since +that's the only thing we follow. The course team has this open and +answers questions, focusing their attention at the bottom. Some other +notes:</p> +<ul> +<li>Instructors should discuss it via voice often, mentioning when the +look at it and when questions come from it. Let the audience know +it's actually useful.</li> +<li>Screenshare it during the Q&amp;A parts and breaks (you need a tool that +won't show the names of anyone who might have happened to be logged +in - HackMD does this properly). It provides something to look at +and reminds people that it exists and has lots of answers.</li> +<li>We often use it as an icebreaker as a demo. Maybe not everyone +understands it.</li> +<li>It can also be used for lightweight polls: learners can <code>+1</code> or add +a character to a line to make simple bar graphs.</li> +<li>Like we said above, it's not a perfect tool, but easy to use and fun.</li> +<li>A &quot;HackMD manager&quot; watches it and tries to keep things organized, +adds section headings, and so on. This makes it easy.</li> +<li>Remember, new content only to the bottom! People can't go following +multiple sections.</li> +</ul> +<p>We don't have unlimited scaling and there are some other problems, +though. Some possible issues that may come up:</p> +<ul> +<li>To make this really good, you need at least one person focusing on +the parallel chat - or at least <a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">two co-instructors</a>. In workshops of +our size, this hasn't been a big issue, though - it provides a good +task for helpers.</li> +<li>The tech might not scale to thousands of people - hackmd.io has +worked with hundreds, or sometimes has been slow. A self-hosted +hedgedoc instance has worked with hundreds and can probably go +higher.</li> +<li>At some point, if the parallel chat is available to everyone, trolls +will start ruining it for everyone. +Our plan is that the parallel chat URL is a bonus for registered +participants, and sometime later we could enforce this limit even +more strictly with write-protections.</li> +</ul> +<p>As good as this is, can in also work for small courses? In theory, +yes, of course. But in practice, the smaller courses get, the harder +it is...</p> +<ul> +<li>Lack of helpers to answer in parallel - fewer answers ⇒ fewer +questions. Fewer questions ⇒ less time looking at it ⇒ less +motivation to ask questions.</li> +<li>But also in smaller hybrid courses it provides a great way to give equal opportunities to on-site vs online participants to ask and get answers to their questions.</li> +</ul> +<p>Overall parallel chat in a workshop feels extremely interactive - even +more so than a medium-sized traditional in-person course. Combine +with a team for teaching, and things seem to work very well.</p> +<p>See also:</p> +<ul> +<li><a href="https://coderefinery.github.io/manuals/hackmd-mechanics/">HackMD mechanics in CodeRefinery +manuals</a></li> +<li><a href="https://coderefinery.github.io/manuals/hackmd-helper/">HackMD manager role +description</a></li> +<li>Series index: <a href="https://coderefinery.org/blog/2022/10/17/future-of-teaching/">Future of Teaching</a></li> +</ul> + + + + + Python for Scientific Computing open for registration and collaborators + 2022-10-21T00:00:00+00:00 + 2022-10-21T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/10/21/python-for-scicomp/ + + <p>Our next workshop, <a href="https://scicomp.aalto.fi/training/scip/python-for-scicomp-2022/">Python for Scientific +computing</a>, +is ready for you! Take part in different ways:</p> +<ul> +<li> +<p>If you want to learn, you can register. Like all of our <a href="https://coderefinery.github.io/manuals/how-to-attend-stream/">livestream +courses</a>, +there are diverse ways to attend based on your needs.</p> +</li> +<li> +<p>If you are a small group, attend together! Get a meeting room, or +online meeting, and watch together. We will tell you when exercise +sessions are, and then you can work together on that.</p> +</li> +<li> +<p>If you are an organization, sponsor attendance locally! Reserve a +room, open your own registration form if you want, and host the +watching. There will be clear times for in-person work like this - +if you contact us, we'll help you however much we can.</p> +</li> +</ul> +<p>Python for Scientific Computing has run in 2020 and 2021, and was +designed to be a next step for scientists after basic Python: not too +in-depth, but showing a broad, hands-on picture of many useful tools +in the Python ecosystem. All +<a href="https://aaltoscicomp.github.io/python-for-scicomp/">material</a> and +teaching is open-source before, during, and after the course.</p> +<p>Last year, we had 500 viewers for our peak days. Can we make 1000 or +5000 this year? - the course certainly supports it, and with your +help, we can.</p> +<p>If you want to contribute more (or see how we do it), join the +<a href="https://coderefinery.github.io/manuals/chat/">CodeRefinery</a> chat and +introduce yourself.</p> + + + + + CodeRefinery teaching strategies and the future of teaching + 2022-10-17T00:00:00+00:00 + 2022-10-17T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/10/17/future-of-teaching/ + + <p><em>This is the index page of the <a href="/blog/2022/10/17/future-of-teaching/">Future of +Teaching</a> series.</em></p> +<p>In early 2020, global teaching got disrupted by the Covid-19 +pandemic. Countless courses struggled to maintain interaction and +teaching, but CodeRefinery found that by embracing the times, our +teaching could become even better. <strong>This series of blog posts will +discuss what we did and how you can learn from it.</strong></p> +<p>So, what is the future of teaching? For type of practical, hands-on +learning, we could try to classify learning situations into three +types:</p> +<ul> +<li>Very large courses and massive open online courses (MOOC),where +individual interaction isn't possible.</li> +<li>Small-medium courses, 10-30 people, with traditional classroom-type +interactions.</li> +<li>One-on-one or small-group mentoring.</li> +</ul> +<p>Before Covid, CodeRefinery was in the middle category with exclusively +in-person classroom sessions over a few days. During Covid, we +focused on very large online courses, which incidentally corresponded +with the rise of Research Software Engineering services in some of our +communities. This produced an interesting effect: <strong>The middle layer +got squeezed out</strong>: very large courses (with the proper tools) were +better at conveying information, and mentoring and co-working was best +for supporting people outside of these courses. These two things +combined seemed to greatly reduce the need for traditional +medium-sized courses. At the same time, the total effort became less +as we scaled up, which we'll talk about later.</p> +<p>Of course, you can't move medium in-person courses to large online +courses without adjusting how you teach. However, once we did adjust, +we were quite happy. We want to take some time in these posts to +informally discuss what we did, sort of as a guide to the other +information which can be found in <a href="https://coderefinery.github.io/manuals/">our +manuals</a>.</p> +<p>The strategies we have developed have revolutionized the way we teach. +We no longer have limited attendance because of room sizes, mandatory +registration, or instructor monologues. We don't want to &quot;return to +normal&quot;, and we think that others should start learning of our +developments as well.</p> +<p>But we realize that not everyone can go all the way that we have gone. +It takes a lot of effort to put on a livestream course with tens of +staff (but still many of our strategies can be adapted by others). +Medium-sized courses are still great for medium-sized communities and +provide a good way for a few people to reach an audience - especially +if it is local. We hope to explore the ways that what we have learned +can be adapted to this kind of teaching, too. And of course, we will +continue supporting medium sized courses where someone wants them, +especially as a &quot;reverse hybrid&quot; with remote instructors but in-person +exercises.</p> +<p>Future blog posts in this series could include the following (this +list will be updated and future blog posts will be linked below, this +is the &quot;start page&quot; of the series):</p> +<ul> +<li><a href="https://coderefinery.org/blog/2022/10/24/parallel-chat/">Random access chat (&quot;HackMD&quot;) and interaction in large courses</a></li> +<li><a href="https://coderefinery.org/blog/2022/10/31/co-teaching/">Co-teaching</a></li> +<li>[Teams](@/blog/2022-11-28-teams.md</li> +<li><a href="https://coderefinery.org/blog/2022/11/07/reverse-hybrid/">Hybrid courses vs reverse-hybrid courses</a></li> +<li>Open source courses</li> +<li>Registration and learner management</li> +<li><a href="https://coderefinery.org/blog/2022/11/14/livestreaming-courses/">Livestream courses</a></li> +<li>Collaboration in organizing</li> +<li><a href="https://coderefinery.org/blog/2022/11/21/video-publishing/">Publishing videos supports more learning styles</a></li> +<li>Working together as a team</li> +<li>Modular and reusable courses</li> +<li>Comparison to MOOCs</li> +<li>Effort needed for organizing big courses</li> +<li>Measuring impact in livestream courses</li> +<li>(lessons for academic teaching?)</li> +</ul> +<h2 id="see-also">See also</h2> +<ul> +<li><a href="https://coderefinery.github.io/manuals/">CodeRefinery manuals</a></li> +<li><a href="https://coderefinery.github.io/community-teaching/">CodeRefinery community teaching +training</a></li> +</ul> + + + + + Outcomes from online hackathon about measuring the impact of CodeRefinery workshops + 2022-05-18T00:00:00+00:00 + 2022-05-18T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/05/18/measuring-impact/ + + <h2 id="introduction">Introduction</h2> +<p>The main focus of our project is to train and collaborate on training and to +connect training activities across different countries. But we also need to +report about our training activities and we need to apply for funding from +time to time. We also want to know whether we meet the needs of the community +and for this we need a mechanism to measure and evaluate the impact of our +workshops on software programming practices.</p> +<p>We have implemented a number of ideas to measure feedback and impact. In this +discussion session we re-examine these solutions and discuss how we can make +these more reusable for other projects. In short:</p> +<ul> +<li>When we operate online and hybrid, we are accessible to many more styles of +attendance (and different measurements, such as live-stream viewers).</li> +<li>We have an excellent <a href="https://coderefinery.org/about/statistics/">report as part of +coderefinery.org</a>, this will be +split to a separate repository that is usable separately.</li> +<li>Tune our daily feedback questions and provide more time and motivation for +this (see below).</li> +<li>Our quantitative measures include number of registrations, number of known +attendees (in person/online), and number of unknown attendees (live-stream +viewers).</li> +<li>Our qualitative measures include text-based feedback per day and also a +post-workshop survey.</li> +</ul> +<h2 id="how-did-we-measure-attendance-and-impact-up-to-now">How did we measure attendance and impact up to now?</h2> +<p>When our workshops were smaller and in-person, we kept track of +presence/attendance and the feedback were sticky notes but over time as we +moved online and grew, measuring attendance became more difficult and the +numbers presented <a href="https://coderefinery.org/about/statistics/">here</a> today +represent the number of registrants and the real number of participants is +probably lower.</p> +<p>In addition, we have collected <a href="https://github.com/coderefinery/pre-workshop-survey">pre-workshop +survey</a> data which was +part of the registration process and <a href="https://github.com/coderefinery/post-workshop-survey">post-workshop +survey</a> data which we +collect 3-6 months after a workshop (we have not been very consistent with the +exact intervals).</p> +<p>We have originally introduced the pre-workshop survey to have a feedback +mechanism for our workshop material but over the years the feedback collected +during a workshop turned out to be the more useful and a more direct feedback +loop (HackMD feedback is often turned into GitHub issues which later turn to lesson +changes). The pre-workshop survey generated <a href="https://github.com/coderefinery/pre-workshop-survey">interesting +data</a> but it wasn't +really driving lesson changes.</p> +<p>Motivation to introduce the post-workshop survey was to ask whether anything +has changed for the participants after a workshop in the workflows and +tooling.</p> +<p>Looking back at our data and how our funders and stakeholders have used it, it +seems that questions about career stage, academic discipline, and +participation numbers per country were the most requested results.</p> +<h2 id="discussion">Discussion</h2> +<p>The main points of our discussion were:</p> +<ul> +<li>The number of participants per country is still an important thing to +measure, even if it may not be 100% accurate. +<ul> +<li>We can get that from registrations and Twitch data.</li> +<li>Breakout rooms could be a natural way to measure attendance but with team +and group registration and exercise room delegation this becomes less +directly measurable.</li> +</ul> +</li> +<li>How can we measure less but have more meaningful results while not adding too much +work? +<ul> +<li>We should not try to achieve perfection. Some data / details cannot be +collected.</li> +<li>We get some feedback via email also.</li> +<li>We could interview individual participants or groups for feedback / +impressions on the workshop +<ul> +<li>That would give more profound insights on how did the students feel.</li> +<li>We could ask for volunteers at the beginning of the workshop.</li> +<li>Conduct the interview at the end, and turn it into a blog.</li> +</ul> +</li> +</ul> +</li> +<li>We should not forget people take workshops for different reasons +<ul> +<li>Do some participants re-take a workshop for more in-depth knowledge? If so, are they attending partially?</li> +<li>And let's not forget passive learners, who might have it running in the background to see what is going on but not be active.</li> +</ul> +</li> +<li>Do we track how did people learn about the workshop? +<ul> +<li>Currently in the pre-workshop survey, but we should do it in the +registration.</li> +</ul> +</li> +<li>How to get feedback that helps us improve? +<ul> +<li>We could ask: why did you decide to stop following the stream?</li> +<li>We do ask: what did you find useful or not so useful?</li> +</ul> +</li> +<li>The HackMD feedback is one of the most important ways for us to improve the +lessons, as opposed to the pre-workshop survey. +<ul> +<li>The results need to be interpreted and compiled manually.</li> +</ul> +</li> +<li>Yet, we ask for the HackMD feedback in the last 5 min of the days, right as +people are leaving. +<ul> +<li>Consider improvements, such as asking before, or during, the last lesson.</li> +<li>Provide sufficient time for this, discuss the feedback as it comes in to +motivate it.</li> +</ul> +</li> +<li>During workshops, we should talk more about us and the workshops, and let +people know the importance of surveys and feedback. We should motivate how +this &quot;pays us back&quot;.</li> +<li>Our current (early 2022 and earlier) post-workshop survey questions are +found at: +https://github.com/coderefinery/post-workshop-survey#survey-questions</li> +<li>NeIC perspective: +<ul> +<li>Ask project partners / stakeholders how do they benefit from CodeRefinery +training and how we can improve this</li> +</ul> +</li> +<li>How can we improve response rate? +<ul> +<li>Even shorter and clearer questionnaire</li> +<li>Good timing for when the survey is sent to participants, it seems that +Monday is the best day to send them out</li> +</ul> +</li> +<li>How can we learn why somebody stopped? +<ul> +<li>Easier for the contact person of group registrations to know why some of +the participants did not show up, e.g. if there are local parallel events +happening at the same time</li> +<li>Include a question in the registration form: would you like to withdraw +your registration? If yes, please tell us why (but we need to check +whether this can be implemented in our current solution)</li> +<li>Post-workshop survey: section for those who attended and section for those +who dropped out (the accompanying email needs to be carefully worded to +motivate participation and to not sound accusative about dropping out)</li> +<li>The feedback of a person who showed up but later dropped out is probably +more interesting/relevant than the one of a person who did not show up at +all</li> +<li>Our main focus should be to make and keep it interesting for those who +show up and on the material and we should not spend too much focus on +no-shows</li> +</ul> +</li> +</ul> +<h2 id="what-will-we-change">What will we change?</h2> +<h3 id="registration-in-addition-to-a-previous-discussion">Registration <a href="https://coderefinery.org/blog/2022/05/04/improving-workshop-registration/">(in addition to a previous discussion)</a></h3> +<ul> +<li>We do ask: country and academic discipline +<ul> +<li>Also should allow multiple selections to mark interdisciplinary work</li> +</ul> +</li> +<li>Here we could also ask: career stage and how did you you learn about +workshop?</li> +<li>For group registrations it might get a bit tricky: +<ul> +<li>Contact person could list the academic disciplines and the career stages +of the participants (but we are unsure whether we can do that in Indico)</li> +<li>Make it possible and encourage the contact person to update the +registration form, e.g. at the end of the workshop</li> +</ul> +</li> +</ul> +<h3 id="pre-workshop-survey"><a href="https://github.com/coderefinery/pre-workshop-survey">Pre-workshop survey</a></h3> +<ul> +<li>Integrate selected questions from the pre-workshop survey into the registration</li> +<li>In hindsight the pre-workshop data has not been used to change workshop lessons +<ul> +<li>Live-feedback (turned into issues turned into lesson/program changes) has +been the main feedback loop</li> +<li>Some of the questions can be turned into icebreaker question</li> +</ul> +</li> +</ul> +<h3 id="statistics-page"><a href="https://coderefinery.org/about/statistics/">Statistics page</a></h3> +<ul> +<li>Registration numbers +<ul> +<li>Convert from JSON to YAML (less error prone)</li> +<li>Make a separate repository</li> +</ul> +</li> +<li>Number of stream viewers +<ul> +<li>Combine registration numbers with streaming numbers on https://coderefinery.org/about/statistics/</li> +<li>Present views per country (it seems this is non-downloadable)</li> +<li>Present views over time (Twitch provides this data per 10-minute interval)</li> +</ul> +</li> +</ul> +<h3 id="live-feedback-hackmd">Live-feedback (HackMD)</h3> +<ul> +<li>Integrate feedback into the lesson itself, e.g. the last 10 min of the +workshop are dedicate to filling it in</li> +</ul> +<h3 id="post-workshop-survey"><a href="https://github.com/coderefinery/post-workshop-survey">Post-workshop survey</a></h3> +<ul> +<li>What to ask straight after the workshop and what to ask later? Separate +survey?</li> +<li>Could be integrated to the pre-workshop survey because it can be updated</li> +<li>Update questions: +<ul> +<li>we could add the question: what would you like to learn more?</li> +<li>Maybe condense a bit (less text and repetition)</li> +<li>Remove suggestive questions if any</li> +<li>add academic field</li> +</ul> +</li> +<li>What data to request from groups / partners? +<ul> +<li>Number of participants</li> +<li>How did they like the event</li> +</ul> +</li> +</ul> + + + + + Our plans to improve our workshop registration process + 2022-05-04T00:00:00+00:00 + 2022-05-04T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2022/05/04/improving-workshop-registration/ + + <p>As we entered the sustainability phase of the CodeRefinery project, the number +of participants attending our workshops continues to increase. The March 2022 +online workshop on best practices for scientific software development has +reached <a href="https://coderefinery.org/workshops/past/">297 registrants</a> which is a +record for us.</p> +<p>Interactive lessons and team exercise work where teams of colleagues can +register as a team and go through exercises as a team are among the essential +ingredients of our workshops. However, we also wish to accommodate also solo +learners and exercise leads in our workshops and give them the possibility to +exercise with other solo learners. The challenge for us is to manage a dynamic +registration process and exercise group formation without excessive effort.</p> +<p>To collect ideas on how to simplify this in future, the CodeRefinery staff and +some community members have brainstormed in an online hackathon on improving +the workshop registration, held on May 3, 2022.</p> +<p>Below we summarize our observations and strategies for the upcoming events.</p> +<h3 id="goals-of-a-good-registration">Goals of a good registration</h3> +<ul> +<li> +<p>Avoid chaos during the workshop</p> +<ul> +<li>Avoid misunderstandings about registration types</li> +<li>Teams are clear and require minimum effort from organizers</li> +</ul> +</li> +<li> +<p>Be able to predict attendance, avoid major disappointments</p> +</li> +<li> +<p>Reusable by different partners who have different approved survey platforms (not tied to one system, though it's OK if the questions have to be re-entered)</p> +<ul> +<li>E.g. not being bound only to Indico or something else that needs to be installed</li> +</ul> +</li> +<li> +<p>Collect good information on participants for reporting later</p> +</li> +<li> +<p>Registration does not <em>have</em> to ever close</p> +<ul> +<li>Continued registrations allow people to join halfway through</li> +<li>What needs does this have?</li> +</ul> +</li> +<li> +<p>Editable by organizers (without making a copy by exporting)</p> +<ul> +<li>e.g. exporting Indico to spreadsheet makes a copy, if people modify their registration our copy is invalid</li> +<li>Google Docs allows a form to be directly connected to a spreadsheet, we can modify old registrations while new ones come in</li> +</ul> +</li> +</ul> +<h3 id="lessons-learned-from-a-recent-event">Lessons learned from a recent event</h3> +<ul> +<li>Unclear what registration options mean, people sign up for Zoom and don't show up</li> +<li>We have to manage teams ourselves, which requires too much communication and +manual work. Teams should be able to do this themselves.</li> +<li>Scheduling teams is hard, must optimize for this and avoid all ambiguity</li> +<li>Registration coordinator shouldn't teach (much, certainly not early on)</li> +<li>Communication and registration is the same person or same two persons</li> +<li>Communication/registration and teaching coordination should not be the same person</li> +<li>Indico is a good tool but we need to remove old copy-pasted questions/options and streamline</li> +<li>Allow teams to register with one contact point only</li> +<li>Merging teams is hard in indico</li> +<li>Adjusting teams is hard in indico</li> +<li>Communication/registration/coordination is a full time job for two weeks prior to the workshop</li> +<li>Question about availability is too often misunderstood: ask differently</li> +<li>Optimize for fewer emails since these are difficult to delegate</li> +<li>For exercise leads it is confusing whether to choose staff registration or regular registration</li> +<li>It is good to leave registration open. People ask on twitch &quot;can I have the +Q&amp;A&quot; and then I can say &quot;not right not but if you register you will get it in +an email tonight so you have it tomorrow&quot;</li> +<li>Regarding breakout rooms in Zoom and the problems with too small rooms, +missing ELs, and the organisational challenges: it's worth trying something +different next time, like having only one-person registrations but having +numbered rooms in zoom that participants self-organise into</li> +<li>Team registrations seem to have worked though and they seem to have the only +groups that &quot;survived&quot; to the end.</li> +<li>Local organizers could choose to use a centrally organized zoom if they +wanted - as long as they managed the teams themselves</li> +</ul> +<h3 id="suggestions-for-improving-our-previous-registration-form">Suggestions for improving our previous registration form</h3> +<ul> +<li>&quot;affiliation or university&quot;: have a list of institutions + &quot;other&quot; * free +text for other institutions or companies not listed</li> +<li>can we decentralize registration to groups and partners? +<ul> +<li>groups/partners scale as far as they like to as many helpers as they have</li> +</ul> +</li> +<li>questions on form +<ul> +<li>&quot;do you want to participate in Stockholm? click here&quot; -&gt; another form</li> +<li>&quot;in Aalto&quot; -&gt; another form</li> +<li>none of the above -&gt; central form +<ul> +<li>group registration (exercise lead? or anybody as proxy?)</li> +<li>register as exercise lead and want to help out a &quot;random&quot; group</li> +<li>want to be part of a group -&gt; click here but we can't guarantee a helper, especially if you register late</li> +<li>want to only watch alone</li> +</ul> +</li> +<li>also offer options to get informed for those unsure/undecided +<ul> +<li>yes</li> +<li>&quot;interested&quot; </li> +</ul> +</li> +</ul> +</li> +<li>standardized reporting form for partners</li> +</ul> +<h3 id="how-to-manage-teams">How to manage teams?</h3> +<ul> +<li>Teams could handle some issues/setup themselves</li> +<li>They need some templates to send information</li> +<li>Which information should be sent by CR and which by the local organizers?</li> +<li>Need to get statistics and feedback from the local groups</li> +<li>Need to clarify if there will be &quot;general&quot; helpers in addition to team helpers</li> +<li>Larger project partners will probably prefer offering in-person exercise groups</li> +<li>How to deal with registration in the wrong form if we have several forms?</li> +<li>Each partner needs to clearly commit to a certain level of support and size</li> +<li>How to self-organize teams: +<ul> +<li>&quot;helpers, rename yourself and join a room that does not have helpers yet&quot;</li> +<li>&quot;learners, if you are in a room that is too empty or too full, join another one&quot; </li> +<li>this is to avoid rooms that are too full or too empty, or without helpers, or avoiding communicating which days an EL is unavailable</li> +<li>what if one exercise lead or room is more popular than another room?</li> +<li>how about continuity between days?</li> +</ul> +</li> +<li>What to do with solo registrations who are not part of a group and want to be +in an exercise group? +<ul> +<li>Is pairing up happening locally or centrally?</li> +</ul> +</li> +</ul> +<h3 id="comments-on-a-mock-up-registration-form">Comments on a mock-up registration form</h3> +<p>We have together reviewed an <a href="https://forms.gle/xNSmW7DJ43jV7NhD9">example +form</a> and collected comments:</p> +<ul> +<li>Problems: &quot;team organized by us&quot; is not separated from &quot;self-organized team&quot;</li> +<li>The &quot;probably not but send info&quot; does not need to be asked for each day separately</li> +<li>But it's nice to offer the possibility to stay informed and decide later</li> +<li>Nice to have one form both for staff and everyone else to avoid the confusion that we saw at the previous event</li> +<li>&quot;observer&quot;: let them decide whether they want emails or not</li> +<li>&quot;how do you plan on attending&quot; +<ul> +<li>Option 1: +<ul> +<li>Maybe confusing if somebody selects both zoom and in person</li> +<li>In-person breakout delegated to the local organization</li> +</ul> +</li> +<li>Option 2:</li> +</ul> +</li> +<li>Local rooms +<ul> +<li>Ask this earlier </li> +</ul> +</li> +<li>Teams +<ul> +<li>Ask this question earlier </li> +</ul> +</li> +<li>It is important that registrants can change their choices</li> +<li>In general, Radio buttons are nicer than dropdowns because you get to see the answers right away +<ul> +<li>But dropdown takes less screen space</li> +</ul> +</li> +</ul> +<h3 id="what-if-we-get-asked-for-help-with-creating-a-registration-page-for-a-local-partner">What if we get asked for help with creating a registration page for a local partner?</h3> +<ul> +<li>We need to communicate who we share data with and ask for consent</li> +<li>We document what we ask and what we recommend partners to ask</li> +<li>We document which privacy policy we follow and which privacy standards +we require</li> +<li>We could offer a form/event if some local organizers need a separate +form but do not want to set it up themselves</li> +</ul> +<h3 id="starting-point-for-the-new-registration-form">Starting point for the new registration form</h3> +<ul> +<li>OS +<ul> +<li>Dropdown</li> +</ul> +</li> +<li>Discipline +<ul> +<li>Dropdown</li> +</ul> +</li> +<li>Name +<ul> +<li>Open</li> +</ul> +</li> +<li>Email +<ul> +<li>Open</li> +</ul> +</li> +<li>Affiliation +<ul> +<li>Open</li> +<li>Has not been used for reporting yet but the information is good to +have </li> +</ul> +</li> +<li>Country +<ul> +<li>Dropdown</li> +</ul> +</li> +<li>Team name +<ul> +<li>Open</li> +</ul> +</li> +<li>Permission to give contact details to breakout room organizer +<ul> +<li>Yes/no dropdown</li> +</ul> +</li> +<li>Other notes to organizers +<ul> +<li>Open</li> +</ul> +</li> +<li>Room +<ul> +<li>Open</li> +</ul> +</li> +<li>Which days attending +<ul> +<li>Radio buttons</li> +</ul> +</li> +<li>Type of attendee +<ul> +<li>Radio buttons</li> +</ul> +</li> +<li>Do you want to attend in Zoom or follow live-stream only? +<ul> +<li>Dropdown/Radio buttons</li> +</ul> +</li> +</ul> +<h3 id="conclusions">Conclusions</h3> +<ul> +<li>Central registration is in Indico</li> +<li>We can offer a copy of our Indico template for a separate event for local partners who cannot use a local +registration system</li> +<li>Local partners are welcome to use their own registration systems</li> +<li>Teams can register as a team with a single contact point and the contact point does not have to be an exercise lead</li> +<li>We offer the possibility for individual learners and individual exercise leads to self-join exercise rooms</li> +<li>Workshop limits: +<ul> +<li>in terms of Twitch: it seems one bottleneck could be the collaborative HackMD document</li> +<li>in terms of exercise groups: the number of volunteers but also groups without exercise leads can be useful</li> +</ul> +</li> +</ul> +<h3 id="follow-up-steps">Follow-up steps</h3> +<ul> +<li>Share a mock-up form soon with stakeholders for feedback via email and during a team meeting</li> +<li>Explain the setup clearly and concisely, directly in the <a href="https://github.com/coderefinery/template-workshop-webpage">workshop template</a></li> +</ul> + + + + + Lessons learned from the May 2021 online workshop + 2021-11-25T00:00:00+00:00 + 2021-11-25T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2021/11/25/lessons-learned-may-2021/ + + <p>May 10-12 and 18-20, 2021, we gave our at that time largest <a href="https://coderefinery.github.io/2021-05-10-workshop/">CodeRefinery +online workshop</a> (6 x 3.5 hours) with 128 participants. +We plan to deliver many more such workshops based on our <a href="https://coderefinery.org/lessons/">lessons</a>.</p> +<p>Here we wish to share with the community our lessons learned: What worked well +and what we need and plan to improve. We use bullet point format for brevity.</p> +<p>This complements our lessons learned from <a href="https://coderefinery.org/blog/2020/04/14/first-online-workshop/">our first online workshop</a>.</p> +<h3 id="lesson-coordination">Lesson coordination</h3> +<ul> +<li>The person teaching should not be doing the intro as well, as they may still need to set stuff up and it is better to focus on the lesson only.</li> +<li>The teaching coordinator should check in for basic practicalities with each instructor: +<ul> +<li>team-teaching if desired</li> +<li>material to cover</li> +<li>schedule breaks</li> +<li>test screenshare prior to the lesson</li> +<li>how to control breakouts yourself</li> +</ul> +</li> +<li>Be clear about video on or off for instructors. If multiple people on then gallery OBS capture doesn't work.</li> +<li>Include role mentoring as part of the coordination initial meeting.</li> +<li>More talk about &quot;voice of audience&quot;.</li> +<li>Prepare schedule summary for next day to be sent to everyone, together with instructors of following day, after workshop day: lessons to be covered and break/exercise room timing.</li> +<li>Inform individual exercise leads about how the set group of individual learners is like (e.g. expecting how many in the room, OS, background).</li> +<li>Inform exercise leads and all the team members who are replacing when a regular exercise leader is absent.</li> +<li>Clearer role distribution, spreading the work among many is a great idea but it things should be clearly (or as clearly as possible split) also for roles during workshop, one or few people should have 'power' to decide things and clearly communicate: instead of &quot;could somebody do X?&quot; we have a person in charge of X.</li> +</ul> +<h3 id="zoom-and-obs">Zoom and OBS</h3> +<ul> +<li>Ask participants to join with video OFF when they join after the workshop started (otherwise they may appear in the stream).</li> +<li>Huge amount of work that many people did making the instructions, and testing them on all the different OSs, surely helped.</li> +<li>For some people the screenshare froze after break/ when screenshare switched between instructors, for browser reloading solved it, for client people had to rejoin chat.</li> +<li>Gallery insert view is risky.</li> +<li>You can't spotlight someone when only two peoples' videos are on.</li> +<li>We can basically record the cutpoints and TOC while I am watching it, then there is very little effort to process afterwards. This probably requires one almost-dedicated person, but is worth it.</li> +<li>It takes manual work to switch from one to two people (changing cropping), and also two to three (alignment).</li> +<li>Gallery view for a lesson worked OK, but you must always expect people to join and appear. Stress level is high and we need to be vigilant to not let a problem go unnoticed.</li> +<li>We can switch from single-person to gallery live without too much trouble. +If spotlighting requires at least two videos but no &quot;real&quot; video is available or wouldn't make sense, one workaround might be to have someone show a &quot;video&quot; (zoom background + webcam cover on) so that it only shows the background) of CR logo or schedule or whatever feels relevant.</li> +<li>If spotlighting requires at least two videos but no &quot;real&quot; video is available or wouldn't make sense, one workaround might be to have someone show a &quot;video&quot; (zoom background + webcam cover on) so that it only shows the background) of CR logo or schedule or whatever feels relevant.</li> +<li>When capturing windows with OBS, set to &quot;don't capture mouse cursor&quot; and then you can hover over and pin/unpin video and the cursor and pop-up menu don't appear in the capture.</li> +<li>It is good when the presenters clearly say when things start and end, as in &quot;And now we are done with the intro, and will go to our first lesson, Jupyter&quot;. It makes cutting a bit easier and also helps learners to re-orient.</li> +<li>The zoom default &quot;focus on the current speaker&quot; view was quite good for co-teaching, it was slightly less fragile than full gallery view but still swapped between the two people (but someone speaking with video off would have their name or profile picture displayed).</li> +<li>By using the OBS websocket remote control, one can see the current recording time, and use that to generate the video editlist live without being the one running OBS.</li> +<li>OBS helper: would be nice to have a way to unmute both of us.</li> +</ul> +<h3 id="collaborative-notes">Collaborative notes</h3> +<ul> +<li>Don't try to insert html into HackMD :sweat_smile:</li> +<li>HackMD at this size seems to have worked, not all the time for everybody, but sufficiently.</li> +<li>Using one HackMD for twitch and zoom was a good idea.</li> +<li>Provide plan for the day (including breaks and exercise plan) on top of HackMD and mention it at the beginning of the day.</li> +<li>When talking about HackMD, please share it, it gives people something to +look at.</li> +<li>Add HackMD link to the workshop page and use the workshop page as main entry point so that participants don't have to hunt for links in email inboxes.</li> +</ul> +<h3 id="installation-and-tools">Installation and tools</h3> +<ul> +<li> +<p>Having one conda environment with everything seems to have been a success. We have seen a lot less installation friction and trouble compared to earlier workshops.</p> +</li> +<li> +<p>Very useful feedback we got via email (paraphrasing with own words, also support this): Let us reconsider the choice of editors. We use &quot;plain&quot; nano but many of us use something else, use syntax highlighting, possibly Git integration. By leveling everybody to plain nano we risk giving the impression that this is how development is always done or should be done (no offense to those developing using plain nano in their work)</p> +<blockquote> +<p>[Quote:] One of my personal tips which we discussed a little in the breakout rooms was the use of a modern editor with syntax highlighting, ssh-to-remote, and git integration. We are actually doing a little post-workshop about this subject in my team this week. I totally understand that you do not wish to enforce a choice of editor for the participants during the workshop, but I think that some of the learners that are beginners to for instance version control, will think that plain Nano without any extras is how a lot of people work. Which I think is wrong, but again this is only my impression. I'm thinking about a modern editor as a tool you use to force yourself to make the right choices as a default, for instance, awareness of snake vs. camel naming convention. I also realize that this is a subject that might not fit under the &quot;beginner&quot; label for software. Maybe it would make sense to host a &quot;Research Software Hour&quot; with this as a topic?</p> +</blockquote> +</li> +</ul> +<h3 id="presenting-and-coordinating">Presenting and coordinating</h3> +<ul> +<li>Coordination plan should be continuously reviewed.</li> +<li>Strong director role is needed.</li> +<li>Give clear message at the end of the day: Now the workshop day is concluded, stream and recording stopped. So that people that came for workshop content can leave, then have some official start of 'afterparty'. It was not fully clear when the outro was finished.</li> +<li>Make it clear what someone needs to have open: Screenshare, HackMD, your terminal. You get links to the episodes from HackMD.</li> +<li>Avoid breaks between exercise explanation and doing exercise.</li> +<li>Clearly mark interruptions/speaking up during presentations as interruption (as in: not part of the presentation).</li> +<li>Spotlight video changes every time screenshare changes: It is defininitely still important to warn before stopping screen sharing (more than before)</li> +<li>Announcing &quot;I'm about to take the screenshare&quot; and waiting two seconds works +well.</li> +<li>Share screen for what you are talking about. Makes editing a bit easier.</li> +<li>When presenting, highlight or otherwise indicate on screen (not just temporarily) what you are talking about. It makes it much faster to scan through to make a good table of contents. Related: always show what is currently going on, like break times or pauses between exercises.</li> +</ul> +<h3 id="lesson-content">Lesson content</h3> +<ul> +<li>Staging area: as usual, a difficult episode +<ul> +<li>What parts of the episode is a dependency for other parts of CodeRefinery?</li> +<li>Remove it?</li> +<li>Make it clear it is advanced/optional/you won't get it yet, when it is taught?</li> +<li>Move it to the end?</li> +</ul> +</li> +</ul> +<h3 id="communication-with-participants">Communication with participants</h3> +<ul> +<li>Indico: select &quot;none&quot; after selecting some registrants to for example sending emails (otherwise selection remain).</li> +<li>Confirmation of acceptance to the workshop should be done sooner. It may be too late if they get confirmed one week before the event and suddenly need to free up 6 half days.</li> +<li>As for the &quot;team registrations&quot;, as long they include an EL, we should send an acceptance ASAP.</li> +<li>Regarding individual learners and ELs: +1) opening sign-up as individual ELs and to set its soft-deadline much earlier than for individual learners, +2) for individual learners, opening registration first as stream viewers only with an option of 'want to join in interactive exercise sessions' yes/no, +3) after the soft-deadline of individual ELs, to those who said 'yes', sending invitations to sign-up for zoom participation in another reg. form, and +4) accept the capacity of #individual ELs x 5 and otherwise put them in waitlist. +However, I actually want to suggest a quite wild idea rather than struggling with the dilemma of no-shows and withdrawal with very very short notice while not being able to accept all sign ups. Instead of coordinating for acceptance and grouping on backside, how about encouraging open&amp;public self-organization of groups? somewhere everyone can access, 'sign up' by writing their name, as a learner or EL, potentially also country, affiliation, background so that it might happen that they will self-organize a team. Once they can make a group of 6-7 people with at least one who can be acting as an EL, then their participation is sort of 'confirmed'. This is different from team registration as this is primarily for those who want to join but cannot make a group will find others to make a group to join in the workshop. +Another thing is that the threshold of ELs could be even lower than some people may think. And I would say being an EL is probably better way to learn about the CodeRefinery lesson materials than joining as an learner. Especially if some people have already made their own team, one of them should be able to act as an EL, or they can even circulate the role among eath other. +And what I learned from the R+Tidyverse workshop until yesterday is that if a learner cannot turn on camera or mic (for any reason), it is almost no worth to join in a breakout room session, as HackMD Q&amp;A will more or less perfectly solve the problem in that case.</li> +</ul> + + + + + Towards citable lessons + 2021-11-21T00:00:00+00:00 + 2021-11-21T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2021/11/21/towards-citable-lessons/ + + <p>In Autumn 2021 we have started to work on making our lessons and other material +we have created over the years, citable. At the same time we wish to assign a +digital object identifier (DOI) to each lesson so that the material becomes +persistent and remains findable. However, the main motivation for this work is +to get some metrics about the use of our material and also to give contributors +better credit and to make it possible for them to get and display metrics about +their contributions.</p> +<p>This effort is work in progress and in this document we will summarize our +discussions, decisions, findings, and observations so that we can then use +these later when we conclude this effort lesson by lesson.</p> +<h3 id="technical-choices">Technical choices</h3> +<ul> +<li>We will use Zenodo because it is a well-established service which we know and +which integrates nicely with the repositories hosting the lessons and because +we will need to be able to update metadata (author information) without +changing the DOI record.</li> +<li>We will convert the 3 remaining Jekyll lessons to Sphinx to simplify pdf export.</li> +<li>We will not start with <a href="https://allcontributors.org/">https://allcontributors.org/</a> because it requires each contributor +to have a GitHub account which we have found a too strict limitation.</li> +<li>We start with tracking authorship in CITATION.cff since GitHub presents a +&quot;cite as&quot; button when this file is present.</li> +<li>If we find that CITATION.cff is not enough or does not provide the right +categories, we will try to track this in the .zenodo.json which Zenodo +understands and we could generate CITATION.cff from this file. It seems that +if a .zenodo.json is present in a repo, it has on Zenodo precedence over a +CITATION.cff.</li> +</ul> +<h3 id="distinguishing-authors-and-contributors">Distinguishing authors and contributors</h3> +<ul> +<li>Removed &quot;code&quot; (lesson material) does not mean removing authorship unless the author prefers to be removed.</li> +<li>Example for how Carpentries do it (unix shell lesson): +<ul> +<li><a href="https://github.com/swcarpentry/shell-novice/blob/gh-pages/CITATION">https://github.com/swcarpentry/shell-novice/blob/gh-pages/CITATION</a></li> +<li><a href="http://doi.org/10.5281/zenodo.3266823">http://doi.org/10.5281/zenodo.3266823</a></li> +</ul> +</li> +<li>Definitions of the roles: +<ul> +<li>&quot;creator&quot;: significant contributions</li> +<li>&quot;contributor&quot;/Editor: reviewing/approving contributions</li> +<li>&quot;contributor&quot;/Other: smaller contributions</li> +</ul> +</li> +<li>On Zenodo we start with &quot;creator&quot; (author) and &quot;contributor&quot; (other). +<ul> +<li>See also categories that Zenodo understands: <a href="https://developers.zenodo.org/#representation">https://developers.zenodo.org/#representation</a> (search for &quot;creators&quot; and &quot;contributors&quot;)</li> +<li>We are a bit unsure whether one person can assume more than one role on +Zenodo. probably yes. If so, maybe one occurence for the highest +contribution is best.</li> +</ul> +</li> +<li>We still need to verify whether CITATION.cff and/or .zenodo.json can map to +the definitions of roles (above).</li> +</ul> +<h3 id="how-we-will-reach-out-to-creators-and-contributors">How we will reach out to creators and contributors</h3> +<ul> +<li>We will do this on a per-lesson basis and we will start with the lessons +which we teach the most often.</li> +<li>Contributors are not only people who have contributed with Git commits, but +could also be people that contributed with input and ideas in other form.</li> +<li>We reach out to everybody and ask whether they want to be contributor or author.</li> +<li>If a person cannot be reached, we do not add the person without consent and +rather add the person later once we reach them.</li> +<li>Reaching out to creators and contributors will happen via GitHub issues close +to the lesson repository but those who do not respond or may not be on GitHub +will be reached via email.</li> +<li>On the GitHub issue we will ask authors for their ORCID.</li> +</ul> +<h3 id="archiving-lessons-as-pdf">Archiving lessons as pdf</h3> +<ul> +<li>When archiving lessons on Zenodo we have the choice of archiving the +repository as is (the sources) or to generate a pdf version of the lesson and +archiving the pdf.</li> +<li>We have concluded that we wish to attempt depositing pdf versions unless this +turns out too difficult.</li> +<li>The pdf versions will be generated automatically as part of a &quot;release&quot; workflow.</li> +<li>The automatic pdf generation is relatively straightforward with Sphinx +lessons but less trivial with Jekyll-based lessons.</li> +<li>We will focus on Sphinx lessons and prefer converting Jekyll-based lessons to +Sphinx lessons rather than investing time in generating pdfs from Jekyll lessons.</li> +<li>But we have also concluded that cite-ability is more important than preserving +a pdf version of the lessons since we expect the lessons to evolve and be +continuously improved and the credit aspect is found more important than the +preservation aspect.</li> +</ul> +<h3 id="orcid-vs-zenodo-community">ORCID vs. Zenodo community</h3> +<ul> +<li>We have decided against introducing a project ORCID for CodeRefinery and +rather collect related records in a CodeRefinery Zenodo community.</li> +</ul> +<h3 id="how-we-wish-to-test-the-workflow">How we wish to test the workflow</h3> +<ul> +<li>For one or two example lessons we will create a fork and test the release +deployment and DOI generation on <a href="https://sandbox.zenodo.org">Zenodo sandbox</a>.</li> +</ul> +<h3 id="suggested-workflow-to-make-lessons-citable-via-zenodo">Suggested workflow to make lessons citable via Zenodo</h3> +<ul> +<li>Add a .zenodo.json to the lesson repo, for example:</li> +</ul> +<pre data-lang="json" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-json "><code class="language-json" data-lang="json"><span> </span><span style="color:#d07711;">&quot;creators&quot;</span><span>: [ +</span><span> { +</span><span> </span><span style="color:#d07711;">&quot;orcid&quot;</span><span>: </span><span style="color:#d07711;">&quot;0000-0002-1825-0097&quot;</span><span>, +</span><span> </span><span style="color:#d07711;">&quot;affiliation&quot;</span><span>: </span><span style="color:#d07711;">&quot;Feline research institute&quot;</span><span>, +</span><span> </span><span style="color:#d07711;">&quot;name&quot;</span><span>: </span><span style="color:#d07711;">&quot;Field, Gar&quot; +</span><span> }, +</span><span> { +</span><span> </span><span style="color:#d07711;">&quot;orcid&quot;</span><span>: </span><span style="color:#d07711;">&quot;0000-0002-1825-0097&quot;</span><span>, +</span><span> </span><span style="color:#d07711;">&quot;affiliation&quot;</span><span>: </span><span style="color:#d07711;">&quot;Feline research institute&quot;</span><span>, +</span><span> </span><span style="color:#d07711;">&quot;name&quot;</span><span>: </span><span style="color:#d07711;">&quot;Cat, Felix&quot; +</span><span> } +</span><span> ], +</span></code></pre> +<ul> +<li>Generate pdfs from Sphinx sources via LaTeX: +<ul> +<li>In <code>conf.py</code>, set <code>latex_engine = 'xelatex'</code> (makes emojis work), then <code>make clean ; make latexpdf</code>.</li> +<li>This will become part of GitHub Actions, it will not be a manual step.</li> +</ul> +</li> +<li>Create a release of the lesson on GitHub.</li> +<li>On Zenodo, check syncing with GitHub.</li> +</ul> +<h3 id="resources">Resources</h3> +<ul> +<li>About Zenodo <a href="https://about.zenodo.org/">https://about.zenodo.org/</a></li> +<li>Zenodo terms of use <a href="https://about.zenodo.org/terms/">https://about.zenodo.org/terms/</a></li> +<li>Zenodo policies <a href="https://about.zenodo.org/policies/">https://about.zenodo.org/policies/</a></li> +<li>Zenodo FAQ <a href="https://help.zenodo.org/">https://help.zenodo.org/</a></li> +<li>Zenodo REST API <a href="https://developers.zenodo.org/">https://developers.zenodo.org/</a></li> +<li>Zenodo .zenodo.json and GitHub <a href="https://developers.zenodo.org/#github">https://developers.zenodo.org/#github</a></li> +<li>GitHub-Zenodo tutorial <a href="https://guides.github.com/activities/citable-code/">https://guides.github.com/activities/citable-code/</a></li> +<li>The <a href="https://allcontributors.org/">https://allcontributors.org/</a> specification and GitHub bot</li> +<li>The CITATION.cff format <a href="https://citation-file-format.github.io/">https://citation-file-format.github.io/</a></li> +<li>The CITATION.cff format keywords <a href="https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md">https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md</a></li> +<li>SPDX ID short-form identifiers for FOSS license information <a href="https://spdx.dev/ids/">https://spdx.dev/ids/</a></li> +</ul> + + + + + Lessons learned from phase 2 of the project + 2021-11-20T00:00:00+00:00 + 2021-11-20T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2021/11/20/phase-2-lessons-learned/ + + <p>The motivation for this document was to collect lessons learned from phase 2 of +our project, both for our own future work but also for other future projects +who may find our experiences useful. We have chosen to collect the lessons +learned in bullet-point format and not in prose.</p> +<p>Below we list experiences and also unsolved challenges from workshop +organization, lesson development, meeting minutes and decision tracking, +Carpentries membership, communication, data management, stakeholder- and +community engagement, and infrastructure hosting.</p> +<h3 id="workshop-event-organization">Workshop/event organization</h3> +<h4 id="metrics">Metrics</h4> +<ul> +<li>When we started teaching in 2016, we only worried about the teaching and not +about measuring how many participants from which country and from which +discipline and career stage. However, we were asked to report about metrics +again and again, on short notice. At some point we started reporting this in +detail (<a href="https://coderefinery.org/about/statistics/">https://coderefinery.org/about/statistics/</a>) which really simplified +reporting.</li> +</ul> +<h4 id="survey">Survey</h4> +<ul> +<li>Survey should be designed considering analysis and presentation of results, +as well as and what to focus on (what we want to show off).</li> +<li>When survey platform needs to be migrated to another, consider the structure +of the questions and answers to avoid tedious post-processing. Over the past +few years we have moved between platforms and also kept adapting questions +which made the analysis non-trivial.</li> +<li>How to get a better and precise overview of &quot;actual&quot; participants: +<ul> +<li>Both pre-/post-workshop surveys are opt-in, and they should be. In principle, sign-up form should collect only very necessary information for those to be able to participate in the workshop, and thus it may not be optimal to collect learner-profile type of information via sign-up form (at least not as mandatory fields), except for cases where we need to apply priority criteria or treating participants differently (e.g. team participation, grouping according to background so that they can work on different exercises etc.)</li> +<li>Pre-workshop survey: so far submitted by anyone voluntarily upon sign-up. Not necessarily all the submitters are participating in the workshop, neither all the actual participants submitted the pre-workshop survey. It might be an idea to ask them to submit upon acceptance to increase accuracy to some extent. </li> +<li>Post-workshop survey: +<ul> +<li>It needs a scheduled reminder to the organizer side have consistency in the time between the workshop and the survey timing, as the survey aims to see the long-term effect of the workshop. </li> +<li>There is inevitable risks that the survey invitation cannot reach the email address registered after a half year or such, and of course we cannot expect very high response rate, either. </li> +<li>Another limitation that we need to think of could be that the chances could be higher for those who had positive impression would submit the post-workshop survey than those who had negative impression, which will naturally yield biased results.</li> +</ul> +</li> +</ul> +</li> +</ul> +<h4 id="capacity-and-workshop-format">Capacity and workshop format</h4> +<ul> +<li>How to afford as many as possible learners while keeping good learner experiences +or even improving them.</li> +<li>How we carried out online workshops in 2020-2021: +<ul> +<li>Standard 3-full day CR workshop was transformed into 6-half day format, typically Tuesday-Thursday over 2 consecutive weeks.</li> +<li>Helper/Exercise lead onboarding sessions as well as installation help drop-in sessions were held typically a week before the 1st week.</li> +<li>All the exercises were done in breakout room with a group of regular members. </li> +<li>We recruited exercise leads and accepted 5-6 individual learners per exercise lead plus team registration including their own exercise lead.</li> +<li>We used priority criteria based on countries and/or institution's characteristics.</li> +<li>Problems/challenges we experienced: +<ul> +<li>Withdrawals on short notices and no-shows</li> +<li>Much hassles by the coordinators</li> +<li>Feedback showing both positive and negative experiences with regular members/exercise leads </li> +</ul> +</li> +</ul> +</li> +<li>What is the optimal format of help provision and exercises: +<ul> +<li>Should the group members be fixed or more ad-hoc or even hop-in-and-out? </li> +<li>Is one regular exercise lead always needed per group? One disadvantage of not-having regular exercise lead is that it takes time to call help, explaining situation etc., which eats up exercise time.</li> +<li>&quot;Webinar (stream)-by default&quot; with an option for joining in zoom-meeting room for extra help may work better (ref. <a href="https://scicomp.aalto.fi/training/scip/python-for-scicomp/">Python for SciComp 2021</a>)?</li> +<li>Post-workshop Q&amp;A session time/day would be useful? </li> +<li>We have considered for the future to offer optional exercise walk-through sessions. These could be +interesting not only for learners but recording of these sessions could also help future +exercise leads.</li> +</ul> +</li> +</ul> +<h4 id="communication-with-participants">Communication with participants</h4> +<ul> +<li>Indico's email function worked well to send information about the workshop to participants/signers.</li> +<li>We experienced few cases of typo in email address, thus we could not reach registrants.</li> +<li>Online collaborative notebook (HackMD and similar) worked well for Q&amp;A during the lectures. </li> +</ul> +<h4 id="certificates">Certificates</h4> +<ul> +<li>Should CR issue any certificate at all? Certificates became participation certificates and possibly we should delegate certification to participating organizations.</li> +<li><a href="https://www.tudelft.nl/en/library/research-data-management/r/training-events/training-for-researchers/code-refinery-workshop">&quot;TU Delft PhD candidates can obtain 2 GS credits (Research skills) when attending and actively participating in the workshop (complete assistance)&quot;</a> - It may be better that each institute would have one responsible for approval of students' (or similar) active participation in any of the CR workshops as part of the study etc rather than CR takes responsibility on their participation by checking their records in Zoom etc. </li> +<li>(Relevant to <a href="https://coderefinery.org/blog/2021/11/20/phase-2-lessons-learned/#Legal-questions">Legal questions</a>) Issuing certificates may have some problems with data management including personal information.</li> +</ul> +<h4 id="planning">Planning</h4> +<ul> +<li>Long term scheduling with fixed twice-per-year schedule is probably better than juggling many calendars and trying to find a time slot 1 month in advance.</li> +<li>Planning relevant workshops/events before and after the CR big workshops will be also helpful. They include for example Software Carpentry, Python for SciComp, Hackathon, etc.</li> +</ul> +<h3 id="lesson-development">Lesson development</h3> +<ul> +<li>Only happened before workshops. This was very efficient but introduced stress.</li> +<li>It probably requires a calendar event to dedicate time for this.</li> +<li>&quot;software installation and setup&quot; +<ul> +<li>This is not lesson itself, but this also needs to be updated along the lesson development and improvement as well as along the changes implemented in different software programs, packages and platforms to use (e.g. GitHub).</li> +<li>The procedures need validations given diverse scenarios.</li> +<li>Introduction of step-wise procedures with prepared Conda environment worked well, we had considerably fewer visits to installation-help sessions (no statistics, though, it is staff's impression).</li> +</ul> +</li> +<li>Compared to the cases where one sends PR with all the team members assigned as reviewers, lesson improvement works better when done in a pair; one takes revision work, while the other does a thorough review. Often assigning all the team members as reviewers make the responsibility unclear and ends up with the PM (or in a better case, a few regularly active members) reviews and merges.</li> +<li>It is important to make the contribution criteria clear for making lesson citable: +<ul> +<li>“creator”(author): significant contributions</li> +<li>“contributor”/Editor: reviewing/approving contributions</li> +<li>“contributor”/Other: smaller contributions</li> +</ul> +</li> +<li>Ref: https://hackmd.io/@coderefinery/citable-lessons</li> +<li>In view of marketing as well as convincing funders, it would be worth collecting information about where the lesson materials are used. It will be an idea to have a form to submit where it can ask the following questions: +<ul> +<li>Institution/Organization etc.</li> +<li>Type of event and link to the event page: +<ul> +<li>Workshop</li> +<li>Credited course</li> +<li>Non-credited course</li> +<li>Other type (specify) </li> +</ul> +</li> +<li>Which lessons were used +<ul> +<li>Only CR lessons (which ones)</li> +<li>CR lessons (which ones) as well as other lesson materials (what materials?)</li> +<li>part of CR lessons (where of it)</li> +</ul> +</li> +</ul> +</li> +</ul> +<h3 id="the-carpentries">The Carpentries</h3> +<h4 id="membership-and-use-of-its-benefits">Membership and use of its benefits</h4> +<ul> +<li>Membership tier: Platinum, 3 years (2018 Nov. 1 - 2021 Nov. 1)</li> +<li>After discount for providing the regional coordinator (RC) position (2019 Nov. 1 - 2021 Nov. 1), we paid 5,000 USD annually for the last two years.</li> +<li>Use of instructor seats and Centrally-Organized Workshops (COW): </li> +</ul> +<table><thead><tr><th>year</th><th>used seats</th><th>badged instructors</th><th>COW</th></tr></thead><tbody> +<tr><td>2018-2019</td><td>13</td><td>8</td><td>-</td></tr> +<tr><td>2019-2020</td><td>12</td><td>8</td><td>3</td></tr> +<tr><td>2020-2021*</td><td>10</td><td>6</td><td>1</td></tr> +</tbody></table> +<ul> +<li>For each membership year, NeIC had 15 priority seats for the instructor training and 6 COWs without fee.</li> +<li>Regarding the membership year 2020-2021; 3 trainees who took the instructor training are planning to finish the rest of the checkout procedures within this year. 1 of them remains as pending in the Carpentries database at the time of 26th Oct.</li> +<li>RC did follow-up check-ins for the trainees who attended a training event. Regarding 2019-2020, 4 trainees from the same institute failed check-out (1 of them could not complete the participation in the training event due to absence more than an hour) despite repetitive check-ins. 1 trainees in 2020-2021 became unreachable after the training event.</li> +</ul> +<h4 id="relationship-with-the-carpentries-and-recognition-of-cr-in-the-carpentries-community">Relationship with the Carpentries and recognition of CR in the Carpentries community</h4> +<ul> +<li>CodeRefinery had sessions at CarpentryCon 2018 in Dublin (short-talk), CarpentryConnect 2019 in Manchester (lightning-talk) and CarpentryCon2020@Home (lightning-talk, panel-session), links found at https://coderefinery.org/about/reports/#presentations</li> +<li>CodeRefinery submitted 2 blog posts in the Carpentries blog: +<ul> +<li><a href="https://carpentries.org/blog/2020/04/coderefinery-first-online-workshop/">Lessons Learned from Running Code Refinery's First Online Workshop</a></li> +<li><a href="https://carpentries.org/blog/2020/08/Report-from-the-Mega-Coderefinery-workshop/">Report from the Mega-Coderefinery workshop</a></li> +</ul> +</li> +<li><a href="https://carpentries.org/community/">CodeRefinery's Zulip chat is introduced as a Carpentries local community space for Nordics and Baltics.</a></li> +<li>Attended at membership executive council meetings (2020 by RA, 2021 by NT).</li> +<li>In 2021, CodeRefinery hosted a workshop on <a href="https://coderefinery.github.io/2021-01-08-coderefinery-online/">Introduction to Conda for (Data) Scientists</a> as a part of <a href="https://carpentries.org/blog/2020/10/call-for-pilot-workshops-carpentries-incubator/">the Carpentries pilot program to improve the lesson material in the incubator program to further level</a>.</li> +<li>Carpentries Executive Director provided a support letter upon the application for the sustainability phase.</li> +<li>CodeRefinery has re-licensed their lesson material from CC-BY-SA to CC-BY based on a suggestion by the Carpentries.</li> +</ul> +<h4 id="regional-coordinator-rc">Regional Coordinator (RC)</h4> +<ul> +<li>During the period where the RC role was given as a part of tasks by a CodeRefinery project staff, the RC had an administrative role within the Carpentries on both COWs and SOWs in the relevant region. In total, appointed RC carried out administrative works on <strong>35 workshops</strong>. In addition, she recorded 28 past SOWs hosted by University of Oslo, which were eligible to be recorded in the Carpentries database but had not been registered.</li> +<li>RC initiated the following: +<ul> +<li><a href="https://carpentries.topicbox.com/groups/local-nordic">Nordic region mailing list at topic-box (managed by the Carpentries)</a>, </li> +<li><a href="https://2020.carpentrycon.org/schedule/#session-48">&quot;Nordic and Baltic Get Together&quot; session at CarpentryCon 2020 @home</a>, and</li> +<li><a href="https://codimd.carpentries.org/nordic-community-call">monthly community calls</a>.</li> +</ul> +</li> +<li>RC explained and guided about the NeIC's membership benefit and the Carpentries workshops, as well as bridging new individuals to the region to the local community upon requests. </li> +<li>Upon the expiration of the NeIC's membership, RC in Nordic region is also discontinued.</li> +</ul> +<h4 id="dissemination-of-opportunities-to-use-the-neic-s-membership-benefit">Dissemination of opportunities to use the NeIC's membership benefit</h4> +<ul> +<li>Dissemination of opportunities were done via CR and NeIC website, CR Zulip chat, CR newsletter, at relevant workshops, CR twitter, etc.</li> +<li>In addition, presentations at conferences etc. (for example at &quot;Seminar for bibliotekenes nettverk for ph.d.-støtte&quot; (In Norway)) were also used to disseminate opportunities. </li> +</ul> +<h4 id="uptake-of-the-membership-benefits">Uptake of the membership benefits</h4> +<ul> +<li>Benefits were generally underused, especially COW opportunities. This was partially due to the pandemic and that requests for online COW were not accepted for the first several months after the pandemic hit. Also, the difficulty in planning in-person workshops may have also influenced here as well.</li> +<li>Instructor training's three check-out procedures seem a bit high barrier for some people. Follow-up by RC seemed to have helped to some extent, for example, reminding them to apply for extension of the due date to complete the check-out, offering opportunity to join in Nordic community call as a part of check-out processes, and some advices on contribution works (e.g., translation of terms in Glosario). </li> +<li>Provision of teaching/learning opportunities in Carpentries SOWs/COWs initiated by CR might have been helping; +<ul> +<li>to disseminate the usefulness of the Carpentries workshops, as well as </li> +<li>to provide a &quot;safe&quot; place for newly-badged instructors to try teaching. </li> +<li>NB: There was a plan to attempt this idea by a SOW for 2021, and several newly badged instructors showed interest in teaching there. But then there was a request for a new COW, and those new instructors had a chance to teach there.</li> +</ul> +</li> +<li>The Carpentries is also changing along time: +<ul> +<li>Membership price model and the price itself had been stable for a couple of years, but will be changed within 2021.</li> +<li>RC role is to be changed in the process of <a href="https://carpentries.org/blog/2021/10/announcing-community-development-program/">re-designing community development program</a>. RC will no longer have responsibility for administrative works on workshops in the responsible region. This is also explained as due to a concern around GDPR raised by the major sponsor of the Carpentries (<a href="https://communityin.org/">Community Initiatives</a>). The discount offer of having an RC is to be discontinued. </li> +<li>The Carpentries will have online workshops as their standard option to offer in near future; it is so far only as pilot.</li> +</ul> +</li> +</ul> +<h3 id="meeting-minutes-and-decision-tracking">Meeting minutes and decision tracking</h3> +<ul> +<li>One rolling meeting minutes document is probably better than one document per +meeting to track tasks and decisions. Creating new documents for each meeting risks +that action points get lost or forgotten.</li> +</ul> +<h3 id="time-reporting-and-vacation-planning">Time reporting and vacation planning</h3> +<ul> +<li>In the project we have early on chosen to not report hours to the project +management to build trust (only report hours to the local management).</li> +<li>But in hind sight the project manager should have had a closer overview over reported hours +earlier, not with a delay of months between work done, work reported to local +management, work invoiced to NeIC, and NeIC management informing the project +manager about hours invoiced.</li> +<li>There has been work imbalance among the team: the contribution and buy-in was not the uniform among +all participating countries/organizations (taking into account different FTE shares).</li> +<li>In hindsight, it would have been better to offer more 1-1 discussions between +project manager and staff.</li> +<li>Over time there has been significant staff fluctuation which is normal but every time it takes +time to know the routines and grow mutual trust and to get up to speed with the tools and processes.</li> +<li>It reduces confusion to share a vacation plan: not only for the project +manager but for the entire staff.</li> +</ul> +<h3 id="issue-task-tracking">Issue/task tracking</h3> +<ul> +<li>The process of having a centralized task tracking was found to be +difficult to implement in a decentralized team where everyone has other 'primary' projects.</li> +<li>Over the first two project terms we have tried different tools: +Trello, GitHub project board, GitHub issues, HackMD, but +it seems no tool replaces 1-1 discussions and more personalized task planning and one or +few persons keeping the overview and re-prioritizing from time to time.</li> +<li>However, having one HackMD document that collects all tasks that we chose to +work on and keeping this document across bi-weekly calls has been found +useful.</li> +</ul> +<h3 id="support-line-request-tracker">Support line/ request tracker</h3> +<ul> +<li>We got roughly 200-300 tickets/year.</li> +<li>We have started with email to project manager but that got too much, then we moved to +ZenDesk but we had to pay for each agent and it felt expensive for the very +few emails we got per week.</li> +<li>SNIC has kindly provided us with the RequestTracker service which we appreciate but the barrier +to authenticate using SSL certificates was too high for a cross-border +project and for few staff members it took weeks or months to get access.</li> +<li>Most tickets arrive around workshops.</li> +<li>Most non-workshop tickets were to unblock GitLab accounts.</li> +</ul> +<h3 id="communication-within-the-community-and-the-project">Communication within the community and the project</h3> +<ul> +<li>We have started within NeIC Slack.</li> +<li>We have a major problem, because we don't want to (or are unsure how to) keep lists of +contacts/interested people (personal data), so we don't have a way to reach out to a broad audience.</li> +<li>Although we have accumulated a large dataset of contact information, we had to delete this information +and could not use it to announce other events since we never asked registrants whether they +would prefer being informed about related events.</li> +<li>We are unsure however, whether the problem with outreach is lack of tools or lack of processes.</li> +<li>One way out is to move communication to the public space which we have +done when moving from Slack to Zulip.</li> +<li>Internally Zulip chat has been good for the project.</li> +<li>In addition, we have managed to engage many helpers and volunteers for each workshop.</li> +<li>When contracted staff are working on different percentages and remotely, it is important +to have clear overview of who is working on what and when, otherwise it may give the feeling of +unfairness. Frequent short meetings in &quot;Standup&quot;-format (or even writing asynchronously on Zulip or GitHub +project etc.) may help all having a better overview and enable us to regularly follow up each other.</li> +<li>Minimizing the toolset has been found beneficial since everybody already has a set of tools to +interact with in other projects and these tools often do not overlap or inter-operate.</li> +</ul> +<h3 id="data-management">Data management</h3> +<ul> +<li>Google Drive has served us well in the first years.</li> +<li>However, this storage was connected to a personal account.</li> +<li>Over time we used GitHub more and more.</li> +<li>HackMD was used a lot in the last 2 years of the project, both for workshops and notes and meetings.</li> +<li>We have never defined who owns the data and this created a bit of work for the project management towards the end of the project phase.</li> +<li>We should have created a data management plan.</li> +<li>Relevant to some points written in <a href="https://coderefinery.org/blog/2021/11/20/phase-2-lessons-learned/#Legal-questions">Legal questions</a>.</li> +</ul> +<h3 id="community-engagement">Community engagement</h3> +<ul> +<li>There was a constant stream of people interested in becoming more involved.</li> +<li>We have activated some, but as 'communication' says above, some potential was left unrealized.</li> +<li>Growing a community requires also promoting newcomers and mentoring.</li> +<li>Mentoring also requires volunteer mentors.</li> +<li>With more mentoring and more follow-up we could have had engaged more people and more organizations.</li> +<li>How to give proper credits to the volunteer effort given to the community; do we need different +&quot;levels&quot; as well as types (e.g. lesson contributions or exercise leads) of contributions? +Ref. <a href="https://www.cscce.org/2021/10/21/octobers-community-call-recap-supporting-community-champions-and-running-champions-programs/">Supporting community champions and running champions programs</a></li> +<li>How to keep the community engagement up and running without &quot;burn-out&quot; is a constant challenge.</li> +</ul> +<h3 id="stakeholder-engagement">Stakeholder engagement</h3> +<ul> +<li>Steering group seems to have become less engaged over time.</li> +<li>At the beginning of the project the SG actively influenced and gave ideas and input and suggestions.</li> +<li>Over time the steering group meetings and communication grew more and more +passive and turned into a reporting channel.</li> +<li>The project had only 3 short meetings with the reference group formed by national +training coordinators. This was somehow beneficial to connect to national newsletters.</li> +</ul> +<h3 id="infrastructure-hosting-gitlab-service">Infrastructure hosting (GitLab service)</h3> +<ul> +<li>Both the steering group and also the project staff became less interested in this over time.</li> +<li>Although the GitLab service turned out successful, it became more and more disconnected and disengaged +and ended up a two-person effort (one person maintaining service, another person answering tickets).</li> +</ul> +<h3 id="legal-questions">Legal questions</h3> +<ul> +<li>The project was lacking support in GDPR-related questions +<ul> +<li>We felt a bit left alone with questions about data privacy and storage +and collaboration. For example: how long can we keep participants' data +to issue certificates? Should we keep information of the certificates +issued? If so, how long, who and where eventually will keep them in case +the project ends?</li> +<li>The employer organizations, preferably their lawyers should be consulted, +especially in terms of making a project's privacy policy and choice of +common cloud-based platforms that are inevitable to use. As an example, UiO lawyers +have raised concern about using work email address for making user account of any +cost-free cloud service (including GitHub) so that users don't set the +same password as the one used at the work. In addition, it was not +encouraged to use any cloud-service based in the US to store any personal +data (even not sensitive ones) for work-related purpose given the risk +that <a href="https://www.uio.no/for-ansatte/arbeidsstotte/personvern/gdpr/aktuelt/endelige-retningslinjer-for-overforing-ut-av-eos.html">GDPR is not followed due to its server existence outside of the EU +(especially in +US)</a> +(Ref. <a href="https://edpb.europa.eu/system/files/2021-06/edpb_recommendations_202001vo.2.0_supplementarymeasurestransferstools_en.pdf">Recommendations by European Data Protection +Board</a>)</li> +<li>Given its characteristics, NeIC should provide both necessary legal +support on the issues relevant to GDPR and common cloud-based platforms +that staff across boarder securely use. Common support email and a +platform where more than one project staff can answer inquiries +regardless of their affiliation is essential (see also section about &quot;Support line/ request tracker&quot;).</li> +<li>CodeRefinery is (and has become) a very much community-driven project +rather than one where only fixed staff work with written contract through +the employer. Such project may have been rare, but there might be more of +this type in future. Clear legal guideline for involvement of voluntary +staff is needed. In this sense, working contract or collaboration +agreements including data processor agreement may not be sufficient and +it will need a very clear guideline about who should be able to have +access to any personal information of the third parties including sign-up +information to workshops, for example.</li> +</ul> +</li> +<li>&quot;Rights to work results&quot; vs. Open Science +<ul> +<li>Ref: a page about <a href="https://www.uio.no/english/for-employees/employment/work-results/rights-to-work-results.html">&quot;Rights to work results&quot; at University of Oslo</a></li> +<li>General clarification is needed here so that everyone won't be in trouble later.</li> +<li>It should be also better explained and clarified in terms of the choice of platform for collaborative works in this regard so that staff/volunteers etc. can feel safe in using the chosen (cloud-based) platforms, including GitHub, YouTube, Twitch, HackMD, Tinyletter etc.</li> +</ul> +</li> +<li>We also lacked support in questions about how to start an own organization/ spin-off.</li> +</ul> + + + + + Bi-weekly Community Calls started + 2021-09-01T00:00:00+00:00 + 2021-09-01T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2021/09/01/bi-weekly-community-calls/ + + <p>CodeRefinery is now shifting towards a new phase with community-based collaboration. We are aiming to continue offering the workshops, community space, and develop lesson materials together with those who are interested in. </p> +<p>For this to be successful, CodeRefinery started bi-weekly community calls from the 9th August. Calls are open to anyone interested in joining in the community from any point of view; teaching, learning, hosting, contributing to lessons, you name it. Join in the calls, get informed and influence the community's way forward! </p> +<p>So far, we informed and discussed among others;</p> +<ul> +<li>CodeRefinery project: current status and future,</li> +<li>How to improve outreach and publicity,</li> +<li>Importance of possibility to provide ECTS,</li> +<li>How CodeRefinery should give credits to contributions by volunteers,</li> +<li>Mentorship program for exercise leads after the workshop,</li> +<li>How to &quot;order&quot; workshops</li> +</ul> +<p>For more details of each call, please visit <a href="https://github.com/coderefinery/coderefinery.org/commits/main/content/about/community-call.md">the archive of the minutes</a></p> +<p>The next call is on the 6th September 12:00-13:00 CEST with a theme of &quot;CodeRefinery way forward&quot;, where we will be discussing the community organization model. For the connection details and agenda, please follow <a href="https://hackmd.io/@coderefinery/community-call">the Community Call HackMD</a>.</p> +<p>We all look forward to seeing you at community calls and <a href="https://coderefinery.zulipchat.com/#">Zulip</a> :)</p> + + + + + Community discussion in Nordic and Baltic countries + 2020-11-13T00:00:00+00:00 + 2020-11-13T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/11/13/carpentry-community-discussion-nordic/ + + <p>This blogpost is based on the notes made on <a href="https://pad.carpentries.org/community-discussions">Carpentries Community Discussion Etherpad</a> on the 30th Oct. 2020.</p> +<h2 id="summary">Summary</h2> +<p><em>The Carpentries say &quot;never touch learners keyboard&quot;. Should instructors rigidly follow this advice in online workshops or should we be more flexible in order to overcome the challenges of teaching online?</em></p> +<p>On October 30th 2020, a Carpentries community discussion was held with discussion focused on Nordic and Baltic countries. The host was Annika Rockenberger (Carpentries instructor trainer). Including the host and the co-host, totally 15 participants joined: 6 from Norway, 3 from Sweden, 3 from Finland, 2 from Denmark, and 1 from Bangladesh (Thanks for joining, all!). A complete list of the participants can be found <a href="https://coderefinery.org/blog/2020/11/13/carpentry-community-discussion-nordic/#Participant-list">below</a>.</p> +<p>First, experiences from 2 online workshops were shared. The theme above was raised as a part of the discussion. The active discussion left little time for other topics, but we had a positive and creative suggestion for further collaboration and community building for Nordic and Baltic region: There was a suggestion for running a joint workshop on AR technology and the idea to create a mapping of expertise in the region to facilitate cross-border collaboration.</p> +<p>There are ongoing initiatives to develop Nordic community further. Among other things, information about the <a href="https://nordic-rse.org/">Nordic Research Software Engineer initiative</a> and its <a href="https://nordic-rse.org/events/2020-online-get-together/">first online get-together event on 30th Nov. - 2nd Dec.</a> was announced.</p> +<h2 id="workshop-debriefing">Workshop debriefing</h2> +<p>Experiences from two recently held online Carpentries workshops were shared and discussed:</p> +<h3 id="sweden-stockholm-mix-and-match-sql-openrefine-python-programming-and-plotting">Sweden, Stockholm -- Mix and Match (SQL, OpenRefine, Python programming and plotting)</h3> +<p><a href="https://linajandren.github.io/2020-09-22-stockholmtrio-online/">A self-organized workshop by KTH, Stockholm University, and Karolinska Institute</a></p> +<ul> +<li>(Lina, instructor of this workshop) Felt it was hard to teach online, as she was unsure if it reached to the audience. But it went fine.</li> +<li>(Radovan) (In his experiences from teaching online workshops in <a href="https://coderefinery.org">CodeRefinery</a>) Jumping into breakout rooms to see how the participants did in exercise sessions helped a lot. Also being able to ask/answer questions asynchronously via HackMD hopefully lowers barrier to ask (does not delay others).</li> +<li>(Annika) Even being able to see helpers' faces would help despite having all the learners camera off. Also, when breakout room size is small, it is easier to get impression of the learners.</li> +</ul> +<h3 id="norway-bodo-dc-social-science">Norway, Bodø -- DC social science</h3> +<p><a href="https://mchiapello.github.io/2020-09-16-nord-online/">A centrally-organized workshop at Bodø University</a></p> +<ul> +<li>(Lars, instructor of this workshop) Breakout rooms helped as it enhanced dialog. One of the key issues in the Carpentries. Remote control function worked well. The other instructor used this function to help a learner in the main room. It took some time to build trust.</li> +<li>(Anne) &quot;Taking over learner's keyboard on an in-person workshop should never happen&quot;, the Carpentries says! But this concept could be too rigid. This should be given back as feedback to the Carpentries.</li> +<li>(Lina) Depending on the context?</li> +<li>(Annika) Communicating the principles and the important parts for not leaving participants behind in critical situation would be the essential thing to consider when taking over keyboard or not.</li> +<li>(Joakim) Important thing is not give pressure on instructors.</li> +<li>(Lina) Letting learners take over instructor's screen would be interesting.</li> +<li>(Lars) Polls for ice-breakers as well. Easy to rush through, but important not to, especially when you cannot see faces as feedback.</li> +<li>(Radovan) Hopefully useful tips for online teaching learned from CodeRefinery workshops: https://coderefinery.github.io/manuals/</li> +</ul> +<h2 id="community-building-collaboration-and-ongoing-initiatives-in-the-nordic-and-baltic-region">Community building, collaboration, and ongoing initiatives in the Nordic and Baltic region</h2> +<ul> +<li>(Tobias) Is planning to run a workshop on AR &quot;Let's build an augmented reality web app!&quot; based on a full-day workshop given at the <a href="https://www.ub.uio.no/english/courses-events/events/all-libraries/2020/research-bazaar-2020.html">research bazaar at the University of Oslo</a> earlier this year: +<ul> +<li>goal: making 3D holiday greeting card using HTML and JavaScript: https://arworkshop.teebusch.repl.co/card1.html</li> +<li>The lesson material is all there: https://repl.it/@Teebusch/arworkshop</li> +</ul> +</li> +<li>(Joakim) Suggestion of a repository of Carpentries Nordic/Baltic community members with specialities and skills</li> +<li>(Annika) Google Sheets for this?</li> +<li>(Anne) EOSC Nordic claims to be a knowledge-hub</li> +<li>(Radovan) Is also working on mapping.</li> +</ul> +<h3 id="announcements">Announcements</h3> +<ul> +<li>Nordic RSE (research software engineers) online get-together (Nov 30 - Dec 2): https://nordic-rse.org/events/2020-online-get-together/ (everybody welcome to attend and submit proposals or ideas)</li> +<li>Local-nordic Carpentries mailing list: https://carpentries.topicbox.com/groups/local-nordic</li> +<li>CodeRefinery workshop in November 17-19, 24-26 (registration closed): https://coderefinery.github.io/2020-11-17-online/ (looking for helpers: great way to learn)</li> +</ul> +<h2 id="participant-list">Participant list</h2> +<ol> +<li>Annika Rockenberger (host, Norway, Oslo)</li> +<li>Naoe Tatara (co-host, Norway, Oslo)</li> +<li>Kerstin Lenk (Finland, Tampere)</li> +<li>Lars Kjær (Denmark, Copenhagen)</li> +<li>Tobias Busch (Norway, Oslo)</li> +<li>Lina Andrén (Sweden, Stockholm)</li> +<li>Mohamed Abdelhalim (Norway, Oslo)</li> +<li>Annajiat Alim Rasel (Bangladesh, Dhaka)</li> +<li>Joakim Philipson (Sweden, Stockholm)</li> +<li>Thomas Arildsen (Denmark, Aarborg)</li> +<li>Radovan Bast(Norway, Tromsø)</li> +<li>Samantha Wittke (Finland, Helsinki)</li> +<li>Olav Vahtras (Sweden, Stockholm)</li> +<li>Anne Fouilloux(Norway, Oslo)</li> +<li>Richard Darst (Finland, Helsinki)</li> +</ol> +<p>Thank you for all the contributions!</p> + + + + + Making lessons citable and giving credits for contributors + 2020-10-02T00:00:00+00:00 + 2020-10-02T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/credit/ + + <p>CodeRefinery is organizing a half day online &quot;open house&quot; dedicated to +collaboratively working on making CodeRefinery lessons citable as well as giving credits for contributors! +Here, contributors are not only those who developed lesson materials, but also lesson mainteners.</p> +<p>Anyone interested is welcome to contribute to discussion on how to realize these in practice!</p> +<p>We will collect notes in a <a href="https://hackmd.io/@coderefinery/2020-10-02-openhouse">shared +document</a>. +Please note that this document will be archived in our <a href="https://github.com/coderefinery/open-house">Open House +event repository</a>.</p> +<p>We first meet online at 9:00 am (CEST) / 10:00 am (EEST) via video (connection link +will be shared in our <a href="https://hackmd.io/@coderefinery/2020-10-02-openhouse">shared document</a>. +If we decide on working individually during the day, we will coordinate +the work through our <a href="https://coderefinery.zulipchat.com">Zulip chat</a> +with possibilities to further discuss via video if necessary.</p> +<p>We conclude the day around 12:00 pm (UTC+1).</p> + + + + + git-pr: painless small pull requests + 2020-09-29T00:00:00+00:00 + 2020-09-29T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/09/29/git-pr/ + + <h1 id="git-pr-painless-small-pull-requests">git-pr: painless small pull requests</h1> +<p>In CodeRefinery, we teach the benefit of small changes via pull +requests in order to have better collaboration and review. But, when +the changes get small enough, the time it takes to run the commands +and open the pull requests begins to get annoying. I looked around +for other tools that could make this faster, but wasn't quite +satisfied with anything. So, I slowly started making something that +evolved into git-pr, <a href="https://github.com/NordicHPC/git-pr">https://github.com/NordicHPC/git-pr</a>.</p> +<p>Let's talk about how it works.</p> +<h2 id="making-a-change">Making a change</h2> +<p>First, git-pr will help you to make the new feature branch. <code>git pr branch $branch_name</code> willcreate a new feature branch off of the +upstreamdefault branch and check it out for you. You might want to +<code>git fetch</code> first. Make your commits off of this branch.</p> +<p>One trick I use is to write the first commit's message like I would +write the pull request description. I decided it's usually not worth +writing a separate description for the pull request itself. Perhaps +there is some advantage to including the PR message in the git history +itself, too.</p> +<p>Then, to push the pull request, I use <code>git pr open</code>. This will push +the current branch, and open a pull request on both Github and Gitlab. +It will pop up an editor pre-seeded with the commit's message for you +to further edit. Once you save and close, the pull request is made.</p> +<p>One thing that git-pr will do is figure out the upstream and your +local copy by yourself. Default upstream goes in priority order +<code>upstream</code>→<code>origin</code>, Default personal fork goes in the order +<code>local</code>→<code>origin</code>→<code>upstream</code>, so no matter if you first clone the +upstream, or your own fork, you can always add the other with only one +command and have it auto-detected with no renaming.</p> +<p><code>git pr prune</code> will remove all merged branches both locally and on the +remote (possibly dangerous!).</p> +<p>Various <code>git pr fetch*</code> commands will fetch pull requests into a local +<code>pr/NNN</code> branch.</p> +<p>There are various other small useful things, with it, but this is the +main part.</p> +<p>These are <em>only</em> shorthands for things you can easily do with other +git commands, but they save you time. It gets me closer to the ideal +of making many small pull requests.</p> +<h2 id="about-git-pr">About git-pr</h2> +<p>You can find it at <a href="https://github.com/NordicHPC/git-pr">https://github.com/NordicHPC/git-pr</a> - it is a +single shell script to copy to your path.</p> +<p>It's beta-quality software: it is used by me and a few others all the +time, but there will almost certainly be issues as others start using +it. Send issues and PRs!</p> +<p>It supports both Github and Gitlab, though Gitlab support is less well +tested.</p> +<p>There is a lot of prior art on different pieces here, there isn't much +in git-pr that is completely new - In particular, the GitHub command +line interface has come out since then and has some overlap. You can +see other options in the git-pr README.</p> + + + + + Writing newsletter articles and blog posts + 2020-08-24T00:00:00+00:00 + 2020-08-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/newsletter/ + + <p>CodeRefinery is organizing a one day online &quot;open house&quot; dedicated to +collaboratively writing up blog posts which have been in +the pipeline for some time and which will be published in the next +CodeRefinery newsletter.</p> +<p>Tentative list of articles:</p> +<ul> +<li>Future mega-CR </li> +<li>Update on citable lessons and credit/visibility for instructor and helpers</li> +<li>Update on sustainability efforts?</li> +<li>Manuals : how they can be used for your lessons </li> +<li>git-pr</li> +</ul> +<p>Anyone who would like to contribute to these articles or suggests new +topics is welcome to join!</p> +<p>We will collect notes in a <a href="https://hackmd.io/@coderefinery/2020-08-24-openhouse">shared +document</a>. +Please note that this document will be archived in our <a href="https://github.com/coderefinery/open-house">Open House +event repository</a>.</p> +<p>We first meet online at 9:00 am (CEST) / 10:00 am (EEST) via video (connection link +will be shared in our <a href="https://hackmd.io/@coderefinery/2020-08-24-openhouse">shared +document</a> and then work on +the instructor training material. During the day, we will coordinate +the work through our <a href="https://coderefinery.zulipchat.com">Zulip chat</a> +with possibilities to further discuss via video if necessary.</p> +<p>We conclude the day around 4:00 pm (UTC+1) by writing a short +/summary in our <a href="https://hackmd.io/@coderefinery/2020-08-24-openhouse">shared +document</a>.</p> + + + + + Report from the Mega-Coderefinery workshop + 2020-07-31T00:00:00+00:00 + 2020-07-31T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/07/31/mega-coderefinery/ + + <p>In May/June 2020, CodeRefinery ran a large online workshop with about +100 learners in attendance. We overcame the challenges with some +clever strategies, and we feel the learning outcomes were similar to that of in-person workshops of around 30-40 participants.</p> +<p>After that workshop, some of the same staff held an even larger +&quot;High-performance computing (HPC) Kickstart&quot; workshop (180 learners, +more than four universities). This provided another perspective and +reinforced some of the lessons learned during the large online +CodeRefinery workshop.</p> +<p>Running a 100-person workshop seems like an intimidating goal, but +with the right vision and techniques it turned out to be quite smooth. +Instead of expecting direct instructor interaction with every learner, +we had to accept that everyone could be both a helper and learner and +create a hierarchical support structure.</p> +<p>Online is not simply a temporary substitute for in-person. +Mega-online is not simply a way to reach more people because we don't +have instructors. This concept fundamentally takes us closer to the +promise of technology for teaching: being able to reach everyone +regardless of location and physical limitations.</p> +<h2 id="executive-summary">Executive summary</h2> +<ul> +<li>Yes, we scale to 100 people pretty well, but you do need a good +vision about how to do it.</li> +<li>We maintained good learning outcomes with our adjusted strategies.</li> +<li>Helpers are essential and need to be trained. Helpers serve as a +first-level of support, and instructors/expert helpers serve as a +second. Helpers need training in breakout room management and a +walk-through/training in the group exercises.</li> +<li>Encourage the social aspect by asking for people to register as part +of teams and keep the teams together. Teams can even bring their +own helper - or even helpers (learners in previous CodeRefinery) can +bring their own learners to spread their knowledge to their +colleagues.</li> +<li>You need to put in extra effort to ensure things run smoothly and +make sure that everyone is prepared - anticipate all problems.</li> +<li>Roles of staff should be carefully explained and ideally not +overlapping, to reduce the cognitive load.</li> +</ul> +<h2 id="mega-coderefinery">Mega-CodeRefinery</h2> +<p><a href="https://coderefinery.github.io/2020-05-25-online/">Webpage</a></p> +<h2 id="finnish-hpc-kickstart">Finnish HPC Kickstart</h2> +<p><a href="https://scicomp.aalto.fi/training/scip/summer-kickstart/">Webpage</a></p> +<h2 id="organization">Organization</h2> +<ul> +<li>Pre-workshop install help times: +<ul> +<li>Emphasis on getting ready and making sure things are installed +and configured.</li> +<li>We &quot;required&quot; everyone to attend one pre-workshop installation +time, even if they thought they had already done it (in this +case, we quickly verified the instllation). In practice, we +didn't check this requirement and only 25-50% of people came, +but it still make the workshop more smooth.</li> +<li>The installation verification time occurred right after the +&quot;helper introduction meeting&quot;, so helpers would stay and help +people verify their installation.</li> +</ul> +</li> +<li>Installation instructions consist not just of installation, but also +verification instructions. +<ul> +<li>In particular, verifying of the git configuration, since if +there are any issues, it very quickly derails things.</li> +</ul> +</li> +<li>We created installation and verification videos for the most +critical part, git <a href="https://www.youtube.com/playlist?list=PLpLblYHCzJACyKCfHnPwRruOxllNoHsEg">youtube +playlist</a>: +<ul> +<li>One on verifying an installation (make repo, run it)</li> +<li>One for most common problems you might see and how to fix</li> +<li>One for advanced topics (ssh keys)</li> +</ul> +</li> +<li>Start the meeting 20-30 minutes before, request joining 10 minutes +early (on time is late). Have some sort of +icebreakers/discussion/program to fill that 10 minutes to keep +people interested.</li> +<li>We kept the Zoom meeting room open for 30 min to 1 hour after the scheduled lessons are over on that day. +<ul> +<li>This enabled continuation of exercises in re-opening breakout rooms.</li> +<li>Some participants could receive individual help by a helper or an expert helper.</li> +<li>In the main room, we did debriefing among instructors and helpers so that we could reflect on the day after.</li> +</ul> +</li> +<li>The larger the audience gets, the more diverse it is. +<ul> +<li>This causes more load on helpers and more effort for organizers +to prepare.</li> +<li>It also makes it harder to please everyone.</li> +<li>But on average, we felt that the outcome was about as expected.</li> +</ul> +</li> +<li>To scale to this cognitive load, carefully assign roles (roles +explained below): +<ul> +<li>Zoom host, focuses on chat, breakout rooms, registration, etc.</li> +<li>HackMD master</li> +<li>Expert helpers (special ops)</li> +<li>Instructors</li> +<li>Helpers</li> +<li>It is best if these roles don't overlap, because they require +different types of focus. Zoom host and HackMD master are +easiest to combine. Then, instructor and expert helpers.</li> +</ul> +</li> +</ul> +<h3 id="recommendations">Recommendations</h3> +<ul> +<li>Place a large emphasis on getting ready for the workshop.</li> +<li>Have multiple ways for learners to verify their installation.</li> +<li>&quot;Require&quot; attendance in pre-workshop installation verification +times. Invite helpers there to get involved and practice basic +helping.</li> +</ul> +<h2 id="teams">Teams</h2> +<p>Our recruitment/sign-up strategy was twofold.</p> +<ol> +<li>Open call for helpers and sign-up for individual learners.</li> +<li>“Bring your own breakout room”: We allowed learners to register as <strong>teams</strong>, where each team brought its own helper.</li> +</ol> +<h3 id="open-call-for-helpers-and-sign-up-for-individual-learners">Open call for helpers and sign-up for individual learners.</h3> +<ul> +<li>First we had a general call for helpers to assign a breakout room with individual learners.</li> +<li>Our plan was to allocate one helper for 5 learnes accepted approx. (the number of helpers) * 5 of individual leraner sign-ups.</li> +<li>We tried to sort these learners by university/country/field, but didn't put too much effort into this.</li> +<li>Helpers and learners were told which team they will be in before the workshop (personalized email with breakout room number).</li> +<li>In general, we tried to keep consistency in member composition in a breakout room throughout the whole workshop; with the same learnes and the same helper, as much as possible. +<ul> +<li>For a long workshop like this one (6 half-days), getting to know each other seemed to result in more interaction by the end.</li> +<li>Random assignments might work better in a smaller workshop, where you are likely to see the same people you know. That isn't the case in a large workshop, so consistent breakout rooms are more worth it.</li> +<li>It took a session or two for people to get comfortable with their room, but once they did it went well.</li> +</ul> +</li> +</ul> +<h3 id="bring-your-own-breakout-room">&quot;Bring your own breakout room&quot;</h3> +<ul> +<li>To further improve things, imagine if a whole group wants to get trained? They can register and bring their own helper, who could be an advanced group member.</li> +<li>Research shows that multiple adopters in an organization greatly increases uptake of new tools (<a href="https://doi.org/10.1007/s11301-017-0133-3">Graf-Vlachy, L., Buhtz, K. &amp; König, 2018</a>). Encourage people to come with friends or groupmates.</li> +<li>How it worked: +<ul> +<li>This is implemented as a &quot;Team name&quot; option when registering.</li> +<li>They are put in their own breakout room together.</li> +</ul> +</li> +<li>Advantages: +<ul> +<li><strong>Scalability</strong>: Because they bring their own helper, we can scale to essentially as many learners as we want.This mechanism allowed us to reach far more people than we could normally, and allowed anyone who could find their own helper to attend. So, our workshop size became SUM(number of people in a team; number of teams) + (number of helpers)*6: every teamless helper directly allowed five other learners to attend.</li> +<li><strong>Team building</strong>: Because these learners have a pre-existing social connection, they are able to keep a sense of community and help each other much better than you might expect from a course of this size.</li> +<li><strong>Possibility to use familiar examples</strong>: We have observed that some team breakout rooms were discussing examples close to their research domain which would otherwise have been difficult to do in a &quot;random&quot; group room or the main room.</li> +</ul> +</li> +<li>The concept of teams could be extended to in-person workshops, too. +<ul> +<li>Not necessarily pre-assigned, but cleverly organize tables, expect the group to stay together all days.</li> +<li>One could give the teams names and so on, to increase team spirit.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-1">Recommendations</h3> +<ul> +<li>Accept a &quot;team name&quot; as part of registration. These people will be +put into the same breakout rooms. Worst case, it isn't used.</li> +<li>Keep people in the same breakout room for the entire workshop - if +there is risk that people will not get used to interacting with +their group.</li> +</ul> +<h2 id="breakout-rooms-management">Breakout rooms management</h2> +<ul> +<li>Assign names depending on breakout room and role. Here, <code>n</code> is the +breakout room number: +<ul> +<li><code>(n) First Last</code> - learner</li> +<li><code>(n,H) First Last</code> - helper</li> +<li>the above help you to easily assign to the correct breakout +rooms, and becomes fairly easy with the Zoom interface. When +there are more than 10 teams, it is recommended to use '01', +'02', .. as it makes it even easier to organize them into +breakout rooms manually.(Otherwise participant list sorts (10), +not (2), right after (1))</li> +<li><code>(CR) First Last</code> for instructors and expert helpers (here &quot;CR&quot; +stood for CodeRefinery staff).</li> +</ul> +</li> +<li>Initial breakout room assignments serves as a guideline, rooms are +constantly adjusted as needed but we try to keep teams together.</li> +<li>Preferably, one breakout room should have minimum 4 learners.</li> +<li>When people register as a team together, keep them together unless +explicitly asked. For others, do what you need, but realize that +the social aspect becomes important.</li> +<li>Some people don't join with the right Zoom name. +<ul> +<li>Other co-hosts can browse the registration list and manually +rename participants who didn't name themselves correctly.</li> +<li>Then, the Zoom host only has to worry about assigning them into +the right rooms, and not looking up everyone on the lists.</li> +</ul> +</li> +<li>Our registration system, Indico, made this management much easier +than it could have been. +<ul> +<li>After registration closed, we added a &quot;Room&quot; field to the +registration data.</li> +<li>Then, we went through and manually assigned each person to an +appropriate room number. We have to make sure that each room +has one helper and an appropriate number of learners.</li> +<li>We could send personalized messages to each person with the +Indico mail merge function</li> +<li>The majority of people did manage to name themselves correctly.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-2">Recommendations</h3> +<ul> +<li>Consistent naming of participants (and an order that sorts properly) +makes managing breakout rooms reasonable.</li> +<li>Consider how your registration system can send personalized emails +to each person.</li> +</ul> +<h2 id="helper-training">Helper training</h2> +<p>Regular helpers:</p> +<ul> +<li>Have a helper call the previous week. Actually, have two so that +everyone can make it to at least one.</li> +<li>Helper training: +<ul> +<li><a href="https://coderefinery.github.io/manuals/helping-and-teaching/">General</a></li> +<li><a href="https://coderefinery.github.io/manuals/breakout-rooms-helping/">Breakout rooms</a></li> +</ul> +</li> +<li>Focus on training for managing time and keeping a flow going. This +is described in our document.</li> +<li>Helpers do not need to be experts in everything. +<ul> +<li>They should be able to know what &quot;correct&quot; looks like, see +obvious problems, and then call for help from an expert when +something will take more than a minute to resolve.</li> +</ul> +</li> +<li>Helper training is focused on: +<ul> +<li>Motivation of learners and teaching psychology.</li> +<li>How to help: don't do it for them, etc.</li> +<li>Keeping the flow going, encourage everyone to speak up and +share.</li> +<li>Knowing when and how to call for an expert helper to come to the +room.</li> +</ul> +</li> +</ul> +<p>Special expert helpers:</p> +<ul> +<li>There are also &quot;special expert helpers&quot; (we need a new name), who +are experts in the material and problems that may come up. +<ul> +<li>Most are instructors or could soon become instructors (though +really they need to be expert debuggers). Basically many of our +free instructors would hang around to serve as special experts.</li> +<li>Special experts aren't assigned to any particular breakout room. +Instead, they are able to go to any room that needs more help.</li> +<li>While no room is calling them, they swap between rooms: they +join a room, wait a bit (30-60s) and watch if it's going ok, +before moving to another room. This way, the instructors can +always be aware of the pulse of the breakout rooms, pro-actively +help, and also provide more mentorship to the helpers.</li> +<li>One idea was to have expert helpers begin joining breakout rooms +only after 1/3rd of the breakout session is over. This ensures +that helpers get a chance to do their thing. This needs some +thought.</li> +</ul> +</li> +<li>Special experts provide valuable feedback to the instructor on the +progress of all learners. They should bring up some of the most +important issues they have seen in the main room.</li> +<li>Special experts also serve as backup helpers and can take over or +permanently join a room if a helper is unprepared.</li> +<li>The instructor is also encouraged to pop into some breakout rooms to +see how things are going. This may be enough in small workshops.</li> +<li>Special experts should be Zoom co-hosts. They are then able to go +into any breakout room they want (the mechanics of this is <em>not</em> +obvious, see our helper training info for more).</li> +<li>Special experts are different than the Zoom host and hackmd master. +These jobs require different types of concentration. Helpers and +expert helpers need to carefully follow what the instructor is +saying, Zoom host/hackmd master follow learner questions, and +up-next instructors think about what they are about to do.</li> +</ul> +<h3 id="recommendations-3">Recommendations</h3> +<ul> +<li>Hierarchical helpers allows you to extend to a greater size.</li> +<li>You need to put thought into how helpers work and prepare them well. +We should develop a special, quick training for them.</li> +<li>Special expert helpers connect the instructor (occupied with +teaching) to the pulse of the breakout rooms and serve as helper +mentors.</li> +</ul> +<h2 id="lesson-adjustment">Lesson adjustment</h2> +<ul> +<li>Make the exercise sessions as long as possible, group things +together. +<ul> +<li>There is a significant overhead to each breakout session, +becoming adjusted, figure out just what it is you are supposed +to do.</li> +</ul> +</li> +<li>Type-along is hard, given limited screen space to both watch and do.</li> +<li>In the end, the main room was more for lectures and watch an +example, then we flipped to breakout rooms to do most of the +hands-on work. We still need to think about this more.</li> +<li>With hierarchical helpers and more people in general, make sure that +each exercise and hands-on session is as self-contained as possible. +<ul> +<li>A person familiar with the tools should be able to read the +exercise and figure out what the objective is and what the steps +are - not having to pay attention to something said 5 minutes +ago, and not having a surprise twist that somehow had to be +accommodated at the beginning of the exercise.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-4">Recommendations</h3> +<ul> +<li>Consider limits of online formats and how difficult it is to do +interactive work.</li> +</ul> +<h2 id="exercises-and-breakout-sessions">Exercises and breakout sessions</h2> +<ul> +<li>Very clearly say what the goal is, what the duration is (duration +<em>and</em> time it ends), etc. for each lesson</li> +<li>Write the basic info in hackmd for each exercise: link to it, what +you are expected to do, how long it is and clock time when it ends +<ul> +<li>e.g. &quot;we expect you to finish 1-3, 4-5 are optional. 20 +minutes, ending at xx:45&quot;.</li> +<li>When participants are in two time zones, it is extra important +to use this format of not specifying hour.</li> +</ul> +</li> +<li>This is exactly the case of &quot;if it's even a little bit slow to you, +then it takes ages for a learner to understand&quot;.</li> +</ul> +<h3 id="recommendations-5">Recommendations</h3> +<ul> +<li>Have lots of &quot;meta-talk&quot; about what you are doing, what expectations +are, etc.</li> +</ul> +<h2 id="hackmd">HackMD</h2> +<ul> +<li>HackMD serves as a side channel to answer questions, so that the +main flow is not disrupted. +<ul> +<li>Learners keep it open and always watch and ask questions at the +bottom.</li> +</ul> +</li> +<li>One person serves as the &quot;HackMD master&quot; who follows it, answers, +and most importantly keeps it organized and adds in meta-information +about what the course does. +<ul> +<li>We've found that it's best if there is one person dedicated to +this without any other distractions (but of course many others +help, too).</li> +</ul> +</li> +<li>Be careful about answering questions in too much depth, more than is +needed. If you do, text becomes overwhelming and people can't +follow. Be strategic: if an answer isn't needed for following the +course, say so (and if you want, come back and answer later). +Answer the minimum to let someone follow the course, and inspire +people to research themselves later. Several short bullet points +progressively going into more depth makes for fast reading but also +more inspiration. For example this point, it's a bit long and +intimidating to read, which makes you lose the flow of whatever else +you are watching, isn't it? Imagine if every bullet point was like +this.</li> +<li>HackMD starts failing with a lot of people +<ul> +<li>We saw the limits at 50-100 people. If most people leave it in +view mode, it gets a little bit better.</li> +<li>If there isn't much text in it, it's better (~10k characters is +low).</li> +<li>When the document grew too long: we moved some of the text from +previous episodes to a side-HackMD and linked to it.</li> +<li>The failure mode was usually not being able to edit.</li> +<li>In theory, there are no strict limits. With short documents, even 100 +or more people could use it. Perhaps this is determined by +length of edit history.</li> +<li>We even saw Google Docs fail with 50 simultaneous editors during +an icebreaker (and our icebreakers with hackmd seemed to work +with ~50).</li> +</ul> +</li> +<li>Always have people ask questions and comment at the bottom. +<ul> +<li>There is not a &quot;questions section&quot; and &quot;lesson section&quot;, always +write at the bottom.</li> +<li>Add headings when you get to a new lesson/page/exercise/topic. +Questions go at the bottom, sorted by what you were talking +about at the time.</li> +</ul> +</li> +<li>Suggested heading arrangements (but hackmd master does whatever +makes sense): +<ul> +<li><code>#</code> for page title</li> +<li><code>##</code> for each lesson</li> +<li><code>###</code> for each episode</li> +<li><code>####</code> for each exercise, group discussion, etc. (if it needs to +be smaller than <code>###</code>.)</li> +</ul> +</li> +<li>Make participants aware that we plan to publish questions and +answers later as workshop outcomes. +<ul> +<li>After the workshop we add questions and answers from the HackMD +document to the workshop page.</li> +<li>We go through these to make sure that we don't publish names or +any sensitive information or any information that would violate +our Code of Conduct.</li> +<li>But even though we take the effort of checking the questions and +answers we recommend to point out to learners and helpers to +only use the form <code>[name=Myname]</code> if they prefer to indicate +their name in the notes to simplify discussions during the +workshop. Before publishing the notes, we remove all of the +<code>[name=Myname]</code>. In other words write in a style and recommend +everybody to write in a style which allows us to publish these +notes without hurting anybody's privacy.</li> +<li>For a large workshop, even sharing the notes among other +learners might be too much, and will naturally limit who else +you can share the live notes link with. Consider if you really +want to ask anyone to put real names in there.</li> +</ul> +</li> +</ul> +<h2 id="zoom">Zoom</h2> +<ul> +<li>Have a dedicated host, who focuses on breakout rooms and +registration related matters.</li> +<li>Use a client, not the web browser - though web browser is minimally +OK.</li> +<li>Assigning leareners to breakout rooms takes a long time, but luckily +Zoom can make it easy enough: +<ul> +<li>The &quot;pre-assign breakout rooms&quot; seems to only work within one +organization, thus was useless to us</li> +<li>When people name themselves according to the <code>(n) Firstname Lastname</code> system, people sort properly and it becomes very fast +to assign hundreds of people to their rooms.</li> +</ul> +</li> +<li>Ask participants to edit profile beforehand and log into zoom when they join in the +meeting room. This shows the name properly upon entry and thus the zoom host +can confirm that the name is found in the registration list. +<ul> +<li>This is important when you approve entry to the meeting room from the waiting room.</li> +<li>Enabling or disabling waiting room is another discussion: For the host, it can be a lot of work verifying people against a +registration list. Plus, we experienced some problems that waiting room interfered breakout room entry (see the point at the bottom of this section). With a private link, waiting room didn't seem to be that +important.</li> +</ul> +</li> +<li>Prepare another communication channel dedicated to staff (like +expert helpers and those who could help with HackMD editing), in our +case we used a dedicated topic in <a href="https://coderefinery.zulipchat.com/">CodeRefinery Zulip channel</a>. +<ul> +<li>Zoom chat is sometimes tricky, as it allows communication with +either all to the same room (in the main room or breakout room, +wherever you are, and as a host to all in waiting room) or to an +individual.</li> +<li>HackMD can also be used to discuss among staff, of course always +at the very bottom.</li> +</ul> +</li> +<li>If someone uses a different computer for Zoom than for doing the +exercises, they can join twice, one of those times for sharing their +screen (second one also be web browser client).</li> +<li>We saw some interesting Zoom problems: +<ul> +<li>We experienced in the first +couple of days that after assigning a participant into one +of the breakout rooms, and then that participant leaves from the +meeting room (not only breakout room), and tries to join in the +meeting room again with waiting room enabled, then that +participant was kicked out from the meeting room.</li> +<li>We don't still understand the mechanism behind, but once we disabled the +waiting room function (right before opening breakout rooms until +they are closed), it went totally fine.</li> +<li>Even after opening breakout rooms, people can join in the +meeting room, and the host could assign the new people into one +of the breakout rooms.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-6">Recommendations</h3> +<ul> +<li>Managing breakout rooms isn't too hard, but do practice.</li> +</ul> +<h2 id="streaming">Streaming</h2> +<p>Once you reach 100 people in a lesson, you start wondering: why can we +not reach everyone in the world at once? The technology is there, +it's a question of if it matches our vision.</p> +<ul> +<li> +<p>We are worried about trolls in our Zoom meetings, but that is +because the Zoom mechanics is many-to-many, while for a public +meeting you need a one-to-many mechanic where learners can't +interact with each other. Streaming provides this mechanic, at a +loss of interactivity. In principle, it can co-exist with breakout +rooms.</p> +</li> +<li> +<p>What's the point of streaming?</p> +<ul> +<li>We did streaming in parallel to the interactive workshop. That +way, anyone who couldn't register could also follow along. They +wouldn't get the full experience, but could at least do +something.</li> +<li>We encouraged people to watch streams in groups (ideally with +their own helper) so that they can get the social aspect and +help each other anyway.</li> +<li>We can imagine a fully federated system: There is one small Zoom +meeting with instructors doing the teaching. <em>All</em> learners +join via other Zoom meetings. Each other Zoom meeting watches +the stream together, and manages their own breakout rooms. Each +other zoom meeting can communicate to the central one as needed +to adjust the pace, for example chat and hackmd. HackMD helps +here.</li> +</ul> +</li> +<li> +<p>Stream as an overflow</p> +<ul> +<li>We had far more people register than we could accommodate, even +after getting as many helpers as we could, we could feel good at +least offering everyone who could not make it a chance to attend +via the stream</li> +<li>We emphasized that the experience would not be the same, and +they should try to come to another workshop later.</li> +<li>The stream can also be good for lurkers and passive attendees, +who can't go through the effort of attending but would like to +follow along.</li> +</ul> +</li> +<li> +<p>Interacting with stream viewers</p> +<ul> +<li>We got questions and comments on the stream chat.</li> +<li>We also provided a separate streaming HackMD to ask questions. +With our volume, we just as well could have given them the +primary hackmd (and did when someone asked, but we were worried +about trolls)</li> +<li>Stream viewers seemed pretty happy with what they were getting.</li> +</ul> +</li> +<li> +<p>Risks of streaming</p> +<ul> +<li>When the main room is streamed, people are more cautious about +saying things. But once we get to 100 participants, the main +room is quiet anyway, so we don't lose too much.</li> +<li>Risk of the stream going off-track from what learners need. You +need a good support system of expert helpers and feedback tools +to keep this working, if it was a stream-only workshop.</li> +<li>Risk of learner audio or video being broadcast. Zoom provides +tools (&quot;spotlight video&quot;) to prevent this, but it doesn't work +all the time.</li> +<li>Extra effort needed. The marginal cost isn't that great in the +end, once you know how it works.</li> +</ul> +</li> +<li> +<p>Zoom can send a video feed to a streaming service, which +re-broadcasts to the whole world</p> +<ul> +<li>This has to be enabled under your account, then can be +configured for a particular meeting.</li> +<li>&quot;Custom streaming server&quot; seems to be able to broadcast to +anything. In particular, we used <a href="https://www.twitch.tv/coderefinery">Twitch</a> to do our streaming.</li> +</ul> +</li> +<li> +<p>Keeping learner's videos out of the stream</p> +<ul> +<li>Privacy of learners is the first prerequisite to streaming.</li> +<li>We said: if you speak in the main room, it may be streamed and +recorded. Your video should never be. We thought this was +fair, since most main room questions go through hackmd anyway.</li> +<li>Breakout rooms never recorded or streamed (though some groups +asked if they could be recorded).</li> +<li>Zoom &quot;Spotlight video&quot; means that <em>only</em> that person should go +out into the stream. +<ul> +<li>The zoom host <em>must not</em> be in the gallery view.</li> +<li>This <em>bugs</em> sometimes and everyone ends up in the stream is +gallery view. This is extremely frustrating and we didn't +find a cause or solution. Workaround: someone should always +share their screen.</li> +<li>In practice this wasn't a big issue, since in the main room +video was off most of the time. We reminded participants to +turn off videos when they are back from breakout room +sessions.</li> +<li>We really need to investigate this more.</li> +</ul> +</li> +</ul> +</li> +<li> +<p>What to do with the stream while the breakout rooms are going on?</p> +<ul> +<li>At first, during the breakout sessions in the main room, we +spent a lot of time trying to fix problem with people who +couldn't be assigned to breakout rooms. This seems to have been +a waste of time</li> +<li>Then, we decided to not spend time on Zoom problems, and instead +use the main room to do the exercises as a demo. This was +mainly for the stream viewers, but also could be useful to the +people who couldn't join breakout rooms. In the future, it +could also serve a different type of learning style.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-7">Recommendations</h3> +<ul> +<li>Consider the place of the workshop in the larger world. Once you go +big, streaming is not too hard and lets you reach even more people.</li> +<li>If you do streaming, clearly announce it from the very start, with +the privacy deal (e.g. &quot;video not broadcast, voice may be&quot;). It is +much harder to add this later.</li> +</ul> +<h2 id="recording">Recording</h2> +<ul> +<li>Once you do streaming, it is a smaller step to recording and posting +the videos. +<ul> +<li>Who is benefited by the recordings? Perhaps not brand new +learners, but the learners who were in the workshop can review +them again later.</li> +</ul> +</li> +<li>If recordings require post-processing, they will almost never get +done. +<ul> +<li>Plan for one-short recording as much as you can: find a way to +keep learners out of the recording so you can go and directly +publish it with the minimum effort afterwards.</li> +</ul> +</li> +<li>A surprising number of learners have asked for the videos after the +workshop. +<ul> +<li>While the videos may not be as useful to someone learning the +material from scratch, they are probably very useful to an +existing learner who wants to review something they already saw, +teach others, etc.</li> +<li>When we can't provide them quickly, their usefulness is much +reduced.</li> +</ul> +</li> +</ul> +<h3 id="recommendations-8">Recommendations</h3> +<ul> +<li>Clearly announce the recording privacy statement when first +registering.</li> +<li>Try to make the recording as one-shot as possible, with minimal +post-processing needed. Plan for who will do this and when already +before the workshop.</li> +</ul> + + + + + CodeRefinery tools in action: NordicHPC + 2020-04-27T00:00:00+00:00 + 2020-04-27T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/27/nordichpc-tools/ + + <p>You've been to a CodeRefinery workshop, and wonder how these tools are +actually used? The NordicHPC github organization, which we've +mentioned before, provides a lot of demonstrations on using github and +working collaboratively. It's an example of people who have a common +interest and form a community by using common tools.</p> +<p>Yet at the same time, not everything is perfect. Rather than try to +make everything perfect, they make things good enough, licensed, and +shareable, and improve it as a need comes - possibly, when someone +else has a need and time to improve it.</p> +<p>Within the organization, you can find many examples of using +<a href="https://coderefinery.github.io/git-intro/">git</a> (everything), +<a href="https://coderefinery.github.io/git-collaborative/">pull-request based +workflows</a> +(e.g. sonar, git-pr, slurm2sql), <a href="https://coderefinery.github.io/testing/">automated +testing</a> (e.g. .travis.yml in +sonar, envkernel, nbscript, slurm2sql), <a href="http://cicero.xyz/v3/remark/0.14.0/github.com/coderefinery/modular-code-development/master/talk.md">modular code +development</a> +(e.g. ), <a href="https://coderefinery.github.io/social-coding/">open +licensing</a> +(e.g. everything).</p> +<p>Below you see some examples of NordicHPC tools. Some tools are useful +to anyone, but some may be more interesting to cluster administrators.</p> +<ul> +<li><a href="https://github.com/NordicHPC/nbscript">nbscrpt</a> is an attempt to +provide the familiar script interface to Jupyter notebooks.</li> +<li><a href="https://github.com/NordicHPC/sonar">sonar</a> and +<a href="https://github.com/NordicHPC/sonar-web">sonar-web</a> provide a way to +watch what is actually running on clusters.</li> +<li><a href="https://github.com/NordicHPC/git-pr">git-pr</a> saves you keystrokes +when making pull requests, though perhaps +<a href="https://cli.github.com/">cli.github.com</a> takes its place.</li> +<li><a href="https://github.com/NordicHPC/envkernel">slurm2sql</a> imports the HPC +Slurm job history to a sqlite3 database. It can be useful, even +individually, to get and analyze data about your jobs.</li> +<li><a href="https://github.com/NordicHPC/envkernel">envkernel</a> is a Jupyter +extension which lets you run your kernels in different environments, +such as Docker, Singularity, and virtual/conda environments more +easily.</li> +</ul> +<p>Do you have a nice tool that needs a home? You know what to do...</p> + + + + + Announcing the first Nordic-RSE conference + 2020-04-24T00:00:00+00:00 + 2020-04-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/24/nordic-rse-conference/ + + <p>A couple of years ago, <a href="https://neic.no/news/2018/05/04/building-a-community/">several CodeRefinery members and their +friends</a> +started discussing how a Nordic network of Research Software Engineers +(RSEs) could be established, and soon thereafter the <a href="https://nordic-rse.org/">Nordic-RSE +initiative</a> was launched. The idea was to +follow in the footsteps of very successful such initiatives in other +countries, most notably in <a href="https://society-rse.org/">the UK</a>, <a href="http://nl-rse.org/">the +Netherlands</a> and +<a href="http://www.de-rse.org/de/index.html">Germany</a>. For the past two years +we have been taking the first steps in this direction. A <a href="https://github.com/nordic-rse/RSE_intro_survey/blob/master/analysis/results_nordics_2018_narrative.ipynb">survey was +conducted</a> +to learn about the environment for people in RSE-related +roles. Information on <a href="https://nordic-rse.org/communities/map/">groups and people</a> +working in Nordic universities who identify as RSEs is being +collected, and local campaigns have been launched within several +universities for the creation of new RSE groups. To further grow the +emerging Nordic community of RSEs, we are now happy to announce that +<strong>the <a href="https://nordic-rse.org/events/conference/">first Nordic-RSE conference</a>, +Nordic-RSE2020, will take place in Stockholm between 1st and 2nd +December 2020</strong>!</p> +<h3 id="about-the-conference">About the conference</h3> +<p>At Nordic-RSE2020, we will bring together those that develop software +for research purposes and contribute to building the RSE +community. The program is not set in stone but we will have invited +talks, lightning talks, poster sessions and workshops on best +practices for creating research software and other popular RSE related +topics. We expect a large contribution from Nordic RSEs, but will also +invite international RSEs that can help our Nordic community take +shape.</p> +<p>The emphasis of the conference will be on learning from each other in +a supportive and relaxed atmosphere. The choice of conference venue +for Nordic-RSE2020, the THS student union building at KTH campus in +Stockholm, reflects our hopes: it has lots of spaces for casual +conversations and is equipped with fast internet and all the +facilities required for a successful conference.</p> +<h3 id="who-should-attend">Who should attend?</h3> +<p>Our aim is to reflect the diverse and emerging community of RSEs by +seeking input from all levels of experience and across a variety of +domains, genders, and ethnicities.</p> +<p>We welcome participation from:</p> +<ul> +<li>Researchers at any career stage who develop software for research +purposes;</li> +<li>Software developers working in a research context, whatever their +job title or field;</li> +<li>Those interested in advancing the understanding of how best to use +existing research software (e.g. with respect to scalability, +performance and/or reproducibility);</li> +<li>People from any organization providing tools, platforms or services +that benefit research software;</li> +<li>Anyone with a stake in research software (funders, publishers, +decision makers, etc).</li> +</ul> +<p>We especially encourage first-time presenters and can offer mentoring +and other support with preparing your contribution.</p> +<h3 id="getting-involved">Getting involved</h3> +<p>In order to make this a successful conference, we will need help from +volunteers to ensure that all the logistics and practicalities work +smoothly. What's in it for you? All conference helpers get a free +conference ticket! Please get in touch with the organizing committee +(nordic-rse-organizers@neic.no) if you would like to help or if you +have any questions on how to get involved with Nordic-RSE2020.</p> +<p>We will also need sponsors to cover costs, keep the conference fee as +low as possible and to be able to offer travel grants to younger +participants. We have already received generous offers for sponsorship +from the <a href="https://e-science.se/">Swedish e-Science Research Centre +(SeRC)</a>, the <a href="https://snic.se/">Swedish National Infrastructure +for Computing (SNIC)</a> and the <a href="https://essenceofescience.se/">Swedish e-science +collaboration (eSSENCE)</a>. By supporting +us, our sponsors are helping to raise awareness of the importance of +developing RSE career path in the Nordics.</p> +<h3 id="inviting-new-sponsors">Inviting new sponsors</h3> +<p>Nordic-RSE2020 is the first networking and community-building event of +Nordic-RSE. We will meet to network, to learn about best software +practices, reproducible research and open science, and to further +develop communication and project management skills required by RSEs.</p> +<p>RSEs are the connection between technology and research. If you want +to get a message directly to those who facilitate research with +technology, you want to sponsor this conference. Our attendees often +shape decisions about tools, contracts and approaches to research +software and computing – either directly or through their role in +advising, training and collaborating with researchers. In addition to +the chance to raise awareness of how your products or services are +relevant to modern research, sponsors will get mentions, visibility, +and depending on the sponsor package chosen, conference tickets and +contributed workshops, posters or short +talks. For +information on sponsorship see our +webpage [removed] or <a href="mailto:nordic-rse-organizers@neic.no">get in +touch</a>.</p> + + + + + CodeRefinery workshops moving online + 2020-04-24T00:00:00+00:00 + 2020-04-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/24/online-workshops-update/ + + <p>After cancelling all our planned in-person workshops this spring due +to the ongoing pandemic, we decided to make the best of the situation +and start focusing our efforts on developing an online workshop +training programme. We wanted to start small while learning the +mechanics of online teaching, so we began by offering an online +workshop covering only the +<a href="https://coderefinery.github.io/git-intro/">Git-intro</a> lesson to a +group of around 25 participants on April 7-8. Neither teaching nor +attending online workshops offers quite the same experience as +attending in-person events, but we were pleasantly surprised about how +well the workshop went and it definitely gave a boost to our ambitions +to move more of our traditional workshops online. Online workshops will +also provide a means for us to <em>scale up</em> and reach a larger audience +than possible with in-person workshops.</p> +<p>We learned many important lessons in this first experiment and we +tried to summarize them all in a <a href="https://coderefinery.org/blog/2020/04/14/first-online-workshop/">previous +article</a>. We +hope that these notes can be of help to others who are going online +with some of their teaching.</p> +<h3 id="new-notify-me-form">New notify-me form</h3> +<p>We expect to be delivering many more online workshops also after +covid-19 restrictions are lifted and life starts returning to +normal. We realized that this means that our old notify-me form has +become obsolete - it is no longer enough to only indicate the +city in which you want to attend a workshop. So we created a <a href="https://coderefinery.org/workshops/upcoming/#notify-me">new more +fine-grained notify-me +form</a> where +people can sign up for updates about upcoming online and/or in-person +workshops and also indicate which lessons they are most interested +in. If you want to be informed of upcoming workshops, please sign +up.</p> +<h3 id="join-an-online-workshops-as-a-helper">Join an online workshops as a helper</h3> +<p>The new notify-me form now also has an option to indicate that you are +interested in participating as a helper or instructor. Instructors +always need help and this is even more relevant for our online +workshops. Helpers assist learners in overcoming technical problems +and work through challenges or questions they may have. Ideally, we +need at least one helper per breakout room (4-5 learners). Helpers +don't have to be familiar with all the lesson material - experience +with even just one lesson/tool/approach is sufficient.</p> +<p>Have you already particated in one or more workshops, and now want to +help us in spreading better software development practices to the world? +Register as <strong>helper</strong> for upcoming online or in-person workshops in our +new <a href="https://coderefinery.org/workshops/upcoming/#notify-me">notify-me +form</a>. Remember +also that there is no better way to consolidate new knowledge than +teaching it to others!</p> +<h3 id="bring-your-own-breakout-room-helper">Bring your own breakout room/helper</h3> +<p>With online courses over video we could in principle aim at reaching a +larger scale than in-person workshops which are limited by room-size +and being visible and audible, but also by the number of helpers. In +online workshops the presence of helpers is no less important to make +sure that each breakout room has a helper to answer questions during +exercise sessions. We are considering to offer participants the +possibility to &quot;bring their own breakout room&quot; to the workshop. This +way they can collaborate on exercises with colleagues they already +know, if they prefer so. More importantly, they can assign one person +who is more experienced in the toolset presented to take the role as +helper. Participating as helper not only means &quot;giving&quot; but is also a +great learning experience: both in the tools and in solving problems +and supporting and teaching other learners.</p> +<h3 id="upcoming-online-workshops">Upcoming online workshops</h3> +<p>We plan to arrange two full online CodeRefinery workshops covering all +our material before the summer. The format will be to split the +workshop content over six half-days spread over two weeks.</p> +<p>In May we will do our first full CodeRefinery workshop, starting on a +Tuesday, and ending on a Thursday the week after. Drawing on the +experience from this first full workshop, the plan is to deliver a +second online workshop in June.</p> +<p>Sign up for the <a href="https://coderefinery.org/workshops/upcoming/#notify-me">notify-me +form</a> if you +want to receive an email as soon as registration opens for these +workshoops!</p> + + + + + Rebase vs merge + 2020-04-24T00:00:00+00:00 + 2020-04-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/24/rebase-vs-merge/ + + <p>During a CodeRefinery workshop you might have heard an instructor say +that you can merge or alternatively rebase, like merge and rebase are +two equivalent operations. Clearly, they are not, but should we treat +the operations equally?</p> +<p>Let us take a closer look at rebase and merge, how they differ and in +which situations they are an advantage to use.</p> +<h3 id="rebase">Rebase</h3> +<p>Rebase gives you the opportunity to move the base of a branch to a new +base. Here we have two branches, <code>master</code> and <code>feature_A</code>.</p> +<p><img src="/blog/image_01.png" alt="Initial tree" title="Initial git commit tree" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<p>We can rebase the <code>feature_A</code> branch to the last commit in <code>master</code>:</p> +<pre data-lang="bash" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#5597d6;">git</span><span> checkout feature_A +</span><span style="color:#5597d6;">git</span><span> rebase master +</span></code></pre> +<p>The result will look like this.</p> +<p><img src="/blog/image_02.png" alt="First rebase tree" title="git commit tree +after rebase" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<p>Checking out <code>master</code> again, we can merge <code>feature_A</code> with <code>master</code>. The merge will by default be a fast-forward. We end up with a linear history, which many find attractive as it is easy to follow. The disadvantage is that we rewrite the history as the commit hashes changes.</p> +<p><img src="/blog/image_03.png" alt="FF-merge tree" title="git commit tree after fast-forward merge" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<h3 id="merge">Merge</h3> +<p>If we don’t use rebase, but just merge <code>feature_A</code> with <code>master</code>, we get an merge commit, a new commit pointing to the previous last commit in <code>master</code> and the previous last commit in <code>feature_A</code>.</p> +<p><img src="/blog/image_04.png" alt="Plain merge tree" title="git commit tree after regular merge" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<p>If we only do merges, we show the true story of the repository, how the code came to be. As the repository grows with new branches, maybe more contributors, following the history can become very challenging. The git graph can look like the tracks of a large railway station, where it can be hard to find the ancestors of a feature.</p> +<h3 id="mixing-rebase-and-merge">Mixing rebase and merge</h3> +<p>Instead of sticking to either rebase or merge, we could use both operations, but establish principles for when we will use merge and under which conditions we use rebase:</p> +<ul> +<li>When we merge a semantic unit to <code>master</code>, we use merge.</li> +<li>When patch features, or do general corrections, we use rebase.</li> +</ul> +<p>How will this look?</p> +<h4 id="merge-revisited">Merge revisited</h4> +<p>Let us say we have created a new function or class, something that belongs together - a semantic unit we call <code>feature_B</code>. The base of <code>feature_B</code> is the last commit in <code>master</code>.</p> +<p><img src="/blog/image_05.png" alt="Master feature-b tree" title="git commit tree with master and a new feature" />{:class=&quot;img-responsive&quot; style=&quot;max-width:70%&quot;}</p> +<p>If we do a merge, git will by default do a fast-forward merge. Following our newly stated policy, we want this merge to be a merge commit. Consequently, we add the option --no-ff to the merge command:</p> +<pre data-lang="sh" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#5597d6;">git</span><span> checkout master +</span><span style="color:#5597d6;">git</span><span> merge feature_B</span><span style="color:#5597d6;"> --no-ff +</span></code></pre> +<p>Alternatively, we can configure git to default do merge commits, by setting the configuration to not do fast-forward by default. Here as a global setting, spanning all our projects:</p> +<pre data-lang="sh" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#5597d6;">git</span><span> config</span><span style="color:#5597d6;"> --global</span><span> branch.master.mergeoptions</span><span style="color:#5597d6;"> --no-ff +</span></code></pre> +<p>The result will be like this, where the feature is clearly visible in a feature path, presumably with well written commit messages explaining what has been added in this path of work.</p> +<p><img src="/blog/image_06.png" alt="No-ff merge tree" title="git commit tree after --no-ff merge" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<h4 id="rebase-revisited">Rebase revisited</h4> +<p>Now we take the case where we checkout a branch from C1 to do some corrections. While we were doing the corrections, at least before we were able to complete the corrections, <code>master</code> moved to M1 as in the picture above. A merge commit will add unnecessary complexity to the story of our project. We are not adding a new semantic unit, just fixing things that got wrong in the first phase. That we started to fix things from C1 is not necessarily a important information to keep for the project.</p> +<p><img src="/blog/image_07.png" alt="No-ff merge tree plus patch" title="git commit tree with a merged feature branch and a patch branch in master" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<p>Following our second principle, we rebase the fix_typos branch to M1. Then we do a merge, but this time as fast-forward. If we have configured merge for not doing fast forward when possible, as the configuration statement above, we need to add the --ff-only argument:</p> +<pre data-lang="sh" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#5597d6;">git</span><span> checkout fix_types +</span><span style="color:#5597d6;">git</span><span> rebase master +</span><span style="color:#5597d6;">git</span><span> checkout master +</span><span style="color:#5597d6;">git</span><span> merge fix_typos</span><span style="color:#5597d6;"> --ff-only +</span></code></pre> +<p>The git graph will now look like this:</p> +<p><img src="/blog/image_08.png" alt="No-ff merge plus rebase" title="git commit tree with a merged feature branch and a rebased patch branch" />{:class=&quot;img-responsive&quot; style=&quot;max-width:100%&quot;}</p> +<h3 id="rebase-vs-merge-revisited">Rebase vs merge revisited</h3> +<p>Rebase and merge serve two different purposes. We can use this to our advantage to create a clear story, a more readable git log (It is important to create a story, remember?). By using the above principles as guidance, we will become more conscious of where these operations will serve us or add more clutter. For instance, we might conclude that rebasing semantic branches, but insisting on a merge commit, is perfectly fine, because it is where the feature (the semantic entity) enters the <code>master</code> branch which is important, not where the development first started. Features will clearly stand out as a visible pattern in a git repository following such a practice.</p> +<p><a href="https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa">[1] Getting Solid at Merge vs Rebase</a></p> + + + + + Research Software Hour + 2020-04-24T00:00:00+00:00 + 2020-04-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/24/rsh/ + + <p>CodeRefinery is a project that holds workshops, but computing is an +experience. As much as we teach in workshops, it's not enough: these +workshops are hands-on, but still can't show our whole daily thought +process. They also aren't the right format for everyone and can't +reach enough people at once. In order to extend our reach, we are +trying a streaming web show <a href="https://researchsoftwarehour.github.io">Research Software Hour</a> that combines +the spirit of CodeRefinery with real-life examples from our daily +work - and hopefully, some entertainment, too. We hope watchers +experience the <em>spirit of research software and computing</em>.</p> +<p>We knew that there had to be a way to reach more people, so considered +streaming and decided to do it together: it's more fun and more +engaging for the audience, we can discuss, ask each other questions, +show each other new tools we discovered, learn from each other, +hopefully teach the audience some. We will certainly be learning a +lot from the audience, too.</p> +<p>We wish to show why we enjoy research software and computing and how +you can, too. <strong>This is an interactive show, and a big part is +answering your questions. We encourage you to submit your own codes +and scripts and repositories which we can constructively review on +stream. You'll get positive ideas and everyone will benefit.</strong> We are +not experts in everything and will also show you the errors we make +and how we get through them and also critically review our own codes.</p> +<p>We are starting this as a two-person project (Richard Darst from Aalto +University, Finland, and Radovan Bast from UiT the Arctic University +of Norway, both working as part of the CodeRefinery project). This is +an open source production - anyone can help us develop Research +Software Hour, too. There are many different ways to contribute, from +streaming to developing material to community building. Join us with +questions, answers, ideas, code!</p> +<p>Read more at <a href="https://researchsoftwarehour.github.io/">the website</a> +and join us each Tuesday at 20:30 CEST on Twitch.</p> + + + + + Work on blog posts + 2020-04-24T00:00:00+00:00 + 2020-04-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/blog-posts/ + + <p>CodeRefinery is organizing a one day online &quot;open house&quot; dedicated to +collaboratively writing up blog posts which have been in +the pipeline for some time and which will be published in the next +CodeRefinery newsletter.</p> +<p>Tentative list of articles:</p> +<ul> +<li>Online lessons, what we're working on, how we'll be delivering online workshops</li> +<li>Merge vs rebase</li> +<li>Nordic-RSE conference</li> +<li>NordicHPC tools</li> +</ul> +<p>Anyone who would like to contribute to these articles or suggests new +topics is welcome to join!</p> +<p>We will collect notes in a <a href="https://hackmd.io/46XkhCr5T4yahKprL6N01A">shared +document</a>. +Please note that this document will be archived in our <a href="https://github.com/coderefinery/open-house">Open House +event repository</a>.</p> +<p>We first meet online at 9:00 am (UTC+1) via video (connection link +will be shared in our <a href="https://hackmd.io/46XkhCr5T4yahKprL6N01A">shared +document</a> and then work on +the instructor training material. During the day, we will coordinate +the work through our <a href="https://coderefinery.zulipchat.com">Zulip chat</a> +with possibilities to further discuss via video if necessary.</p> +<p>We conclude the day around 4:00 pm (UTC+1) by writing a short +/summary in our <a href="https://hackmd.io/46XkhCr5T4yahKprL6N01A">shared +document</a>.</p> + + + + + Lessons learned from running our first online workshop + 2020-04-14T00:00:00+00:00 + 2020-04-14T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/blog/2020/04/14/first-online-workshop/ + + <p>April 7-8, 2020, we gave our first online workshop on <a href="https://coderefinery.github.io/2020-04-07-online/">introduction to +Git</a> (2 x 3 hours) with 22 +participants and we plan to deliver many more such workshops on a number of +topics based on our <a href="https://coderefinery.org/lessons/">lessons</a>.</p> +<p>The workshop went well. Online feels slower, but has a different set of +advantages (we discussed later whether we actually covered significantly less +than during an in-person workshop and we were not sure the pace was actually +slower).</p> +<p>Here we wish to share with the community our lessons learned: What worked well +and what we need and plan to improve. We use bullet point format for brevity.</p> +<p>It's maybe obvious but aiming for less material at a calm pace is better than +trying to cover all material too fast. During the online workshop we will +manage to traverse less material than in-person and it's good to prepare for +that. For 1 hour session, plan for 30 minutes. The rest will be questions, +issues, and breaks.</p> +<h3 id="breaks-and-ice-breaker">Breaks and ice-breaker</h3> +<ul> +<li>5 minute breaks were too short, better 10 minutes or longer, at least once an +hour.</li> +<li>We have started with a demonstration of the tools (Zoom and HackMD) and this +was probably time well spent (thanks to Greg Wilson's excellent +<a href="https://www.rstudio.com/resources/webinars/teaching-online-at-short-notice/">presentation</a> +and references therein).</li> +<li>The HackMD ice-breaker was for each participant to write their name, +operating system, experience with Git, and optionally what they are working +on. We found it useful to pre-fill the HackMD section with the participants' +initials to avoid that all cursors start from the same place and everybody +hesitates to write something.</li> +<li>We should have included a &quot;ice-breaker&quot; break-out room session where persons can talk +about something informally considering that the first time participants +possibly ever experience a breakout room is in the first exercise (they may not +know how breakout rooms work, they need to find the exercise in the material, +they don't know anybody). We want people to feel comfortable and to ask +questions.</li> +</ul> +<h3 id="solving-technical-issues">Solving technical issues</h3> +<p>Online, the initial problems can end up derailing the whole day's schedule, and +take longer to get resolved. Compensate by ensuring they are set up in advance, +which is also easier to do online.</p> +<ul> +<li>On day 1 we spent some time debugging tech issues and for the next event we +plan to create a 5-10 minute video &quot;setting up and configuring Git&quot; and ask +all participants to show up at a session one day before the workshop to +demonstrate that all is set up to not lose any time during the actual workshop.</li> +<li>For solving technical problems we found it useful to move the participant +into a breakout room with a helper where the participant can share screen and +this way we could solve problems without disrupting the main flow too much. +<ul> +<li>However, if one has previously created groups for group work, the only way +to send helper-instructor pair to room is to delete all the existing rooms +or un-assign all participants. It's not possible to launch just a single room +out of several existing rooms.</li> +<li>We think that when pre-making the rooms, you have to create some empty +spares for this.</li> +</ul> +</li> +</ul> +<h3 id="helpers">Helpers</h3> +<p>Without limitations on distance, we can involve more helpers. With more use of +breakout rooms, they have a more clear job and it could be a great opportunity +to pay forward but also learn more for someone who finished CodeRefinery a +little while ago.</p> +<ul> +<li>To keep a high quality of the workshop each group should have one +helper/instructor. But this places limits on scalability - we can't have too +many participants and must maintain a 1:5 helper:participant ratio.</li> +<li>Helpers were important for our breakout room systems to work. They don't have +to be the absolute experts: primary instructors can rotate between breakout +rooms and help with hard questions, also having typically more experience with the material +and exercise goals.</li> +<li>Helpers can be recruited from previous online workshops, and perhaps that +could even be a requirement: &quot;price of workshop is to attend a later workshop +as helper&quot; (not a direct lesson learned from this workshop).</li> +</ul> +<h3 id="breakout-sessions">Breakout sessions</h3> +<p>Breakout rooms are pretty good, but as a host, the Zoom mechanics take some +getting used to. We found an interesting semi-flipped classroom mechanic.</p> +<ul> +<li>Fewer longer (15 min) breakout sessions were better than many short ones +(5-10 min).</li> +<li>This also means that we should group some exercises and not have them spread +out every 10 minutes.</li> +<li>On day 1 we tried to group participants according to operating systems but we +got better feedback and it felt better after grouping participants either +randomly or even better according to experience.</li> +<li>Groups with 4-5 persons seem to work well, with one helper.</li> +<li>In breakout rooms encourage participants to share their screen and other +participants to comment but also make sure that it's not only one participant +sharing all the time at every group session.</li> +<li>Some exercises can be done in driver-navigator mode, where one participant +who shares screen types in the commands and other participants in the room +discuss and recommend what to type.</li> +<li>Some people just wanted to work alone, that's OK too.</li> +<li><strong>Method 1: group work</strong> +<ul> +<li>Most teaching done in main room (this is important for the most important +and delicate topics).</li> +<li>Participants are in breakout rooms, working independently, sharing +screen/asking for help when they need to.</li> +</ul> +</li> +<li><strong>Method 2: flipped classroom</strong> (&quot;flipped classroom&quot; isn't quite the right +term though) +<ul> +<li>Initial motivation in the main room.</li> +<li>Switch to breakout rooms early to go through the type-along exercises.</li> +<li>This only works when things are clear enough that people can't get too lost.</li> +<li>(*) One learner shares screen, others follow along discussing, asking +question, and typing along themselves. Emphasize &quot;it's easiest to share +the screen since you don't have to do the thinking&quot;.</li> +<li>(*) Instructor flips between the rooms every 1-2 minutes answering hard +questions and following progress.</li> +<li>Join the end for a wrap-up where best questions are discussed.</li> +<li>Helpers and instructors should write down the most important questions to +discuss afterwards.</li> +</ul> +</li> +<li>In reality, use the best of both depending on your specific lesson, +especially the asterisk (*) points! +<ul> +<li>Encourage the instructor to cycle through breakout rooms to watch +discussions and help out.</li> +<li>Many interesting questions were asked in breakout rooms but we did not +write them down, they could have been interesting for everybody. They +should be written down and discussed as a follow-up in method (2).</li> +</ul> +</li> +<li>Host can lose host rights sometimes. +<ul> +<li>Host should not enter breakout rooms, at least if they are not the original +host because then hostship is transferred to original host.</li> +<li>In our case the person who created the meeting room transferred hostship to +another instructor who then organized the breakout room but we experienced +a technical glitch and hostship fell back to the first person and we lost the +room assignments and for a minute or two the room creator did not even notice +this (was busy helping out a participant). This means that ideally the person +who is the main host should also create the meeting room, if possible.</li> +<li>Richard: at least when I was main host in another meeting, I could join a +breakout room and not lose host. I think. Needs more testing.</li> +</ul> +</li> +<li>Co-hosts seem to be able to jump between rooms freely <em>after</em> first joining +the room they were originally assigned to (i.e. can't select any group from +the main room).</li> +<li>At one point, Zoom dropped the whole meeting and everyone re-joined +(automatically). Pre-assembled breakout rooms got lost, which was annoying.</li> +</ul> +<h3 id="hackmd">HackMD</h3> +<p><strong>HackMD was a vital resource</strong>, but you should have someone dedicated to watching it and keeping it organized.</p> +<ul> +<li>We were impressed how well it worked, holding up with 25 persons editing +without noticeable lag.</li> +<li>If a question was too advanced or we had no time to answer it, we encouraged +to write the question in HackMD (or wrote it ourselves there) so that it +could be answered later.</li> +<li>Asking and replying question in HackMD worked well. It worked so well that +even in physical workshops we should use HackMD for questions that helpers +can answer!</li> +<li>It gives the possibility to answer at different levels of complexity in +successive bullets, so that each participant can read until satisfied with +the answer.</li> +<li>Students can come back after the course and find better researched answers, +if the in-course answer is unsatisfactory.</li> +<li>Make sure that the HackMD contents, without any identifying information, can +be made public after the course.</li> +<li>Instead of asking questions in a particular section of the HackMD and +searching and scrolling it was better to ask questions <em>always at the current +bottom</em> of the document. Add new section headings as you start new sections.</li> +<li>Some questions on HackMD were a bit off topic (but still very good questions) +and some answers probably looked confusing so some questions can be postponed +for after the video call and answered later.</li> +<li>Participants should be asked to give feedback after each day at the end of +the HackMD. One positive experience, one thing to improve, as usual.</li> +</ul> +<h3 id="chat">Chat</h3> +<p>The chat window in the Zoom client is useful because it can provide multiple +ways to get information for different learning styles. However, it is not +threaded and you have to keep it from getting out of hand. Better for detailed +questions to go into HackMD.</p> +<ul> +<li>It helped to direct most questions and answers to HackMD and only short +administrative questions via chat. Participants should not be asked to watch +both the chat and the document.</li> +<li>The chat can be used for formative assessment questions where participants +are asked to vote for correct answers in a multiple-choice question.</li> +<li>Practical announcements/instructions should be provided both written and +spoken, to reduce chance they are missed.</li> +<li>The recommended signals (raise hand, \hand, red/yellow &quot;sticky&quot; notes) should +not only be communicated at the beginning but also written somewhere and +easily findable.</li> +</ul> +<h3 id="organization">Organization</h3> +<p>Online, there are more things to think about, but also more ways to communicate +(they go together). To compensate, have enough people and clear roles about who +does what.</p> +<ul> +<li>We used a private chat as back-channel to coordinate among instructors and +helpers. We kept the chat private to not reveal any personal information we +may need to share but we noticed later that most/all of what we talked about +could have been and <em>should have been</em> public (though not necessarily to +students, but just for reasons of cognitive load). We never needed names and +the only sensitive information were room connection details.</li> +<li>On day 1 we failed/forgot to assign clear roles to ourselves; we were all a +bit overwhelmed with the chat, plus the HackMD, plus answering questions on +the microphone, plus some of us preparing and giving the lectures. Next time we +will try:</li> +<li>Roles during main lectures: +<ul> +<li>Host person in charge of overall schedule, timekeeping, breakout rooms and +Zoom chat/participant reactions, clearing feedback, balancing answering +questions, moderating, etc.</li> +<li>Instructor and upcoming instructors (they can't at the same time prepare +their material, follow questions, and do one of the other jobs). One of our +instructors managed to do both: teach and manage breakout rooms, so it is +possible, but easier if somebody else takes the charge.</li> +<li>One person watching and formatting the HackMD (but more persons might be +needed if there are many questions).</li> +<li>Backup expert helpers for problems that require intensive debugging (at +least needed at the beginning).</li> +</ul> +</li> +<li>Roles during breakouts (this is more flexible): +<ul> +<li>Host in main room watching stuff.</li> +<li>One helper per room leading.</li> +<li>Lesson instructor hopping from room to room answering advanced questions +and also probing the general mood.</li> +</ul> +</li> +<li>Host makes all instructors and helpers co-hosts so that they can move between +rooms.</li> +</ul> +<h3 id="screencasting">Screencasting</h3> +<p>The requirements and recommendations are roughly like in-person.</p> +<ul> +<li>Showing history of commands via tmux or similar, coupled with <a href="https://coderefinery.github.io/manuals/instructor-tech-setup/">displaying the +last commands +typed</a> +really helps.</li> +<li>Gray/dark background terminal looked better than light background terminal.</li> +</ul> +<h3 id="how-to-make-this-more-scalable">How to make this more scalable?</h3> +<ul> +<li>This time we did not plan to record or stream but we nevertheless asked the +participants in a pre-workshop survey: 2/20 preferred not to have the +workshop streamed, 1/20 didn't want it recorded.</li> +<li>The workshop was great, but we should think more about how to reach more +people. A small workshop where we can individually interact with everyone is +amazing, but the promise of digital technology is that we can reach everyone in +the world. How can we get the best of both? Can we also do something for +everyone else who can't attend but might want to watch later? This is +something to think about.</li> +<li>How can we make this more scalable? This workshop was quite labor-intensive. +You could probably do it with two instructors (instructor + HackMD watcher) + 1 +zoom expert (host + general helper) + a lot of semi-experienced helpers (1:5 +ratio) + a few debuggers to help with tech support the first hour (not +overlapping with instructor or HackMD watcher).</li> +<li>Imagine if we had main room recorded (or even streamed), but breakout rooms +not. People can still ask and interact with privacy in the small rooms - and +we take these comments/issues back to the main room. Other people following +along later can do the exercises at their own pace, and hear the +intros/conclusions in the main rooms, and it might feel a bit like a small +class.</li> +</ul> + + + + + Work on instructor training material + 2020-03-24T00:00:00+00:00 + 2020-03-24T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/instructor-training-material/ + + <p>CodeRefinery is organizing a one day online &quot;open house&quot; dedicated to +work together on revising and +improving <a href="https://coderefinery.github.io/instructor-training/">our instructor training +material</a>. +<a href="https://github.com/coderefinery/instructor-training/issues">Issues are filed +here</a>, +notes from the first workshop can be in the <a href="https://hackmd.io/@doFoQYKqR623RI-YyXvmew/HJGgb_9VL">shared +document</a>, and we +are taking what each of us wants to work on. Input for the further +improvement are also very welcome.</p> +<p>Anyone who would like to contribute to the instructor training +material, or learn how to contribute to any CodeRefinery lesson in +general, is welcome!</p> +<p>We will collect nodes in a <a href="https://hackmd.io/@doFoQYKqR623RI-YyXvmew/HJGgb_9VL">shared +document</a>. +Please note that this document will be archived in our <a href="https://github.com/coderefinery/open-house">Open House +event repository</a>.</p> +<p>We first meet online at 9:00 am (UTC+1) via video (connection link +will be shared in our <a href="https://hackmd.io/@doFoQYKqR623RI-YyXvmew/HJGgb_9VL">shared +document</a> and +then work on the instructor training material. During the day, we will +coordinate the work through our <a href="https://coderefinery.zulipchat.com">Zulip +chat</a> with possibilities to +further discuss via video if necessary.</p> +<p>We conclude the day around 4:00 pm (UTC+1) by writing a short +blog/summary in our <a href="https://hackmd.io/@doFoQYKqR623RI-YyXvmew/HJGgb_9VL">shared +document</a>.</p> + + + + + Preparing for online teaching + 2020-03-20T00:00:00+00:00 + 2020-03-20T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/online-teaching/ + + <p>We will meet on <a href="https://kth-se.zoom.us/j/152239500">video</a> (9:00 am, UTC+1) +and <a href="https://coderefinery.zulipchat.com">chat</a> and discuss techniques, +solutions, and tricks for online teaching and collect our notes in a <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared +document</a>.</p> +<p>Anyone who would like to contribute or learn is most welcome!</p> +<p>We will conclude the day around 4:00 pm (UTC+1) by writing a short blog/summary +in our <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>.</p> + + + + + Collaborative work on the website + 2020-02-11T00:00:00+00:00 + 2020-02-11T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/website/ + + <h3 id="welcome-to-the-second-coderefinery-open-house">Welcome to the second CodeRefinery Open House!</h3> +<p>Following up on our successful first CodeRefinery Open House, we will have our +second online Open house!</p> +<p>The idea behind this event is to work together on revising and improving +<a href="https://coderefinery.org">coderefinery.org</a>. <a href="https://github.com/coderefinery/coderefinery.org/issues">Issues are +filed</a> and we are +taking what each of us wants to work on. Input for the further improvement are +very welcome!</p> +<p>Anyone who would like to contribute, or learn how to contribute to +<a href="https://coderefinery.org">coderefinery.org</a> is very welcome to join.</p> +<p>We will collect nodes in a <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>. +Please note that this document will be archived in our +<a href="https://github.com/coderefinery/open-house">Open House event repository</a>.</p> +<p>We first meet online at 9:00 am (UTC+1) via video (connection link will be +shared in our <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>) and +then work on CodeRefinery training material. During the day, we will coordinate +the work through our <a href="https://coderefinery.zulipchat.com">Zulip chat</a> with +possibilities to further discuss via video if necessary.</p> +<p>We conclude the day around 4:00pm (UTC+1) by writing a short blog/summary in +our <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>.</p> + + + + + Collaborative work on the training material + 2019-12-13T00:00:00+00:00 + 2019-12-13T00:00:00+00:00 + + + + + Unknown + + + + + + https://coderefinery.org/open-house/training-material/ + + <h3 id="welcome-to-the-first-coderefinery-open-house">Welcome to the first CodeRefinery Open House!</h3> +<p>The idea behind this event is to bring together people who are interesting in +contributing to the <a href="https://coderefinery.org/lessons/">CodeRefinery training +material</a>.</p> +<p>Anyone who would like to contribute, learn how to contribute to the +CodeRefinery training material is very welcome to join.</p> +<p>We will collect nodes in a <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>. +Please note that this document will be archived in our +<a href="https://github.com/coderefinery/open-house">Open House event repository</a>.</p> +<p>We first meet online at 9:00 am (UTC+1) via video (connection link will be +shared in our <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>) and +then work on CodeRefinery training material. During the day, we will coordinate +the work through our <a href="https://coderefinery.zulipchat.com">Zulip chat</a> with +possibilities to further discuss via video if necessary.</p> +<p>We conclude the day around 4:00pm (UTC+1) by writing a short blog/summary in +our <a href="https://hackmd.io/1Sso1UFMTXKihv1sedsTIA">shared document</a>.</p> + + + + diff --git a/blog/2020/04/14/first-online-workshop/index.html b/blog/2020/04/14/first-online-workshop/index.html new file mode 100644 index 00000000..9b591cd9 --- /dev/null +++ b/blog/2020/04/14/first-online-workshop/index.html @@ -0,0 +1,1152 @@ + + + + Lessons learned from running our first online workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from running our first online workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from running our first online workshop

+ + + +
+ +

April 7-8, 2020, we gave our first online workshop on introduction to +Git (2 x 3 hours) with 22 +participants and we plan to deliver many more such workshops on a number of +topics based on our lessons.

+

The workshop went well. Online feels slower, but has a different set of +advantages (we discussed later whether we actually covered significantly less +than during an in-person workshop and we were not sure the pace was actually +slower).

+

Here we wish to share with the community our lessons learned: What worked well +and what we need and plan to improve. We use bullet point format for brevity.

+

It's maybe obvious but aiming for less material at a calm pace is better than +trying to cover all material too fast. During the online workshop we will +manage to traverse less material than in-person and it's good to prepare for +that. For 1 hour session, plan for 30 minutes. The rest will be questions, +issues, and breaks.

+

Breaks and ice-breaker

+
    +
  • 5 minute breaks were too short, better 10 minutes or longer, at least once an +hour.
  • +
  • We have started with a demonstration of the tools (Zoom and HackMD) and this +was probably time well spent (thanks to Greg Wilson's excellent +presentation +and references therein).
  • +
  • The HackMD ice-breaker was for each participant to write their name, +operating system, experience with Git, and optionally what they are working +on. We found it useful to pre-fill the HackMD section with the participants' +initials to avoid that all cursors start from the same place and everybody +hesitates to write something.
  • +
  • We should have included a "ice-breaker" break-out room session where persons can talk +about something informally considering that the first time participants +possibly ever experience a breakout room is in the first exercise (they may not +know how breakout rooms work, they need to find the exercise in the material, +they don't know anybody). We want people to feel comfortable and to ask +questions.
  • +
+

Solving technical issues

+

Online, the initial problems can end up derailing the whole day's schedule, and +take longer to get resolved. Compensate by ensuring they are set up in advance, +which is also easier to do online.

+
    +
  • On day 1 we spent some time debugging tech issues and for the next event we +plan to create a 5-10 minute video "setting up and configuring Git" and ask +all participants to show up at a session one day before the workshop to +demonstrate that all is set up to not lose any time during the actual workshop.
  • +
  • For solving technical problems we found it useful to move the participant +into a breakout room with a helper where the participant can share screen and +this way we could solve problems without disrupting the main flow too much. +
      +
    • However, if one has previously created groups for group work, the only way +to send helper-instructor pair to room is to delete all the existing rooms +or un-assign all participants. It's not possible to launch just a single room +out of several existing rooms.
    • +
    • We think that when pre-making the rooms, you have to create some empty +spares for this.
    • +
    +
  • +
+

Helpers

+

Without limitations on distance, we can involve more helpers. With more use of +breakout rooms, they have a more clear job and it could be a great opportunity +to pay forward but also learn more for someone who finished CodeRefinery a +little while ago.

+
    +
  • To keep a high quality of the workshop each group should have one +helper/instructor. But this places limits on scalability - we can't have too +many participants and must maintain a 1:5 helper:participant ratio.
  • +
  • Helpers were important for our breakout room systems to work. They don't have +to be the absolute experts: primary instructors can rotate between breakout +rooms and help with hard questions, also having typically more experience with the material +and exercise goals.
  • +
  • Helpers can be recruited from previous online workshops, and perhaps that +could even be a requirement: "price of workshop is to attend a later workshop +as helper" (not a direct lesson learned from this workshop).
  • +
+

Breakout sessions

+

Breakout rooms are pretty good, but as a host, the Zoom mechanics take some +getting used to. We found an interesting semi-flipped classroom mechanic.

+
    +
  • Fewer longer (15 min) breakout sessions were better than many short ones +(5-10 min).
  • +
  • This also means that we should group some exercises and not have them spread +out every 10 minutes.
  • +
  • On day 1 we tried to group participants according to operating systems but we +got better feedback and it felt better after grouping participants either +randomly or even better according to experience.
  • +
  • Groups with 4-5 persons seem to work well, with one helper.
  • +
  • In breakout rooms encourage participants to share their screen and other +participants to comment but also make sure that it's not only one participant +sharing all the time at every group session.
  • +
  • Some exercises can be done in driver-navigator mode, where one participant +who shares screen types in the commands and other participants in the room +discuss and recommend what to type.
  • +
  • Some people just wanted to work alone, that's OK too.
  • +
  • Method 1: group work +
      +
    • Most teaching done in main room (this is important for the most important +and delicate topics).
    • +
    • Participants are in breakout rooms, working independently, sharing +screen/asking for help when they need to.
    • +
    +
  • +
  • Method 2: flipped classroom ("flipped classroom" isn't quite the right +term though) +
      +
    • Initial motivation in the main room.
    • +
    • Switch to breakout rooms early to go through the type-along exercises.
    • +
    • This only works when things are clear enough that people can't get too lost.
    • +
    • (*) One learner shares screen, others follow along discussing, asking +question, and typing along themselves. Emphasize "it's easiest to share +the screen since you don't have to do the thinking".
    • +
    • (*) Instructor flips between the rooms every 1-2 minutes answering hard +questions and following progress.
    • +
    • Join the end for a wrap-up where best questions are discussed.
    • +
    • Helpers and instructors should write down the most important questions to +discuss afterwards.
    • +
    +
  • +
  • In reality, use the best of both depending on your specific lesson, +especially the asterisk (*) points! +
      +
    • Encourage the instructor to cycle through breakout rooms to watch +discussions and help out.
    • +
    • Many interesting questions were asked in breakout rooms but we did not +write them down, they could have been interesting for everybody. They +should be written down and discussed as a follow-up in method (2).
    • +
    +
  • +
  • Host can lose host rights sometimes. +
      +
    • Host should not enter breakout rooms, at least if they are not the original +host because then hostship is transferred to original host.
    • +
    • In our case the person who created the meeting room transferred hostship to +another instructor who then organized the breakout room but we experienced +a technical glitch and hostship fell back to the first person and we lost the +room assignments and for a minute or two the room creator did not even notice +this (was busy helping out a participant). This means that ideally the person +who is the main host should also create the meeting room, if possible.
    • +
    • Richard: at least when I was main host in another meeting, I could join a +breakout room and not lose host. I think. Needs more testing.
    • +
    +
  • +
  • Co-hosts seem to be able to jump between rooms freely after first joining +the room they were originally assigned to (i.e. can't select any group from +the main room).
  • +
  • At one point, Zoom dropped the whole meeting and everyone re-joined +(automatically). Pre-assembled breakout rooms got lost, which was annoying.
  • +
+

HackMD

+

HackMD was a vital resource, but you should have someone dedicated to watching it and keeping it organized.

+
    +
  • We were impressed how well it worked, holding up with 25 persons editing +without noticeable lag.
  • +
  • If a question was too advanced or we had no time to answer it, we encouraged +to write the question in HackMD (or wrote it ourselves there) so that it +could be answered later.
  • +
  • Asking and replying question in HackMD worked well. It worked so well that +even in physical workshops we should use HackMD for questions that helpers +can answer!
  • +
  • It gives the possibility to answer at different levels of complexity in +successive bullets, so that each participant can read until satisfied with +the answer.
  • +
  • Students can come back after the course and find better researched answers, +if the in-course answer is unsatisfactory.
  • +
  • Make sure that the HackMD contents, without any identifying information, can +be made public after the course.
  • +
  • Instead of asking questions in a particular section of the HackMD and +searching and scrolling it was better to ask questions always at the current +bottom of the document. Add new section headings as you start new sections.
  • +
  • Some questions on HackMD were a bit off topic (but still very good questions) +and some answers probably looked confusing so some questions can be postponed +for after the video call and answered later.
  • +
  • Participants should be asked to give feedback after each day at the end of +the HackMD. One positive experience, one thing to improve, as usual.
  • +
+

Chat

+

The chat window in the Zoom client is useful because it can provide multiple +ways to get information for different learning styles. However, it is not +threaded and you have to keep it from getting out of hand. Better for detailed +questions to go into HackMD.

+
    +
  • It helped to direct most questions and answers to HackMD and only short +administrative questions via chat. Participants should not be asked to watch +both the chat and the document.
  • +
  • The chat can be used for formative assessment questions where participants +are asked to vote for correct answers in a multiple-choice question.
  • +
  • Practical announcements/instructions should be provided both written and +spoken, to reduce chance they are missed.
  • +
  • The recommended signals (raise hand, \hand, red/yellow "sticky" notes) should +not only be communicated at the beginning but also written somewhere and +easily findable.
  • +
+

Organization

+

Online, there are more things to think about, but also more ways to communicate +(they go together). To compensate, have enough people and clear roles about who +does what.

+
    +
  • We used a private chat as back-channel to coordinate among instructors and +helpers. We kept the chat private to not reveal any personal information we +may need to share but we noticed later that most/all of what we talked about +could have been and should have been public (though not necessarily to +students, but just for reasons of cognitive load). We never needed names and +the only sensitive information were room connection details.
  • +
  • On day 1 we failed/forgot to assign clear roles to ourselves; we were all a +bit overwhelmed with the chat, plus the HackMD, plus answering questions on +the microphone, plus some of us preparing and giving the lectures. Next time we +will try:
  • +
  • Roles during main lectures: +
      +
    • Host person in charge of overall schedule, timekeeping, breakout rooms and +Zoom chat/participant reactions, clearing feedback, balancing answering +questions, moderating, etc.
    • +
    • Instructor and upcoming instructors (they can't at the same time prepare +their material, follow questions, and do one of the other jobs). One of our +instructors managed to do both: teach and manage breakout rooms, so it is +possible, but easier if somebody else takes the charge.
    • +
    • One person watching and formatting the HackMD (but more persons might be +needed if there are many questions).
    • +
    • Backup expert helpers for problems that require intensive debugging (at +least needed at the beginning).
    • +
    +
  • +
  • Roles during breakouts (this is more flexible): +
      +
    • Host in main room watching stuff.
    • +
    • One helper per room leading.
    • +
    • Lesson instructor hopping from room to room answering advanced questions +and also probing the general mood.
    • +
    +
  • +
  • Host makes all instructors and helpers co-hosts so that they can move between +rooms.
  • +
+

Screencasting

+

The requirements and recommendations are roughly like in-person.

+
    +
  • Showing history of commands via tmux or similar, coupled with displaying the +last commands +typed +really helps.
  • +
  • Gray/dark background terminal looked better than light background terminal.
  • +
+

How to make this more scalable?

+
    +
  • This time we did not plan to record or stream but we nevertheless asked the +participants in a pre-workshop survey: 2/20 preferred not to have the +workshop streamed, 1/20 didn't want it recorded.
  • +
  • The workshop was great, but we should think more about how to reach more +people. A small workshop where we can individually interact with everyone is +amazing, but the promise of digital technology is that we can reach everyone in +the world. How can we get the best of both? Can we also do something for +everyone else who can't attend but might want to watch later? This is +something to think about.
  • +
  • How can we make this more scalable? This workshop was quite labor-intensive. +You could probably do it with two instructors (instructor + HackMD watcher) + 1 +zoom expert (host + general helper) + a lot of semi-experienced helpers (1:5 +ratio) + a few debuggers to help with tech support the first hour (not +overlapping with instructor or HackMD watcher).
  • +
  • Imagine if we had main room recorded (or even streamed), but breakout rooms +not. People can still ask and interact with privacy in the small rooms - and +we take these comments/issues back to the main room. Other people following +along later can do the exercises at their own pace, and hear the +intros/conclusions in the main rooms, and it might feel a bit like a small +class.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/04/24/nordic-rse-conference/index.html b/blog/2020/04/24/nordic-rse-conference/index.html new file mode 100644 index 00000000..6f9359d7 --- /dev/null +++ b/blog/2020/04/24/nordic-rse-conference/index.html @@ -0,0 +1,978 @@ + + + + Announcing the first Nordic-RSE conference - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Announcing the first Nordic-RSE conference + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Announcing the first Nordic-RSE conference

+ + + +
+ +

A couple of years ago, several CodeRefinery members and their +friends +started discussing how a Nordic network of Research Software Engineers +(RSEs) could be established, and soon thereafter the Nordic-RSE +initiative was launched. The idea was to +follow in the footsteps of very successful such initiatives in other +countries, most notably in the UK, the +Netherlands and +Germany. For the past two years +we have been taking the first steps in this direction. A survey was +conducted +to learn about the environment for people in RSE-related +roles. Information on groups and people +working in Nordic universities who identify as RSEs is being +collected, and local campaigns have been launched within several +universities for the creation of new RSE groups. To further grow the +emerging Nordic community of RSEs, we are now happy to announce that +the first Nordic-RSE conference, +Nordic-RSE2020, will take place in Stockholm between 1st and 2nd +December 2020!

+

About the conference

+

At Nordic-RSE2020, we will bring together those that develop software +for research purposes and contribute to building the RSE +community. The program is not set in stone but we will have invited +talks, lightning talks, poster sessions and workshops on best +practices for creating research software and other popular RSE related +topics. We expect a large contribution from Nordic RSEs, but will also +invite international RSEs that can help our Nordic community take +shape.

+

The emphasis of the conference will be on learning from each other in +a supportive and relaxed atmosphere. The choice of conference venue +for Nordic-RSE2020, the THS student union building at KTH campus in +Stockholm, reflects our hopes: it has lots of spaces for casual +conversations and is equipped with fast internet and all the +facilities required for a successful conference.

+

Who should attend?

+

Our aim is to reflect the diverse and emerging community of RSEs by +seeking input from all levels of experience and across a variety of +domains, genders, and ethnicities.

+

We welcome participation from:

+
    +
  • Researchers at any career stage who develop software for research +purposes;
  • +
  • Software developers working in a research context, whatever their +job title or field;
  • +
  • Those interested in advancing the understanding of how best to use +existing research software (e.g. with respect to scalability, +performance and/or reproducibility);
  • +
  • People from any organization providing tools, platforms or services +that benefit research software;
  • +
  • Anyone with a stake in research software (funders, publishers, +decision makers, etc).
  • +
+

We especially encourage first-time presenters and can offer mentoring +and other support with preparing your contribution.

+

Getting involved

+

In order to make this a successful conference, we will need help from +volunteers to ensure that all the logistics and practicalities work +smoothly. What's in it for you? All conference helpers get a free +conference ticket! Please get in touch with the organizing committee +(nordic-rse-organizers@neic.no) if you would like to help or if you +have any questions on how to get involved with Nordic-RSE2020.

+

We will also need sponsors to cover costs, keep the conference fee as +low as possible and to be able to offer travel grants to younger +participants. We have already received generous offers for sponsorship +from the Swedish e-Science Research Centre +(SeRC), the Swedish National Infrastructure +for Computing (SNIC) and the Swedish e-science +collaboration (eSSENCE). By supporting +us, our sponsors are helping to raise awareness of the importance of +developing RSE career path in the Nordics.

+

Inviting new sponsors

+

Nordic-RSE2020 is the first networking and community-building event of +Nordic-RSE. We will meet to network, to learn about best software +practices, reproducible research and open science, and to further +develop communication and project management skills required by RSEs.

+

RSEs are the connection between technology and research. If you want +to get a message directly to those who facilitate research with +technology, you want to sponsor this conference. Our attendees often +shape decisions about tools, contracts and approaches to research +software and computing – either directly or through their role in +advising, training and collaborating with researchers. In addition to +the chance to raise awareness of how your products or services are +relevant to modern research, sponsors will get mentions, visibility, +and depending on the sponsor package chosen, conference tickets and +contributed workshops, posters or short +talks. For +information on sponsorship see our +webpage [removed] or get in +touch.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/04/24/online-workshops-update/index.html b/blog/2020/04/24/online-workshops-update/index.html new file mode 100644 index 00000000..e637b6ba --- /dev/null +++ b/blog/2020/04/24/online-workshops-update/index.html @@ -0,0 +1,961 @@ + + + + CodeRefinery workshops moving online - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery workshops moving online + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery workshops moving online

+ + + +
+ +

After cancelling all our planned in-person workshops this spring due +to the ongoing pandemic, we decided to make the best of the situation +and start focusing our efforts on developing an online workshop +training programme. We wanted to start small while learning the +mechanics of online teaching, so we began by offering an online +workshop covering only the +Git-intro lesson to a +group of around 25 participants on April 7-8. Neither teaching nor +attending online workshops offers quite the same experience as +attending in-person events, but we were pleasantly surprised about how +well the workshop went and it definitely gave a boost to our ambitions +to move more of our traditional workshops online. Online workshops will +also provide a means for us to scale up and reach a larger audience +than possible with in-person workshops.

+

We learned many important lessons in this first experiment and we +tried to summarize them all in a previous +article. We +hope that these notes can be of help to others who are going online +with some of their teaching.

+

New notify-me form

+

We expect to be delivering many more online workshops also after +covid-19 restrictions are lifted and life starts returning to +normal. We realized that this means that our old notify-me form has +become obsolete - it is no longer enough to only indicate the +city in which you want to attend a workshop. So we created a new more +fine-grained notify-me +form where +people can sign up for updates about upcoming online and/or in-person +workshops and also indicate which lessons they are most interested +in. If you want to be informed of upcoming workshops, please sign +up.

+

Join an online workshops as a helper

+

The new notify-me form now also has an option to indicate that you are +interested in participating as a helper or instructor. Instructors +always need help and this is even more relevant for our online +workshops. Helpers assist learners in overcoming technical problems +and work through challenges or questions they may have. Ideally, we +need at least one helper per breakout room (4-5 learners). Helpers +don't have to be familiar with all the lesson material - experience +with even just one lesson/tool/approach is sufficient.

+

Have you already particated in one or more workshops, and now want to +help us in spreading better software development practices to the world? +Register as helper for upcoming online or in-person workshops in our +new notify-me +form. Remember +also that there is no better way to consolidate new knowledge than +teaching it to others!

+

Bring your own breakout room/helper

+

With online courses over video we could in principle aim at reaching a +larger scale than in-person workshops which are limited by room-size +and being visible and audible, but also by the number of helpers. In +online workshops the presence of helpers is no less important to make +sure that each breakout room has a helper to answer questions during +exercise sessions. We are considering to offer participants the +possibility to "bring their own breakout room" to the workshop. This +way they can collaborate on exercises with colleagues they already +know, if they prefer so. More importantly, they can assign one person +who is more experienced in the toolset presented to take the role as +helper. Participating as helper not only means "giving" but is also a +great learning experience: both in the tools and in solving problems +and supporting and teaching other learners.

+

Upcoming online workshops

+

We plan to arrange two full online CodeRefinery workshops covering all +our material before the summer. The format will be to split the +workshop content over six half-days spread over two weeks.

+

In May we will do our first full CodeRefinery workshop, starting on a +Tuesday, and ending on a Thursday the week after. Drawing on the +experience from this first full workshop, the plan is to deliver a +second online workshop in June.

+

Sign up for the notify-me +form if you +want to receive an email as soon as registration opens for these +workshoops!

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/04/24/rebase-vs-merge/index.html b/blog/2020/04/24/rebase-vs-merge/index.html new file mode 100644 index 00000000..c1817ab0 --- /dev/null +++ b/blog/2020/04/24/rebase-vs-merge/index.html @@ -0,0 +1,944 @@ + + + + Rebase vs merge - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Rebase vs merge + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Rebase vs merge

+ + + +
+ +

During a CodeRefinery workshop you might have heard an instructor say +that you can merge or alternatively rebase, like merge and rebase are +two equivalent operations. Clearly, they are not, but should we treat +the operations equally?

+

Let us take a closer look at rebase and merge, how they differ and in +which situations they are an advantage to use.

+

Rebase

+

Rebase gives you the opportunity to move the base of a branch to a new +base. Here we have two branches, master and feature_A.

+

Initial tree{:class="img-responsive" style="max-width:100%"}

+

We can rebase the feature_A branch to the last commit in master:

+
git checkout feature_A
+git rebase master
+
+

The result will look like this.

+

First rebase tree{:class="img-responsive" style="max-width:100%"}

+

Checking out master again, we can merge feature_A with master. The merge will by default be a fast-forward. We end up with a linear history, which many find attractive as it is easy to follow. The disadvantage is that we rewrite the history as the commit hashes changes.

+

FF-merge tree{:class="img-responsive" style="max-width:100%"}

+

Merge

+

If we don’t use rebase, but just merge feature_A with master, we get an merge commit, a new commit pointing to the previous last commit in master and the previous last commit in feature_A.

+

Plain merge tree{:class="img-responsive" style="max-width:100%"}

+

If we only do merges, we show the true story of the repository, how the code came to be. As the repository grows with new branches, maybe more contributors, following the history can become very challenging. The git graph can look like the tracks of a large railway station, where it can be hard to find the ancestors of a feature.

+

Mixing rebase and merge

+

Instead of sticking to either rebase or merge, we could use both operations, but establish principles for when we will use merge and under which conditions we use rebase:

+
    +
  • When we merge a semantic unit to master, we use merge.
  • +
  • When patch features, or do general corrections, we use rebase.
  • +
+

How will this look?

+

Merge revisited

+

Let us say we have created a new function or class, something that belongs together - a semantic unit we call feature_B. The base of feature_B is the last commit in master.

+

Master feature-b tree{:class="img-responsive" style="max-width:70%"}

+

If we do a merge, git will by default do a fast-forward merge. Following our newly stated policy, we want this merge to be a merge commit. Consequently, we add the option --no-ff to the merge command:

+
git checkout master
+git merge feature_B --no-ff
+
+

Alternatively, we can configure git to default do merge commits, by setting the configuration to not do fast-forward by default. Here as a global setting, spanning all our projects:

+
git config --global branch.master.mergeoptions --no-ff
+
+

The result will be like this, where the feature is clearly visible in a feature path, presumably with well written commit messages explaining what has been added in this path of work.

+

No-ff merge tree{:class="img-responsive" style="max-width:100%"}

+

Rebase revisited

+

Now we take the case where we checkout a branch from C1 to do some corrections. While we were doing the corrections, at least before we were able to complete the corrections, master moved to M1 as in the picture above. A merge commit will add unnecessary complexity to the story of our project. We are not adding a new semantic unit, just fixing things that got wrong in the first phase. That we started to fix things from C1 is not necessarily a important information to keep for the project.

+

No-ff merge tree plus patch{:class="img-responsive" style="max-width:100%"}

+

Following our second principle, we rebase the fix_typos branch to M1. Then we do a merge, but this time as fast-forward. If we have configured merge for not doing fast forward when possible, as the configuration statement above, we need to add the --ff-only argument:

+
git checkout fix_types
+git rebase master
+git checkout master
+git merge fix_typos --ff-only
+
+

The git graph will now look like this:

+

No-ff merge plus rebase{:class="img-responsive" style="max-width:100%"}

+

Rebase vs merge revisited

+

Rebase and merge serve two different purposes. We can use this to our advantage to create a clear story, a more readable git log (It is important to create a story, remember?). By using the above principles as guidance, we will become more conscious of where these operations will serve us or add more clutter. For instance, we might conclude that rebasing semantic branches, but insisting on a merge commit, is perfectly fine, because it is where the feature (the semantic entity) enters the master branch which is important, not where the development first started. Features will clearly stand out as a visible pattern in a git repository following such a practice.

+

[1] Getting Solid at Merge vs Rebase

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/04/24/rsh/index.html b/blog/2020/04/24/rsh/index.html new file mode 100644 index 00000000..2a5a5d60 --- /dev/null +++ b/blog/2020/04/24/rsh/index.html @@ -0,0 +1,919 @@ + + + + Research Software Hour - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Research Software Hour + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Research Software Hour

+ + + +
+ +

CodeRefinery is a project that holds workshops, but computing is an +experience. As much as we teach in workshops, it's not enough: these +workshops are hands-on, but still can't show our whole daily thought +process. They also aren't the right format for everyone and can't +reach enough people at once. In order to extend our reach, we are +trying a streaming web show Research Software Hour that combines +the spirit of CodeRefinery with real-life examples from our daily +work - and hopefully, some entertainment, too. We hope watchers +experience the spirit of research software and computing.

+

We knew that there had to be a way to reach more people, so considered +streaming and decided to do it together: it's more fun and more +engaging for the audience, we can discuss, ask each other questions, +show each other new tools we discovered, learn from each other, +hopefully teach the audience some. We will certainly be learning a +lot from the audience, too.

+

We wish to show why we enjoy research software and computing and how +you can, too. This is an interactive show, and a big part is +answering your questions. We encourage you to submit your own codes +and scripts and repositories which we can constructively review on +stream. You'll get positive ideas and everyone will benefit. We are +not experts in everything and will also show you the errors we make +and how we get through them and also critically review our own codes.

+

We are starting this as a two-person project (Richard Darst from Aalto +University, Finland, and Radovan Bast from UiT the Arctic University +of Norway, both working as part of the CodeRefinery project). This is +an open source production - anyone can help us develop Research +Software Hour, too. There are many different ways to contribute, from +streaming to developing material to community building. Join us with +questions, answers, ideas, code!

+

Read more at the website +and join us each Tuesday at 20:30 CEST on Twitch.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/04/27/nordichpc-tools/index.html b/blog/2020/04/27/nordichpc-tools/index.html new file mode 100644 index 00000000..92fee36b --- /dev/null +++ b/blog/2020/04/27/nordichpc-tools/index.html @@ -0,0 +1,928 @@ + + + + CodeRefinery tools in action: NordicHPC - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery tools in action: NordicHPC + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery tools in action: NordicHPC

+ + + +
+ +

You've been to a CodeRefinery workshop, and wonder how these tools are +actually used? The NordicHPC github organization, which we've +mentioned before, provides a lot of demonstrations on using github and +working collaboratively. It's an example of people who have a common +interest and form a community by using common tools.

+

Yet at the same time, not everything is perfect. Rather than try to +make everything perfect, they make things good enough, licensed, and +shareable, and improve it as a need comes - possibly, when someone +else has a need and time to improve it.

+

Within the organization, you can find many examples of using +git (everything), +pull-request based +workflows +(e.g. sonar, git-pr, slurm2sql), automated +testing (e.g. .travis.yml in +sonar, envkernel, nbscript, slurm2sql), modular code +development +(e.g. ), open +licensing +(e.g. everything).

+

Below you see some examples of NordicHPC tools. Some tools are useful +to anyone, but some may be more interesting to cluster administrators.

+
    +
  • nbscrpt is an attempt to +provide the familiar script interface to Jupyter notebooks.
  • +
  • sonar and +sonar-web provide a way to +watch what is actually running on clusters.
  • +
  • git-pr saves you keystrokes +when making pull requests, though perhaps +cli.github.com takes its place.
  • +
  • slurm2sql imports the HPC +Slurm job history to a sqlite3 database. It can be useful, even +individually, to get and analyze data about your jobs.
  • +
  • envkernel is a Jupyter +extension which lets you run your kernels in different environments, +such as Docker, Singularity, and virtual/conda environments more +easily.
  • +
+

Do you have a nice tool that needs a home? You know what to do...

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/07/31/mega-coderefinery/index.html b/blog/2020/07/31/mega-coderefinery/index.html new file mode 100644 index 00000000..a9767134 --- /dev/null +++ b/blog/2020/07/31/mega-coderefinery/index.html @@ -0,0 +1,1553 @@ + + + + Report from the Mega-Coderefinery workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Report from the Mega-Coderefinery workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Report from the Mega-Coderefinery workshop

+ + + +
+ +

In May/June 2020, CodeRefinery ran a large online workshop with about +100 learners in attendance. We overcame the challenges with some +clever strategies, and we feel the learning outcomes were similar to that of in-person workshops of around 30-40 participants.

+

After that workshop, some of the same staff held an even larger +"High-performance computing (HPC) Kickstart" workshop (180 learners, +more than four universities). This provided another perspective and +reinforced some of the lessons learned during the large online +CodeRefinery workshop.

+

Running a 100-person workshop seems like an intimidating goal, but +with the right vision and techniques it turned out to be quite smooth. +Instead of expecting direct instructor interaction with every learner, +we had to accept that everyone could be both a helper and learner and +create a hierarchical support structure.

+

Online is not simply a temporary substitute for in-person. +Mega-online is not simply a way to reach more people because we don't +have instructors. This concept fundamentally takes us closer to the +promise of technology for teaching: being able to reach everyone +regardless of location and physical limitations.

+

Executive summary

+
    +
  • Yes, we scale to 100 people pretty well, but you do need a good +vision about how to do it.
  • +
  • We maintained good learning outcomes with our adjusted strategies.
  • +
  • Helpers are essential and need to be trained. Helpers serve as a +first-level of support, and instructors/expert helpers serve as a +second. Helpers need training in breakout room management and a +walk-through/training in the group exercises.
  • +
  • Encourage the social aspect by asking for people to register as part +of teams and keep the teams together. Teams can even bring their +own helper - or even helpers (learners in previous CodeRefinery) can +bring their own learners to spread their knowledge to their +colleagues.
  • +
  • You need to put in extra effort to ensure things run smoothly and +make sure that everyone is prepared - anticipate all problems.
  • +
  • Roles of staff should be carefully explained and ideally not +overlapping, to reduce the cognitive load.
  • +
+

Mega-CodeRefinery

+

Webpage

+

Finnish HPC Kickstart

+

Webpage

+

Organization

+
    +
  • Pre-workshop install help times: +
      +
    • Emphasis on getting ready and making sure things are installed +and configured.
    • +
    • We "required" everyone to attend one pre-workshop installation +time, even if they thought they had already done it (in this +case, we quickly verified the instllation). In practice, we +didn't check this requirement and only 25-50% of people came, +but it still make the workshop more smooth.
    • +
    • The installation verification time occurred right after the +"helper introduction meeting", so helpers would stay and help +people verify their installation.
    • +
    +
  • +
  • Installation instructions consist not just of installation, but also +verification instructions. +
      +
    • In particular, verifying of the git configuration, since if +there are any issues, it very quickly derails things.
    • +
    +
  • +
  • We created installation and verification videos for the most +critical part, git youtube +playlist: +
      +
    • One on verifying an installation (make repo, run it)
    • +
    • One for most common problems you might see and how to fix
    • +
    • One for advanced topics (ssh keys)
    • +
    +
  • +
  • Start the meeting 20-30 minutes before, request joining 10 minutes +early (on time is late). Have some sort of +icebreakers/discussion/program to fill that 10 minutes to keep +people interested.
  • +
  • We kept the Zoom meeting room open for 30 min to 1 hour after the scheduled lessons are over on that day. +
      +
    • This enabled continuation of exercises in re-opening breakout rooms.
    • +
    • Some participants could receive individual help by a helper or an expert helper.
    • +
    • In the main room, we did debriefing among instructors and helpers so that we could reflect on the day after.
    • +
    +
  • +
  • The larger the audience gets, the more diverse it is. +
      +
    • This causes more load on helpers and more effort for organizers +to prepare.
    • +
    • It also makes it harder to please everyone.
    • +
    • But on average, we felt that the outcome was about as expected.
    • +
    +
  • +
  • To scale to this cognitive load, carefully assign roles (roles +explained below): +
      +
    • Zoom host, focuses on chat, breakout rooms, registration, etc.
    • +
    • HackMD master
    • +
    • Expert helpers (special ops)
    • +
    • Instructors
    • +
    • Helpers
    • +
    • It is best if these roles don't overlap, because they require +different types of focus. Zoom host and HackMD master are +easiest to combine. Then, instructor and expert helpers.
    • +
    +
  • +
+

Recommendations

+
    +
  • Place a large emphasis on getting ready for the workshop.
  • +
  • Have multiple ways for learners to verify their installation.
  • +
  • "Require" attendance in pre-workshop installation verification +times. Invite helpers there to get involved and practice basic +helping.
  • +
+

Teams

+

Our recruitment/sign-up strategy was twofold.

+
    +
  1. Open call for helpers and sign-up for individual learners.
  2. +
  3. “Bring your own breakout room”: We allowed learners to register as teams, where each team brought its own helper.
  4. +
+

Open call for helpers and sign-up for individual learners.

+
    +
  • First we had a general call for helpers to assign a breakout room with individual learners.
  • +
  • Our plan was to allocate one helper for 5 learnes accepted approx. (the number of helpers) * 5 of individual leraner sign-ups.
  • +
  • We tried to sort these learners by university/country/field, but didn't put too much effort into this.
  • +
  • Helpers and learners were told which team they will be in before the workshop (personalized email with breakout room number).
  • +
  • In general, we tried to keep consistency in member composition in a breakout room throughout the whole workshop; with the same learnes and the same helper, as much as possible. +
      +
    • For a long workshop like this one (6 half-days), getting to know each other seemed to result in more interaction by the end.
    • +
    • Random assignments might work better in a smaller workshop, where you are likely to see the same people you know. That isn't the case in a large workshop, so consistent breakout rooms are more worth it.
    • +
    • It took a session or two for people to get comfortable with their room, but once they did it went well.
    • +
    +
  • +
+

"Bring your own breakout room"

+
    +
  • To further improve things, imagine if a whole group wants to get trained? They can register and bring their own helper, who could be an advanced group member.
  • +
  • Research shows that multiple adopters in an organization greatly increases uptake of new tools (Graf-Vlachy, L., Buhtz, K. & König, 2018). Encourage people to come with friends or groupmates.
  • +
  • How it worked: +
      +
    • This is implemented as a "Team name" option when registering.
    • +
    • They are put in their own breakout room together.
    • +
    +
  • +
  • Advantages: +
      +
    • Scalability: Because they bring their own helper, we can scale to essentially as many learners as we want.This mechanism allowed us to reach far more people than we could normally, and allowed anyone who could find their own helper to attend. So, our workshop size became SUM(number of people in a team; number of teams) + (number of helpers)*6: every teamless helper directly allowed five other learners to attend.
    • +
    • Team building: Because these learners have a pre-existing social connection, they are able to keep a sense of community and help each other much better than you might expect from a course of this size.
    • +
    • Possibility to use familiar examples: We have observed that some team breakout rooms were discussing examples close to their research domain which would otherwise have been difficult to do in a "random" group room or the main room.
    • +
    +
  • +
  • The concept of teams could be extended to in-person workshops, too. +
      +
    • Not necessarily pre-assigned, but cleverly organize tables, expect the group to stay together all days.
    • +
    • One could give the teams names and so on, to increase team spirit.
    • +
    +
  • +
+

Recommendations

+
    +
  • Accept a "team name" as part of registration. These people will be +put into the same breakout rooms. Worst case, it isn't used.
  • +
  • Keep people in the same breakout room for the entire workshop - if +there is risk that people will not get used to interacting with +their group.
  • +
+

Breakout rooms management

+
    +
  • Assign names depending on breakout room and role. Here, n is the +breakout room number: +
      +
    • (n) First Last - learner
    • +
    • (n,H) First Last - helper
    • +
    • the above help you to easily assign to the correct breakout +rooms, and becomes fairly easy with the Zoom interface. When +there are more than 10 teams, it is recommended to use '01', +'02', .. as it makes it even easier to organize them into +breakout rooms manually.(Otherwise participant list sorts (10), +not (2), right after (1))
    • +
    • (CR) First Last for instructors and expert helpers (here "CR" +stood for CodeRefinery staff).
    • +
    +
  • +
  • Initial breakout room assignments serves as a guideline, rooms are +constantly adjusted as needed but we try to keep teams together.
  • +
  • Preferably, one breakout room should have minimum 4 learners.
  • +
  • When people register as a team together, keep them together unless +explicitly asked. For others, do what you need, but realize that +the social aspect becomes important.
  • +
  • Some people don't join with the right Zoom name. +
      +
    • Other co-hosts can browse the registration list and manually +rename participants who didn't name themselves correctly.
    • +
    • Then, the Zoom host only has to worry about assigning them into +the right rooms, and not looking up everyone on the lists.
    • +
    +
  • +
  • Our registration system, Indico, made this management much easier +than it could have been. +
      +
    • After registration closed, we added a "Room" field to the +registration data.
    • +
    • Then, we went through and manually assigned each person to an +appropriate room number. We have to make sure that each room +has one helper and an appropriate number of learners.
    • +
    • We could send personalized messages to each person with the +Indico mail merge function
    • +
    • The majority of people did manage to name themselves correctly.
    • +
    +
  • +
+

Recommendations

+
    +
  • Consistent naming of participants (and an order that sorts properly) +makes managing breakout rooms reasonable.
  • +
  • Consider how your registration system can send personalized emails +to each person.
  • +
+

Helper training

+

Regular helpers:

+
    +
  • Have a helper call the previous week. Actually, have two so that +everyone can make it to at least one.
  • +
  • Helper training: + +
  • +
  • Focus on training for managing time and keeping a flow going. This +is described in our document.
  • +
  • Helpers do not need to be experts in everything. +
      +
    • They should be able to know what "correct" looks like, see +obvious problems, and then call for help from an expert when +something will take more than a minute to resolve.
    • +
    +
  • +
  • Helper training is focused on: +
      +
    • Motivation of learners and teaching psychology.
    • +
    • How to help: don't do it for them, etc.
    • +
    • Keeping the flow going, encourage everyone to speak up and +share.
    • +
    • Knowing when and how to call for an expert helper to come to the +room.
    • +
    +
  • +
+

Special expert helpers:

+
    +
  • There are also "special expert helpers" (we need a new name), who +are experts in the material and problems that may come up. +
      +
    • Most are instructors or could soon become instructors (though +really they need to be expert debuggers). Basically many of our +free instructors would hang around to serve as special experts.
    • +
    • Special experts aren't assigned to any particular breakout room. +Instead, they are able to go to any room that needs more help.
    • +
    • While no room is calling them, they swap between rooms: they +join a room, wait a bit (30-60s) and watch if it's going ok, +before moving to another room. This way, the instructors can +always be aware of the pulse of the breakout rooms, pro-actively +help, and also provide more mentorship to the helpers.
    • +
    • One idea was to have expert helpers begin joining breakout rooms +only after 1/3rd of the breakout session is over. This ensures +that helpers get a chance to do their thing. This needs some +thought.
    • +
    +
  • +
  • Special experts provide valuable feedback to the instructor on the +progress of all learners. They should bring up some of the most +important issues they have seen in the main room.
  • +
  • Special experts also serve as backup helpers and can take over or +permanently join a room if a helper is unprepared.
  • +
  • The instructor is also encouraged to pop into some breakout rooms to +see how things are going. This may be enough in small workshops.
  • +
  • Special experts should be Zoom co-hosts. They are then able to go +into any breakout room they want (the mechanics of this is not +obvious, see our helper training info for more).
  • +
  • Special experts are different than the Zoom host and hackmd master. +These jobs require different types of concentration. Helpers and +expert helpers need to carefully follow what the instructor is +saying, Zoom host/hackmd master follow learner questions, and +up-next instructors think about what they are about to do.
  • +
+

Recommendations

+
    +
  • Hierarchical helpers allows you to extend to a greater size.
  • +
  • You need to put thought into how helpers work and prepare them well. +We should develop a special, quick training for them.
  • +
  • Special expert helpers connect the instructor (occupied with +teaching) to the pulse of the breakout rooms and serve as helper +mentors.
  • +
+

Lesson adjustment

+
    +
  • Make the exercise sessions as long as possible, group things +together. +
      +
    • There is a significant overhead to each breakout session, +becoming adjusted, figure out just what it is you are supposed +to do.
    • +
    +
  • +
  • Type-along is hard, given limited screen space to both watch and do.
  • +
  • In the end, the main room was more for lectures and watch an +example, then we flipped to breakout rooms to do most of the +hands-on work. We still need to think about this more.
  • +
  • With hierarchical helpers and more people in general, make sure that +each exercise and hands-on session is as self-contained as possible. +
      +
    • A person familiar with the tools should be able to read the +exercise and figure out what the objective is and what the steps +are - not having to pay attention to something said 5 minutes +ago, and not having a surprise twist that somehow had to be +accommodated at the beginning of the exercise.
    • +
    +
  • +
+

Recommendations

+
    +
  • Consider limits of online formats and how difficult it is to do +interactive work.
  • +
+

Exercises and breakout sessions

+
    +
  • Very clearly say what the goal is, what the duration is (duration +and time it ends), etc. for each lesson
  • +
  • Write the basic info in hackmd for each exercise: link to it, what +you are expected to do, how long it is and clock time when it ends +
      +
    • e.g. "we expect you to finish 1-3, 4-5 are optional. 20 +minutes, ending at xx:45".
    • +
    • When participants are in two time zones, it is extra important +to use this format of not specifying hour.
    • +
    +
  • +
  • This is exactly the case of "if it's even a little bit slow to you, +then it takes ages for a learner to understand".
  • +
+

Recommendations

+
    +
  • Have lots of "meta-talk" about what you are doing, what expectations +are, etc.
  • +
+

HackMD

+
    +
  • HackMD serves as a side channel to answer questions, so that the +main flow is not disrupted. +
      +
    • Learners keep it open and always watch and ask questions at the +bottom.
    • +
    +
  • +
  • One person serves as the "HackMD master" who follows it, answers, +and most importantly keeps it organized and adds in meta-information +about what the course does. +
      +
    • We've found that it's best if there is one person dedicated to +this without any other distractions (but of course many others +help, too).
    • +
    +
  • +
  • Be careful about answering questions in too much depth, more than is +needed. If you do, text becomes overwhelming and people can't +follow. Be strategic: if an answer isn't needed for following the +course, say so (and if you want, come back and answer later). +Answer the minimum to let someone follow the course, and inspire +people to research themselves later. Several short bullet points +progressively going into more depth makes for fast reading but also +more inspiration. For example this point, it's a bit long and +intimidating to read, which makes you lose the flow of whatever else +you are watching, isn't it? Imagine if every bullet point was like +this.
  • +
  • HackMD starts failing with a lot of people +
      +
    • We saw the limits at 50-100 people. If most people leave it in +view mode, it gets a little bit better.
    • +
    • If there isn't much text in it, it's better (~10k characters is +low).
    • +
    • When the document grew too long: we moved some of the text from +previous episodes to a side-HackMD and linked to it.
    • +
    • The failure mode was usually not being able to edit.
    • +
    • In theory, there are no strict limits. With short documents, even 100 +or more people could use it. Perhaps this is determined by +length of edit history.
    • +
    • We even saw Google Docs fail with 50 simultaneous editors during +an icebreaker (and our icebreakers with hackmd seemed to work +with ~50).
    • +
    +
  • +
  • Always have people ask questions and comment at the bottom. +
      +
    • There is not a "questions section" and "lesson section", always +write at the bottom.
    • +
    • Add headings when you get to a new lesson/page/exercise/topic. +Questions go at the bottom, sorted by what you were talking +about at the time.
    • +
    +
  • +
  • Suggested heading arrangements (but hackmd master does whatever +makes sense): +
      +
    • # for page title
    • +
    • ## for each lesson
    • +
    • ### for each episode
    • +
    • #### for each exercise, group discussion, etc. (if it needs to +be smaller than ###.)
    • +
    +
  • +
  • Make participants aware that we plan to publish questions and +answers later as workshop outcomes. +
      +
    • After the workshop we add questions and answers from the HackMD +document to the workshop page.
    • +
    • We go through these to make sure that we don't publish names or +any sensitive information or any information that would violate +our Code of Conduct.
    • +
    • But even though we take the effort of checking the questions and +answers we recommend to point out to learners and helpers to +only use the form [name=Myname] if they prefer to indicate +their name in the notes to simplify discussions during the +workshop. Before publishing the notes, we remove all of the +[name=Myname]. In other words write in a style and recommend +everybody to write in a style which allows us to publish these +notes without hurting anybody's privacy.
    • +
    • For a large workshop, even sharing the notes among other +learners might be too much, and will naturally limit who else +you can share the live notes link with. Consider if you really +want to ask anyone to put real names in there.
    • +
    +
  • +
+

Zoom

+
    +
  • Have a dedicated host, who focuses on breakout rooms and +registration related matters.
  • +
  • Use a client, not the web browser - though web browser is minimally +OK.
  • +
  • Assigning leareners to breakout rooms takes a long time, but luckily +Zoom can make it easy enough: +
      +
    • The "pre-assign breakout rooms" seems to only work within one +organization, thus was useless to us
    • +
    • When people name themselves according to the (n) Firstname Lastname system, people sort properly and it becomes very fast +to assign hundreds of people to their rooms.
    • +
    +
  • +
  • Ask participants to edit profile beforehand and log into zoom when they join in the +meeting room. This shows the name properly upon entry and thus the zoom host +can confirm that the name is found in the registration list. +
      +
    • This is important when you approve entry to the meeting room from the waiting room.
    • +
    • Enabling or disabling waiting room is another discussion: For the host, it can be a lot of work verifying people against a +registration list. Plus, we experienced some problems that waiting room interfered breakout room entry (see the point at the bottom of this section). With a private link, waiting room didn't seem to be that +important.
    • +
    +
  • +
  • Prepare another communication channel dedicated to staff (like +expert helpers and those who could help with HackMD editing), in our +case we used a dedicated topic in CodeRefinery Zulip channel. +
      +
    • Zoom chat is sometimes tricky, as it allows communication with +either all to the same room (in the main room or breakout room, +wherever you are, and as a host to all in waiting room) or to an +individual.
    • +
    • HackMD can also be used to discuss among staff, of course always +at the very bottom.
    • +
    +
  • +
  • If someone uses a different computer for Zoom than for doing the +exercises, they can join twice, one of those times for sharing their +screen (second one also be web browser client).
  • +
  • We saw some interesting Zoom problems: +
      +
    • We experienced in the first +couple of days that after assigning a participant into one +of the breakout rooms, and then that participant leaves from the +meeting room (not only breakout room), and tries to join in the +meeting room again with waiting room enabled, then that +participant was kicked out from the meeting room.
    • +
    • We don't still understand the mechanism behind, but once we disabled the +waiting room function (right before opening breakout rooms until +they are closed), it went totally fine.
    • +
    • Even after opening breakout rooms, people can join in the +meeting room, and the host could assign the new people into one +of the breakout rooms.
    • +
    +
  • +
+

Recommendations

+
    +
  • Managing breakout rooms isn't too hard, but do practice.
  • +
+

Streaming

+

Once you reach 100 people in a lesson, you start wondering: why can we +not reach everyone in the world at once? The technology is there, +it's a question of if it matches our vision.

+
    +
  • +

    We are worried about trolls in our Zoom meetings, but that is +because the Zoom mechanics is many-to-many, while for a public +meeting you need a one-to-many mechanic where learners can't +interact with each other. Streaming provides this mechanic, at a +loss of interactivity. In principle, it can co-exist with breakout +rooms.

    +
  • +
  • +

    What's the point of streaming?

    +
      +
    • We did streaming in parallel to the interactive workshop. That +way, anyone who couldn't register could also follow along. They +wouldn't get the full experience, but could at least do +something.
    • +
    • We encouraged people to watch streams in groups (ideally with +their own helper) so that they can get the social aspect and +help each other anyway.
    • +
    • We can imagine a fully federated system: There is one small Zoom +meeting with instructors doing the teaching. All learners +join via other Zoom meetings. Each other Zoom meeting watches +the stream together, and manages their own breakout rooms. Each +other zoom meeting can communicate to the central one as needed +to adjust the pace, for example chat and hackmd. HackMD helps +here.
    • +
    +
  • +
  • +

    Stream as an overflow

    +
      +
    • We had far more people register than we could accommodate, even +after getting as many helpers as we could, we could feel good at +least offering everyone who could not make it a chance to attend +via the stream
    • +
    • We emphasized that the experience would not be the same, and +they should try to come to another workshop later.
    • +
    • The stream can also be good for lurkers and passive attendees, +who can't go through the effort of attending but would like to +follow along.
    • +
    +
  • +
  • +

    Interacting with stream viewers

    +
      +
    • We got questions and comments on the stream chat.
    • +
    • We also provided a separate streaming HackMD to ask questions. +With our volume, we just as well could have given them the +primary hackmd (and did when someone asked, but we were worried +about trolls)
    • +
    • Stream viewers seemed pretty happy with what they were getting.
    • +
    +
  • +
  • +

    Risks of streaming

    +
      +
    • When the main room is streamed, people are more cautious about +saying things. But once we get to 100 participants, the main +room is quiet anyway, so we don't lose too much.
    • +
    • Risk of the stream going off-track from what learners need. You +need a good support system of expert helpers and feedback tools +to keep this working, if it was a stream-only workshop.
    • +
    • Risk of learner audio or video being broadcast. Zoom provides +tools ("spotlight video") to prevent this, but it doesn't work +all the time.
    • +
    • Extra effort needed. The marginal cost isn't that great in the +end, once you know how it works.
    • +
    +
  • +
  • +

    Zoom can send a video feed to a streaming service, which +re-broadcasts to the whole world

    +
      +
    • This has to be enabled under your account, then can be +configured for a particular meeting.
    • +
    • "Custom streaming server" seems to be able to broadcast to +anything. In particular, we used Twitch to do our streaming.
    • +
    +
  • +
  • +

    Keeping learner's videos out of the stream

    +
      +
    • Privacy of learners is the first prerequisite to streaming.
    • +
    • We said: if you speak in the main room, it may be streamed and +recorded. Your video should never be. We thought this was +fair, since most main room questions go through hackmd anyway.
    • +
    • Breakout rooms never recorded or streamed (though some groups +asked if they could be recorded).
    • +
    • Zoom "Spotlight video" means that only that person should go +out into the stream. +
        +
      • The zoom host must not be in the gallery view.
      • +
      • This bugs sometimes and everyone ends up in the stream is +gallery view. This is extremely frustrating and we didn't +find a cause or solution. Workaround: someone should always +share their screen.
      • +
      • In practice this wasn't a big issue, since in the main room +video was off most of the time. We reminded participants to +turn off videos when they are back from breakout room +sessions.
      • +
      • We really need to investigate this more.
      • +
      +
    • +
    +
  • +
  • +

    What to do with the stream while the breakout rooms are going on?

    +
      +
    • At first, during the breakout sessions in the main room, we +spent a lot of time trying to fix problem with people who +couldn't be assigned to breakout rooms. This seems to have been +a waste of time
    • +
    • Then, we decided to not spend time on Zoom problems, and instead +use the main room to do the exercises as a demo. This was +mainly for the stream viewers, but also could be useful to the +people who couldn't join breakout rooms. In the future, it +could also serve a different type of learning style.
    • +
    +
  • +
+

Recommendations

+
    +
  • Consider the place of the workshop in the larger world. Once you go +big, streaming is not too hard and lets you reach even more people.
  • +
  • If you do streaming, clearly announce it from the very start, with +the privacy deal (e.g. "video not broadcast, voice may be"). It is +much harder to add this later.
  • +
+

Recording

+
    +
  • Once you do streaming, it is a smaller step to recording and posting +the videos. +
      +
    • Who is benefited by the recordings? Perhaps not brand new +learners, but the learners who were in the workshop can review +them again later.
    • +
    +
  • +
  • If recordings require post-processing, they will almost never get +done. +
      +
    • Plan for one-short recording as much as you can: find a way to +keep learners out of the recording so you can go and directly +publish it with the minimum effort afterwards.
    • +
    +
  • +
  • A surprising number of learners have asked for the videos after the +workshop. +
      +
    • While the videos may not be as useful to someone learning the +material from scratch, they are probably very useful to an +existing learner who wants to review something they already saw, +teach others, etc.
    • +
    • When we can't provide them quickly, their usefulness is much +reduced.
    • +
    +
  • +
+

Recommendations

+
    +
  • Clearly announce the recording privacy statement when first +registering.
  • +
  • Try to make the recording as one-shot as possible, with minimal +post-processing needed. Plan for who will do this and when already +before the workshop.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/09/29/git-pr/index.html b/blog/2020/09/29/git-pr/index.html new file mode 100644 index 00000000..d8f6ddd5 --- /dev/null +++ b/blog/2020/09/29/git-pr/index.html @@ -0,0 +1,937 @@ + + + + git-pr: painless small pull requests - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - git-pr: painless small pull requests + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

git-pr: painless small pull requests

+ + + +
+ +

git-pr: painless small pull requests

+

In CodeRefinery, we teach the benefit of small changes via pull +requests in order to have better collaboration and review. But, when +the changes get small enough, the time it takes to run the commands +and open the pull requests begins to get annoying. I looked around +for other tools that could make this faster, but wasn't quite +satisfied with anything. So, I slowly started making something that +evolved into git-pr, https://github.com/NordicHPC/git-pr.

+

Let's talk about how it works.

+

Making a change

+

First, git-pr will help you to make the new feature branch. git pr branch $branch_name willcreate a new feature branch off of the +upstreamdefault branch and check it out for you. You might want to +git fetch first. Make your commits off of this branch.

+

One trick I use is to write the first commit's message like I would +write the pull request description. I decided it's usually not worth +writing a separate description for the pull request itself. Perhaps +there is some advantage to including the PR message in the git history +itself, too.

+

Then, to push the pull request, I use git pr open. This will push +the current branch, and open a pull request on both Github and Gitlab. +It will pop up an editor pre-seeded with the commit's message for you +to further edit. Once you save and close, the pull request is made.

+

One thing that git-pr will do is figure out the upstream and your +local copy by yourself. Default upstream goes in priority order +upstreamorigin, Default personal fork goes in the order +localoriginupstream, so no matter if you first clone the +upstream, or your own fork, you can always add the other with only one +command and have it auto-detected with no renaming.

+

git pr prune will remove all merged branches both locally and on the +remote (possibly dangerous!).

+

Various git pr fetch* commands will fetch pull requests into a local +pr/NNN branch.

+

There are various other small useful things, with it, but this is the +main part.

+

These are only shorthands for things you can easily do with other +git commands, but they save you time. It gets me closer to the ideal +of making many small pull requests.

+

About git-pr

+

You can find it at https://github.com/NordicHPC/git-pr - it is a +single shell script to copy to your path.

+

It's beta-quality software: it is used by me and a few others all the +time, but there will almost certainly be issues as others start using +it. Send issues and PRs!

+

It supports both Github and Gitlab, though Gitlab support is less well +tested.

+

There is a lot of prior art on different pieces here, there isn't much +in git-pr that is completely new - In particular, the GitHub command +line interface has come out since then and has some overlap. You can +see other options in the git-pr README.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2020/11/13/carpentry-community-discussion-nordic/index.html b/blog/2020/11/13/carpentry-community-discussion-nordic/index.html new file mode 100644 index 00000000..6f8d180b --- /dev/null +++ b/blog/2020/11/13/carpentry-community-discussion-nordic/index.html @@ -0,0 +1,953 @@ + + + + Community discussion in Nordic and Baltic countries - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Community discussion in Nordic and Baltic countries + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Community discussion in Nordic and Baltic countries

+ + + +
+ +

This blogpost is based on the notes made on Carpentries Community Discussion Etherpad on the 30th Oct. 2020.

+

Summary

+

The Carpentries say "never touch learners keyboard". Should instructors rigidly follow this advice in online workshops or should we be more flexible in order to overcome the challenges of teaching online?

+

On October 30th 2020, a Carpentries community discussion was held with discussion focused on Nordic and Baltic countries. The host was Annika Rockenberger (Carpentries instructor trainer). Including the host and the co-host, totally 15 participants joined: 6 from Norway, 3 from Sweden, 3 from Finland, 2 from Denmark, and 1 from Bangladesh (Thanks for joining, all!). A complete list of the participants can be found below.

+

First, experiences from 2 online workshops were shared. The theme above was raised as a part of the discussion. The active discussion left little time for other topics, but we had a positive and creative suggestion for further collaboration and community building for Nordic and Baltic region: There was a suggestion for running a joint workshop on AR technology and the idea to create a mapping of expertise in the region to facilitate cross-border collaboration.

+

There are ongoing initiatives to develop Nordic community further. Among other things, information about the Nordic Research Software Engineer initiative and its first online get-together event on 30th Nov. - 2nd Dec. was announced.

+

Workshop debriefing

+

Experiences from two recently held online Carpentries workshops were shared and discussed:

+

Sweden, Stockholm -- Mix and Match (SQL, OpenRefine, Python programming and plotting)

+

A self-organized workshop by KTH, Stockholm University, and Karolinska Institute

+
    +
  • (Lina, instructor of this workshop) Felt it was hard to teach online, as she was unsure if it reached to the audience. But it went fine.
  • +
  • (Radovan) (In his experiences from teaching online workshops in CodeRefinery) Jumping into breakout rooms to see how the participants did in exercise sessions helped a lot. Also being able to ask/answer questions asynchronously via HackMD hopefully lowers barrier to ask (does not delay others).
  • +
  • (Annika) Even being able to see helpers' faces would help despite having all the learners camera off. Also, when breakout room size is small, it is easier to get impression of the learners.
  • +
+

Norway, Bodø -- DC social science

+

A centrally-organized workshop at Bodø University

+
    +
  • (Lars, instructor of this workshop) Breakout rooms helped as it enhanced dialog. One of the key issues in the Carpentries. Remote control function worked well. The other instructor used this function to help a learner in the main room. It took some time to build trust.
  • +
  • (Anne) "Taking over learner's keyboard on an in-person workshop should never happen", the Carpentries says! But this concept could be too rigid. This should be given back as feedback to the Carpentries.
  • +
  • (Lina) Depending on the context?
  • +
  • (Annika) Communicating the principles and the important parts for not leaving participants behind in critical situation would be the essential thing to consider when taking over keyboard or not.
  • +
  • (Joakim) Important thing is not give pressure on instructors.
  • +
  • (Lina) Letting learners take over instructor's screen would be interesting.
  • +
  • (Lars) Polls for ice-breakers as well. Easy to rush through, but important not to, especially when you cannot see faces as feedback.
  • +
  • (Radovan) Hopefully useful tips for online teaching learned from CodeRefinery workshops: https://coderefinery.github.io/manuals/
  • +
+

Community building, collaboration, and ongoing initiatives in the Nordic and Baltic region

+
    +
  • (Tobias) Is planning to run a workshop on AR "Let's build an augmented reality web app!" based on a full-day workshop given at the research bazaar at the University of Oslo earlier this year: +
      +
    • goal: making 3D holiday greeting card using HTML and JavaScript: https://arworkshop.teebusch.repl.co/card1.html
    • +
    • The lesson material is all there: https://repl.it/@Teebusch/arworkshop
    • +
    +
  • +
  • (Joakim) Suggestion of a repository of Carpentries Nordic/Baltic community members with specialities and skills
  • +
  • (Annika) Google Sheets for this?
  • +
  • (Anne) EOSC Nordic claims to be a knowledge-hub
  • +
  • (Radovan) Is also working on mapping.
  • +
+

Announcements

+
    +
  • Nordic RSE (research software engineers) online get-together (Nov 30 - Dec 2): https://nordic-rse.org/events/2020-online-get-together/ (everybody welcome to attend and submit proposals or ideas)
  • +
  • Local-nordic Carpentries mailing list: https://carpentries.topicbox.com/groups/local-nordic
  • +
  • CodeRefinery workshop in November 17-19, 24-26 (registration closed): https://coderefinery.github.io/2020-11-17-online/ (looking for helpers: great way to learn)
  • +
+

Participant list

+
    +
  1. Annika Rockenberger (host, Norway, Oslo)
  2. +
  3. Naoe Tatara (co-host, Norway, Oslo)
  4. +
  5. Kerstin Lenk (Finland, Tampere)
  6. +
  7. Lars Kjær (Denmark, Copenhagen)
  8. +
  9. Tobias Busch (Norway, Oslo)
  10. +
  11. Lina Andrén (Sweden, Stockholm)
  12. +
  13. Mohamed Abdelhalim (Norway, Oslo)
  14. +
  15. Annajiat Alim Rasel (Bangladesh, Dhaka)
  16. +
  17. Joakim Philipson (Sweden, Stockholm)
  18. +
  19. Thomas Arildsen (Denmark, Aarborg)
  20. +
  21. Radovan Bast(Norway, Tromsø)
  22. +
  23. Samantha Wittke (Finland, Helsinki)
  24. +
  25. Olav Vahtras (Sweden, Stockholm)
  26. +
  27. Anne Fouilloux(Norway, Oslo)
  28. +
  29. Richard Darst (Finland, Helsinki)
  30. +
+

Thank you for all the contributions!

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2021/09/01/bi-weekly-community-calls/index.html b/blog/2021/09/01/bi-weekly-community-calls/index.html new file mode 100644 index 00000000..e52feedb --- /dev/null +++ b/blog/2021/09/01/bi-weekly-community-calls/index.html @@ -0,0 +1,902 @@ + + + + Bi-weekly Community Calls started - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Bi-weekly Community Calls started + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Bi-weekly Community Calls started

+ + + +
+ +

CodeRefinery is now shifting towards a new phase with community-based collaboration. We are aiming to continue offering the workshops, community space, and develop lesson materials together with those who are interested in.

+

For this to be successful, CodeRefinery started bi-weekly community calls from the 9th August. Calls are open to anyone interested in joining in the community from any point of view; teaching, learning, hosting, contributing to lessons, you name it. Join in the calls, get informed and influence the community's way forward!

+

So far, we informed and discussed among others;

+
    +
  • CodeRefinery project: current status and future,
  • +
  • How to improve outreach and publicity,
  • +
  • Importance of possibility to provide ECTS,
  • +
  • How CodeRefinery should give credits to contributions by volunteers,
  • +
  • Mentorship program for exercise leads after the workshop,
  • +
  • How to "order" workshops
  • +
+

For more details of each call, please visit the archive of the minutes

+

The next call is on the 6th September 12:00-13:00 CEST with a theme of "CodeRefinery way forward", where we will be discussing the community organization model. For the connection details and agenda, please follow the Community Call HackMD.

+

We all look forward to seeing you at community calls and Zulip :)

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2021/11/20/phase-2-lessons-learned/index.html b/blog/2021/11/20/phase-2-lessons-learned/index.html new file mode 100644 index 00000000..8a7fe29b --- /dev/null +++ b/blog/2021/11/20/phase-2-lessons-learned/index.html @@ -0,0 +1,1238 @@ + + + + Lessons learned from phase 2 of the project - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from phase 2 of the project + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from phase 2 of the project

+ + + +
+ +

The motivation for this document was to collect lessons learned from phase 2 of +our project, both for our own future work but also for other future projects +who may find our experiences useful. We have chosen to collect the lessons +learned in bullet-point format and not in prose.

+

Below we list experiences and also unsolved challenges from workshop +organization, lesson development, meeting minutes and decision tracking, +Carpentries membership, communication, data management, stakeholder- and +community engagement, and infrastructure hosting.

+

Workshop/event organization

+

Metrics

+
    +
  • When we started teaching in 2016, we only worried about the teaching and not +about measuring how many participants from which country and from which +discipline and career stage. However, we were asked to report about metrics +again and again, on short notice. At some point we started reporting this in +detail (https://coderefinery.org/about/statistics/) which really simplified +reporting.
  • +
+

Survey

+
    +
  • Survey should be designed considering analysis and presentation of results, +as well as and what to focus on (what we want to show off).
  • +
  • When survey platform needs to be migrated to another, consider the structure +of the questions and answers to avoid tedious post-processing. Over the past +few years we have moved between platforms and also kept adapting questions +which made the analysis non-trivial.
  • +
  • How to get a better and precise overview of "actual" participants: +
      +
    • Both pre-/post-workshop surveys are opt-in, and they should be. In principle, sign-up form should collect only very necessary information for those to be able to participate in the workshop, and thus it may not be optimal to collect learner-profile type of information via sign-up form (at least not as mandatory fields), except for cases where we need to apply priority criteria or treating participants differently (e.g. team participation, grouping according to background so that they can work on different exercises etc.)
    • +
    • Pre-workshop survey: so far submitted by anyone voluntarily upon sign-up. Not necessarily all the submitters are participating in the workshop, neither all the actual participants submitted the pre-workshop survey. It might be an idea to ask them to submit upon acceptance to increase accuracy to some extent.
    • +
    • Post-workshop survey: +
        +
      • It needs a scheduled reminder to the organizer side have consistency in the time between the workshop and the survey timing, as the survey aims to see the long-term effect of the workshop.
      • +
      • There is inevitable risks that the survey invitation cannot reach the email address registered after a half year or such, and of course we cannot expect very high response rate, either.
      • +
      • Another limitation that we need to think of could be that the chances could be higher for those who had positive impression would submit the post-workshop survey than those who had negative impression, which will naturally yield biased results.
      • +
      +
    • +
    +
  • +
+

Capacity and workshop format

+
    +
  • How to afford as many as possible learners while keeping good learner experiences +or even improving them.
  • +
  • How we carried out online workshops in 2020-2021: +
      +
    • Standard 3-full day CR workshop was transformed into 6-half day format, typically Tuesday-Thursday over 2 consecutive weeks.
    • +
    • Helper/Exercise lead onboarding sessions as well as installation help drop-in sessions were held typically a week before the 1st week.
    • +
    • All the exercises were done in breakout room with a group of regular members.
    • +
    • We recruited exercise leads and accepted 5-6 individual learners per exercise lead plus team registration including their own exercise lead.
    • +
    • We used priority criteria based on countries and/or institution's characteristics.
    • +
    • Problems/challenges we experienced: +
        +
      • Withdrawals on short notices and no-shows
      • +
      • Much hassles by the coordinators
      • +
      • Feedback showing both positive and negative experiences with regular members/exercise leads
      • +
      +
    • +
    +
  • +
  • What is the optimal format of help provision and exercises: +
      +
    • Should the group members be fixed or more ad-hoc or even hop-in-and-out?
    • +
    • Is one regular exercise lead always needed per group? One disadvantage of not-having regular exercise lead is that it takes time to call help, explaining situation etc., which eats up exercise time.
    • +
    • "Webinar (stream)-by default" with an option for joining in zoom-meeting room for extra help may work better (ref. Python for SciComp 2021)?
    • +
    • Post-workshop Q&A session time/day would be useful?
    • +
    • We have considered for the future to offer optional exercise walk-through sessions. These could be +interesting not only for learners but recording of these sessions could also help future +exercise leads.
    • +
    +
  • +
+

Communication with participants

+
    +
  • Indico's email function worked well to send information about the workshop to participants/signers.
  • +
  • We experienced few cases of typo in email address, thus we could not reach registrants.
  • +
  • Online collaborative notebook (HackMD and similar) worked well for Q&A during the lectures.
  • +
+

Certificates

+ +

Planning

+
    +
  • Long term scheduling with fixed twice-per-year schedule is probably better than juggling many calendars and trying to find a time slot 1 month in advance.
  • +
  • Planning relevant workshops/events before and after the CR big workshops will be also helpful. They include for example Software Carpentry, Python for SciComp, Hackathon, etc.
  • +
+

Lesson development

+
    +
  • Only happened before workshops. This was very efficient but introduced stress.
  • +
  • It probably requires a calendar event to dedicate time for this.
  • +
  • "software installation and setup" +
      +
    • This is not lesson itself, but this also needs to be updated along the lesson development and improvement as well as along the changes implemented in different software programs, packages and platforms to use (e.g. GitHub).
    • +
    • The procedures need validations given diverse scenarios.
    • +
    • Introduction of step-wise procedures with prepared Conda environment worked well, we had considerably fewer visits to installation-help sessions (no statistics, though, it is staff's impression).
    • +
    +
  • +
  • Compared to the cases where one sends PR with all the team members assigned as reviewers, lesson improvement works better when done in a pair; one takes revision work, while the other does a thorough review. Often assigning all the team members as reviewers make the responsibility unclear and ends up with the PM (or in a better case, a few regularly active members) reviews and merges.
  • +
  • It is important to make the contribution criteria clear for making lesson citable: +
      +
    • “creator”(author): significant contributions
    • +
    • “contributor”/Editor: reviewing/approving contributions
    • +
    • “contributor”/Other: smaller contributions
    • +
    +
  • +
  • Ref: https://hackmd.io/@coderefinery/citable-lessons
  • +
  • In view of marketing as well as convincing funders, it would be worth collecting information about where the lesson materials are used. It will be an idea to have a form to submit where it can ask the following questions: +
      +
    • Institution/Organization etc.
    • +
    • Type of event and link to the event page: +
        +
      • Workshop
      • +
      • Credited course
      • +
      • Non-credited course
      • +
      • Other type (specify)
      • +
      +
    • +
    • Which lessons were used +
        +
      • Only CR lessons (which ones)
      • +
      • CR lessons (which ones) as well as other lesson materials (what materials?)
      • +
      • part of CR lessons (where of it)
      • +
      +
    • +
    +
  • +
+

The Carpentries

+

Membership and use of its benefits

+
    +
  • Membership tier: Platinum, 3 years (2018 Nov. 1 - 2021 Nov. 1)
  • +
  • After discount for providing the regional coordinator (RC) position (2019 Nov. 1 - 2021 Nov. 1), we paid 5,000 USD annually for the last two years.
  • +
  • Use of instructor seats and Centrally-Organized Workshops (COW):
  • +
+ + + + +
yearused seatsbadged instructorsCOW
2018-2019138-
2019-20201283
2020-2021*1061
+
    +
  • For each membership year, NeIC had 15 priority seats for the instructor training and 6 COWs without fee.
  • +
  • Regarding the membership year 2020-2021; 3 trainees who took the instructor training are planning to finish the rest of the checkout procedures within this year. 1 of them remains as pending in the Carpentries database at the time of 26th Oct.
  • +
  • RC did follow-up check-ins for the trainees who attended a training event. Regarding 2019-2020, 4 trainees from the same institute failed check-out (1 of them could not complete the participation in the training event due to absence more than an hour) despite repetitive check-ins. 1 trainees in 2020-2021 became unreachable after the training event.
  • +
+

Relationship with the Carpentries and recognition of CR in the Carpentries community

+ +

Regional Coordinator (RC)

+
    +
  • During the period where the RC role was given as a part of tasks by a CodeRefinery project staff, the RC had an administrative role within the Carpentries on both COWs and SOWs in the relevant region. In total, appointed RC carried out administrative works on 35 workshops. In addition, she recorded 28 past SOWs hosted by University of Oslo, which were eligible to be recorded in the Carpentries database but had not been registered.
  • +
  • RC initiated the following: + +
  • +
  • RC explained and guided about the NeIC's membership benefit and the Carpentries workshops, as well as bridging new individuals to the region to the local community upon requests.
  • +
  • Upon the expiration of the NeIC's membership, RC in Nordic region is also discontinued.
  • +
+

Dissemination of opportunities to use the NeIC's membership benefit

+
    +
  • Dissemination of opportunities were done via CR and NeIC website, CR Zulip chat, CR newsletter, at relevant workshops, CR twitter, etc.
  • +
  • In addition, presentations at conferences etc. (for example at "Seminar for bibliotekenes nettverk for ph.d.-støtte" (In Norway)) were also used to disseminate opportunities.
  • +
+

Uptake of the membership benefits

+
    +
  • Benefits were generally underused, especially COW opportunities. This was partially due to the pandemic and that requests for online COW were not accepted for the first several months after the pandemic hit. Also, the difficulty in planning in-person workshops may have also influenced here as well.
  • +
  • Instructor training's three check-out procedures seem a bit high barrier for some people. Follow-up by RC seemed to have helped to some extent, for example, reminding them to apply for extension of the due date to complete the check-out, offering opportunity to join in Nordic community call as a part of check-out processes, and some advices on contribution works (e.g., translation of terms in Glosario).
  • +
  • Provision of teaching/learning opportunities in Carpentries SOWs/COWs initiated by CR might have been helping; +
      +
    • to disseminate the usefulness of the Carpentries workshops, as well as
    • +
    • to provide a "safe" place for newly-badged instructors to try teaching.
    • +
    • NB: There was a plan to attempt this idea by a SOW for 2021, and several newly badged instructors showed interest in teaching there. But then there was a request for a new COW, and those new instructors had a chance to teach there.
    • +
    +
  • +
  • The Carpentries is also changing along time: +
      +
    • Membership price model and the price itself had been stable for a couple of years, but will be changed within 2021.
    • +
    • RC role is to be changed in the process of re-designing community development program. RC will no longer have responsibility for administrative works on workshops in the responsible region. This is also explained as due to a concern around GDPR raised by the major sponsor of the Carpentries (Community Initiatives). The discount offer of having an RC is to be discontinued.
    • +
    • The Carpentries will have online workshops as their standard option to offer in near future; it is so far only as pilot.
    • +
    +
  • +
+

Meeting minutes and decision tracking

+
    +
  • One rolling meeting minutes document is probably better than one document per +meeting to track tasks and decisions. Creating new documents for each meeting risks +that action points get lost or forgotten.
  • +
+

Time reporting and vacation planning

+
    +
  • In the project we have early on chosen to not report hours to the project +management to build trust (only report hours to the local management).
  • +
  • But in hind sight the project manager should have had a closer overview over reported hours +earlier, not with a delay of months between work done, work reported to local +management, work invoiced to NeIC, and NeIC management informing the project +manager about hours invoiced.
  • +
  • There has been work imbalance among the team: the contribution and buy-in was not the uniform among +all participating countries/organizations (taking into account different FTE shares).
  • +
  • In hindsight, it would have been better to offer more 1-1 discussions between +project manager and staff.
  • +
  • Over time there has been significant staff fluctuation which is normal but every time it takes +time to know the routines and grow mutual trust and to get up to speed with the tools and processes.
  • +
  • It reduces confusion to share a vacation plan: not only for the project +manager but for the entire staff.
  • +
+

Issue/task tracking

+
    +
  • The process of having a centralized task tracking was found to be +difficult to implement in a decentralized team where everyone has other 'primary' projects.
  • +
  • Over the first two project terms we have tried different tools: +Trello, GitHub project board, GitHub issues, HackMD, but +it seems no tool replaces 1-1 discussions and more personalized task planning and one or +few persons keeping the overview and re-prioritizing from time to time.
  • +
  • However, having one HackMD document that collects all tasks that we chose to +work on and keeping this document across bi-weekly calls has been found +useful.
  • +
+

Support line/ request tracker

+
    +
  • We got roughly 200-300 tickets/year.
  • +
  • We have started with email to project manager but that got too much, then we moved to +ZenDesk but we had to pay for each agent and it felt expensive for the very +few emails we got per week.
  • +
  • SNIC has kindly provided us with the RequestTracker service which we appreciate but the barrier +to authenticate using SSL certificates was too high for a cross-border +project and for few staff members it took weeks or months to get access.
  • +
  • Most tickets arrive around workshops.
  • +
  • Most non-workshop tickets were to unblock GitLab accounts.
  • +
+

Communication within the community and the project

+
    +
  • We have started within NeIC Slack.
  • +
  • We have a major problem, because we don't want to (or are unsure how to) keep lists of +contacts/interested people (personal data), so we don't have a way to reach out to a broad audience.
  • +
  • Although we have accumulated a large dataset of contact information, we had to delete this information +and could not use it to announce other events since we never asked registrants whether they +would prefer being informed about related events.
  • +
  • We are unsure however, whether the problem with outreach is lack of tools or lack of processes.
  • +
  • One way out is to move communication to the public space which we have +done when moving from Slack to Zulip.
  • +
  • Internally Zulip chat has been good for the project.
  • +
  • In addition, we have managed to engage many helpers and volunteers for each workshop.
  • +
  • When contracted staff are working on different percentages and remotely, it is important +to have clear overview of who is working on what and when, otherwise it may give the feeling of +unfairness. Frequent short meetings in "Standup"-format (or even writing asynchronously on Zulip or GitHub +project etc.) may help all having a better overview and enable us to regularly follow up each other.
  • +
  • Minimizing the toolset has been found beneficial since everybody already has a set of tools to +interact with in other projects and these tools often do not overlap or inter-operate.
  • +
+

Data management

+
    +
  • Google Drive has served us well in the first years.
  • +
  • However, this storage was connected to a personal account.
  • +
  • Over time we used GitHub more and more.
  • +
  • HackMD was used a lot in the last 2 years of the project, both for workshops and notes and meetings.
  • +
  • We have never defined who owns the data and this created a bit of work for the project management towards the end of the project phase.
  • +
  • We should have created a data management plan.
  • +
  • Relevant to some points written in Legal questions.
  • +
+

Community engagement

+
    +
  • There was a constant stream of people interested in becoming more involved.
  • +
  • We have activated some, but as 'communication' says above, some potential was left unrealized.
  • +
  • Growing a community requires also promoting newcomers and mentoring.
  • +
  • Mentoring also requires volunteer mentors.
  • +
  • With more mentoring and more follow-up we could have had engaged more people and more organizations.
  • +
  • How to give proper credits to the volunteer effort given to the community; do we need different +"levels" as well as types (e.g. lesson contributions or exercise leads) of contributions? +Ref. Supporting community champions and running champions programs
  • +
  • How to keep the community engagement up and running without "burn-out" is a constant challenge.
  • +
+

Stakeholder engagement

+
    +
  • Steering group seems to have become less engaged over time.
  • +
  • At the beginning of the project the SG actively influenced and gave ideas and input and suggestions.
  • +
  • Over time the steering group meetings and communication grew more and more +passive and turned into a reporting channel.
  • +
  • The project had only 3 short meetings with the reference group formed by national +training coordinators. This was somehow beneficial to connect to national newsletters.
  • +
+

Infrastructure hosting (GitLab service)

+
    +
  • Both the steering group and also the project staff became less interested in this over time.
  • +
  • Although the GitLab service turned out successful, it became more and more disconnected and disengaged +and ended up a two-person effort (one person maintaining service, another person answering tickets).
  • +
+ +
    +
  • The project was lacking support in GDPR-related questions +
      +
    • We felt a bit left alone with questions about data privacy and storage +and collaboration. For example: how long can we keep participants' data +to issue certificates? Should we keep information of the certificates +issued? If so, how long, who and where eventually will keep them in case +the project ends?
    • +
    • The employer organizations, preferably their lawyers should be consulted, +especially in terms of making a project's privacy policy and choice of +common cloud-based platforms that are inevitable to use. As an example, UiO lawyers +have raised concern about using work email address for making user account of any +cost-free cloud service (including GitHub) so that users don't set the +same password as the one used at the work. In addition, it was not +encouraged to use any cloud-service based in the US to store any personal +data (even not sensitive ones) for work-related purpose given the risk +that GDPR is not followed due to its server existence outside of the EU +(especially in +US) +(Ref. Recommendations by European Data Protection +Board)
    • +
    • Given its characteristics, NeIC should provide both necessary legal +support on the issues relevant to GDPR and common cloud-based platforms +that staff across boarder securely use. Common support email and a +platform where more than one project staff can answer inquiries +regardless of their affiliation is essential (see also section about "Support line/ request tracker").
    • +
    • CodeRefinery is (and has become) a very much community-driven project +rather than one where only fixed staff work with written contract through +the employer. Such project may have been rare, but there might be more of +this type in future. Clear legal guideline for involvement of voluntary +staff is needed. In this sense, working contract or collaboration +agreements including data processor agreement may not be sufficient and +it will need a very clear guideline about who should be able to have +access to any personal information of the third parties including sign-up +information to workshops, for example.
    • +
    +
  • +
  • "Rights to work results" vs. Open Science +
      +
    • Ref: a page about "Rights to work results" at University of Oslo
    • +
    • General clarification is needed here so that everyone won't be in trouble later.
    • +
    • It should be also better explained and clarified in terms of the choice of platform for collaborative works in this regard so that staff/volunteers etc. can feel safe in using the chosen (cloud-based) platforms, including GitHub, YouTube, Twitch, HackMD, Tinyletter etc.
    • +
    +
  • +
  • We also lacked support in questions about how to start an own organization/ spin-off.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2021/11/21/towards-citable-lessons/index.html b/blog/2021/11/21/towards-citable-lessons/index.html new file mode 100644 index 00000000..ba01b3ac --- /dev/null +++ b/blog/2021/11/21/towards-citable-lessons/index.html @@ -0,0 +1,1024 @@ + + + + Towards citable lessons - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Towards citable lessons + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Towards citable lessons

+ + + +
+ +

In Autumn 2021 we have started to work on making our lessons and other material +we have created over the years, citable. At the same time we wish to assign a +digital object identifier (DOI) to each lesson so that the material becomes +persistent and remains findable. However, the main motivation for this work is +to get some metrics about the use of our material and also to give contributors +better credit and to make it possible for them to get and display metrics about +their contributions.

+

This effort is work in progress and in this document we will summarize our +discussions, decisions, findings, and observations so that we can then use +these later when we conclude this effort lesson by lesson.

+

Technical choices

+
    +
  • We will use Zenodo because it is a well-established service which we know and +which integrates nicely with the repositories hosting the lessons and because +we will need to be able to update metadata (author information) without +changing the DOI record.
  • +
  • We will convert the 3 remaining Jekyll lessons to Sphinx to simplify pdf export.
  • +
  • We will not start with https://allcontributors.org/ because it requires each contributor +to have a GitHub account which we have found a too strict limitation.
  • +
  • We start with tracking authorship in CITATION.cff since GitHub presents a +"cite as" button when this file is present.
  • +
  • If we find that CITATION.cff is not enough or does not provide the right +categories, we will try to track this in the .zenodo.json which Zenodo +understands and we could generate CITATION.cff from this file. It seems that +if a .zenodo.json is present in a repo, it has on Zenodo precedence over a +CITATION.cff.
  • +
+

Distinguishing authors and contributors

+
    +
  • Removed "code" (lesson material) does not mean removing authorship unless the author prefers to be removed.
  • +
  • Example for how Carpentries do it (unix shell lesson): + +
  • +
  • Definitions of the roles: +
      +
    • "creator": significant contributions
    • +
    • "contributor"/Editor: reviewing/approving contributions
    • +
    • "contributor"/Other: smaller contributions
    • +
    +
  • +
  • On Zenodo we start with "creator" (author) and "contributor" (other). +
      +
    • See also categories that Zenodo understands: https://developers.zenodo.org/#representation (search for "creators" and "contributors")
    • +
    • We are a bit unsure whether one person can assume more than one role on +Zenodo. probably yes. If so, maybe one occurence for the highest +contribution is best.
    • +
    +
  • +
  • We still need to verify whether CITATION.cff and/or .zenodo.json can map to +the definitions of roles (above).
  • +
+

How we will reach out to creators and contributors

+
    +
  • We will do this on a per-lesson basis and we will start with the lessons +which we teach the most often.
  • +
  • Contributors are not only people who have contributed with Git commits, but +could also be people that contributed with input and ideas in other form.
  • +
  • We reach out to everybody and ask whether they want to be contributor or author.
  • +
  • If a person cannot be reached, we do not add the person without consent and +rather add the person later once we reach them.
  • +
  • Reaching out to creators and contributors will happen via GitHub issues close +to the lesson repository but those who do not respond or may not be on GitHub +will be reached via email.
  • +
  • On the GitHub issue we will ask authors for their ORCID.
  • +
+

Archiving lessons as pdf

+
    +
  • When archiving lessons on Zenodo we have the choice of archiving the +repository as is (the sources) or to generate a pdf version of the lesson and +archiving the pdf.
  • +
  • We have concluded that we wish to attempt depositing pdf versions unless this +turns out too difficult.
  • +
  • The pdf versions will be generated automatically as part of a "release" workflow.
  • +
  • The automatic pdf generation is relatively straightforward with Sphinx +lessons but less trivial with Jekyll-based lessons.
  • +
  • We will focus on Sphinx lessons and prefer converting Jekyll-based lessons to +Sphinx lessons rather than investing time in generating pdfs from Jekyll lessons.
  • +
  • But we have also concluded that cite-ability is more important than preserving +a pdf version of the lessons since we expect the lessons to evolve and be +continuously improved and the credit aspect is found more important than the +preservation aspect.
  • +
+

ORCID vs. Zenodo community

+
    +
  • We have decided against introducing a project ORCID for CodeRefinery and +rather collect related records in a CodeRefinery Zenodo community.
  • +
+

How we wish to test the workflow

+
    +
  • For one or two example lessons we will create a fork and test the release +deployment and DOI generation on Zenodo sandbox.
  • +
+

Suggested workflow to make lessons citable via Zenodo

+
    +
  • Add a .zenodo.json to the lesson repo, for example:
  • +
+
    "creators": [
+        {   
+            "orcid": "0000-0002-1825-0097",
+            "affiliation": "Feline research institute",
+            "name": "Field, Gar"
+        },
+        {   
+            "orcid": "0000-0002-1825-0097",
+            "affiliation": "Feline research institute",
+            "name": "Cat, Felix"
+        }
+    ],
+
+
    +
  • Generate pdfs from Sphinx sources via LaTeX: +
      +
    • In conf.py, set latex_engine = 'xelatex' (makes emojis work), then make clean ; make latexpdf.
    • +
    • This will become part of GitHub Actions, it will not be a manual step.
    • +
    +
  • +
  • Create a release of the lesson on GitHub.
  • +
  • On Zenodo, check syncing with GitHub.
  • +
+

Resources

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2021/11/25/lessons-learned-may-2021/index.html b/blog/2021/11/25/lessons-learned-may-2021/index.html new file mode 100644 index 00000000..7a2ac9f6 --- /dev/null +++ b/blog/2021/11/25/lessons-learned-may-2021/index.html @@ -0,0 +1,994 @@ + + + + Lessons learned from the May 2021 online workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from the May 2021 online workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from the May 2021 online workshop

+ + + +
+ +

May 10-12 and 18-20, 2021, we gave our at that time largest CodeRefinery +online workshop (6 x 3.5 hours) with 128 participants. +We plan to deliver many more such workshops based on our lessons.

+

Here we wish to share with the community our lessons learned: What worked well +and what we need and plan to improve. We use bullet point format for brevity.

+

This complements our lessons learned from our first online workshop.

+

Lesson coordination

+
    +
  • The person teaching should not be doing the intro as well, as they may still need to set stuff up and it is better to focus on the lesson only.
  • +
  • The teaching coordinator should check in for basic practicalities with each instructor: +
      +
    • team-teaching if desired
    • +
    • material to cover
    • +
    • schedule breaks
    • +
    • test screenshare prior to the lesson
    • +
    • how to control breakouts yourself
    • +
    +
  • +
  • Be clear about video on or off for instructors. If multiple people on then gallery OBS capture doesn't work.
  • +
  • Include role mentoring as part of the coordination initial meeting.
  • +
  • More talk about "voice of audience".
  • +
  • Prepare schedule summary for next day to be sent to everyone, together with instructors of following day, after workshop day: lessons to be covered and break/exercise room timing.
  • +
  • Inform individual exercise leads about how the set group of individual learners is like (e.g. expecting how many in the room, OS, background).
  • +
  • Inform exercise leads and all the team members who are replacing when a regular exercise leader is absent.
  • +
  • Clearer role distribution, spreading the work among many is a great idea but it things should be clearly (or as clearly as possible split) also for roles during workshop, one or few people should have 'power' to decide things and clearly communicate: instead of "could somebody do X?" we have a person in charge of X.
  • +
+

Zoom and OBS

+
    +
  • Ask participants to join with video OFF when they join after the workshop started (otherwise they may appear in the stream).
  • +
  • Huge amount of work that many people did making the instructions, and testing them on all the different OSs, surely helped.
  • +
  • For some people the screenshare froze after break/ when screenshare switched between instructors, for browser reloading solved it, for client people had to rejoin chat.
  • +
  • Gallery insert view is risky.
  • +
  • You can't spotlight someone when only two peoples' videos are on.
  • +
  • We can basically record the cutpoints and TOC while I am watching it, then there is very little effort to process afterwards. This probably requires one almost-dedicated person, but is worth it.
  • +
  • It takes manual work to switch from one to two people (changing cropping), and also two to three (alignment).
  • +
  • Gallery view for a lesson worked OK, but you must always expect people to join and appear. Stress level is high and we need to be vigilant to not let a problem go unnoticed.
  • +
  • We can switch from single-person to gallery live without too much trouble. +If spotlighting requires at least two videos but no "real" video is available or wouldn't make sense, one workaround might be to have someone show a "video" (zoom background + webcam cover on) so that it only shows the background) of CR logo or schedule or whatever feels relevant.
  • +
  • If spotlighting requires at least two videos but no "real" video is available or wouldn't make sense, one workaround might be to have someone show a "video" (zoom background + webcam cover on) so that it only shows the background) of CR logo or schedule or whatever feels relevant.
  • +
  • When capturing windows with OBS, set to "don't capture mouse cursor" and then you can hover over and pin/unpin video and the cursor and pop-up menu don't appear in the capture.
  • +
  • It is good when the presenters clearly say when things start and end, as in "And now we are done with the intro, and will go to our first lesson, Jupyter". It makes cutting a bit easier and also helps learners to re-orient.
  • +
  • The zoom default "focus on the current speaker" view was quite good for co-teaching, it was slightly less fragile than full gallery view but still swapped between the two people (but someone speaking with video off would have their name or profile picture displayed).
  • +
  • By using the OBS websocket remote control, one can see the current recording time, and use that to generate the video editlist live without being the one running OBS.
  • +
  • OBS helper: would be nice to have a way to unmute both of us.
  • +
+

Collaborative notes

+
    +
  • Don't try to insert html into HackMD :sweat_smile:
  • +
  • HackMD at this size seems to have worked, not all the time for everybody, but sufficiently.
  • +
  • Using one HackMD for twitch and zoom was a good idea.
  • +
  • Provide plan for the day (including breaks and exercise plan) on top of HackMD and mention it at the beginning of the day.
  • +
  • When talking about HackMD, please share it, it gives people something to +look at.
  • +
  • Add HackMD link to the workshop page and use the workshop page as main entry point so that participants don't have to hunt for links in email inboxes.
  • +
+

Installation and tools

+
    +
  • +

    Having one conda environment with everything seems to have been a success. We have seen a lot less installation friction and trouble compared to earlier workshops.

    +
  • +
  • +

    Very useful feedback we got via email (paraphrasing with own words, also support this): Let us reconsider the choice of editors. We use "plain" nano but many of us use something else, use syntax highlighting, possibly Git integration. By leveling everybody to plain nano we risk giving the impression that this is how development is always done or should be done (no offense to those developing using plain nano in their work)

    +
    +

    [Quote:] One of my personal tips which we discussed a little in the breakout rooms was the use of a modern editor with syntax highlighting, ssh-to-remote, and git integration. We are actually doing a little post-workshop about this subject in my team this week. I totally understand that you do not wish to enforce a choice of editor for the participants during the workshop, but I think that some of the learners that are beginners to for instance version control, will think that plain Nano without any extras is how a lot of people work. Which I think is wrong, but again this is only my impression. I'm thinking about a modern editor as a tool you use to force yourself to make the right choices as a default, for instance, awareness of snake vs. camel naming convention. I also realize that this is a subject that might not fit under the "beginner" label for software. Maybe it would make sense to host a "Research Software Hour" with this as a topic?

    +
    +
  • +
+

Presenting and coordinating

+
    +
  • Coordination plan should be continuously reviewed.
  • +
  • Strong director role is needed.
  • +
  • Give clear message at the end of the day: Now the workshop day is concluded, stream and recording stopped. So that people that came for workshop content can leave, then have some official start of 'afterparty'. It was not fully clear when the outro was finished.
  • +
  • Make it clear what someone needs to have open: Screenshare, HackMD, your terminal. You get links to the episodes from HackMD.
  • +
  • Avoid breaks between exercise explanation and doing exercise.
  • +
  • Clearly mark interruptions/speaking up during presentations as interruption (as in: not part of the presentation).
  • +
  • Spotlight video changes every time screenshare changes: It is defininitely still important to warn before stopping screen sharing (more than before)
  • +
  • Announcing "I'm about to take the screenshare" and waiting two seconds works +well.
  • +
  • Share screen for what you are talking about. Makes editing a bit easier.
  • +
  • When presenting, highlight or otherwise indicate on screen (not just temporarily) what you are talking about. It makes it much faster to scan through to make a good table of contents. Related: always show what is currently going on, like break times or pauses between exercises.
  • +
+

Lesson content

+
    +
  • Staging area: as usual, a difficult episode +
      +
    • What parts of the episode is a dependency for other parts of CodeRefinery?
    • +
    • Remove it?
    • +
    • Make it clear it is advanced/optional/you won't get it yet, when it is taught?
    • +
    • Move it to the end?
    • +
    +
  • +
+

Communication with participants

+
    +
  • Indico: select "none" after selecting some registrants to for example sending emails (otherwise selection remain).
  • +
  • Confirmation of acceptance to the workshop should be done sooner. It may be too late if they get confirmed one week before the event and suddenly need to free up 6 half days.
  • +
  • As for the "team registrations", as long they include an EL, we should send an acceptance ASAP.
  • +
  • Regarding individual learners and ELs: +1) opening sign-up as individual ELs and to set its soft-deadline much earlier than for individual learners, +2) for individual learners, opening registration first as stream viewers only with an option of 'want to join in interactive exercise sessions' yes/no, +3) after the soft-deadline of individual ELs, to those who said 'yes', sending invitations to sign-up for zoom participation in another reg. form, and +4) accept the capacity of #individual ELs x 5 and otherwise put them in waitlist. +However, I actually want to suggest a quite wild idea rather than struggling with the dilemma of no-shows and withdrawal with very very short notice while not being able to accept all sign ups. Instead of coordinating for acceptance and grouping on backside, how about encouraging open&public self-organization of groups? somewhere everyone can access, 'sign up' by writing their name, as a learner or EL, potentially also country, affiliation, background so that it might happen that they will self-organize a team. Once they can make a group of 6-7 people with at least one who can be acting as an EL, then their participation is sort of 'confirmed'. This is different from team registration as this is primarily for those who want to join but cannot make a group will find others to make a group to join in the workshop. +Another thing is that the threshold of ELs could be even lower than some people may think. And I would say being an EL is probably better way to learn about the CodeRefinery lesson materials than joining as an learner. Especially if some people have already made their own team, one of them should be able to act as an EL, or they can even circulate the role among eath other. +And what I learned from the R+Tidyverse workshop until yesterday is that if a learner cannot turn on camera or mic (for any reason), it is almost no worth to join in a breakout room session, as HackMD Q&A will more or less perfectly solve the problem in that case.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/05/04/improving-workshop-registration/index.html b/blog/2022/05/04/improving-workshop-registration/index.html new file mode 100644 index 00000000..e76327fa --- /dev/null +++ b/blog/2022/05/04/improving-workshop-registration/index.html @@ -0,0 +1,1161 @@ + + + + Our plans to improve our workshop registration process - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Our plans to improve our workshop registration process + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Our plans to improve our workshop registration process

+ + + +
+ +

As we entered the sustainability phase of the CodeRefinery project, the number +of participants attending our workshops continues to increase. The March 2022 +online workshop on best practices for scientific software development has +reached 297 registrants which is a +record for us.

+

Interactive lessons and team exercise work where teams of colleagues can +register as a team and go through exercises as a team are among the essential +ingredients of our workshops. However, we also wish to accommodate also solo +learners and exercise leads in our workshops and give them the possibility to +exercise with other solo learners. The challenge for us is to manage a dynamic +registration process and exercise group formation without excessive effort.

+

To collect ideas on how to simplify this in future, the CodeRefinery staff and +some community members have brainstormed in an online hackathon on improving +the workshop registration, held on May 3, 2022.

+

Below we summarize our observations and strategies for the upcoming events.

+

Goals of a good registration

+
    +
  • +

    Avoid chaos during the workshop

    +
      +
    • Avoid misunderstandings about registration types
    • +
    • Teams are clear and require minimum effort from organizers
    • +
    +
  • +
  • +

    Be able to predict attendance, avoid major disappointments

    +
  • +
  • +

    Reusable by different partners who have different approved survey platforms (not tied to one system, though it's OK if the questions have to be re-entered)

    +
      +
    • E.g. not being bound only to Indico or something else that needs to be installed
    • +
    +
  • +
  • +

    Collect good information on participants for reporting later

    +
  • +
  • +

    Registration does not have to ever close

    +
      +
    • Continued registrations allow people to join halfway through
    • +
    • What needs does this have?
    • +
    +
  • +
  • +

    Editable by organizers (without making a copy by exporting)

    +
      +
    • e.g. exporting Indico to spreadsheet makes a copy, if people modify their registration our copy is invalid
    • +
    • Google Docs allows a form to be directly connected to a spreadsheet, we can modify old registrations while new ones come in
    • +
    +
  • +
+

Lessons learned from a recent event

+
    +
  • Unclear what registration options mean, people sign up for Zoom and don't show up
  • +
  • We have to manage teams ourselves, which requires too much communication and +manual work. Teams should be able to do this themselves.
  • +
  • Scheduling teams is hard, must optimize for this and avoid all ambiguity
  • +
  • Registration coordinator shouldn't teach (much, certainly not early on)
  • +
  • Communication and registration is the same person or same two persons
  • +
  • Communication/registration and teaching coordination should not be the same person
  • +
  • Indico is a good tool but we need to remove old copy-pasted questions/options and streamline
  • +
  • Allow teams to register with one contact point only
  • +
  • Merging teams is hard in indico
  • +
  • Adjusting teams is hard in indico
  • +
  • Communication/registration/coordination is a full time job for two weeks prior to the workshop
  • +
  • Question about availability is too often misunderstood: ask differently
  • +
  • Optimize for fewer emails since these are difficult to delegate
  • +
  • For exercise leads it is confusing whether to choose staff registration or regular registration
  • +
  • It is good to leave registration open. People ask on twitch "can I have the +Q&A" and then I can say "not right not but if you register you will get it in +an email tonight so you have it tomorrow"
  • +
  • Regarding breakout rooms in Zoom and the problems with too small rooms, +missing ELs, and the organisational challenges: it's worth trying something +different next time, like having only one-person registrations but having +numbered rooms in zoom that participants self-organise into
  • +
  • Team registrations seem to have worked though and they seem to have the only +groups that "survived" to the end.
  • +
  • Local organizers could choose to use a centrally organized zoom if they +wanted - as long as they managed the teams themselves
  • +
+

Suggestions for improving our previous registration form

+
    +
  • "affiliation or university": have a list of institutions + "other" * free +text for other institutions or companies not listed
  • +
  • can we decentralize registration to groups and partners? +
      +
    • groups/partners scale as far as they like to as many helpers as they have
    • +
    +
  • +
  • questions on form +
      +
    • "do you want to participate in Stockholm? click here" -> another form
    • +
    • "in Aalto" -> another form
    • +
    • none of the above -> central form +
        +
      • group registration (exercise lead? or anybody as proxy?)
      • +
      • register as exercise lead and want to help out a "random" group
      • +
      • want to be part of a group -> click here but we can't guarantee a helper, especially if you register late
      • +
      • want to only watch alone
      • +
      +
    • +
    • also offer options to get informed for those unsure/undecided +
        +
      • yes
      • +
      • "interested"
      • +
      +
    • +
    +
  • +
  • standardized reporting form for partners
  • +
+

How to manage teams?

+
    +
  • Teams could handle some issues/setup themselves
  • +
  • They need some templates to send information
  • +
  • Which information should be sent by CR and which by the local organizers?
  • +
  • Need to get statistics and feedback from the local groups
  • +
  • Need to clarify if there will be "general" helpers in addition to team helpers
  • +
  • Larger project partners will probably prefer offering in-person exercise groups
  • +
  • How to deal with registration in the wrong form if we have several forms?
  • +
  • Each partner needs to clearly commit to a certain level of support and size
  • +
  • How to self-organize teams: +
      +
    • "helpers, rename yourself and join a room that does not have helpers yet"
    • +
    • "learners, if you are in a room that is too empty or too full, join another one"
    • +
    • this is to avoid rooms that are too full or too empty, or without helpers, or avoiding communicating which days an EL is unavailable
    • +
    • what if one exercise lead or room is more popular than another room?
    • +
    • how about continuity between days?
    • +
    +
  • +
  • What to do with solo registrations who are not part of a group and want to be +in an exercise group? +
      +
    • Is pairing up happening locally or centrally?
    • +
    +
  • +
+

Comments on a mock-up registration form

+

We have together reviewed an example +form and collected comments:

+
    +
  • Problems: "team organized by us" is not separated from "self-organized team"
  • +
  • The "probably not but send info" does not need to be asked for each day separately
  • +
  • But it's nice to offer the possibility to stay informed and decide later
  • +
  • Nice to have one form both for staff and everyone else to avoid the confusion that we saw at the previous event
  • +
  • "observer": let them decide whether they want emails or not
  • +
  • "how do you plan on attending" +
      +
    • Option 1: +
        +
      • Maybe confusing if somebody selects both zoom and in person
      • +
      • In-person breakout delegated to the local organization
      • +
      +
    • +
    • Option 2:
    • +
    +
  • +
  • Local rooms +
      +
    • Ask this earlier
    • +
    +
  • +
  • Teams +
      +
    • Ask this question earlier
    • +
    +
  • +
  • It is important that registrants can change their choices
  • +
  • In general, Radio buttons are nicer than dropdowns because you get to see the answers right away +
      +
    • But dropdown takes less screen space
    • +
    +
  • +
+

What if we get asked for help with creating a registration page for a local partner?

+
    +
  • We need to communicate who we share data with and ask for consent
  • +
  • We document what we ask and what we recommend partners to ask
  • +
  • We document which privacy policy we follow and which privacy standards +we require
  • +
  • We could offer a form/event if some local organizers need a separate +form but do not want to set it up themselves
  • +
+

Starting point for the new registration form

+
    +
  • OS +
      +
    • Dropdown
    • +
    +
  • +
  • Discipline +
      +
    • Dropdown
    • +
    +
  • +
  • Name +
      +
    • Open
    • +
    +
  • +
  • Email +
      +
    • Open
    • +
    +
  • +
  • Affiliation +
      +
    • Open
    • +
    • Has not been used for reporting yet but the information is good to +have
    • +
    +
  • +
  • Country +
      +
    • Dropdown
    • +
    +
  • +
  • Team name +
      +
    • Open
    • +
    +
  • +
  • Permission to give contact details to breakout room organizer +
      +
    • Yes/no dropdown
    • +
    +
  • +
  • Other notes to organizers +
      +
    • Open
    • +
    +
  • +
  • Room +
      +
    • Open
    • +
    +
  • +
  • Which days attending +
      +
    • Radio buttons
    • +
    +
  • +
  • Type of attendee +
      +
    • Radio buttons
    • +
    +
  • +
  • Do you want to attend in Zoom or follow live-stream only? +
      +
    • Dropdown/Radio buttons
    • +
    +
  • +
+

Conclusions

+
    +
  • Central registration is in Indico
  • +
  • We can offer a copy of our Indico template for a separate event for local partners who cannot use a local +registration system
  • +
  • Local partners are welcome to use their own registration systems
  • +
  • Teams can register as a team with a single contact point and the contact point does not have to be an exercise lead
  • +
  • We offer the possibility for individual learners and individual exercise leads to self-join exercise rooms
  • +
  • Workshop limits: +
      +
    • in terms of Twitch: it seems one bottleneck could be the collaborative HackMD document
    • +
    • in terms of exercise groups: the number of volunteers but also groups without exercise leads can be useful
    • +
    +
  • +
+

Follow-up steps

+
    +
  • Share a mock-up form soon with stakeholders for feedback via email and during a team meeting
  • +
  • Explain the setup clearly and concisely, directly in the workshop template
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/05/18/measuring-impact/index.html b/blog/2022/05/18/measuring-impact/index.html new file mode 100644 index 00000000..5137fabd --- /dev/null +++ b/blog/2022/05/18/measuring-impact/index.html @@ -0,0 +1,1108 @@ + + + + Outcomes from online hackathon about measuring the impact of CodeRefinery workshops - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Outcomes from online hackathon about measuring the impact of CodeRefinery workshops + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Outcomes from online hackathon about measuring the impact of CodeRefinery workshops

+ + + +
+ +

Introduction

+

The main focus of our project is to train and collaborate on training and to +connect training activities across different countries. But we also need to +report about our training activities and we need to apply for funding from +time to time. We also want to know whether we meet the needs of the community +and for this we need a mechanism to measure and evaluate the impact of our +workshops on software programming practices.

+

We have implemented a number of ideas to measure feedback and impact. In this +discussion session we re-examine these solutions and discuss how we can make +these more reusable for other projects. In short:

+
    +
  • When we operate online and hybrid, we are accessible to many more styles of +attendance (and different measurements, such as live-stream viewers).
  • +
  • We have an excellent report as part of +coderefinery.org, this will be +split to a separate repository that is usable separately.
  • +
  • Tune our daily feedback questions and provide more time and motivation for +this (see below).
  • +
  • Our quantitative measures include number of registrations, number of known +attendees (in person/online), and number of unknown attendees (live-stream +viewers).
  • +
  • Our qualitative measures include text-based feedback per day and also a +post-workshop survey.
  • +
+

How did we measure attendance and impact up to now?

+

When our workshops were smaller and in-person, we kept track of +presence/attendance and the feedback were sticky notes but over time as we +moved online and grew, measuring attendance became more difficult and the +numbers presented here today +represent the number of registrants and the real number of participants is +probably lower.

+

In addition, we have collected pre-workshop +survey data which was +part of the registration process and post-workshop +survey data which we +collect 3-6 months after a workshop (we have not been very consistent with the +exact intervals).

+

We have originally introduced the pre-workshop survey to have a feedback +mechanism for our workshop material but over the years the feedback collected +during a workshop turned out to be the more useful and a more direct feedback +loop (HackMD feedback is often turned into GitHub issues which later turn to lesson +changes). The pre-workshop survey generated interesting +data but it wasn't +really driving lesson changes.

+

Motivation to introduce the post-workshop survey was to ask whether anything +has changed for the participants after a workshop in the workflows and +tooling.

+

Looking back at our data and how our funders and stakeholders have used it, it +seems that questions about career stage, academic discipline, and +participation numbers per country were the most requested results.

+

Discussion

+

The main points of our discussion were:

+
    +
  • The number of participants per country is still an important thing to +measure, even if it may not be 100% accurate. +
      +
    • We can get that from registrations and Twitch data.
    • +
    • Breakout rooms could be a natural way to measure attendance but with team +and group registration and exercise room delegation this becomes less +directly measurable.
    • +
    +
  • +
  • How can we measure less but have more meaningful results while not adding too much +work? +
      +
    • We should not try to achieve perfection. Some data / details cannot be +collected.
    • +
    • We get some feedback via email also.
    • +
    • We could interview individual participants or groups for feedback / +impressions on the workshop +
        +
      • That would give more profound insights on how did the students feel.
      • +
      • We could ask for volunteers at the beginning of the workshop.
      • +
      • Conduct the interview at the end, and turn it into a blog.
      • +
      +
    • +
    +
  • +
  • We should not forget people take workshops for different reasons +
      +
    • Do some participants re-take a workshop for more in-depth knowledge? If so, are they attending partially?
    • +
    • And let's not forget passive learners, who might have it running in the background to see what is going on but not be active.
    • +
    +
  • +
  • Do we track how did people learn about the workshop? +
      +
    • Currently in the pre-workshop survey, but we should do it in the +registration.
    • +
    +
  • +
  • How to get feedback that helps us improve? +
      +
    • We could ask: why did you decide to stop following the stream?
    • +
    • We do ask: what did you find useful or not so useful?
    • +
    +
  • +
  • The HackMD feedback is one of the most important ways for us to improve the +lessons, as opposed to the pre-workshop survey. +
      +
    • The results need to be interpreted and compiled manually.
    • +
    +
  • +
  • Yet, we ask for the HackMD feedback in the last 5 min of the days, right as +people are leaving. +
      +
    • Consider improvements, such as asking before, or during, the last lesson.
    • +
    • Provide sufficient time for this, discuss the feedback as it comes in to +motivate it.
    • +
    +
  • +
  • During workshops, we should talk more about us and the workshops, and let +people know the importance of surveys and feedback. We should motivate how +this "pays us back".
  • +
  • Our current (early 2022 and earlier) post-workshop survey questions are +found at: +https://github.com/coderefinery/post-workshop-survey#survey-questions
  • +
  • NeIC perspective: +
      +
    • Ask project partners / stakeholders how do they benefit from CodeRefinery +training and how we can improve this
    • +
    +
  • +
  • How can we improve response rate? +
      +
    • Even shorter and clearer questionnaire
    • +
    • Good timing for when the survey is sent to participants, it seems that +Monday is the best day to send them out
    • +
    +
  • +
  • How can we learn why somebody stopped? +
      +
    • Easier for the contact person of group registrations to know why some of +the participants did not show up, e.g. if there are local parallel events +happening at the same time
    • +
    • Include a question in the registration form: would you like to withdraw +your registration? If yes, please tell us why (but we need to check +whether this can be implemented in our current solution)
    • +
    • Post-workshop survey: section for those who attended and section for those +who dropped out (the accompanying email needs to be carefully worded to +motivate participation and to not sound accusative about dropping out)
    • +
    • The feedback of a person who showed up but later dropped out is probably +more interesting/relevant than the one of a person who did not show up at +all
    • +
    • Our main focus should be to make and keep it interesting for those who +show up and on the material and we should not spend too much focus on +no-shows
    • +
    +
  • +
+

What will we change?

+

Registration (in addition to a previous discussion)

+
    +
  • We do ask: country and academic discipline +
      +
    • Also should allow multiple selections to mark interdisciplinary work
    • +
    +
  • +
  • Here we could also ask: career stage and how did you you learn about +workshop?
  • +
  • For group registrations it might get a bit tricky: +
      +
    • Contact person could list the academic disciplines and the career stages +of the participants (but we are unsure whether we can do that in Indico)
    • +
    • Make it possible and encourage the contact person to update the +registration form, e.g. at the end of the workshop
    • +
    +
  • +
+

Pre-workshop survey

+
    +
  • Integrate selected questions from the pre-workshop survey into the registration
  • +
  • In hindsight the pre-workshop data has not been used to change workshop lessons +
      +
    • Live-feedback (turned into issues turned into lesson/program changes) has +been the main feedback loop
    • +
    • Some of the questions can be turned into icebreaker question
    • +
    +
  • +
+

Statistics page

+
    +
  • Registration numbers +
      +
    • Convert from JSON to YAML (less error prone)
    • +
    • Make a separate repository
    • +
    +
  • +
  • Number of stream viewers +
      +
    • Combine registration numbers with streaming numbers on https://coderefinery.org/about/statistics/
    • +
    • Present views per country (it seems this is non-downloadable)
    • +
    • Present views over time (Twitch provides this data per 10-minute interval)
    • +
    +
  • +
+

Live-feedback (HackMD)

+
    +
  • Integrate feedback into the lesson itself, e.g. the last 10 min of the +workshop are dedicate to filling it in
  • +
+

Post-workshop survey

+
    +
  • What to ask straight after the workshop and what to ask later? Separate +survey?
  • +
  • Could be integrated to the pre-workshop survey because it can be updated
  • +
  • Update questions: +
      +
    • we could add the question: what would you like to learn more?
    • +
    • Maybe condense a bit (less text and repetition)
    • +
    • Remove suggestive questions if any
    • +
    • add academic field
    • +
    +
  • +
  • What data to request from groups / partners? +
      +
    • Number of participants
    • +
    • How did they like the event
    • +
    +
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/10/17/future-of-teaching/index.html b/blog/2022/10/17/future-of-teaching/index.html new file mode 100644 index 00000000..bc528e5d --- /dev/null +++ b/blog/2022/10/17/future-of-teaching/index.html @@ -0,0 +1,963 @@ + + + + CodeRefinery teaching strategies and the future of teaching - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery teaching strategies and the future of teaching + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery teaching strategies and the future of teaching

+ + + +
+ +

This is the index page of the Future of +Teaching series.

+

In early 2020, global teaching got disrupted by the Covid-19 +pandemic. Countless courses struggled to maintain interaction and +teaching, but CodeRefinery found that by embracing the times, our +teaching could become even better. This series of blog posts will +discuss what we did and how you can learn from it.

+

So, what is the future of teaching? For type of practical, hands-on +learning, we could try to classify learning situations into three +types:

+
    +
  • Very large courses and massive open online courses (MOOC),where +individual interaction isn't possible.
  • +
  • Small-medium courses, 10-30 people, with traditional classroom-type +interactions.
  • +
  • One-on-one or small-group mentoring.
  • +
+

Before Covid, CodeRefinery was in the middle category with exclusively +in-person classroom sessions over a few days. During Covid, we +focused on very large online courses, which incidentally corresponded +with the rise of Research Software Engineering services in some of our +communities. This produced an interesting effect: The middle layer +got squeezed out: very large courses (with the proper tools) were +better at conveying information, and mentoring and co-working was best +for supporting people outside of these courses. These two things +combined seemed to greatly reduce the need for traditional +medium-sized courses. At the same time, the total effort became less +as we scaled up, which we'll talk about later.

+

Of course, you can't move medium in-person courses to large online +courses without adjusting how you teach. However, once we did adjust, +we were quite happy. We want to take some time in these posts to +informally discuss what we did, sort of as a guide to the other +information which can be found in our +manuals.

+

The strategies we have developed have revolutionized the way we teach. +We no longer have limited attendance because of room sizes, mandatory +registration, or instructor monologues. We don't want to "return to +normal", and we think that others should start learning of our +developments as well.

+

But we realize that not everyone can go all the way that we have gone. +It takes a lot of effort to put on a livestream course with tens of +staff (but still many of our strategies can be adapted by others). +Medium-sized courses are still great for medium-sized communities and +provide a good way for a few people to reach an audience - especially +if it is local. We hope to explore the ways that what we have learned +can be adapted to this kind of teaching, too. And of course, we will +continue supporting medium sized courses where someone wants them, +especially as a "reverse hybrid" with remote instructors but in-person +exercises.

+

Future blog posts in this series could include the following (this +list will be updated and future blog posts will be linked below, this +is the "start page" of the series):

+ +

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/10/21/python-for-scicomp/index.html b/blog/2022/10/21/python-for-scicomp/index.html new file mode 100644 index 00000000..aaabd917 --- /dev/null +++ b/blog/2022/10/21/python-for-scicomp/index.html @@ -0,0 +1,921 @@ + + + + Python for Scientific Computing open for registration and collaborators - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Python for Scientific Computing open for registration and collaborators + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Python for Scientific Computing open for registration and collaborators

+ + + +
+ +

Our next workshop, Python for Scientific +computing, +is ready for you! Take part in different ways:

+
    +
  • +

    If you want to learn, you can register. Like all of our livestream +courses, +there are diverse ways to attend based on your needs.

    +
  • +
  • +

    If you are a small group, attend together! Get a meeting room, or +online meeting, and watch together. We will tell you when exercise +sessions are, and then you can work together on that.

    +
  • +
  • +

    If you are an organization, sponsor attendance locally! Reserve a +room, open your own registration form if you want, and host the +watching. There will be clear times for in-person work like this - +if you contact us, we'll help you however much we can.

    +
  • +
+

Python for Scientific Computing has run in 2020 and 2021, and was +designed to be a next step for scientists after basic Python: not too +in-depth, but showing a broad, hands-on picture of many useful tools +in the Python ecosystem. All +material and +teaching is open-source before, during, and after the course.

+

Last year, we had 500 viewers for our peak days. Can we make 1000 or +5000 this year? - the course certainly supports it, and with your +help, we can.

+

If you want to contribute more (or see how we do it), join the +CodeRefinery chat and +introduce yourself.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/10/24/parallel-chat/index.html b/blog/2022/10/24/parallel-chat/index.html new file mode 100644 index 00000000..5e47812b --- /dev/null +++ b/blog/2022/10/24/parallel-chat/index.html @@ -0,0 +1,1007 @@ + + + + Parallel chat ("HackMD") and scaling teaching - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Parallel chat ("HackMD") and scaling teaching + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Parallel chat ("HackMD") and scaling teaching

+ +

+ Parallel chat via a text document enables interactively at scale when online teaching. +

+ + October 24, 2022 + + - Richard Darst + +

+ +
+ +

Part of a series on the Future of +Teaching

+

One of the most common complaints when moving online was the amount of +interaction and feedback possible. How often have you heard "please +turn on your cameras so I can see how it's going" - only to have no +one do that. You might be surprised to learn that CodeRefinery's +online courses have an order of magnitude more interaction than our +in-person courses.

+

Our solution is "parallel chat", or as we typically call it "HackMD" +after the service we started using, hackmd.io - although it's not really specific +to that HackMD, and neither is it a chat platform. Basically, it's on online document (think +etherpad/Google Docs/etc) that everyone can see and edit at the same +time. Instead of asking question by voice or via classic (linear) chat, +people write new questions as a bullet point in the bottom of the +parallel chat. Our team of helpers answers them in sub-bullet +points - and a whole discussion can happen in these bullet points.

+

Demonstration of HackMD

+

There are a variety of reasons this is so good:

+
    +
  • You can have multiple people asking and answering at the same time +(not possible with voice, and linear chat gets confusing with)
  • +
  • At the end of the course, we have a beautiful Markdown document to +revise and publish. We can make sure that all questions get an +complete, accurate answer.
  • +
  • People can ask anonymously - which encourages questions from those +who would usually be silent in courses.
  • +
  • Equally, questions don't distract everyone, so there is no pressure +to be quiet to let the course go on.
  • +
  • You can get multiple diverse answers to the same question, showing +that the instructors aren't one homogeneous group and to give multiple different solutions, when "one right answer" does not exist or is more a matter of taste.
  • +
  • By having more questions asked, you can get much more feedback while +teaching - so much you have to be careful to not be overloaded!
  • +
  • It's fun: parallel chat via a text document isn't perfect, but it's +pretty good. It allows some creativity in asking, answering, and +giving feedback. +For example polls can be conducted as "+" or "-" or "o" added after the options.
  • +
+

Just look at the number of questions in our old courses, one 3.5-hour +day of our May 2022 +workshop - +and this is day 1, when people didn't yet know how it worked.

+

But there are some disadvantages:

+
    +
  • An absolute flood of information, which will be distracting to +anyone trying to follow it. We warn people at the start to be +careful about this, and it's mostly OK. It's anyway archived for +follow-up later at one's convenience.
  • +
  • Another window for people follow. Like above, we warn people to +focus on the learning and parallel chat only when there is time.
  • +
  • It's different, so needs some explanation (but we've seen people +catch on very quickly once they see it).
  • +
+

So, just how does this work? Well, we create the text document with +some standard notes at the top and bottom. It's made freely editable +without any login, shared to everyone in the workshop. All learners +are told to ask every new question in +list item at the bottom of the document - always the bottom, since +that's the only thing we follow. The course team has this open and +answers questions, focusing their attention at the bottom. Some other +notes:

+
    +
  • Instructors should discuss it via voice often, mentioning when the +look at it and when questions come from it. Let the audience know +it's actually useful.
  • +
  • Screenshare it during the Q&A parts and breaks (you need a tool that +won't show the names of anyone who might have happened to be logged +in - HackMD does this properly). It provides something to look at +and reminds people that it exists and has lots of answers.
  • +
  • We often use it as an icebreaker as a demo. Maybe not everyone +understands it.
  • +
  • It can also be used for lightweight polls: learners can +1 or add +a character to a line to make simple bar graphs.
  • +
  • Like we said above, it's not a perfect tool, but easy to use and fun.
  • +
  • A "HackMD manager" watches it and tries to keep things organized, +adds section headings, and so on. This makes it easy.
  • +
  • Remember, new content only to the bottom! People can't go following +multiple sections.
  • +
+

We don't have unlimited scaling and there are some other problems, +though. Some possible issues that may come up:

+
    +
  • To make this really good, you need at least one person focusing on +the parallel chat - or at least two co-instructors. In workshops of +our size, this hasn't been a big issue, though - it provides a good +task for helpers.
  • +
  • The tech might not scale to thousands of people - hackmd.io has +worked with hundreds, or sometimes has been slow. A self-hosted +hedgedoc instance has worked with hundreds and can probably go +higher.
  • +
  • At some point, if the parallel chat is available to everyone, trolls +will start ruining it for everyone. +Our plan is that the parallel chat URL is a bonus for registered +participants, and sometime later we could enforce this limit even +more strictly with write-protections.
  • +
+

As good as this is, can in also work for small courses? In theory, +yes, of course. But in practice, the smaller courses get, the harder +it is...

+
    +
  • Lack of helpers to answer in parallel - fewer answers ⇒ fewer +questions. Fewer questions ⇒ less time looking at it ⇒ less +motivation to ask questions.
  • +
  • But also in smaller hybrid courses it provides a great way to give equal opportunities to on-site vs online participants to ask and get answers to their questions.
  • +
+

Overall parallel chat in a workshop feels extremely interactive - even +more so than a medium-sized traditional in-person course. Combine +with a team for teaching, and things seem to work very well.

+

See also:

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/10/31/co-teaching/index.html b/blog/2022/10/31/co-teaching/index.html new file mode 100644 index 00000000..f01eee1a --- /dev/null +++ b/blog/2022/10/31/co-teaching/index.html @@ -0,0 +1,952 @@ + + + + Co-teaching and scaling up - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Co-teaching and scaling up + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Co-teaching and scaling up

+ +

+ Co-teaching replaces (forced?) learner interaction with natural interaction between co-instructors. +

+ + October 31, 2022 + + - Richard Darst + +

+ +
+ +

Co-teaching

+

So you are trying to teach a large online course. Everyone knows this +will be boring and monotonous, right? What if we told you that our +large, online, livestreamed courses feel more interactive than our old +small in-person courses? Part of that is due to the +parallel chat, +but a significant part also comes from co-teaching, the topic +of this article.

+

The basic idea is that we accept that the audience is probably going +to be quiet, and plant someone to interact with the instructor. This +person doesn't pretend to be a student, but directly acts as a +co-instructor and the course becomes a discussion between them. This +is different than having two instructors who alternate teaching, or an +instructor or helper. It's more like a pilot-co-pilot situation, +where both pilots have a certain focus, but the flying is a continual +team process with each having a focus (flying and monitoring) but both +constantly providing information to each other.

+

Doing co-teaching in practice requires some care, but isn't that hard. +There are different models, usually we try to designate a primary who +is going over the course material, and the other co-instructor acts as +a learner, asking questions and engaging by being the "voice of the +audience". The co-instructor who isn't most actively talking spends +some time watching the parallel chat and raising these questions. During +demo times, one common strategy is that one person is guiding and +explaining the big picture and the other person is typing and +explaining the small picture. Whatever happens, it works. And +usually very well.

+

Besides the much greater interaction, there are other benefits. It's +much easier to onboard a new instructor - one can almost go straight +from advanced learner to co-instructor, since "asking questions a +learner might have" is enough to start. Co-teaching also reduces the +stress of preparation: the instructors still have to prepare, but +with two people, by simply pausing or asking a question to the other +person, any gaps can be filled in.

+

Perhaps the biggest disadvantages are the need for more people and to +coordinate. But, there is probably less preparation total needed. It +requires more staff, but we need a continual flow of instructors +coming in anyway - so this helps us long-term.

+

What's the minimum size course where this makes sense? In theory, it +could work for very small courses, but at that size you would probably +hope that the audience interacts directly. At a few tens of students, +it might work, if you can keep the co-instructor discipline working +well - but that might easily be forgotten if there are many questions +from the audience. But I personally think that even small courses +benefit from two brains, and it worth trying co-teaching at any size.

+

Overall, co-teaching has revolutionized our teaching: we can feel more +interactive in large courses, we can bring in new instructors more +quickly, and we can teach better. It really seems to solve the boring +"500-person lecture" problems that I had when I was in university. We +now use co-teaching for anything that needs to seem "professional", +from 20-person instructor training via Zoom to our 500-person +livestreamed Python for Scientific Computing courses.

+

See also:

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/07/reverse-hybrid/index.html b/blog/2022/11/07/reverse-hybrid/index.html new file mode 100644 index 00000000..bb2ff111 --- /dev/null +++ b/blog/2022/11/07/reverse-hybrid/index.html @@ -0,0 +1,954 @@ + + + + Reverse hybrid teaching - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Reverse hybrid teaching + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Reverse hybrid teaching

+ +

+ 'Reverse hybrid' is instructors remote, students local - possibly spread among different locations in small groups. +

+ + November 07, 2022 + + - Richard Darst + +

+ +
+ +

Part of a series on the Future of +Teaching

+

In 2020, we went to remote teaching. In 2022, we are talking about +hybrid so that we can keep accessibility benefits of being online, +while returning to some of the benefits of interaction. But does this +work? There are plenty of issues with hybrid, mainly the inequality +of the people in-person and those who are remote. What can we do +about this?

+

We've found a surprising solution which we call reverse hybrid. +Surely others have thought of this, and maybe there is even a proper +name.

+

Let's do a thought experiment in a large course. There is one teacher +and hundreds of students. What's the benefit to students doing this +in-person? It's probably not being in the same room as the teacher, +since most students don't have time to ask a question, or even +approach the teacher after the course. The benefit is how students +can interact with each other beside the lecture. The downside is that +making good, accessible online material in a lecture room is hard.

+

I wouldn't quite say it's accidental, but we have started this reverse +hybrid strategy: the teachers are online, and students can be +in-person in small groups. We started this by encouraging students to +meet up with their friends or colleagues to work on exercises, while +we teach online. As things became more relaxed, we had some staff +organize official in-person exercise sessions - while the current +instructors kept teaching online. This has worked surprising well - +students who want interaction can get it (and actually interact, +without disrupting the whole course), and those that don't can still +attend no matter where they are.

+

But what do we lose? Do we lose interaction with instructors? As +our posts on co-teaching and parallel chat show, no! When you get to these large +courses, students can't interact with instructors without technology +anyway. In-person interactions aren't as anonymous, so that solution doesn't +motivate all learners to be active.

+

And what do we gain? The course isn't bound to one location, +literally anyone in the world can attend. There are high-quality +materials that everyone can review afterwards, so that the audience +has the time to relax and interact. By being able to scale up, we can +have more staff, which allows us to interact more via parallel chat or +co-instructors. It's even possible to go as far as we go and make +each course an international collaboration with local breakout rooms, +and plenty of staff to manage everything.

+

Is "reverse hybrid" for everyone? Clearly not. I think it could work +for small courses too if a teacher really promotes the use of +technology to make interaction, but it might feel a bit weird - though +I think it's worth trying! I think the biggest advantage is that it +allows you to scale up in a way that you are no longer have to teach +alone, which is a mindset change more than anything.

+

In practice, does it work? In several cases where we had a structured +in-person session, it has worked well. We know of cases of groups of +friends or colleagues joining together to watch and do exercises for +each of our courses, but we don't have a way to say just how many. We +do have a report of it not working so well - because the online +interaction dominated the in-person interaction. But is that really a +negative about in-person, or an overwhelming message about how +engaging our online courses are?

+

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/08/lessons-learned-Sep-2022/index.html b/blog/2022/11/08/lessons-learned-Sep-2022/index.html new file mode 100644 index 00000000..ebb0e5ed --- /dev/null +++ b/blog/2022/11/08/lessons-learned-Sep-2022/index.html @@ -0,0 +1,1046 @@ + + + + Lessons learned from the Sep 2022 online workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from the Sep 2022 online workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from the Sep 2022 online workshop

+ + + +
+ +

September 20-22 and 27-29, 2022, we held again our CodeRefinery online +workshop (6 x 3.5 hours) +with 204 individual registrants plus 10 teams with a total of 47 participants. +Here we wish to share with the community and our future selves our lessons +learned: What worked well and what we need and plan to improve. We use bullet +point format for brevity. If you think you might have solutions for us or want +to discuss about the topic, please [reach out to +us(https://coderefinery.org/organization/contact/). This complements our +lessons learned from our first online workshop +2020 and the +May 2021 +workshop.

+

We have identified the following main issues that we want to address for future events:

+
    +
  • Registration process is still too complicated.
  • +
  • We are asking ourselves how to further scale without being completely overwhelmed by coordination/communication/synchronization.
  • +
  • There are not enough exercises, especially in the later workshop days and exercise leads often feel that they don't have enough to do so we need to improve the experience for exercise leads.
  • +
  • Lots of effort goes into recruiting exercise leads but then it may be demotivating for some to participate if there are no-shows or not enough interaction in the breakout rooms.
  • +
+

Registration

+
    +
  • We still need a more lightweight system registration. +
      +
    • This is a balancing act between guiding people and trusting them to self-organise.
    • +
    +
  • +
  • Could we actually get away with no registration at all? How to get stats then? +
      +
    • Zoom and Twitch give data like the number of persons viewing. One may ask in the HackMD about the country of origin and additional information for the statistics. +
        +
      • Part of it can be via the icebreaker questions.
      • +
      +
    • +
    +
  • +
  • If we offer a central registration and partner registration sites, they ideally need to open at the same time, otherwise +participants sign up in the "wrong" one.
  • +
  • We could have registration but let people self-organise more: +
      +
    • Offer HackMD, exercise lead zoom, exercise Zoom, stream and inform people about those resources.
    • +
    • Give hints about different ways to participate but no rigid instructions.
    • +
    +
  • +
  • We could leave team registration completely to the partners or participants to handle: +
      +
    • Tell that they could summon teams in their organisation communication channels.
    • +
    • They could indicate somewhere that they are open for managing additional teams.
    • +
    • Tell organisations that they can organise their own registration.
    • +
    +
  • +
  • Exercise leader registration was confusing (too many forms to fill out).
  • +
  • We could ask for participants' consent to be contacted for future events organized by us to allow past participants to inform their colleagues about an upcoming workshop.
  • +
  • How to deal with late registrants? +
      +
    • Should they get the Zoom link or only HackMD? +
        +
      • If not we should take those options away from the registration form. Maybe have a last minute registration form as a separate one.
      • +
      +
    • +
    +
  • +
  • Consider adding others who are helping to Indico (our registration system) as managers :grin:.
  • +
  • We could communicate clearer that also participating part of the workshop is possible and encouraged.
  • +
+

Workshop format

+
    +
  • We noticed that most participants were interested in the Git part and after the Git lessons the interest was smaller. But it could also be that the Git lessons were the first lessons and then work load increased or interest decreased or participants found it too difficult.
  • +
  • Communicate better that even if the Git part gets too difficult, the second week may still be worth watching and again easier to comprehend.
  • +
  • Generally we observed a significant no-show rate (over 50%).
  • +
  • Maybe this format is too big for the resources/time that we have as organisers. +
      +
    • Maybe the task distribution was not clear/visible.
    • +
    • It at least difficult to get enough instructors to commit
    • +
    +
  • +
  • Learners were not that motivated in joining the Otaniemi in-person (daily decreasing numbers).
  • +
  • Is September too crowded with other events?
  • +
  • Have we saturated the local market?
  • +
  • Workshop going over lunch time (until 13:30 local time) was an issue at least in JYU and CSC, +
      +
    • People managed when topic to come after break was announced before break so that they knew if they could skip without losing the thread.
    • +
    +
  • +
  • We could try flipped learning: have people watch videos / read the docs and then come on-site/online to discuss and solve problems
  • +
  • Should we do more asynchronous teaching/learning?
  • +
+

Coordination

+
    +
  • Establish the process according to the experience gained from this and previous workshops: +
      +
    • Make step-by-step instructions in manuals on how to arrange such events.
    • +
    • Put everything that participants will need for the workshop already into the Indico confirmation message. +
        +
      • Info from emails sent could be also in manuals except for the links.
      • +
      +
    • +
    +
  • +
  • It might be interesting to count the number of hours/emails/euros/zooms spent per participant showing up since also in this course we struggle to some extent with no-shows.
  • +
+

Zoom and Twitch

+
    +
  • Ask exercise leads (ELs) not to speak in learners Zoom while lecturers speak in Twitch.
  • +
  • The goal was to have Zoom instructions about breakout rooms and open breakout rooms well before the stream starts but we didn't manage that this time. We opened them ~10 minutes before exercises.
  • +
  • Utilise Zoom annotate in co-teaching.
  • +
  • Exercise Zoom rooms: +
      +
    • Tech questions room: difficult to follow if someone actually goes there. +
        +
      • It would be better to join the tech room during breaks, or before/after the lectures.
      • +
      +
    • +
    • Quiet room had 1-3 participants always.
    • +
    +
  • +
  • Exercise room instructions screen-share: We did it from separate device so we had the host computer free to operate stuff.
  • +
  • We could share the Zoom link as well and consider having a password and/or waiting room (but then somebody would have to manage that).
  • +
  • More interaction in video room: +
      +
    • Since there was so little interaction and not enough exercise time: some ELs felt that they "are not needed"
    • +
    • Too few exercises or too short exercise time and hence not enough possibility for interaction.
    • +
    +
  • +
  • Exercises felt too short (because many participants were software-unprepared).
  • +
  • Navigation problems among different webpages continues to be an issue. Few suggestions on how we could solve it have been and are being discussed here.
  • +
+

Collaborative notes

+
    +
  • HackMD goes to Twitch chat anyway so maybe no point in keeping it as a secret. +
      +
    • Add HackMD link to the workshop page and use the workshop page as main entry point so that participants don't have to hunt for links in email inboxes.
    • +
    +
  • +
  • HackMD started to be slow even if it should not with ~100 participants. +
      +
    • Numbering questions adds confusion -> keep bullets and change to numbers in archive if needed. But this problem was only there because the document was sluggish at times.
    • +
    • Note for future: when pre-seeding the question numbers, leave a line between them. Then, when someone pushes enter after a number to add a new line, it doesn't increment the future numbers. Just saw this, this solves a big problem with numbering.
    • +
    +
  • +
  • Later in the workshop we deployed our own HedgeDoc instance, which worked quite well.
  • +
+

Installation and tools

+
    +
  • Many did not install software beforehand. Either we haven't communicated clearly enough that this is needed or the install sessions were not recognized and not taken up. Very few people showed up at the install help sessions.
  • +
+

Lesson content

+
    +
  • More big picture cohesion between exercises: It has been suggested to have a better connection between lessons and work on one repository that is continuously improved.
  • +
  • Provide snapshots and starting points for those who have not done the previous exercises.
  • +
  • Topics in Day 4 (at least) would deserve a longer lesson.
  • +
  • We can try to communicate better that after the Git lessons it can be OK and also useful to join only for the lessons of interest (to motivate people to pop in also for 1 or 2 lessons).
  • +
  • Especially in in-person: the Twitch sessions felt long (since there was so little interaction in the in-person rooms).
  • +
+

Communication with participants

+
    +
  • Add all sessions to the CodeRefinery calendar.
  • +
  • Link all relevant repositories in one place (i.e. this calendar and anything that needs attention near a workshop). Make sure those repositories have good instructions in READMEs.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/08/mastodon/index.html b/blog/2022/11/08/mastodon/index.html new file mode 100644 index 00000000..e59fea18 --- /dev/null +++ b/blog/2022/11/08/mastodon/index.html @@ -0,0 +1,967 @@ + + + + CodeRefinery Mastodon account - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery Mastodon account + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery Mastodon account

+ +

+ CodeRefinery has started a Mastodon social media account. +

+ + November 08, 2022 + +

+ +
+ +

For the obvious reasons, CodeRefinery is looking into a Mastodon +account. You can now find us at +@coderefinery@fosstodon.org.

+

We will try to mirror to both, at least for the time being. If anyone +has ideas about how balance the two, please let us know. We will have +the CodeRefinery account follow other staff and interesting people +related to CodeRefinery's mission, so if you are looking for other +interesting people to follow to seed your network, check that out, +too.

+

Mastodon is part of a federated social network, open source, and not +under the influence of big companies - just what we should be +supporting more of. Interested in joining yourself?

+
    +
  • https://mastodon.help gives a basic introduction of the how and +why. https://fedi.tips/ gives a longer FAQ (and a separate +introduction).
  • +
  • Usernames are like emails with a username and a server name, +@username@server.name.
  • +
  • To join, you choose a server that you feel comfortable in, and they +all communicate. Some recommendations are below.
  • +
  • You can follow anyone regardless of their server, but the server you +choose might affect what you see in the local timelines (for +example, an art-focused server will probably have more stuff +interesting to artists). Later, it's easy to move and automatically +redirect your followers.
  • +
  • When in doubt, just join somewhere that looks reasonable - don't let +the Paradox of Choice hold back progress!
  • +
+

If you are just joining, you can start out by following CodeRefinery - +copy @coderefinery@fosstodon.org to your search and follow it. You +may be interested in following some of the people that we follow to +seed your list.

+

Deciding a server:

+
    +
  • We chose https://fosstodon.org (FOSS = "free and open source +software") to focus on the software and technology side of things.
  • +
  • For others in academia or research, +https://fediscience.org/server-list.html is a very nice list of +other interesting servers.
  • +
  • https://mastodon.social/ is run by the non-profit that coordinates +the Mastodon open-source project, but that does not mean you +should necessarily prefer it.
  • +
  • Do a web search for server lists. There are both news articles with +broad recommendations, and searchable lists with many servers for +specialized topics.
  • +
+

What you should know about Mastodon (especially vs. Twitter):

+
    +
  • It isn't designed to feed you content via internal algorithms: you +have a much more active role in determining what you see. You need +to find some people to follow, follow who they follow, and develop +your network. At the same time, boost ("reblog") things that are +good so that your network can see them.
  • +
  • It's not designed for low-effort replies (quote-replies) since it +makes engagement farming and negative attention. You can reply to +posts with the reply button on each post. (don't forget you can +click on post to see the thread).
  • +
  • Use hashtags to make things searchable, there is no full-text search +(to make it harder for random attacks based on opinions)
  • +
  • "Fediverse" ("federated universe") is the term used to refer to the +entire network of Mastodon servers (and more) that can communicate. +It's not just Mastodon - +ActivityPub can +communicate across different types of servers, such as image +hosting, video, blogging, etc. - in theory avoiding lock-in.
  • +
  • The Mastodon network is currently absorbing millions of new users in +a matter of days. Especially the popular servers can be a bit +behind in all of the hidden network synchronization work.
  • +
+

We hope to see you there!

+

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/14/livestreaming-courses/index.html b/blog/2022/11/14/livestreaming-courses/index.html new file mode 100644 index 00000000..a0a8e3e1 --- /dev/null +++ b/blog/2022/11/14/livestreaming-courses/index.html @@ -0,0 +1,992 @@ + + + + Livestreaming courses - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Livestreaming courses + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Livestreaming courses

+ +

+ Livestream courses have changed how we teach by allowing unprecedented scaling possibilities. +

+ + November 14, 2022 + + - Richard Darst + +

+ +
+ +

Part of a series on the Future of +Teaching

+

The idea of livestreamed courses came in early 2022, during the early +phase of remote work and teaching. Everyone started online courses +and events, but immediately stared hiding their connection information +behind registrations because "someone might do something bad if they +could join"[1]. While there was a valid short-term reason for this, +something seemed wrong: the promise of the internet was that we can +reach everyone. Yet here we are making things closed by default.

+

Start of the livestream idea

+

I got to thinking about this, and realized we needed to re-think what +it means to interact online. Our first courses used the "meeting" +concept - everyone talks to everyone. But online activities with +large audiences aren't like that - common mass engagement models +include things like TV broadcasting, posting videos, forums, +livestreams, and news articles.

+

So once I understood the conceptual problem with Zoom meetings, I knew +what to do. We started working towards disconnecting the core +teaching parts from the meeting parts. That resulted in developments +like parallel chat ("HackMD") for +questions and +co-teaching, and lots more things +which you will see later such as learner teams. Basically, it was a +systematic process of re-thinking teaching until we could move on to +the next step without losing essential points like interactivity or +engagement.

+

How livestreaming works for our courses

+

Then came livestreaming. Livestream is a fancy way of saying +live video, in this context as a public broadcast over the internet. +We had a few first pilots made by having Zoom do the livestreaming +directly to Twitch (there is something built-in, but I didn't like it +very much) - at least this let us say "anyone who wasn't able to +register can watch the stream". We also got a lot of experience with +streaming in our project Research Software +Hour.

+

The fully "proper" livestreamed course was 2021 February, our Intro +to scientific computing/HPC +Kickstart, +and was great! There were no major problems, and it actually felt +pretty refreshing because for once, everything felt like it was under +control. It was too early to livestream every single course, but by +late 2022 we are using it for most of our capstone courses.

+

How do we actually do it? Instructors teach by Zoom, but there are +no learners or helpers there. The Zoom windows are captured by OBS +(Open Broadcaster Software), which +livestreams to Twitch. Course staff can broadcast to everyone, but +the audience can't interfere with each other, except through our +(moderated) channels. This lets us scale far more than we could +otherwise.

+
+

Livestreaming is made possible by strategies like parallel chat and +co-teaching. Because we livestream, we can now do reverse hybrid, +be more open, produce videos immediately, work together, and +simplify registration. Livestreaming is the mediator of all of our +strategies - even if it's not technically required.

+
+

Evaluation

+
+

I attended several "top" conferences/workshops/seminars as well as +videolectures this past year in their virtual implementations, and this +event is easily the best out of all of them when it comes down to +presentations and audience participation!

+
    +
  • Feedback from Summer 2021 HPC Kickstart
  • +
+
+

In general, feedback was positive.

+

Let's just say there was one surprising thing we noticed: since the +audience isn't in the Zoom, during breaks (when the livestream is +muted and video off), the co-instructors are free to discuss without +disrupting the course. This actually is great for the co-instructors +to manage the flow of the course - and students can continue +interacting via parallel chat +anyway. And when the audience is not in the stream, you can publish +videos immediately with no privacy risk - which is great for +accessibility.

+

Livestreamed courses aren't exactly perfect, but they are pretty good +and I think they should be considered more. It does take some tech +setup and some time to get used to them. Most people probably +wouldn't want to use it for small courses, so there is some threshold +of being worth it. Whatever the case, I think it's something that +everyone teaching online should think about.

+

See also

+ +
+

[1] Incidentally, since 2020 we have had a daily online meeting, our +Scientific Computing Garage help session, with the Zoom link online, +and have never had any problems. My hypothesis is that if you don't +have an exact data listed along with the Zoom information, it's not +found by those that want to troll.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/21/video-publishing/index.html b/blog/2022/11/21/video-publishing/index.html new file mode 100644 index 00000000..fbedbb7f --- /dev/null +++ b/blog/2022/11/21/video-publishing/index.html @@ -0,0 +1,965 @@ + + + + Video publishing supports more learning styles - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Video publishing supports more learning styles + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Video publishing supports more learning styles

+ +

+ Publishing course videos supports more learning styles and doesn't have to affect privacy. +

+ + November 08, 2022 + + - Richard Darst + +

+ +
+ +

Part of a series on the Future of +Teaching

+

What if all the talking in a course didn't disappear right after the +course was over?

+

When we went online, many people thought: avoid recording courses, +that's a privacy risk for participants. I firmly think this is the +right choice: I don't think any privacy risk to participants is worth it, and "don't +say anything if you don't want to be recorded" isn't good enough, +either - I don't want to push "publish" and have to hope that no one +missed the warning. I don't want to motivate participants to be +silent. Editing videos takes a long time and is hardly worth it.

+

This is part of why we developed livestream teaching: we want to +separate the instructor interaction from learner interaction, so that +there is no privacy risk whatsoever when recording. This only works if the +livestream is engaging enough, but our previous posts show how we +handled that problem.

+

In order for a video to be useful, it has to be published quickly. +Watching videos months later isn't that engaging[1], but as a immediate +follow-up for things you missed, or catching up if you had to miss a +day, it is extremely useful. We can't have a long publishing +process with this.

+

So, with livestreaming, what do we get?

+
    +
  • The livestreaming platform usually records the video, making it +immediately available in raw form. This usually gets a lot of +views, even if it is raw.
  • +
  • Extensive editing isn't needed, since you aren't looking for +privacy issues in the stream - just making it "good enough" in the +amount of time you have.
  • +
  • Learners can catch up immediately or refresh themselves on what they +saw going off into the future.
  • +
  • If learners know videos will be available, they +are suddenly much more free to go with the flow of the course.
  • +
+

We actually made our own tool, +ffmpeg-editlist, +that allows us to define cut points in YAML file, and then run a +process to do the editing. This allows us to distribute the editing +via git, and copy-and-paste from previous years to save time. Thanks +to this, it's our standard to have videos published by midnight the +day of the course.

+

Overall, this works well. We seem to get lots of views with the +Twitch automatic video (which lasts for 7 days): the same day as the +course, usually 1-2 +times the number attending the livestream (stats from Python for +Scientific Computing 2022). The YouTube +videos tend to get much fewer, since it's not ready on time for people +catching up the same day. I'm still the main one making the videos, +but it's simple enough that others could do so. I think I put in too +much effort, and if I wanted it could be much faster - say, take only +an hour per day.

+

I wouldn't recommend everyone try to make perfect videos for +everything, but it's a nice advantage of livestreaming, and if you +want text-based video editing for other events, ffmpeg-editlist might +make it possible.

+

In short, I don't think the point of video publishing is to make a +high-quality standalone production (although we can do that, and it +can work well, especially with co-teaching). The most direct impact +is supporting diverse teaching styles in the short term.

+

Read more:

+ +

[1] Before remote teaching in 2020, an argument against recording the +teaching was "it won't be interesting for others to watch later". +This post also shows how that's the wrong perspective: the videos +aren't only for random people later, but people in the course already.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2022/11/28/teams/index.html b/blog/2022/11/28/teams/index.html new file mode 100644 index 00000000..57aaa254 --- /dev/null +++ b/blog/2022/11/28/teams/index.html @@ -0,0 +1,1018 @@ + + + + Learner teams in courses - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Learner teams in courses + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Learner teams in courses

+ +

+ Teams can provide high-quality interaction even in large courses. +

+ + November 28, 2022 + + - Richard Darst + +

+ +
+ +

Part of a series on the Future of +Teaching

+

In April/May 2020, when we started doing "large" (~100 people) online +courses, we wanted a way to be more interactive. This was before the +time of co-teaching and +barely at the start of parallel +chat, so we were focused +on the personal experience. Our solution was learner teams.

+

How it worked

+

The basic mechanics was this:

+
    +
  • Learners are grouped into teams of ~5 people each. (We try no more +than 6 people that don't know each other already, if a team already +knows each other then we take whatever size they came with).
  • +
  • Some learners registered as teams (in this case, we kept them +together).
  • +
  • We would also accommodate individual learners by finding suitable +teams for them - and this did work well.
  • +
  • Each team has an exercise leader assigned to it. It might be +someone who separately volunteered, or it might be someone who is +already part of the group.
  • +
  • Teams are pre-assigned and static over the entire workshop. This +takes more work, but means that a community forms - randomly +assigning teams each day would not work as well.
  • +
  • There are lecture parts, and there are exercise parts. During the +exercise parts, everyone is moved to a breakout room. The exercise +leaders work with their team to do the exercises and in general be +friendly.
  • +
  • We have other course staff around ("expert helpers") and they rotate +between different rooms and make sure the expert helpers are doing +well, if they need any help, and if they are keeping a safe and +welcoming course environment.
  • +
+

We have a short ~1-hour training course for the exercise +leaders, +where we try to motivate their value, give hints on promoting +interaction, hints on what happens if things go badly, and especially +about motivation of learners and safe learning environments.

+

We would encourage entire groups to sign up together as a team. +Research has shown that when two people (instead of one) learn some +new skill, it is much more likely to be adopted by a group. This is +the natural extension of that, and it becomes very easy to take entire +groups into a course.

+

For exercise leaders, detailed knowledge about the course material +wasn't needed, exercise leaders could come by and help with that. The +more important role of the exercise leader was social: being able to +keep everyone engaged and make sure that no one felt left out. +Knowing a little bit about command line interfaces and not being +scared of reading error messages is a nice bonus, but not strictly +needed.

+

Teams seemed to work best when it was actively managed. This +doesn't mean forcing everyone to be a part of a team, but if someone +is on a team, it's clear they are expected to take part in it. There +should be a clear "do you want to take part in a team?" during the +registration phase.

+

Evaluation

+

Teams worked great for us to scale to ~100-120 people. We could have +one instructor per lesson with plenty of staff to support the teams. +We could scale up the number of people we could teach at once much +more than the traditional 3-instructor model in a classroom.

+

In principle, this is a lot like "work tables in a classroom". In +some ways, it wasn't as nice since it was online. But in other ways, +screensharing can allow everyone to see the active screen - something +not easily possible with this sized groups in a classroom. Everyone +had a clear team, and exercise leaders were clearly responsible for +the people on their teams - which meant that fewer people were at a +table but not really participating in the group.

+

When teams already knew each other in advance, it worked exceptionally +well. They would usually speak the same domain language and +programming language, and use the same tools. Often, one team member +had more experience and became the exercise leader. Even when teams +didn't know each other in advance, if we could try to put people +together based on these criteria, by day 2 they were working very well +together.

+

Benefits

+

Teams allowed us to scale to an even larger number of people. Our +registration was: "We take people up to the capacity of exercise leaders we +have. However, we take any team that comes with their own exercise +leader, even if we are over our basic capacity". This worked well.

+

Decrease of teams with the rise of livestreaming

+

By 2022, the roles of teams has been decreasing (though this isn't +exactly a good thing). Our developments in +co-teaching, parallel +chat, and +livestreaming allows us to +break free of the limits of zoom. Co-teaching provides engagement +without needing two-way communication, parallel chat allows a way for +everyone to ask questions at the same time, and with that +livestreaming goes bigger than even the team-based approach. In our +recent attempts at teams, even when we provided an in-person team room +with staff, there were very few attendees. After spending large +amounts of time setting up the teams, this was a bit disappointing. +Still, this doesn't discourage us overall - if people find the mass +communication to work better, that's fine! We can be available for +those who want something else. Thus, or latest strategy is +"livestream for the masses, higher-quality teams for those who want +them."

+

Downside: amount of organizational work

+

The biggest downside is the overwhelming amount of effort needed to +assign and manage teams. The more work done to make good teams, the +more effort needed, and it almost needs a full-time person to manage +it. This means we need to re-think our registration to make it more +sustainable in the long-term.

+

The advance assignment was doable, but handling last-minute changes to +keep the teams balanced, or handling no-shows, was the worst part. In +order for the team concept to work best, we needed to handle these +cases, since a team of too few people, or without an exercise leader, +or changing every day didn't work well.

+

Summary

+

In summary, teams allowed us to make a more interactive and engaging +course than many others could online. It's similar to how tables +organized themselves in groups in classrooms, but by putting more +attention to the arrangement, we could ensure fewer people were left +out than in-person. Yet, practical difficulties and the benefits of a +livestream strategy mean that teams have a less central role than they +used to. In the near future, we will put extra effort into +simplifying the registration system so that they can co-exist with the +large livestream courses, since they are worth it when they work.

+

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2023/02/14/march-workshop/index.html b/blog/2023/02/14/march-workshop/index.html new file mode 100644 index 00000000..16b85f88 --- /dev/null +++ b/blog/2023/02/14/march-workshop/index.html @@ -0,0 +1,941 @@ + + + + CodeRefinery workshop, 21-23 and 28-30 March 2023 - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery workshop, 21-23 and 28-30 March 2023 + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery workshop, 21-23 and 28-30 March 2023

+ +

+ Our March workshop is soon, and you can join alone, as a team, or as a volunteer. +

+ + February 14, 2023 + +

+ +
+ +

Our March workshop is soon. By now, many of you know what a +CodeRefinery workshop is - git (intro and collaborative), social +coding, reproducible research, Jupyter, documentation, testing, and +modular code development (check all +material). But what's less +known is all the new ways to take part.

+

Workshop page +and Register

+

In case you didn't know, we teach via livestream - which means anyone +can attend and we have unlimited capicity. Our teaching +style (as far as we can tell, quite +unique to us!) makes the courses still engaging while allowing us to +reach a much larger audience than we could otherwise. We also offer +some in-person or Zoom attendance options.

+

As an individual, you can attend - by yourself watching the +livestream, apply to work together in a Zoom team we organize, or some +local partners will even have in-person rooms to attend. Registration +is not binding, sign up for information and come when you can (you +won't take a seat from others). To simplify registration, you can +just sign up and you'll get contacted about Zoom/in-person +possibilities later.

+

If you have some friends, work together! Book your own meeting +room and watch the livestream together. We provide hands-on exercises +that on which you can work together - or even try to apply the +techniques to your own projects during this exercise time. Working +with a friend seriously improves learning and uptake after the +workshop.

+

If you've been to CodeRefinery before, why not volunteer? (For any +of these, sign up in the normal registration form and tick the +interested in being staff/observer box):

+
    +
  • Be a team leader to allow us to support more teams (register in the +normal form and indicate this interest there).
  • +
  • Be a co-instructor: thanks to our +co-teaching, we've reduced the +barrier to get started. In fact, someone that has taken +CodeRefinery once would make a perfect co-instructor for a lesson, +since you'll remember what it was like to be a learner and act.
  • +
  • We can always use volunteers to follow up on HackMD questions, help +manage Zoom, communications, and generally all the other little +things that need doing.
  • +
+

Why volunteer? You'll learn more of the workshop contents and get +involved in our teaching network - really good for both your career +and your organization.

+

More than anytime before, CodeRefinery is about being accessible to as +many learning styles as possible. Anyone can register and you'll get +information, you can decide if you want to watch the livestream, +review videos later, or just be aware of what happened and check again +later.

+

We hope to see you there!

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2023/04/12/lessons-learned-mar-2023/index.html b/blog/2023/04/12/lessons-learned-mar-2023/index.html new file mode 100644 index 00000000..9c18bf96 --- /dev/null +++ b/blog/2023/04/12/lessons-learned-mar-2023/index.html @@ -0,0 +1,1042 @@ + + + + Lessons learned from the March 2023 online workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from the March 2023 online workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from the March 2023 online workshop

+ + + +
+ +

March 21-23 and 28-30, 2023, we held again our CodeRefinery online +workshop (6 x 3.5 hours) +with 493 individual registrants and 100-200 views on average in Twitch. +Here we wish to share with the community and our future selves our lessons +learned: What worked well and what we need and plan to improve.

+

If you think you might have solutions for us or want +to discuss about the topic, please reach out to +us. This complements our +lessons learned from our first online workshop +2020, the +May 2021 +workshop, +and the Sep 2022 workshop.

+

We have identified the following main issues that we want to address for future events:

+
    +
  • Speaking more clearly, improving mic quality, and recommending participants to get familiar with Vim, Nano, etc. before the workshop starts.
  • +
  • Some attendees expressed confusion with some exercises and recommended more +repetition of basic commands and more concrete examples of solutions in +exercises.
  • +
  • Some attendees suggested improving the teaching style by doing exercises +while explaining each step, while others preferred doing the exercises +themselves for better learning.
  • +
  • Provide more support for online participants and having more, smaller repositories for exercises.
  • +
  • Some participants found certain aspects of the training confusing, such as the merging process.
  • +
  • Provide clearer instructions.
  • +
  • Some participants wanted more hands-on exercises and more information on specific topics like environments, MATLAB, and good documentation and attribution practices.
  • +
  • The participants suggested expanding the course duration or offering a series of mini workshops.
  • +
  • They also suggested covering ethics and copyright law and providing solutions to exercises directly under each question.
  • +
  • There are suggestions for improvement, including making the content more linear, explaining concepts in more detail, and providing more examples.
  • +
  • The use of Sphinx, a documentation tool, was discussed, and some participants were unsure of its value.
  • +
  • Suggestions for improvements included providing more information on common practices and beginner's mistakes, as well as offering more focused mentorship and help sessions after the course.
  • +
  • Some participants felt that the daily schedule could be shorter or more compact.
  • +
  • Cheat sheets or code checkpoints could be provided to help with finding information quickly.
  • +
+

Daily summaries

+

Day 1

+
    +
  • The workshop was just right in terms of pace and highly recommendable to others.
  • +
  • Participants appreciated the hands-on experience, type-along exercises, +availability of workshop material, and the responsiveness of the +collaborative document.
  • +
  • Some participants suggested speaking more clearly, improving mic quality, and +recommending participants to get familiar with Vim, Nano, etc. before the +workshop starts.
  • +
  • Overall, participants enjoyed the workshop and would like to join more like this.
  • +
+

Day 2

+
    +
  • The speed and level of the workshop were appropriate and engaging.
  • +
  • Several positive comments on the commands and examples covered, the breaks provided, and the helpfulness of the instructors.
  • +
  • Some attendees expressed confusion with some exercises and recommended more +repetition of basic commands and more concrete examples of solutions in +exercises.
  • +
  • Some attendees suggested improving the teaching style by doing exercises +while explaining each step, while others preferred doing the exercises +themselves for better learning.
  • +
  • Technical questions were asked about the official Git documentation, the use +of Overleaf, and the concept of stash, which were addressed by the +instructors.
  • +
  • Some attendees provided personal comments and suggestions for future +workshops, including the possibility of working on a test project together +and adding prompts to show the branch in Git repositories.
  • +
+

Day 3

+
    +
  • General consensus that the pace of the training was appropriate.
  • +
  • Many participants found the hands-on work helpful.
  • +
  • Some participants encountered technical difficulties.
  • +
  • Suggestions for improvements, such as providing more support for online participants and having more, smaller repositories for exercises.
  • +
  • Some participants found certain aspects of the training confusing, such as the merging process.
  • +
  • Suggestion for instructors to provide clearer instructions.
  • +
  • Overall, a positive response to the training.
  • +
  • Many participants indicated that they learned useful skills that they can apply in their work.
  • +
+

Day 4

+
    +
  • The participants found the speed of the course to be appropriate.
  • +
  • They appreciated learning about containers, as well as Snakemake, licensing, and R examples.
  • +
  • Some participants wanted more hands-on exercises and more information on +specific topics like environments, MATLAB, and good documentation and +attribution practices.
  • +
  • The participants suggested expanding the course duration or offering a series of mini workshops.
  • +
  • They also suggested covering ethics and copyright law and providing solutions to exercises directly under each question.
  • +
  • Overall, the participants enjoyed the course and found it to be informative and useful.
  • +
+

Day 5

+
    +
  • Participants have varying opinions on the pace, level, and usefulness of the workshop.
  • +
  • Some participants found the tools introduced to be too advanced, while others found them to be a good challenge.
  • +
  • There are suggestions for improvement, including making the content more linear, explaining concepts in more detail, and providing more examples.
  • +
  • The use of Sphinx, a documentation tool, was discussed, and some participants were unsure of its value.
  • +
  • Overall, participants found the workshop to be informative and inspiring, with some planning to spend additional time reviewing the content.
  • +
+

Day 6

+
    +
  • The course was generally well-received and appreciated.
  • +
  • Many participants felt that they learned useful skills and would recommend the course to others.
  • +
  • Suggestions for improvements included providing more information on common practices and beginner's mistakes, as well as offering more focused mentorship and help sessions after the course.
  • +
  • Some participants felt that the daily schedule could be shorter or more compact.
  • +
  • Cheat sheets or code checkpoints could be provided to help with finding information quickly.
  • +
  • Technical concerns included difficulty with using the automatic debugging tool in GitHub.
  • +
  • There were also some questions about how to receive course credits or certificates.
  • +
+

Registration

+
    +
  • The registration process has definitely been improved, but we have identified that it could be further streamlined.
  • +
  • Our initial ambition was to register participants in two steps: in the first step to make sure they get all following +information, and in the second step signing up more concretely to a specific format. But during the registration we +decided to not ask all registrants to update their registrations. For future we wish to make this one-step.
  • +
+

Zoom and Twitch

+
    +
  • Before this workshop we had decided to do away with the group Zoom rooms +because it proved to be a lot of work for inconsistent results. +In previous workshops we found that the problems start to mount when +members don't show up for the group they signed up for. As the workshop +progresses, there is a drop in attendance and this affects the Zoom +breakout rooms. This in and of itself is not a big problem, but we found +that we get some rooms that are completely empty; some rooms are at full +capacity; and some rooms have 1 or 2 people. We then have to asses each day +and rearrange people together with expert helpers. This proved to be more +work for little improvement in the quality of the workshop. So, we decided +to do away with the group rooms for this workshop and focus only on the +collaborative document.
  • +
+

Collaborative notes

+
    +
  • As was mentioned above, we had more hands on the collaborative document since +we did away with the Zoom rooms. This proved to work well because we had a +lot more people answering questions, so the document was kept updated and +archived for maximum performance and accuracy.
  • +
+

Installation and tools

+
    +
  • We could have a demo exercise (or some) that people can test before the +workshop: "If you feel comfortable with this you’re gonna be fine during the +workshop".
  • +
+

Lesson content

+
    +
  • We could shorten the lecture-part by moving exercises to the end.
  • +
  • Longer exercises would benefit in on-site rooms.
  • +
  • We are constantly looking at improving the quality of the lessons we provide, +so this is an ongoing process. We take into consideration all the feedback +that is given through the collaborative document to inform our decisions on +where we should focus for lesson improvement.
  • +
+

Communication with participants

+
    +
  • Add all sessions to the CodeRefinery calendar.
  • +
  • Link all relevant repositories in one place (i.e. this calendar and anything +that needs attention near a workshop). Make sure those repositories have good +instructions in READMEs.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2023/06/25/planning-sep-workshop/index.html b/blog/2023/06/25/planning-sep-workshop/index.html new file mode 100644 index 00000000..e2d15090 --- /dev/null +++ b/blog/2023/06/25/planning-sep-workshop/index.html @@ -0,0 +1,1135 @@ + + + + What we plan to improve for the September 2023 workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - What we plan to improve for the September 2023 workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

What we plan to improve for the September 2023 workshop

+ +

+ We encourage the community to give us feedback on these ideas. +

+ + June 25, 2023 + + - Radovan Bast + +

+ +
+ +

In this post we wish to share our ideas for what we want to change and improve +for the for the upcoming September 2023 +workshop. This is based on +lessons learned from the March 2023 +workshop and on two meetings we +had two weeks ago with the CodeRefinery team.

+
+

We encourage the community to give us feedback on these ideas either via +chat or via email to +support@coderefinery.org. +We are particularly curious to hear what you think about the section +"Keep two weeks or split in two or more parts?".

+
+ + + + + +

Keep two weeks or split in two or more parts?

+
    +
  • Problems with current set-up (6 half-days): +
      +
    • Second week has different software requirements and is rather different from first week (git)
    • +
    • It could use more exercises but there is currently not much time
    • +
    • It is dense
    • +
    • Not each lesson feels relevant/interesting for all
    • +
    +
  • +
  • We are considering keeping first week focused on Git over 3 days as we have +now, but to spread the second week over a longer time frame (one or two +sessions per week).
  • +
  • Advantages of splitting it off: +
      +
    • More time per lesson
    • +
    • More focused preparation
    • +
    • More time between lessons (more time to prepare for us, more time to digest and apply for learners)
    • +
    • Possibility to add hackathons/ more personalized Q&A
    • +
    • Attracting different and more interested audiences
    • +
    • The second half could become more research-software-hour-y
    • +
    • Enables to do more around the second weeks topics, like adding a hackathon +or some panel discussion or a seminar where we could invite previous CR +participants/teachers or other people to talk about cool stuff they have +been doing around the topic.
    • +
    • Collaborative document might be enough and Zoom rooms might not be needed.
    • +
    +
  • +
  • Downsides: +
      +
    • Less cohesive workshop
    • +
    • Maybe more difficult to schedule although it might be easier to commit time both for organizers and for learners (two instructors would be able to deliver the entire workshop, if needed)
    • +
    • Credits? But can be solved by giving recommendations to local organizers (learning diary, quiz, git log)
    • +
    +
  • +
  • It could make it more difficult for: +
      +
    • Scheduling other workshops that build on top of this workshop.
    • +
    • For those who organize the streaming and video production.
    • +
    • For local organizers (we are particularly interested in their feedback about this idea).
    • +
    +
  • +
  • The first week part could also be extended with a hackathon (3 half-days +teaching, followed by a session e.g. one week later).
  • +
  • Advertise sessions with a more descriptive title (not "Jupyter", but "How to +prototype in Python" or something like that).
  • +
  • Concrete suggestion: keep first week as is (3 half-days) but split second +week into 6 two-hour to half-day sessions (reproducible research, software licensing and +citation, prototyping in Python, documentation, software testing, modular +code development)
  • +
  • UPDATE: after a lot of thinking we decided to keep two weeks this time +and perhaps try a more extended format in 2024 +but to separate sessions a bit during week two in order to give few +sessions more time but also to make it easier for participants to only join +for a specific session. In addition, we consider offering additional debrief +sessions a la "research software hour" where we can go more in-depth.
  • +
+

Creating a more motivating environment for volunteers

+
    +
  • Improve focus so that we can improve the quality and avoid that most time +dissolves in coordinating efforts that could be more focused.
  • +
  • Having few days of focused time for preparation. Otherwise with 25% or less +in-kind involvement, other day-to-day tasks take over.
  • +
  • Organize an online writing/preparation retreat (with buddy-system, +meeting times booked early).
  • +
  • Keep half-day format.
  • +
  • Clear session structure and clear commitment (put names behind lessons as +early as possible).
  • +
  • Knowing who from organizers to contact with questions.
  • +
+

Improve the experience for helpers/ exercise leads

+
    +
  • In the last few versions we had trouble engaging volunteer exercise leads +since we either had trouble predicting and planning a central exercise zoom +room, or tried without providing one. While this simplifies workshop +coordination and planning, it "optimized away" helpers who came to the +workshop without own team or local exercise room.
  • +
  • This time we will try with a central exercise room (see next section) and try +to engage them again.
  • +
+

Workshop format: keep the stream format but also provide a central but self-organized exercise room

+
    +
  • Continue offering the hybrid format: people joining from class rooms.
  • +
  • Again offer centrally managed exercise rooms for learners without own teams. +Even if this means "binding" one person to manage that space.
  • +
  • However, we need an easily organizable way.
  • +
  • Previously it was tricky to manage central exercise rooms: +
      +
    • Rooms became imbalanced (no-shows, empty / overfull rooms) and some exercise leads had then nothing to do.
    • +
    • Pre-allocating persons to rooms has previously failed: Some learners selected the "wrong" option or did not show up.
    • +
    • People were confused about the model.
    • +
    +
  • +
  • What we will try this time: +
      +
    • Self-organized central zoom with free-floating helpers ("expert helpers").
    • +
    • We communicate clearly expectations: that we don't really know who shows up.
    • +
    • Also communicate meaning of rooms (topical rooms) .
    • +
    • Split on-boarding into 2: in-person helpers and Zoom helpers need different info.
    • +
    • No exercise below 15 mins, otherwise no time to have discussions with helpers.
    • +
    • Communicate that groups can pause the stream and ask questions later in the +notes - they do not have to interrupt discussions or mute the stream.
    • +
    +
  • +
+

Lesson development without last-minute stress

+
    +
  • Organize a 2-day online writing retreat and also a one-week in-person writing +retreat later this year.
  • +
+

Instructor on-boarding

+
    +
  • In past editions the instructor coordinator has met with all instructor pairs +and went with them through the checklist. We will keep this.
  • +
  • Tech-setup could be done all together.
  • +
  • Invite past instructors who have taught the lesson in question earlier to +those meetings to provide background and their experiences.
  • +
  • Check questions and feedback from last time.
  • +
  • Switch instructors less often? Maybe always have one person who has done the lesson before.
  • +
  • Plan for an instructor training workshop after the autumn workshop and offer +it also at conferences.
  • +
+

What organizational changes are most important?

+

What would simplify coordination and planning for all involved?

+
    +
  • Current playbook: https://coderefinery.github.io/manuals/workshop-playbook/
  • +
  • Early role decisions (commitment).
  • +
  • All roles using the checklist (it is good to know what is going on in all roles).
  • +
+

Most important lesson/course changes

+
    +
  • We need to re-think exercises for the second week to make them more +interesting. Learners sometimes don't get the point of them.
  • +
+

Simpler registration form

+
    +
  • Keep registration form simple but communicate the different options +elsewhere, not in the form. Previously we have tried +to use form questions to also communicate the options.
  • +
  • Remove the "might" questions. Rather clarify participation options and give +participants the flexibility to decide.
  • +
  • Remove the question whether somebody is interested in following in person. +Rather provide overview about local events, and have links available to +local rooms on the workshop page.
  • +
  • Link to partner local rooms in registration form, as a possibility for learners.
  • +
  • Add an option about central zoom room.
  • +
  • Record and add short video explaining the options.
  • +
  • Instead of separate observer registration encourage observers to register the same way learners do.
  • +
  • Try to arrive at clearer and more consistent naming for "in-person", +"breakout rooms", "exercise rooms", "satellite events", ... +Names need to be clarified, check also other places and choose commonly used name.
  • +
  • For on-boarding we need to know if somebody is interested in being a team-lead/helper: +
      +
    • Ask whether local or central exercise room.
    • +
    • Make it clearer that they can change registration.
    • +
    • Communicate why we ask for this info.
    • +
    +
  • +
  • Learners do not need to be asked whether alone/zoom/local.
  • +
  • Do not try a two-step registration process.
  • +
+

The form options will be simplified to:

+
    +
  • +learner or observer
  • +
  • +helper at central exercise room
  • +
  • +helper at local group
  • +
  • +organizer of local group
  • +
  • +instructor (I would like to teach a lesson)
  • +
  • free text to share additional information with organizers
  • +
  • consider asking which sessions the participant is interested in attending
  • +
  • contact email for questions
  • +
+

We plan to open registration before end of June 2023.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2023/12/05/lessons-learned-sep-2023/index.html b/blog/2023/12/05/lessons-learned-sep-2023/index.html new file mode 100644 index 00000000..c3877d73 --- /dev/null +++ b/blog/2023/12/05/lessons-learned-sep-2023/index.html @@ -0,0 +1,1140 @@ + + + + Lessons learned from the September 2023 online workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Lessons learned from the September 2023 online workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Lessons learned from the September 2023 online workshop

+ + + +
+ +

After each workshop we try to collect feedback and lessons learned from team +members, learners, local organizers, and stakeholders. These documents help us +preparing future workshops and events and serve as our organizational +memory so that we don't forget important observations six months later. Below +we summarize our lessons learned from our September 2023 +workshop.

+

But let us first start with a nice feedback we received:

+
+
+
+
+ "I've been on many courses, I organize some bioinformatics courses myself, but + it was certainly one of the best if not the best course I've attended. Thank + you for your time and engagement :)" +
+
+ + + + + +

Material

+

The team has done amazing work preparing a high-quality material:

+
    +
  • "We've really enjoyed the material (even without the video, it was good to +follow all the tutorials you provided. Some coworkers could not attend the +workshop but did the exercises on their own. They found the material so +nice that they've shared it to their students.)."
  • +
  • "The written course materials are really fantastic. I had to review some +aspects of Git/GitHub myself before the session, and the online notes made +that much more efficient."
  • +
+

Role of helpers/ exercise leaders

+
    +
  • The role of local helpers seems more crucial before and after, than during the workshop.
  • +
  • The bigger the course, the more likely we will see questions that are +answered in install instructions. This supports the previous point.
  • +
  • Local groups see the benefit from nurturing a local community of +trainees of the CodeRefinery courses.
  • +
  • "During the course I think you are already doing a wonderful job."
  • +
+

How to improve exercises

+
    +
  • Consider collecting some feedback between the explanation and start of the +exercise. For example, having the attendees take part in one of these +interactive online group quizzes. That provides some immediate review of the +ideas and gives you feedback on anything that needs clarified.
  • +
  • For the GitHub forking exercise, consider demonstrating using a split-screen +simultaneously showing the two roles on one screen.
  • +
+

Providing a Zoom to work on exercises together

+

This time we have again decided to provide a central Zoom for learners who are +not part of a team to work on exercises together with others. However, this +was mostly unused and we were unsure why precisely.

+
    +
  • Idea for next time: instead of us providing Zoom where nobody shows up, we +offer that we can be invited to local group Zoom and they call us in.
  • +
  • With self-organised Zoom: we got no contact to those who indicate "interest +in being an EL/TL but don't have team ready”. If we keep the Zoom, those +people could be instructed to go straight to that Zoom + usual mention about +the on-boarding.
  • +
  • Consider providing Zoom only after the streaming has stopped for end of the +day live clarifications, Q&A, etc. This in practice already happened in the live +room where after the streaming people had more questions. Downside: It can +be tiring after a long day.
  • +
+

Helping learners to navigate and find where we are

+

When following the different windows and at the same time listening to the +stream it is easy to get distracted for a minute and miss where we are right +now.

+
    +
  • Each exercise/type along on a new topic can start with "Check your current +directory. Decide where you want to be for the next part."
  • +
  • We should have a graphical prompt/box on the stream somewhere which says what +people should do: "watch", "type along", "continue with XYZ".
  • +
+

Technical setup

+
    +
  • Don't use new streaming setup without good advance practice. We had some behind-the-scenes +hiccups the first day, but without impact on learners or the course quality.
  • +
  • Self-hosted HedgeDoc seems to work really well. We observed no technical +issues.
  • +
+

Audio quality is super important

+
    +
  • Use a headset. Podcast-quality microphone on the desk was +not enough and when switching to a headset, quality improved significantly.
  • +
  • Headset should be wired or via a dedicated dongle (Bluetooth has too much +latency).
  • +
+

Using "main" as the default branch

+

This was our first workshop where we have asked participants to configure Git +to use main as the default branch instead of master to avoid confusion when +moving from laptop to GitHub. We did this after a lot of thinking and waiting +because we knew that some learners have old versions of Git and sometimes no +possibility to upgrade. Trying to make sure that our instructions and exercises +work on "all" Git versions we chose to initialize Git using git init -b main. +However, that command unfortunately failed on older Git versions to our +surprise. We did not consider that possibility when testing and preparing.

+
    +
  • For the next workshop reconsider the default and provide a safety net. But +also see the discussion +below about "Should we start with the command line?" which might make this +problem go away in a different way.
  • +
+

Using git switch/restore instead of checkout

+

This change seems to have worked without problems.

+

Should we start with the command line?

+
    +
  • Command line seems to be a too big of a barrier to install and learn. We are +wondering whether command line should not be a separate course and we should +try to not expect it.
  • +
  • Consider starting the Git lesson not from the command line but from an IDE or from the web.
  • +
  • Consider starting with cloning and improve a repo first (instead of git init as the first step).
  • +
  • Already for this workshop we have provided a "web-based track" parallel to +the command line track as safety net in case command line does not work. This was +useful and should be developed further.
  • +
+

Timetable

+

Here is a list of suggestions we got on how to improve the selection of topics +and the timetable.

+

To improve:

+
    +
  • Day 1 felt too slow. Idea: "if you are able to do X and Y and Z, you can join +from day 2".
  • +
  • Sometimes it was too slow, too long to explain concept.
  • +
  • Modular code part too much demo, too little participation, not practical enough.
  • +
  • Snakemake part did not seem to fit into the flow, it felt out of place (good +to know that it exists but might not use it in future; same feeling for +helpers).
  • +
  • It would be interesting to hear about best practices about how to write code +(in a way that others can understand it).
  • +
  • Idea: colorize an example code to identify room for improvement, e.g. +repetition (but that is difficult to do online).
  • +
  • During demo-heavy lessons it is difficult to have interaction and discussion +in the room (contributes to the feeling that it is not practical).
  • +
  • Git collaboration: instead of discussing the collaboration figures, show an +animation or steps or visual aids - otherwise it can be confusing trying to +grasp it all.
  • +
  • Day 2 felt like lots of downtime (long exercises, breaks, too little time "real lesson").
  • +
  • Streaming and in-person interaction is not easy to manage.
  • +
  • More practical exercises needed in second week.
  • +
  • "On the second week, it was a bit more difficult to know if the tools +presented would be useful for us."
  • +
  • Stream/exercise-combo works well for Git (first week) but less well for second week.
  • +
+

To keep:

+
    +
  • "The first week on Git was very good, all the people that attended were +already familiar with Git (they've at least heard of it or used a bit). We +still have discovered some tips and now we have a better foundation about +Git."
  • +
  • Which days most useful? Documentation and Jupyter, then followed by Git intro day 2.
  • +
  • In-person participation was appreciated.
  • +
  • It was appreciated to see that programming is not just about programming +(also about documentation and communication).
  • +
  • The lunch break division was globally an improvement (although it also made +some days feel like there were too many breaks).
  • +
  • Longer break between sessions makes sure that session 1 does not eat time +away from session 2.
  • +
+

MOOC-ify the workshop?

+

We are considering pre-recording sessions in smaller chunks and also pre-record +exercise solutions. We still want to provide an event-feeling but perhaps this +can be done with a MOOC, a "flipped-classroom approach", and more focus on +answering questions and bring-your-own-code sessions (see also below)?

+
    +
  • Streaming workshop was excellent solution during pandemic but we need to check whether this is still good fit.
  • +
  • MOOC could be an interesting format.
  • +
  • It could relieve some organization effort during the event at the cost of +spreading the preparation over a longer time period.
  • +
+

Bring-your-own-code sessions

+

This was the first workshop where we scheduled two follow-up sessions, one week +after and two weeks after, where learners could bring their own code and ask +questions about how to apply the course to their code and research. +Unfortunately no learners showed up to these sessions. Our recommendations:

+
    +
  • Schedule bring your own code session already in week 2 and then with more +time after the workshop.
  • +
  • More active advertising, earlier in the workshop.
  • +
  • Give examples for problems to bring
  • +
  • Offer at different time slots.
  • +
  • Consider coupling advertising with workshop survey.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/01/24/project-future-concept-board/index.html b/blog/2024/01/24/project-future-concept-board/index.html new file mode 100644 index 00000000..2b2887d8 --- /dev/null +++ b/blog/2024/01/24/project-future-concept-board/index.html @@ -0,0 +1,1188 @@ + + + + Summary from a brainstorming meeting about the project future - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Summary from a brainstorming meeting about the project future + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Summary from a brainstorming meeting about the project future

+ +

+ Screenshots and summary from our concept board. +

+ + January 24, 2024 + + - Radovan Bast + +

+ +
+ +

On January 23, 2024, we held a meeting where we wanted to explore ideas for +the future of the CodeRefinery project from team members and the community.

+

In most meetings only very few people speak and most participants don't say +anything. We wanted to change this and tried to create a welcoming meeting +environment with a facilitator who hopefully only facilitates and meeting +participants where hopefully everybody gets the chance to contribute. We used a +concept board and collected ideas visually (screenshots are below).

+

In this post we summarize our findings and lessons learned. If you only have 3 +minutes, then read the summary (first section).

+ + + + + +

Summary of ideas that were voted as most important

+

We provide more details in screenshots below. Here we only summarize the points +that received votes answering the question: "which ideas are most +important for you". The ideas are summarized here without being commented. +They of course need to be followed-up somehow but this we will do in future +meetings and events.

+

Needs

+

In your current position, what do you need in order to be able to contribute to +the project 1 year from now (in terms of work time, financing, governance, +administration, accounting, leadership, credit)?

+

Recognition and credit (12 votes combined):

+
    +
  • Strong publication or white paper about CR and its importance/benefits
  • +
  • Recognition of our good teaching practices
  • +
  • Collect and showcase where else our materials are used
  • +
  • Formalize credit to outside contributors
  • +
+

Collaboration and experimentation (12 votes combined):

+
    +
  • Collaboration with passionate people who enjoy teaching
  • +
  • Two-way learning
  • +
  • More opportunities for future development
  • +
  • Experiment beyond the usual tools workshop
  • +
+

Overlap with high-performance computing (6 votes):

+
    +
  • Subject overlap with skills and tools of relevance for HPC
  • +
+

Roadmap (6 votes combined):

+
    +
  • Statement how CodeRefinery fits into the FAIR ecosystem
  • +
  • Concrete and public roadmap for the future
  • +
+

Administrative/financial needs (6 votes combined):

+
    +
  • Tasks that have a clear work-time estimation
  • +
  • Cost projects also for in-kind work
  • +
  • Home organization securing funding
  • +
  • If outside regular job, then compensated for the work
  • +
+

Wants

+

What do you wish from the project in terms of lesson portfolio, format, and +collaboration in order to still be around 1 year from now?

+

Topics and target audience (22 votes combined):

+
    +
  • Stronger integration with HPC - if CR should "belong" somewhere, it should be HPC
  • +
  • New topics on AI and ML
  • +
  • New training material topics"
  • +
  • Think about new topics for training via discussion & collaboration
  • +
  • Develop training material for GPU computing
  • +
  • Programming lessons to go hand-in-hand with software engineering lessons
  • +
  • Create new lessons based on needs and existing expertise
  • +
  • Focus on academic users to make it more valuable to [academic] management
  • +
  • Material suitable for the "phone generation"
  • +
+

Self-learning vs. real-time (11 votes combined):

+
    +
  • Self learning materials/courses/ asynchronous learning: some researchers +don't have time for long workshops and don't wanna know all the details
  • +
  • MOOC as basic service, interaction/teams delegated
  • +
  • Collaboration on video material
  • +
+

External collaboration and conferences (5 votes combined):

+
    +
  • Stronger connection to other similar projects, like BSSW, INTERSECT, etc.
  • +
  • Regular BoF sessions at conferences like ISC, SC, PyCon, JuliaCon, etc.
  • +
  • Keep/improve connection to RSE community
  • +
+

Collaboration and co-hosting (5 votes combined):

+
    +
  • Course collaborations of courses that already exist, like currently done with Aalto HPC kickstart
  • +
  • National course/workshop collaborations, offering in-person specialized short workshops
  • +
  • Co-hosting of events, and co-developing of lessons
  • +
+

Social events and keeping up-to-date (5 votes combined):

+
    +
  • Social events where team members get an overview of activities in each partner organization (e.g. monthly "zoomffee")
  • +
  • Easy way to follow what is going on and when to step in (something else than scrolling all chat)
  • +
+

Workshop format (5 votes combined):

+
    +
  • Smaller, shorter workshops
  • +
  • Have more formalized possibility of using ready-made computing environment ("executable website")
  • +
+

Administration and governance (3 votes combined):

+
    +
  • Formalized and more official course request form, to show organizations (in +and outside of CR) that this is "a thing"
  • +
  • Mechanism/support for creating new "refineries" (HPC Refinery, AI Refinery, ...)
  • +
  • Delegate non-profit side to DRA (for example)
  • +
+

Credit (3 votes):

+
    +
  • Official network of teachers, public on webpage, with skills
  • +
+

Workshop preparation (3 votes combined):

+
    +
  • Less lesson revision each workshop
  • +
  • Up-to-date and maintained lessons
  • +
+

General suggestions for future meetings

+
    +
  • Restart monthly community chats around specific topics where one can get +updates without reading all chat.
  • +
  • Separate on-boarding meetings for friends and future instructors (community +calls could be on-boarding meetings).
  • +
  • More social media presence and dissemination.
  • +
  • Create tasks forces or work packages so that others can help better and to +have fewer bottlenecks in the project.
  • +
+
+

Meeting format and goals

+

To facilitate a meeting where we collect ideas from everybody but without +judging them, we used a concept board and virtual sticky notes and divided the +session into 3 parts:

+
    +
  • Start with everybody taking notes by themselves ("me"; for ourselves).
  • +
  • Second step: formalize and place on concept board ("we"; randomized 1-1 +pairs).
  • +
  • Third step: we review and discuss as a group ("us"). Make sure that the +facilitator understood what the group wanted.
  • +
+

13 persons participated in this meeting (one of them, the author of this blog +post, was the facilitator): +screenshot of sticky notes with participant names

+

Timeline

+
    +
  • 5 min: welcome and getting started
  • +
  • 5 min: everyone adds themselves to the board
  • +
  • 10 min "me" time: work on your own on the two boards below, without sharing your thoughts yet
  • +
  • 15 min "we" time: 1-1 work with a randomized partner; put ideas on the board(s)
  • +
  • 10 min "us" time: we cluster and organize
  • +
  • 10 min: voting on which ideas are most important for you (everybody got 10 votes to distribute)
  • +
  • follow-up: blog post summarizing this
  • +
+

Here is a screenshot from the session: +screenshot of the meeting timeline and meeting suggestions

+

Concept boards where we explored what project members need and want from the project

+

Meeting participants were asked to answer two questions with sticky notes +(sticky note color has no meaning):

+
    +
  • "Needs": In your current position, what do you need in order to be able +to contribute to the project 1 year from now? (in terms of work time, +financing, governance, administration, accounting, leadership, credit)
  • +
  • "Wants": What do you wish from the project in terms of lesson portfolio, +format, and collaboration in order to still be around 1 year from now?
  • +
+

We did not have enough time to cluster the notes better but to summarize the +findings I have later manually clustered related votes and summed them up.

+screenshot of the sticky notes with ideas and number of votes +

The comment note that is outside that screenshot to the bottom and looks a bit +cut off says: +"I agree with this a way that CR should have a more defined brand - be it HPC or something else".

+

Below we list the ideas also in text format.

+
    +
  • +

    Needs: In your current position, what do you need in order to be able to contribute to the project 1 year from now? (in terms of work time, financing, governance, administration, accounting, leadership, credit)

    +
      +
    • Company internal cost object for in-kind contribution
    • +
    • Staff in my own project that are interested in working on CR
    • +
    • A project in my organisation  that somehow includes CR
    • +
    • Official statement of how CR fits in the ecosystem of FAIR X, to help convincing management if they say "we do already Y"
    • +
    • collaborations with different people on varied topic for training and workshop, and also seeking more opportunities for future development
    • +
    • Measurable benefit to Aalto (continued enrollment numbers)
    • +
    • formalize contribution to the outside (credit to contributors)
    • +
    • Subject overlap with skills and tools of relevance for HPC
    • +
    • HPC connection
    • +
    • Possibility to allocate (more) worktime for this
    • +
    • "cost object" either via project funding or formalized "in-kind"
    • +
    • Collaboration with passionate people who enjoys delivering, two way learning
    • +
    • "Project" that includes CR as a job
    • +
    • a strong publication or white paper about CR and its importance/benefits
    • +
    • Plans for the future public and concrete, roadmap
    • +
    • Tasks that have clear work-time estimations
    • +
    • UPPMAX & NAISS provide in-kind support: this has worked really well up to now, but it is dependent on the home organization to have a secure funding
    • +
    • (this is a need/want) New content? New formats? Experiment beyond the usual tools workshop
    • +
    • If outside regular job then some other compensation for my time
    • +
    • Permission from supervisor
    • +
    • possibility to join as "oneself",without organization that is "part of CR"
    • +
    • collect and showcase where else than within the CR project, the materials are used -> show benfit, visibility to employer
    • +
    • Recognition of our good teaching practices
    • +
    +
  • +
  • +

    Wants: What do you wish from the project in terms of lesson portfolio, format, and collaboration in order to still be around 1 year from now?

    +
      +
    • UPPMAX & NAISS perspective: In terms of collaboration, the fact that this is a collaboration among people from several supercomputing centers makes it more valuable / "sells" better to higher ups. That is not to exclude industry, but main target audience for us/UPPMAX is academic users.
    • +
    • More frequent social events eg. monthly zoomffee / networking events
    • +
    • thinking more topics for training via discussion & collaboration
    • +
    • Self learning materials/courses/ asynchronous learning: some researchers don't have time for long workshops and don't wanna know all the details
    • +
    • social events where team members get an overview of activities in  each partner organization
    • +
    • CR MOOC as basic service, interaction/teams delegated
    • +
    • smaller shorter workshops
    • +
    • New training material topics
    • +
    • Have "phone generation" suitable materials , eg IQM academy style
    • +
    • National course/workshop collaborations, offering in -person specialized short workshops
    • +
    • more in-person teaching
    • +
    • New topics on AI and ML can be added to CR lesson portfolio
    • +
    • official network of teachers, public on webpage, with skills
    • +
    • stronger integration with HPC - if CR should "belong" somewhere, it should be HPC
    • +
    • UPPMAX & NAISS perspective: In terms of lessons, the base workshop is great. I think new lessons should be created in terms of needs and existing/wish-for expertise. CR has enabled collaboration on additional courses that are complimentary to the ones of the home institution - added value.
    • +
    • co-organizing events
    • +
    • course collaborations of courses that already exiost, like currently done with Aalto HPC kcikstart
    • +
    • formalized and more official course request form, to show organizations (in and outside of CR) that this is "a thing"
    • +
    • Have more formalized possibility of using readymade computing environment "executable website"
    • +
    • regular BoF sessions at conferences like ISC, SC, PyCon, JuliaCon, etc
    • +
    • programming lessons to go hand-in-hand with software engineering lessons
    • +
    • Co-hosting of events, and co-developing of lessons, with PDC/NAISS
    • +
    • mechanism/support for creating new "refineries" (HPC Refinery, AI Refinery, ...)
    • +
    • Develop training material for GPU computing
    • +
    • volunteer instructors for CR and instructor training workshops
    • +
    • Easy way to follow what is going on and when to step in. (Something else than scrolling all chat)
    • +
    • stronger connection to other similar projects, like BSSW, INTERSECT, etc
    • +
    • UPPMAX & NAISS perspective: As for the format, in my opinion going even +larger in attendance would imply using a platform like LinkedIn or similar. +But it does require additional effort, at least in the setup phase. This +would allow for asyncrohonous learning. The danger I see with it is that it +may not be appealing for the home institution.
    • +
    • maintenance and further development of sphinx-lesson
    • +
    • Collaborators on video-material (should we choose to make some)
    • +
    • collaboration & flexibility, promote two way learning
    • +
    • Connection to RSE community somehow
    • +
    • Delegate nonprofit side to DRA (for example)
    • +
    • Denmark could use with another CR person
    • +
    • Less lesson revision each workshop
    • +
    • up-to-date and maintained lessons
    • +
    +
  • +
+

What we learned about the meeting format

+

The format felt like the right choice. However we noted few suggestions +for how we can improve such meetings in future:

+
    +
  • Allocate 1.5 hours instead of 1 hour.
  • +
  • Add a break so that facilitator can organize boards to make it easier for all.
  • +
  • Add example sticky notes.
  • +
  • Suggest to make text short (some sticky notes contained too many words and +were possibly not read during the 5 minute voting session).
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/02/29/install-instructions/index.html b/blog/2024/02/29/install-instructions/index.html new file mode 100644 index 00000000..0c242cfa --- /dev/null +++ b/blog/2024/02/29/install-instructions/index.html @@ -0,0 +1,937 @@ + + + + Help us make usable IDE/git install instructions - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Help us make usable IDE/git install instructions + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Help us make usable IDE/git install instructions

+ +

+ We want our workshops to be more usable than before, and that means aligning with best practices. +

+ + February 29, 2024 + + - Richard Darst + +

+ +
+ +

At the current CodeRefinery meeting, we had a session on installation +instructions. It was clear that the instructions, and really +everything we teach, needs to be tied to what is easy to install and +set up these days (not just because it's easy to teach, but because if +it's easy to install that's what most people use). Help us to +figure out what current best practices are.

+

We've mostly taught git from the command line so far. That's going to +change when we go web-first (to explain concepts). But, as one +example, when looking at ways to simply command line linking, there +are lots of modern tools such as the "git credential manager", which +make linking remotes more automatic than SSH keys. IDEs make it easy +to clone, commit, and push. We should use all the modern work - but +what to recommend? There are so many operating systems and IDEs, we +can't know them all.

+

Our question to the world

+

Imagine someone new to scientific computing, using your operating +system. They aren't a developer, they are a scientist (broadly +defined) or similar, trying to get some other stuff done. What do you +recommend to them to install and use? Are there special instructions +on configuring it?

+

Usability is more important than perfection here. You want them to +get started without major problems, so that they can be happy now and +be motivated to learn more later. You aren't there to teach them +every step of the way. They should have some editor to use, git, +git authentication to Github, be able to edit files, add them, +commit them, and get them to appear on Github? They should be able to +access the shell some way, but it doesn't have to be the main feature +(an editor's terminal is OK, as long as it probably works with Git, +including whatever config and auth is needed).

+

We want some common solutions, even if not perfectly free/open +source (though of course that is preferable). We will likely +recommend VSCode/VSCodium since it's most used by our communities, but +would like to provide instructions for other IDSs as well.

+

How to respond

+

We recommend to respond to one our social medias or Github repos:

+ +

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/03/15/week1-march-workshop-rework/index.html b/blog/2024/03/15/week1-march-workshop-rework/index.html new file mode 100644 index 00000000..d91a656c --- /dev/null +++ b/blog/2024/03/15/week1-march-workshop-rework/index.html @@ -0,0 +1,909 @@ + + + + Recap of the first week of the spring 2024 workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Recap of the first week of the spring 2024 workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Recap of the first week of the spring 2024 workshop

+ +

+ Looking back at week one of the CodeRefinery workshop and the big rework of the version control lessons +

+ + March 15, 2024 + + - Samantha Wittke, Radovan Bast + +

+ +
+ +

What an exciting first 3 days of the CodeRefinery workshop we had!

+

Our Git lesson got fully rewritten right before the workshop to make it more welcoming to beginners and closer to how researchers would encounter Git in their work. And that without the need for any coding: All our Git exercises are around a recipe book.

+

Week 1 recap

+

We start with the GitHub web interface, explore existing repositories, making our own fork of an existing repository, committing our own contributions to our own branch and merge it to the main content by pull request.

+

Only on day 2 we switched from working in the GitHub web interface to working locally. Here we provided 2-4 tracks: Working on the command line , in VScode, RStudio or staying in the web interface.

+

We cloned a repository and repeated the actions from before locally: committing, branching, merging. Then we also checked how we can inspect the history of existing projects and how commit messages can help us understand how a repository has developed over time.

+

At the end of day 2, we also learned to estimate how much Git is necessary or helpful for different types of projects.

+

Day 3 was all about collaboration and it got a bit chaotic, but the good kind of chaotic. We first learned about the basic workflow of contributing when multiple people are working on the same repository. Writing issues, suggesting changes via pull requests and connecting the two. Then we went on to code review, and practiced that on our recipe book, we don't want any typos there!

+

In the afternoon we also practiced how to contribute to projects that we are not a part of via forks and pull requests as well as how automated tests can help the code review.

+

Thank you!

+

Now we have a nice recipe base for our next CodeRefinery in person meeting. And participants have hopefully learned something along the way.

+

The downside of changing the entire week right before the course however made it possibly more difficult for team leaders and volunteers to prepare and it was a difficult choice to make and we appreciate their patience and flexibility and trust.

+

Thanks to everyone involved!

+

Materials and recordings

+

You can watch the recordings of the first 3 days of the workshop on YouTube, reuse the lesson materials for your own course if you like (https://coderefinery.org/lessons/core/) and check out one of the resulting collaborative recipe books of this course for cooking inspiration.

+

Next week (Tue 19.03.24- Thu 21.03.24) we will continue with other topics around FAIR research software development; event page with materials, questions and answers and more information: https://coderefinery.github.io/2024-03-12-workshop/

+

See you there or in one of our future workshops!

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/03/17/streaming-training-workshop/index.html b/blog/2024/03/17/streaming-training-workshop/index.html new file mode 100644 index 00000000..fc37b68a --- /dev/null +++ b/blog/2024/03/17/streaming-training-workshop/index.html @@ -0,0 +1,943 @@ + + + + Anyone want a streaming training workshop? - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Anyone want a streaming training workshop? + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Anyone want a streaming training workshop?

+ +

+ CodeRefinery's streaming setup is getting fairly professional. Anyone want to learn how to reproduce it? +

+ + March 17, 2024 + + - Richard Darst + +

+ +
+ +

If you haven't noticed, CodeRefinery livestreams it's workshops (see +refs below). We can reach a virtually unlimited number of people and +easily make recordings for later, yet our co-teaching and Collab notes +system still makes a workshop that feels interactive and fun to +attend. Does anyone want to learn how to do this yourselves?

+

A workshop idea

+

Richard Darst has been doing most of the streaming and would like to +teach others. Richard can host people in Helsinki, Finland for some +workshop, or if people fund travel somewhere else we can host it +there. A workshop would include:

+
    +
  • Basic streaming theory
  • +
  • Setting up OBS-Studio for streaming
  • +
  • Recording and publishing videos rapidly (by the same night, every +time).
  • +
  • How to make a livestream course lively (co-teaching, Collab Notes, +lesson design, screenshare style)
  • +
  • Time to test and practice all of the above.
  • +
  • Improving our documentation
  • +
+

Most of the above is in theory documented in the CodeRefinery +manuals, but reading is hard +and seeing by example with mentoring is easy.

+

An ideal host would be an EU or regional computing competence center, +open science organization, or someone interested in teaching innovation, +who can host a public workshop, and be able to help in advertising the +workshop to other interested parties. (This could be tried online, but +when we are setting up computers to do the screencapture of a meeting, +while also doing another meeting to share that screen capture... it +might get a bit complex.)

+

Contact us at scip@aalto.fi or support@coderefinery.org, or via the +CodeRefinery chat.

+ +

How the MOOC stragegy works:
+Schematic diagram of the MOOC strategy.  Streaming to Twitch, and watching, feedback by collaborative notes.

+

A usable view from the learner side:
+Screenshot of a desktop with half the screen for instructor screenshare and the other half for the learns to work.

+

An extremely high-quality screen sharing setup:
+A 840 wide x 1080 tall screenshot or instructors, web browser, and terminal

+

OBS isn't that hard:
+OBS screenshot with labels of some key points

+

Our recently-created streaming control panel:
+Screenshot of a small control-panel looking window

+

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/03/25/next-cr-workshop-help-needed/index.html b/blog/2024/03/25/next-cr-workshop-help-needed/index.html new file mode 100644 index 00000000..1c203f89 --- /dev/null +++ b/blog/2024/03/25/next-cr-workshop-help-needed/index.html @@ -0,0 +1,939 @@ + + + + Help us do the next CodeRefinery workshop (2024 H2) - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Help us do the next CodeRefinery workshop (2024 H2) + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Help us do the next CodeRefinery workshop (2024 H2)

+ +

+ Our workshop in 2024 March went well. But we need help if we want to do this again. +

+ + March 25, 2024 + + - Richard Darst + +

+ +
+ +

As usual, our workshop in 2024 March has worked very well, and our +feedback is as positive as ever. The technical setup worked smoothly, +and we are working to share our livestreaming technique with +others. But +there's another thing we need: the mere fact we have hundreds of +registrations, multiple partners, and more than 10 instructors means +we need more help to keep these going.

+

We won't schedule another very large CodeRefinery workshop until we can be sure +we have enough people to distribute the load widely enough to make it +worth it. If we don't get that, we'll scale down to what is +manageable. Your help is essential. We give an initial deadline of +the end of April to figure out our status and do rough timetabling.

+

The good thing is that instructors and helpers are not what is in +short supply, but something more about bigger picture stuff. We've +developed good processes and pretty well know what works, but as we +move to the sustainability phase, we can't do everything ourselves. +For example, we would be happy to have:

+
    +
  • +

    Instructor coordinator, who can keep track of all of our +instructors and make sure the necessary onboarding and all is done.

    +
  • +
  • +

    Registration coordinator, who can help manage all of the +registrations and communication.

    +
  • +
  • +

    Partner coordinator who can help with outreach to partners +(other universities for example) who advertise our workshop and +organize local sessions.

    +
  • +
+

None of these are exactly hard, and we can help you learn what is +needed (but also there is a lot that can be improved for the future - +new visions are welcome).

+

Our vision is that our commonly shareable online, live-streamed course +can be used by as many organizations and learners as possible. We +have the base and now we need the communication and outreach to make +that possible. (If you can't help directly, but want to be part of +this vision, also let us know) Whoever joins would basically become +part of CodeRefinery for the purposes of organization - your voice +would matter as much as anyone else.

+

TODO who to contact.

+

See also

+
    +
  • (manuals links? website links?)
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/04/in-person-install-instructions-session/index.html b/blog/2024/04/04/in-person-install-instructions-session/index.html new file mode 100644 index 00000000..09cc5cfc --- /dev/null +++ b/blog/2024/04/04/in-person-install-instructions-session/index.html @@ -0,0 +1,990 @@ + + + + In-person meeting: install instructions update - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - In-person meeting: install instructions update + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

In-person meeting: install instructions update

+ +

+ We looked at the installation instructions for CodeRefinery workshops and tried to figure out how to improve them +

+ + April 04, 2024 + + - Richard Darst + +

+ +
+ +

This session of our 2024 February in-person meeting focused on the +install instructions. By it's nature, it related to how we were going +to teach the lessons (would we offer multiple paths? Would the second +week be active or passive?)

+

The core problem

+

Using git and computational tools can be hard. It can be made even +harder by the long steps needed to install the tools - which has to +happen before we get contact with the learners.

+

But, not everything is hard. Many commercial tools are easy to use. +For example, VS Code came up many times. VS Code is easy to install, +and (on Windows) will automatically prompt you to install Git when +needed. But it goes beyond that: VS Code provides some sort of +out-of-the-box working authenciton to GitHub, even on Windows, that's +based on SSO or OAuth, that "just works". There isn't any extra need +for another page on setting this up. This kind of usability is what +we need, though unfortunately this is often only present in these +high-level tools (which we don't want to favor only one or the +other).

+

So, what do we do? Keep up with our strategy of universal, low-level +tools, or recommend some high-level that make installation (and use) +easy?

+

What we did

+

For this session itself, most of it was discussion of both the tools +and the idea above, trying to decide what to do. We had practically +already decided to teach the 2024 March workshop this way:

+
    +
  • Week 1: day 1 through GitHub web interface, day 2-3 has options for VS +Code, command line, and maybe others (RStudio) (but day2-3 would +only be demonstrated with VS Code).
  • +
  • Week 2: Would be all demo-based, we wouldn't expect any installation +or exercises from users.
  • +
+

With this, for week 1, we could take advantage of VS Code's ease of +use to handle the difficult setup (we could tell people "just install +VS Code. It provides the terminal, Git authentication, and editor, +all together". For Windows, Git had to be installed separately but +that is fairly easy). We skipped requiring installing Conda and the +conda environment and getting it working for week 2 (many things could +go wrong here).

+

We made a blog post and +posted about our ideas on social media to try to get feedback. We +didn't get much.

+

As of mid-2024, this can be seen at our installation +instructions.

+

Detailed notes

+

Below is pasted our raw detailed notes, for archival purposes.

+

Current state:

+
    +
  • Mostly works (but every time needs updates)
  • +
  • There is much there, it's hard to know what to focus on depending on how you want to attend
  • +
  • VSCode and other editors mostly missing.
  • +
+

Suggestions

+ +

Discussion:

+
    +
  • It would take ~1 day to go through all these and get set up.
  • +
  • For week 2, how to communicate "you don't have to do this." +
      +
    • Remove "what to do" table on the front page. Move install to-do list to the front page.
    • +
    • Install instructions should say "Week 1: do this [list]. Week 2: optional, [list]"
    • +
    +
  • +
  • Can we do everything by docker/container? What if we containerize everything?
  • +
+

To do:

+
    +
  • GitHub account: shorten
  • +
  • Shell and git: +
      +
    • Windows: vscode instead
    • +
    • MacOS: developer tools, or xcode
    • +
    • Linux: install package (use package manager)? +
        +
      • Fresh instaltions no Git
      • +
      +
    • +
    • remove "set default branch (move it to lesson)"
    • +
    • check if two more windows settings are needed
    • +
    +
  • +
  • SSH connection to GitHub: Add "VSCode" tab to install instructions
  • +
  • Remove git-bash from windows
  • +
  • Redo/change install verification videos
  • +
  • Post to CR chat/social media and ask "For [operating system x], what's the easiest way to get started with an editor and git. This is for a person new to scientific computing and doesn't have extensive command line experience. Usability is more important than perfection here. They should have git, authentication to clone/push/pull from github, edit files, and commit them."
  • +
+

Epilogue

+

We applied these ideas for our 2024 March workshop, and it worked out +quite well. We were happy with both the lesson redesign, and the new +install instructions. We didn't notice any major problems with the +installation (and we seemed to get fewer live questions about problems +with software installation, and more questions about the main topic. +This was a big win).

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/04/in-person-video-production-session.md/index.html b/blog/2024/04/04/in-person-video-production-session.md/index.html new file mode 100644 index 00000000..514793ff --- /dev/null +++ b/blog/2024/04/04/in-person-video-production-session.md/index.html @@ -0,0 +1,955 @@ + + + + In-person meeting summary: video production - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - In-person meeting summary: video production + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

In-person meeting summary: video production

+ +

+ The video production session provided a hands-on experience in what goes on behind the scenes. It wasn't that hard. +

+ + April 04, 2024 + + - Richard Darst + +

+ +
+ +

This session, on the first day, went over the basics of video +production. Richard has handled video production (streaming, +producing videos after the event), and this provided a much-needed +introduction to what happens behind the scenes.

+

The initial goals were to:

+
    +
  • allow others to help with video processing during workshops
  • +
  • allow others to use our best practices.
  • +
+

Video editing

+

First, we practiced video editing with +ffmpeg-editlist +really nice and easy to use. It allows powerful-enough editing for +splicing without learning a full editor, and storing the progress in +git. This can allow distribution of the work, too - even to those who +don't know all the details but can write descriptions or find cut +points by playing the file.

+

The exercise we did are located in the Video editing section of the +Community teaching +lesson. +There is a demonstration of the video releasing process +here.

+

The conclusion was that video editing wasn't that hard and more +people should know about the possibilities. However, it still is more +work and for workload reasons needs someone other than main +instructors to do it. (Richard's rule of thumb is "do it the same +night, or it will never get done" - ffmpeg-editlist makes it easy to +do a bad-enough job to accomplish that.)

+

Livestreaming

+

As for streaming, we brainstormed ideas on how to make the workshop +easier to follow ("where are we right now?", "what are we supposed to +do right now?") and easier to video-edit afterwards. Ideas included:

+
    +
  • status bar overlay that shows the breadcrumb including where we are at the lesson
  • +
  • status text overlay that shows whether the workshop is in exercise or lesson etc.
  • +
+

Both of these require some work, but more importantly someone to watch +over it and make sure it's up to date. Our notes-based system is at +least the same tool for everything.

+

We got overview of OBS settings: the setting files are in obs-config +repo. They can be +downloaded and imported to the OBS Studio. This is a bit harder to +use in practice, since it requires understanding about OBS, but it's +definitely doable. We have a long description of OBS +theory. The +participants left more prepared to get involved with streaming.

+

Epilogue

+

Based on these discussions, we made an OBS control +panel which +was used in the 2024 March workshop to allow others to manage the +stream some. It's still in development, but could allow us to go to +the next stage of large-scale collaboration.

+

See also

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/10/writing-retreat-community.md/index.html b/blog/2024/04/10/writing-retreat-community.md/index.html new file mode 100644 index 00000000..be0cc513 --- /dev/null +++ b/blog/2024/04/10/writing-retreat-community.md/index.html @@ -0,0 +1,931 @@ + + + + In-person meeting summary: Community - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - In-person meeting summary: Community + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

In-person meeting summary: Community

+ +

+ What is the CodeRefinery community to you? +

+ + April 20, 2024 + + - Samantha Wittke + +

+ +
+ +

As mentioned in a previous blog post on social media strategy, it is our desire to build and expand the CodeRefinery community around our shared interest in FAIR research software practices. +currently, the CodeRefinery community mainly lives in the Zulip chat, which is something we want to expand to our various social media platforms. People that mainly engage in our chat are spread all over the Nordics. +Some of these people are even located in the same country, but can live hundreds of kilometers apart. +In order to bring the community together and develop an onboarding strategy to the community, we first need to look at what the CodeRefinery community actually is.

+

The CodeRefinery community

+

The first question we asked to the participants of the in-person meeting in Tromsø was "What is the CodeRefinery community to you?". +Answers:

+
    +
  • A place where it feels safe to ask questions around the coderefinery workshop, but also beyond
  • +
  • A place to get some interesting tips that i didn't know i needed to know (TIL)
  • +
  • RSE (Research Software Engineers) that like teaching
  • +
  • A small group of people that found each other and want to make the (research)world a better place + a slightly larger group of people that find the topics more or less interesting and more or less follow what is happening
  • +
  • A place to share working experience and interactions with those having similar interest +
      +
    • Brainstroming discussion on varied topics
    • +
    +
  • +
  • Place to get feedback and input on ideas and tasks
  • +
  • Place to learn things and ask for help
  • +
  • Place where there is a lot of discussions going on
  • +
+

Zulip chat

+

The level of engagement in the community is largely tied to how much time people spend in the chat, which often is not too much. Everyone already has their own work chat, that needs to be followed, and having all the different chats and platforms can easily get overwhelming.

+

The main reason to engage in the chat is to ask questions and read the answers as well as coordinate CodeRefinery and other than CodeRefinery workshops (often around High Performance Computing (HPC)). +The "monday morning hello" (in #general stream) was mentioned as one way of feeling engaged with and welcome by the community.

+

Apart from "not enough time" to follow the chat, also its unorganized nature was mentioned as a reason not to engage. +We briefly disucussed that this can partly be solved by using the chat differently, following/unfollowing topics and streams that are of interest to oneself and setting up notifications properly. Another way to limit the information overflow could be to take better care of marking topics as "resolved", when there is nothing to be discussed anymore.

+

We have since been discussing a chat cleanup and reorganization/renaming strategy (to be implemented in early summer '24) and will be sharing tips on how to use Zulip efficiently as blog, event or video. In addition to that, admins will try to be more active in managing the chat. +After the reorganization and the addition of an events channel will also try to share more events of interest to the community via chat and our calendars where appropriate.

+

We already implemented a "CodeRefinery for busy people" weekly chat summary, which anyone can sign up to here: https://postit.csc.fi/sympa/subscribe/coderefinery-team. In addition to that, we will also continue the less frequent (~one email every one/two months) newsletter.

+

Sharing the work

+

One big ask from the community was to share the work/tasks more open and completely. We used to have a large list of tasks sorted by amount of time a community member has to spare. While this was considered a good idea, the tasks often lacked description, and so were not taken over by the community. We have therefore started to move the tasks back to the github organization, where all open tasks are assigned to repositories and described in enough detail that anyone in the community could pick up the task. The tasks are also labelled by the time it approximately takes to fulfill the task and urgency. Anyone can find the board under the Coderefinery GitHub organization.

+

Community calls

+

An additional request by the participants for more community engagement, was to restart community calls. So we decided to have some more and more regularly in the future. A challenge to ourselves will be to also make those engaging and worth of spending ones time. These community calls can have a specific topic and/or serve as Q&A and discussion sessions for the community. It is important to us that the community gets something out from them. We also invite the community to shape these calls, by suggesting topics or take over the organization of a call. In order to attract people to the community calls, the topics and dates should be set as early as possible.

+

Extending the instructor/helper/organizer pool

+

We also brainstormed ideas for attracting more people to be instructors/helpers/organizers of the CodeRefinery workshop. Since we upscaled the workshop from ~20 people in person workshops to ~200 online participants, being an instructor or helper in the workshop has become more complex. It is less interesting to teach to the stream, which on our end is just a pretty empty Zoom call. Our co-teaching model ensures that the instructor is never alone and the collaborative document is used to influence the teaching, but that does not replace a room full of learners. The current workshop format also seems very complex for newcomers and we have not been offering a train-the-trainer program lately (planned for fall 2024 now! - stay tuned). Due to the sometimes a little bit chaotic planning phase and usually enough team members signing up for the workshop we have not done much active outreach for the workshops lately. For this to work it might be required to contact possible instructors more directly and offer direct mentoring. Which is something we are very keen on providing and making it fun and interesting for everyone to contribute. Again, people need to get something out from it.

+

Other ideas

+

In order to engage with the community a few other ideas were discussed as well: +We could approach different domain communities by visiting their events and presenting CodeRefinery. In addition, we could organize our own info events, targeting different groups to engage more directly. Here, also our close connection to the RSE community could be used more. Another idea was to offer further BYOC (bring your own code) sessions to provide the possibility of interacting with CodeRefinery instructors and asking for support.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/10/writing-retreat-onboarding.md/index.html b/blog/2024/04/10/writing-retreat-onboarding.md/index.html new file mode 100644 index 00000000..b9d8b949 --- /dev/null +++ b/blog/2024/04/10/writing-retreat-onboarding.md/index.html @@ -0,0 +1,934 @@ + + + + In-person meeting summary: Onboarding - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - In-person meeting summary: Onboarding + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

In-person meeting summary: Onboarding

+ +

+ Onboarding new people to the community +

+ + April 20, 2024 + + - Samantha Wittke + +

+ +
+ +

In order to provide newcomers to the CodeRefinery community a good experience that inspires them to stay we need to create a welcoming atmosphere and provide a good onboarding.

+

CodeRefinery onboarding

+

Currently, our onboarding procedure varies from case to case. The team at in-person meeting are mainly in-kind contributions to the project that joined the project on own incentive (usually after a workshop) or by being sent by their managers. Everyone got at least one personal meeting with the project manager, which introduced them to whatever was needed at the time. One thing that many of the team mentioned was that they wish they had gotten more introduction to the Zulip chat. ( More on improvement suggestions in the "community" blog post).

+

Team members generally agreed that active participation an interest in strategy and availability to help/teach makes them part of the CodeRefinery team. +Everyone present felt well onboarded.

+

Roles

+

We currently have a few different roles a community member fits into:

+
    +
  • team (mostly in-kind contributions and highly motivated individuals, onboarding via team meeting and personal chat with the project manager),
  • +
  • instructors (Workshop team leader onboarding or personal onboarding by co-instructor or the workshop organizer, often no further community engagement),
  • +
  • helper / team leader (onboarding before each workshop, often no further community engagement),
  • +
  • "everyone in chat" (no specific onboarding, unless they use #new-members stream; info from website)
  • +
+

Where to find information

+

We discussed what information potential future community members should get from the website and what should be made available later:

+
    +
  • What do I get in return?
  • +
  • How do I get started, show me the steps
  • +
  • What kind of responsibilities/roles are there in the community
  • +
  • How can I help or "I have only half a day this month, where can I help which will be meaningful?"
  • +
+

All those are very good points which we will make sure to inlcude on the website, our project board and the chat redesign (see community blog).

+

The perfect onboarding

+

We also asked the question: "In a perfect world where everything is possible, money and time is not an issue, how would onboarding look?" to see what the ideal onboarding for participants of the meeting would look like. These were the answers:

+
    +
  • Join community call -> We have more community calls and better advertising of them planned in the future
  • +
  • One manual page which gives overview -> We since created: https://coderefinery.github.io/manuals/onboarding/
  • +
  • A video that explains how to join
  • +
  • Each new member gets a mentor/buddy who mentors for a while and is their main contact and who connects them to other people
  • +
  • In person event
  • +
  • Co-teaching with a mentor (as one option)
  • +
+

The mentor system we will try to implement better in the future also beyond the workshop.

+

New roles

+

We also asked if we need to add more roles in the community and what those would be. Most CodeRefinery team members do not have specific roles unless they decide so themselves. Roles that we do not currently have in the community:

+
    +
  • Ambassadors; people that could already be called ambassadors are local organizers of teams to watch the CodeRefinery workshop stream and do the exercises together and training coordinators in organizations or projects that help advertising the workshops -> We have since started to implement the CodeRefinery ambassador program and plan to invite our known suspects soon. If you want to become an ambassador, please check out the ambassador section on our website.
  • +
  • Board; in order to continue working on CodeRefinery after the project funding ends we need to define who can make decisions
  • +
  • Contributors; e.g. lesson material contributors need to acknowledged better (citation file format (.cff) in progress) and
  • +
  • Heroes.
  • +
+

We are currently working on fleshing out what it would mean to be a CodeRefinery ambassador, what they can get out from it and how we can support future ambassadors. This could be similar to onboarding a new team member, e.g. via a community call, mentoring or some kind of a welcome package. Whenever we reach out to different research communities and during our workshops we could advertise this role. In the end it should be easy to become an ambassador and people should be able to make it whatever they need it to be.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/18/in-person-asynchronous-versus-live-online-teaching/index.html b/blog/2024/04/18/in-person-asynchronous-versus-live-online-teaching/index.html new file mode 100644 index 00000000..d52d61c6 --- /dev/null +++ b/blog/2024/04/18/in-person-asynchronous-versus-live-online-teaching/index.html @@ -0,0 +1,929 @@ + + + + Asynchronous vs. Live Online Teaching: Understanding the Pros and Cons - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Asynchronous vs. Live Online Teaching: Understanding the Pros and Cons + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Asynchronous vs. Live Online Teaching: Understanding the Pros and Cons

+ + + +
+ +

Introduction

+

The comparison of asynchronous and live (synchronous) online teaching highlights key benefits and drawbacks that suit different learning preferences and logistical needs.

+

Asynchronous Teaching: Pros and Cons

+

Pros:

+
    +
  1. Flexibility in scheduling
  2. +
  3. Self-paced learning
  4. +
  5. Access to a broad range of resources
  6. +
+

Cons:

+
    +
  1. Limited real-time interaction
  2. +
  3. Requires significant self-discipline
  4. +
  5. Delayed feedback, though mitigatable via Q&A sessions
  6. +
+

Live Teaching Online: Pros and Cons

+

Pros:

+
    +
  1. Immediate interaction and feedback
  2. +
  3. Structured learning schedule
  4. +
  5. Enhanced engagement and motivation
  6. +
+

Cons:

+
    +
  1. Reduced flexibility in scheduling
  2. +
  3. Potential technical and connectivity issues
  4. +
  5. Limited access to past session materials
  6. +
+

CodeRefinery Q&A Sessions

+

Utilize pre-recorded lectures for content delivery, supplemented by regular, shorter live Q&A sessions for interactive engagement and query resolution.

+

Preparation for Live Sessions

+

Efficiency in Q&A sessions is improved by having students submit questions in advance, allowing instructors to concentrate on prevalent issues and intricate questions.

+

Summaries from discussion

+

The discussion delved into various strategies to enhance student engagement in asynchronous learning environments, emphasizing the importance of certificates coupled with challenging exercises. The exercises should be designed to be sufficiently difficult to maintain engagement, and personalized projects can further enhance involvement. Additionally, the possibility of automating exercise evaluation and certificate issuance was explored, with considerations on how this could be implemented efficiently across platforms. Other engagement tactics included incorporating polls, Kahoot-like feedback, utilizing chat platforms like Zulip for topic-wise discussions, and potentially establishing a public, moderated forum like CodeRefinery for peer-reviewed evaluations.

+

Addressing technical and connectivity issues in live online teaching was another focal point. Strategies discussed included integrating tech checks into registration processes in a gamified manner, recording lectures for later viewing to accommodate technical difficulties, and providing support from helpers in breakout rooms during live sessions. The integration of asynchronous and live teaching methods was also considered, acknowledging that while some students require direct instruction, others may thrive in self-directed environments. The suggestion to guide students to platforms like Zulip for questions and incorporating alternative session formats during sign-up highlighted a flexible approach to accommodate diverse learning preferences. Additionally, the discussion emphasized the importance of facilitating interactive and responsive learning experiences in both asynchronous and live settings, recognizing the challenges of maintaining momentum and support for learners with limited continuous study time.

+

Platforms

+

In addition to discussing engagement strategies and technical considerations, various platforms were mentioned as potential tools which provide a proof of concept for asychronous learning. These included well-known platforms like Coursera, Udemy, and edX, which offer a wide range of courses and educational resources. Additionally, the discussion touched upon MOOC platforms like mooc.com and Moodle, with the recognition that many universities have their own Moodle instances for course management. The conversation also briefly explored specialized platforms such as LeetCode for coding practice, as well as the possibility of building custom platforms like IQMAcademy.

+

Notes on platforms

+

If we opt to create our own platform, it's advisable to keep it lightweight, considering options like hosting videos on YouTube or utilizing tools like HedgeDoc for documentation. Utilizing Moodle might be too heavyweight for our needs. The decision to develop our own platform would primarily hinge on the necessity for automated exercises and certifications. However, existing platforms offer the advantage of providing tools to structure learning paths, though developing a course on such platforms requires substantial upfront effort. Nonetheless, prioritizing modularity and content reusability could lead to universities integrating our materials into their courses, thereby handling their own exercises and certifications.

+

Summary

+

This is an ongoing question with regards to what is the best way for students to learn and instructors to teach. Given that CodeRefinery is spread across the whole world, the online space has many possibilities, so it's not an easy decision because there are pros and cons to both options. With the above-mentioned information, we have more insights into those pros and cons which can be taken into future discussions on the topic.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/19/drafting-a-governance/index.html b/blog/2024/04/19/drafting-a-governance/index.html new file mode 100644 index 00000000..fdc0eee7 --- /dev/null +++ b/blog/2024/04/19/drafting-a-governance/index.html @@ -0,0 +1,1196 @@ + + + + Drafting a governance structure for 2025 and beyond - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Drafting a governance structure for 2025 and beyond + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Drafting a governance structure for 2025 and beyond

+ +

+ We are working on defining a mission, vision, guiding principles, and a decision body +for CodeRefinery in 2025 and beyond. This is an early draft. + +

+ + April 19, 2024 + + - Radovan Bast and Richard Darst + +

+ +
+ + + + + + +

Executive summary

+

CodeRefinery's NeIC sponshorship may be coming to an end, and the feeling is +that partners want the collaboration to continue with some sort of structure. +In short, we propose to organize as a community project with a steering group +of interested partners that could take over CodeRefinery management on +2025-01-01:

+
    +
  • CodeRefinery continues with roughly the same vision and mission as now: +
      +
    • We want to promote reproducible science by training and community.
    • +
    • We will continue giving courses like we have been doing (but with more +possibility of new partners joining and custom teaching styles, including small local +courses).
    • +
    +
  • +
  • Board: a steering group of organizational partners and some community representatives. +
      +
    • The steering group will meet occasionally to discuss high-level matters and the broad direction.
    • +
    • The steering group can make agreements on behalf of CodeRefinery.
    • +
    • Updates the governance documents and accepts new organizational partners via majority vote.
    • +
    +
  • +
  • Community managers: Coordinate the project on a day-to-day basis. +
      +
    • Appointed by the steering group (with consultation of the community).
    • +
    • Handle most of the day-to-day organizational activities (or delegate them).
    • +
    • Report to and work with the board.
    • +
    +
  • +
  • Community: +
      +
    • Operated as an open-source project with an open community membership of individuals.
    • +
    • The board can work with organizational partners to define in-kind contributions and roles.
    • +
    • Recognized as decided by board/community managers.
    • +
    +
  • +
  • We don't currently plan a separate legal entity just for CodeRefinery.
  • +
+

There are ideas on these matters is below, but there will be much more among +the "founding board" as it works towards formally defining a collaboration +agreement.

+

Mission, vision, and guiding principles (early draft)

+

(when thinking of these, think "what makes us different from others?")

+

Mission (what we do and why we do it¸ 2025):

+
    +
  • CodeRefinery improves science and research by providing education in the tools of computational science to a diverse audience. +
      +
    • CR empowers XX by providing skills needed for achieving YY through providing training on practical skills.
    • +
    +
  • +
  • Fill gaps between academia's lack of training in certain areas.
  • +
  • Preparing people and communities for high-performance computing and AI.
  • +
  • Foster a culture of FAIR, collaboration and openness in research software practices.
  • +
+

Vision (what we want to achieve):

+
    +
  • We create a highly skilled academic community who can do better, more reproducible science.
  • +
  • Our core workshops are a regular recommendation for any students or researchers who does computational research.
  • +
  • We have a wide variety of other rotating workshops, organized by partners but with contribution by many.
  • +
  • When research projects need extra training, they think of us and our team.
  • +
  • Skilled trainers and build knowledge transfer and build competence.
  • +
  • Highly skilled researchers and staff.
  • +
  • Create a group of good trainers in partner institutes.
  • +
  • Bringing academia into digital age.
  • +
  • Equip society with tools for collaborative and reusable research.
  • +
+

Guiding principles (when a difficult decision needs to be made, we invoke the following guiding principles):

+
    +
  • At our core, we are an open project and structure our working methods like one. Our outputs are openly licensed with distributed copyright.
  • +
  • We optimise for practical usability for those who lack skills in reproducible computational work. We don't try to replace career-oriented IT training.
  • +
  • Make people's lives easier (but we need to make this more tangible).
  • +
  • When in doubt, do what makes science/research/academics more reproducible.
  • +
  • Make it easier for people and organizations to participate.
  • +
  • Encourage collaboration when possible to do so.
  • +
+

Structure and responsibilities

+

Project governance 2016 - 2024

+
    +
  • Initially: NeIC board
  • +
  • NeIC board transfers management to steering group via project directive
  • +
  • Project partners each appoint a steering group member
  • +
  • Steering group meets 2-3 times per year and makes big picture decisions
  • +
  • Day to day decisions by project manager in communication with steering group and project owner (NeIC)
  • +
  • Project manager reports to NeIC and project owner and steering group
  • +
  • Project manager is responsible for the project budget
  • +
  • Project manager tries to get support and consensus from the project team and community
  • +
+

Scope and responsibilities for future board

+
    +
  • Strategic and organisational planning
  • +
  • Ensuring the effective implementation of community objectives
  • +
  • Financial oversight
  • +
  • Business plan and budget plan
  • +
  • Capacity plan
  • +
  • Fostering collaboration among members
  • +
  • Name, brand, and public image
  • +
  • Steering the lesson portfolio
  • +
  • Coordinate community initiatives
  • +
  • Manage accounts: Freshdesk, Twitter, Fosstodon, GitHub, domain name, HackMD, Indico, chat, mailing list, GitLab, YouTube
  • +
  • Manage the data and data sharing policies
  • +
  • Contact point
  • +
  • GitLab (maybe)
  • +
  • Intellectual property
  • +
+

Outline of the structure

+
    +
  • Partners: the institutions that collaborate, and unaffiliated individuals.
  • +
  • Board: high-level strategy and help. Can be consulted on big decisions and +for tricky trade-offs. Within mission statement, delegates all other +decisions to community managers.
  • +
  • Community managers: Manage day-to-day work and connection with steering +group. Build consensus among those doing the actual work for the day-to-day +operations.
  • +
  • Community: does work
  • +
+

Board

+
    +
  • Initial board is one person per organization of the NeIC project.
  • +
  • Board decides its future composition, probably once a year.
  • +
  • Board confirms partner-level contributions.
  • +
  • Board confirms community managers (likely with the community's input) and delegates most daily operation to them.
  • +
+

Community managers

+
    +
  • Coordinate most of the day-to-day work.
  • +
  • Are responsible to the board, but mainly lead the community in doing the work.
  • +
  • Ensure rough consensus and push things forward if it can't be done.
  • +
  • Can appoint (=recognize on the website) leads in different areas.
  • +
+

Community

+
    +
  • Community doe most of the work, and should be recognized as decided by the community managers and board.
  • +
  • This is a volunteer organization, no person has any requirement to do anything.
  • +
  • Members are expected to abide by our community standards of cooperation and respect.
  • +
+

Working methods

+

Code of conduct

+

We take our code of conduct as starting point but suggest to adapt it to +the governance structure and decision making process.

+

Conflict resolution

+

Questions to be worked out:

+
    +
  • What to do if there is conflict within leadership?
  • +
  • Conflict within community?
  • +
  • Conflict between leadership and community?
  • +
  • What if a collaboration partner becomes problematic? (mission, guiding principles, code of conduct)
  • +
+

Community meetings, communication, and reporting mechanisms

+

This needs to be worked out. +Data sharing policy needs to be worked out.

+

Amendments to the governance document

+

Board can change based on majority vote.

+

Periodic review and evaluation

+
    +
  • How often do we review the governance document?
  • +
  • How do we evaluate the success of the community and project?
  • +
+

Discussion points during the in-person meeting in February 2024

+
    +
  • Mission, vision, guiding principles: what is missing?
  • +
  • Initial board composition? The NeIC project partners? What if they prefer not to or are inactive? +
      +
    • proportional to activity 2023-2024?
    • +
    +
  • +
  • What if a board member leaves?
  • +
  • Can community elect a board member? +
      +
    • Should be able to, yes.
    • +
    +
  • +
  • What decision necessitates board input? +
      +
    • Initially guiding principles (part of foundation document), in principle anything they haven't delegated to a community manager.
    • +
    +
  • +
  • At which level of support should a partner be offered a board seat? +
      +
    • Board decides. Initial principle is "those with in-kind work".
    • +
    +
  • +
  • "This is a volunteer organization, no person has any requirement to do anything." - this is currently not the case but maybe we want this to be the case? +
      +
    • I guess that's more for community, rather than paid staff. Paid staff do what their employer says.
    • +
    +
  • +
  • Responsibilities for future board: what should be left out or added?
  • +
  • Who/what has ownership over intellectual property (IP)? Maybe case-by-case? +
      +
    • case: teaching material publicly available – CC-licence?
    • +
    • Transferring IP is probably very hard. Distributed IP is probably needed.
    • +
    +
  • +
  • Independent non-profit organization
  • +
  • Find the carpentries cooperation model and propose them to be in the board +
      +
    • E.g. Science library of University of Oslo
    • +
    +
  • +
+

Inspirations for this document

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/19/git-lesson-rewrite/index.html b/blog/2024/04/19/git-lesson-rewrite/index.html new file mode 100644 index 00000000..c81df6bc --- /dev/null +++ b/blog/2024/04/19/git-lesson-rewrite/index.html @@ -0,0 +1,1009 @@ + + + + We have completely changed our Git lessons. Hopefully to the better. - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - We have completely changed our Git lessons. Hopefully to the better. + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

We have completely changed our Git lessons. Hopefully to the better.

+ +

+ We don't start on the command line anymore. Instead, we start in the web +interface of a Git hosting service and offer several tracks to follow the +lesson. + +

+ + April 19, 2024 + + - Radovan Bast + +

+ +
+ + + + + + +photo of a white board where we planned the first three workshop days +

Status and big picture summary of changes

+

We have completely changed our Git lessons before the March +workshop in which we +taught the new format:

+
    +
  • Start from GitHub instead of on the command line.
  • +
  • Start from an existing repository instead of with an empty one.
  • +
  • Only on second course day we move to local work on the laptop.
  • +
  • Offer several tracks to participate in the lesson (GitHub, VS Code, and +command line) and learners can choose which one they want to follow.
  • +
  • Use a new example where we collaboratively edit a cooking recipe book.
  • +
+

You can also have a look at the +issue where these +changes were discussed and tracked.

+

Motivation for this change

+
    +
  • Learners are more likely to start from an existing repo or to already have some project that is not yet on Git
  • +
  • Might feel more motivating to see something "real" instead of starting from something empty
  • +
  • Many do not work in the terminal but rather in an IDE or editor
  • +
  • Making a terminal available on Windows is not always easy
  • +
  • Previously we tried to explain basic concepts in a terminal but they might be easier to explain in a web interface
  • +
  • It should be possible to participate and learn without a functioning local installation of Git and Bash
  • +
  • Give everybody the feeling of accomplishment and everybody should be able to +do the most basic Git/GitHub tasks after the 2-3 half days
  • +
  • Avoid troubles with main/master naming
  • +
  • We introduce forks and pull requests already on day 1: this can free up time for day 3 to do more interesting things there
  • +
  • Also the "non-programmers" can benefit from this course
  • +
  • In future we might not need "Collaborating and sharing using GitHub without command line" as standalone lesson anymore
  • +
  • Gives more opportunity to "sneak in" some branch design discussions
  • +
  • Might make the lesson more interesting and fun for new instructors and helpers to join
  • +
+

Discussion points during

+

Metaphors should be so generic that they can apply to literally everyone e.g. +inheritance in object-oriented programming can be explained using a family +tree. Some potential metaphors: Time machine, photo album, or a detailed diary +that documents your project (you can go back to any page to see what you did +there). We need to be able to explain git in a short introduction so that +people not familiar with git at all. Tie in with a metaphor (as previously +mentioned) then create a visual (ideally a video, but could also be an image) +to explain that metaphor.

+

We have also discussed whether instead of providing a single course for all, we +should have at least two introductions and classify materials into different +levels (introductory, intermediate, advanced). +For "coders" and future Git power users we might need a "Git masterclass" with +all scenarios and command line. For general learners who are interested in +version control, we might need a course that focuses on concepts, empowering +them, and providing visuals. +However, are learners able to self-assess their level?

+

We also noted that it could be +useful to modularize the first two days so that they could be swapped without +friction.

+

We discussed the risk of oversimplifying the lesson.

+

Executive summary from our discussion session was:

+
    +
  • We found the suggested changes would be an improvement but they would need to be worked out in more detail.
  • +
  • We were concerned about whether this is doable in terms of preparation time and in doubt post-pone to future.
  • +
  • We recommended to modularize to make it possible to re-shuffle and choose.
  • +
  • We noted the need to think and elaborate a bit more before we commit to implement this change.
  • +
+

How did it go?

+

We decided to go ahead and implement the change in a massive sprint. It would +be nice to be able to post-pone to later "when we have more time" but from the +past we know that that time never comes.

+

We were very happy with the new format for days 1 and 2 but then we realized +that day 3 also needed to be adjusted to not feel disconnected and repetitive.

+

The new lessons are available at:

+ +

The feedback was generally positive both from learners and co-organizers. As an +instructor I had the feeling that we managed to cover more ground and more +exercises in this edition of the workshop than in past years.

+

One downside of the change which happened over two weeks just before the workshop was +that it was more difficult for co-instructors and team leaders to prepare since the lesson +received changes until the day before the event.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/19/in-person-modular-code-development-lesson/index.html b/blog/2024/04/19/in-person-modular-code-development-lesson/index.html new file mode 100644 index 00000000..43064873 --- /dev/null +++ b/blog/2024/04/19/in-person-modular-code-development-lesson/index.html @@ -0,0 +1,899 @@ + + + + The Modular Code Developement Lesson - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - The Modular Code Developement Lesson + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

The Modular Code Developement Lesson

+ + + +
+ +

Introduction

+

Currently we do a lesson on Modular Code Development. We start out with a simple plotting script and end up with a +script which is more general and have a wider use. The script move from a Jupyter Notebook to the command line. In +parallel there is ongoing discussion on what to do next with the script in the shared HackMD document.

+

The challenge with the current lesson is that it is python based. Mostly python users are engaged in the discussion. +How can we engaged a larger part of the audience, and how can we cater for the non-python users?

+

To cater for the non-python user we can have several streams where one stream is dedicated to a programming language.

+

There were people who like the lesson as it is. The question about AI was raised. Shold we mention GitHub Copilot or ChatGPT? This feels natural as tools are used more and more for support in the code development process. We did not conclude.

+

Conclusion

+

We had a hard time of finding a way to make it more engaging, in a way that everyone could follow along. +The conclusion was to add tabs for R, Matlab, Julias in the "instructor guide".

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/04/19/in-person-social-media-strategy/index.html b/blog/2024/04/19/in-person-social-media-strategy/index.html new file mode 100644 index 00000000..90d2c801 --- /dev/null +++ b/blog/2024/04/19/in-person-social-media-strategy/index.html @@ -0,0 +1,942 @@ + + + + CodeRefinery Social Media Strategy - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery Social Media Strategy + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery Social Media Strategy

+ + + +
+ +

Introduction

+

We looked at our social media strategy and discussed to improve it to engage our audience and cultivate our brand presence during our in-person meeting in Tromsø (26 Feb-1 Mar, 2024).

+

We have already documented CodeRefinery outreach and marketing plan. Link here.

+

Discussion

+

Why do we need a social media strategy?

+

We need a good social media strategy to:

+
    +
  • reach wider audience
  • +
  • to establisg CodeRefinery(CR) brand beyond nordic
  • +
  • to build an engaged community
  • +
  • let the world know about the good work we do
  • +
  • expand our training network
  • +
+

Our targeted audience

+
    +
  • Students, researchers
  • +
  • Possible future CodeRefinery Teachers
  • +
  • University teachers, who then steer students to us
  • +
+

Our Social media platforms

+

Currently we are using following platforms:

+ +

We paln to continue using these platforms and we decided that we don't need a complicate things by adding more platforms for our social media activities.

+

It seems to be possible to post in multiple some at once + schedule posts with eg.

+
    +
  • https://www.socialchamp.io/blog/post-to-all-social-media-at-once/
  • +
  • https://go.loomly.com/schedule-social-media-posts/
  • +
  • https://blog.hootsuite.com/post-to-all-social-media-at-once/
  • +
+

Our SMART Goals

+

We defined our SMART(Specific, Measurable, Attainable, Relevant & Time-based) goals to help us to ensure that our objectives are attainable within a certain time frame. +Our SMART Goals are:

+
    +
  • To onboard CodeRefinery ambassadors
  • +
  • Frequent actions on social media (not limited to the workshops)
  • +
  • Add video/visual contents to social media posts to get more visibility
  • +
  • Improve outreach/publicity/webinars to various research community and encourage engagement on social media
  • +
  • Tagging: Tag CodeRefinery when it is relevant, and use hashtags when posting on social media
  • +
  • Promote user generated content campaigns
  • +
  • Post behind the scene contents
  • +
  • Boost our brand awareness
  • +
  • Coordinate the timing of announcement
  • +
  • Encourage institutions to mention CodeRefinery in there posts when it is relevant.
  • +
+

We have our own challenges to achieve our social media strategy goals as most of us are not major social media people, but we'd like to try to be more engaging.

+

Our desire is to build and expand CodeRefinery community around our shared interest in FAIR research software practices globally. It will take time to reach our desired goal, but we are optimistic and proud of our work. We can definitly achieve our desired goals wih the support of our community members/ambassadors and partner organisations.

+

Epilogue

+

We are acting on these ideas and it looks promising as our increased visibility in social media platforms is evident.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/06/07/organisation-info-support-cr-how/index.html b/blog/2024/06/07/organisation-info-support-cr-how/index.html new file mode 100644 index 00000000..408e9a9e --- /dev/null +++ b/blog/2024/06/07/organisation-info-support-cr-how/index.html @@ -0,0 +1,916 @@ + + + + Why should your organization support CodeRefinery and how? - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Why should your organization support CodeRefinery and how? + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Why should your organization support CodeRefinery and how?

+ +

+ Organizations can support the CodeRefinery project in several ways to make it sustainable and can have a mutually advantageous collaboration. +

+ + June 07, 2024 + + - Dhanya Pushpadas, Samantha Wittke, Radovan Bast + +

+ +
+ +

Why should your organization support CodeRefinery and how?

+

There are many courses at universities and on the internet about learning how to code for researchers. But not many teach about sustainable software development or how to collaborate with others.

+

The consequences of this gap are that researchers tend to start from scratch, code on their own, or that a lot of time is spent on figuring out old codes by onself or others instead of spending that valuable time on research.

+

The idea of the CodeRefinery project is to help researchers that already know how to code (in any language) to increase their codes reproducibility and show some tools that can help on this journey.

+

CodeRefinery is a growing training network. We try to make this project more accessible and inclusive. We developed public and freely available and reusable learning and teaching materials on many topics around research software development in order to improve its FAIR-ness (Findable, Accessible, Interoperable, Reusable).

+

Our workshops foster collaborative research/work environment to increase productivity and efficiency. +The workshops themselves are interactive online events, to which participants can join individually or in team. +Teams usually have some kind of advanced person with them to guide through the exercise sessions.

+

From our point of view, organizations can support the CodeRefinery project in many different ways, as can be seen from the following figure:

+

Figure showing different possibilities for organizations to support the project, description below

+ +

The easiest way to support us is to advertise the workshop to your network. In that way, you can get people that know about FAIR software development back and can start implementing it in their work creating a more collaborative working environment regarding research software. By participating, your organization contributes to improving research software quality.

+

Observe

+

If you are curious about how these workshops work, you can always send observers: a CodeRefinery workshop is a special event, let your teachers observe how we do things and maybe we can learn a thing or two from each other.

+

Teach with us

+

The most valuable contribution for us is to let your experienced employees work on lesson development, or be an instructor on worktime ("contribute in kind"). That way we can learn from each other and everyone can bring in their expertise to make the project sustainable. In-kind contribution can be facilitated by including it as apart of your organisation's culture to develop employee's competence and accelerate knowledge transfer.

+

Provide a local team space

+

If you want to provide a better way of learning together in a CodeRefinery workshop, provide a (virtual or real) room for a team from your institution to join the workshop together ("bring your own classroom"). This facilitates collaborative learning. You can make use of our central registration system or use your own (if you need control over own registration, credits, schedule).We mention all "local breakout rooms" on our webpage, if wished, to maximize outreach for these possibilities.

+

Collaborative Workshops

+

Within the CodeRefinery community an organization can also collaborate with CodeRefinery partner organizations on other trainings that otherwise could not happen due to missing resources for. In that way we can share the "burden" of teaching. One example for such collaboration: Aalto university HPC kickstart with participants from all over Nordics, partners contribute to teaching and cluster specific instructions

+

User Community

+

If you are a part of a specific user community or a project, you can benefit similarly by supporting CodeRefinery.

+

The CodeRefinery team is happy to discuss these or other possibilities further via email or arrange a meeting. Please contact support@coderefinery.org, if you are interested.

+

Together we can improve research software practices, promote collaboration, develop expertise, and establish an inclusive training network!

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/06/17/finance-models/index.html b/blog/2024/06/17/finance-models/index.html new file mode 100644 index 00000000..bc9a36eb --- /dev/null +++ b/blog/2024/06/17/finance-models/index.html @@ -0,0 +1,988 @@ + + + + Summary of business and financing models -planning session Tromsø 2024 - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Summary of business and financing models -planning session Tromsø 2024 + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Summary of business and financing models -planning session Tromsø 2024

+ +

+ Discussing possible business and financing models for CodeRefinery + +

+ + June 17, 2024 + + - Matias Jääskeläinen + +

+ +
+ +

Summary of business and financing models -planning session Tromsø 2024

+ + + + + +

Financing CodeRefinery - from reality to expectations

+

CodeRefinery is receiving funding from the parent organisation NeiC. That covers two half-time personnel and some operational costs, like travelling. +Apart from those two project people, the activities and products of CodeRefinery are largely run and produced by people from organisations who see the value of letting their employees to spend time on CodeRefinery activities. This in-kind model has made all CodeRefinery work possible.

+

CodeRefinery is a project, not a company or organisation (situation Feb 2024). This means we cannot invoice for our work. If some company would like to have tailored training form us and is willing to pay forit, we have no way to handle the transactions.

+

During our meetup at Tromsø Feb 2024 we held a session to brainstorm possible ways to let CodeRefinery operations continue.

+
    +
  • We would need a way to invoice.
  • +
  • We would not want people to work for free
  • +
  • We should be able to accept grant funding
  • +
  • Many CodeRefinery team members would like to continue in-kind work
  • +
  • People would like multiple different ways of working: in-kind, freelancer, direct employment to name a few
  • +
+

Open source – open core?

+

CodeRefinery is an open project and the outputs are openly licensed with distributed copyright. If we are to introduce paid products and/or services we need to be very transparent of the guiding principles and the business model. One example is the open-core model in software industry, where basic functionality is offered open source and free, but premium features are behind a paywall.

+

Our warm-up exercise in the workshop session was to gather ideas what CR should offer for free, and what possibly could be behind paywall. This is not a definitive list, but something to start the discussions with.

+

CR could offer for free:

+
    +
  • General or introductory course and lesson materials, possibly without integration
  • +
  • General CR workshop in some format
  • +
  • Tutorial videos eg. in YouTube
  • +
+

CR could charge a fee for:

+
    +
  • Advanced courses
  • +
  • Customised training
  • +
  • Courses for private sector
  • +
  • Training for organisations that do not contribute to CodeRefinery but want the training
  • +
  • In-person events like summer schools
  • +
  • Workshop collaborative notes access
  • +
  • Technical consultation for research
  • +
+

Towards a business model

+

For a business model one needs to consider for example the following questions: "Who are our customers?", "What services we offer?", "What are the potential sources of income?", "Who are the other operators in the field?". We filled in a flowchart consisting of Customers, Service Providers and the flows of value in both directions.

+

Potential customer segments

+
    +
  • Organisations that want to build the employee competence eg. in version control
  • +
  • PhD students and researchers
  • +
  • Universities that want to include our topics in their curricula
  • +
  • Research projects that want to outsource training work packages
  • +
  • Small SaaS startups
  • +
+

Potential services

+
    +
  • Courses, workshops or summer schools
  • +
  • A lecturer for an university course
  • +
  • Bootcamps for companies' new employees
  • +
  • Consultation of technical support for research teams or companies
  • +
  • Consultation for individuals eg. a monthly zoom call
  • +
+

Potential service providers

+
    +
  • A freelancer trainer or RSE
  • +
  • An in-kind employee from a partner organisation
  • +
+

Potential income/resources

+
    +
  • A partner organisation lets people to work for CR = in-kind contribution
  • +
  • Funding from EU or a funding agency +
      +
    • Funding agencies could require projects to get training in reproducible research
    • +
    +
  • +
  • Subscriptions eg. Patreon
  • +
  • Course/workshop fees
  • +
  • Service fees (from eg. consultation)
  • +
  • YouTube ad revenue
  • +
  • Sponsorships: we advertise a product we think is worth it to our target groups and get paid to do it
  • +
+

Next steps

+

Some of these listed items have more potential than the others – and some of them might have synergies together. Then it comes to the decisions about our vision and guiding principles. Those can indicate whether some of the options listed here don't represent what we want CodeRefiery to be. +We (CodeRefinery) could formulate a business plan as a tool to refine the ideas and find out the most feasible solution.

+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/07/30/lesson-cffs/index.html b/blog/2024/07/30/lesson-cffs/index.html new file mode 100644 index 00000000..d6407e18 --- /dev/null +++ b/blog/2024/07/30/lesson-cffs/index.html @@ -0,0 +1,1139 @@ + + + + Citation Information for Open Source Lessons - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Citation Information for Open Source Lessons + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Citation Information for Open Source Lessons

+ +

+ Discussing the current state and potential future applications of the Citation File Format for lessons + +

+ + July 30, 2024 + + - Radovan Bast, Toby Hodges, Samantha Wittke + +

+ +
+ +
+

This post was originally published on the Carpentries blog and is cross-posted here.

+
+ + + + + +

In this post, co-authored by members of the CodeRefinery project and The +Carpentries Curriculum Team, we discuss the current state and potential future +applications of the Citation File Format (CFF) for open source lesson projects. +The post concludes with a set of recommendations for what information should be +captured in a CITATION.cff and how.

+

What is the Citation File Format (CFF)?

+

The Citation File Format is a +plain-text human- and machine readable citation information metadata for +software and datasets. The text files contain standardized fields and use the +YAML serialization language. These fields +are listed in a CITATION.cff text file, including but not limited to authors, +title, version, identifiers, and type. Type is currently restricted to software +and dataset. While lessons are neither software nor a dataset, the metadata +collected in the CFF file represents well everything needed in order to also +cite lesson materials.

+

Popular tools and platforms like GitHub, Zenodo, and Zotero integrate with the +Citation File Format and understand and use CITATION.cff files.

+GitHub displays a 'Cite this repository' pop-up on projects containing a CITATION.cff file. +

Creating a new CITATION.cff file is easy with the initializer +CFF-init, +but fields need to be filled with care. The webtool can also be used to update +an existing CFF: the current version is uploaded to the site, pre-populating +fields in the form with the information in the file.

+

CFF can be converted to other formats (APA-like plaintext, BibTeX, CodeMeta, +EndNote, RIS, schema.org JSON, .zenodo.json) using +cffconvert. This tool +can also be used to validate the CFF file on the command line to make sure that +all fields are valid and all required fields are present. The validation step +can be automated and part of code review using the +cff-validator GitHub +Actions workflow.

+

Why we want to make lessons citable

+

The motivation to adopt and integrate CFF into lesson metadata and to make +lessons citable is first and foremost to give the many contributors, editors, +and lesson maintainers credit and hopefully more visibility for their work +(which is sometimes paid but often on volunteer basis). Lessons can then be +cited and their contributors can point to these on their CVs to highlight their +work and the reach of their work.

+

The second motivation is that by assigning a digital object identifier to +lessons we have a chance to make the material more persistent and findable +beyond the lifetime of projects. Many projects are limited in time and we wish +to avoid that knowledge and lessons simply disappear when a project website is +discontinued.

+

Citation File Format was conceived to describe software and data, and it is +sometimes not obvious how it should translate to "creative" outputs like +lessons. Nevertheless, Open Source lessons like those created by the +CodeRefinery and Carpentries communities are similar to software projects in +many of the ways that matter for CFF: they have a commit history, an open +license, multiple versions, publicly-accessible repositories, etc. Another +similarity to software and data projects is that it is often not clear how Open +Source lessons should be cited by those who have used and benefited from them. +The growing ecosystem of tools and platforms that support CFF lead us to +conclude that adopting the format is the sensible choice when providing +citation information for our lessons.

+

Towards FAIR metadata for lessons

+

In future, we hope to establish a yearly release cycle for stable lessons. +Lessons in the early stages of development, which can be expected to undergo +relatively frequent and dramatic changes, may be released more often and less +regularly. Before each release, we plan to verify the CITATION.cff file, and +then create a new release with the version tag in the form YYYY-MM-DD.

+

Ideally, the CFF file is continuously modified with pull requests (or merge +requests) that bring in lesson changes. With pull/merge requests as the main +mechanism to suggest changes, updating the author information becomes part of +code/lesson review, and is ideally not postponed to the time when we finalize a +new release.

+

A successful adoption of the CFF metadata in lessons could bring us one step +closer to have a well-defined FAIR metadata for lessons by reusing some of the +information captured in the CFF metadata. For this, we will need to compare +metadata specifications of related efforts (e.g. the TrainingMaterial +specification from +BioSchemas, the +Course specification from schema.org) to find and +define a common overlap (however, we might explore this in more detail in a +future blog post).

+

Next steps

+

We will start integrating the CFF first into few of our lessons (in order to +test and debug the process and to collect more experience and possibly identify +new problems that we did not anticipate). Eventually, we will roll this out to +all our lessons. Our hope is, that other projects will then follow our example +and also contribute to the process itself.

+

The first step towards making a lesson citable is often to collect a list of +all contributors and to reach out to them to get their consent to be listed. +CodeRefinery plans to do this through GitHub issues tracked close to the +corresponding lesson repositories (review an example from +CodeRefinery). +The Carpentries already records community members' consent to be included in +lesson publications as part of their profile in the community database, +AMY. (You can log in an update your content +preferences any time!)

+

In order to simplify the process of uploading release artifacts to Zenodo we +will create a GitHub Actions workflow which will upload the data and the +metadata to Zenodo using the Zenodo API. Although further development is +required to implement this workflow, the HERMES +tool may be pivotal in the retrieval, +collation, processing, and publication of the relevant metadata.

+

What should be the release artifacts? Our plan is to upload both the lesson +sources as well as a generated PDF/HTML from the lesson sources. This workflow +will be run on each release creation. Using the Zenodo API rather than +uploading the lessons manually offers several advantages, foremost that we can +avoid the situation that future updates to a lesson record would be tied to the +person who uploaded the first version. By the time we will want to upload the +next version, that person might have already left the organization or project. +Instead, we should be able to share the permission to update the lesson record +and metadata within organizations, projects, and research groups (where +applicable).

+

Thanks for reading this far! Do you have ideas for how citation information +could be used in our lessons, or feedback about the proposed implementation +above? If so, we would be delighted to discuss it +further. For those interested in the finer +details of CFF for lesson projects, the remainder of this post describes the +specific information that we recommend to include in the CITATION.cff of an +open source lesson.

+
+

What information should be captured in a CFF for a lesson?

+

Based on previous experience and discussions at various conferences and events, +we have developed the following list of information that should be captured in +the CFF of an open source lesson.

+

Authorship information

+

Lessons are usually the product of numerous and diverse contributions from a group of people. Contributions can be made in a wide variety of different ways: most directly by writing and committing content to the default branch of the project, but also by providing feedback on pull requests, contributing to discussions on issues and elsewhere that influence the content, and/or providing input during the initial planning/ideation of the project. The list of authors should aim to include everyone who has contributed to the project, whether or not they are represented in the commit history. Although some omissions are inevitable, especially on large/long-established projects, capturing all of these contributions in the author list best represents the open and collaborative nature of such projects. This aligns with one of the core values of The Carpentries community: valuing all contributions.

+

Inclusion of non-committing contributors complicates the definition of an order of authors in the list. Furthermore, we feel that any order based solely on the commit history of the project -- whether by number of commits or number of lines added/deleted -- are imprecise proxies to the magnitude and importance of contributions. Therefore, our recommendation is to provide a list of authors ordered alphabetically by last name.

+

At the time of writing, the Citation File Format specification does not provide a way to describe different types of contribution (e.g. according to the CRediT framework). Where a subset of authors should be given further prominence, we recommend capturing this in a published record of the lesson e.g. on Zenodo, where more fine-grained definition of contributor roles is possible. For example, The Carpentries lists lesson Maintainers as Editors in the related Zenodo records. For CodeRefinery, everyone is currently added as Creator.

+

The project type

+

At time of writing, the CFF +specification +only provides for two types of project: software and dataset. It may not be +immediately clear which of these categories a lesson falls into. However, the +CFF team recommends that lesson projects specify "dataset" as the type in +their CITATION.cff +file.

+

References

+

The references field in a CFF can be used to recognise and credit resources +that your lesson is based on/draws from/is inspired by. This is a great way to +provide attribution to other Open Source content that has been modified/adapted +for inclusion in your lesson, literature cited in your lesson, etc.

+

Abstract

+

The abstract field of the CITATION.cff should be used to provide a brief +description of the lesson, including its target audience and a list of its +learning objectives/intended learning outcomes.

+

DOI

+

A Digital Object +Identifier +(DOI) provides a permanent record of your lesson, usually associated with a +particular version published online. It should be included in the lesson CFF, +and updated regularly as the lesson evolves, so that any citation made from it +will include information about exactly which incarnation of the lesson was +used. You might receive a DOI when the lesson is published e.g. in The Journal +of Open Source Education and you can also obtain one +yourself by creating a Zenodo record for the lesson. We recommend that you +publish a lesson to Zenodo early, e.g. when you are ready to teach it for the +first time (to use The Carpentries terminology, when it enters alpha testing), +and release new versions on the same Zenodo record as the lesson develops.

+

The CFF specification allows for a DOI to be included with the doi field, or +as one entry in the identifiers array. Either method is valid -- doi being +simpler and more concise, but identifiers being produced when using cffinit +to create/update the CFF -- and we make no specific recommendation either way.

+

Other information

+

The following fields should also be included in a lesson's CITATION.cff:

+
    +
  • license
  • +
  • cff-version - use the latest version whenever possible
  • +
  • title: descriptive of the content, if possible specifying that this is lesson material
  • +
+

Examples

+
    +
  • Example in a CodeRefinery lesson: + +
  • +
  • Example in The Carpentries Collaborative Lesson Development Training repository: + +
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/2024/08/10/post-workshop-survey/index.html b/blog/2024/08/10/post-workshop-survey/index.html new file mode 100644 index 00000000..1a977dd1 --- /dev/null +++ b/blog/2024/08/10/post-workshop-survey/index.html @@ -0,0 +1,1764 @@ + + + + Results from our 2024 post workshop survey - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Results from our 2024 post workshop survey + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Results from our 2024 post workshop survey

+ +

+ In this blog post we summarize the feedback and suggestions +collected from participants of workshops from 2022 and 2023. + +

+ + August 10, 2024 + + - Radovan Bast + +

+ +
+ + + + + + +

About this survey

+

In early 2024 we sent out a survey to participants of our workshops from 2022 and 2023. +We received 129 responses and this blog post summarizes the findings.

+

You can also browse the +survey questions +and the +Jupyter notebook which generated the plots. +We have archived the results on Zenodo.

+

For each plot we will also provide a summary in text form right below each +plot. Further below you can find answers to free-form questions as well as +suggestions for improvement which we received from the survey participants.

+

One thing we did not do with the answers was to try to cross-correlate +questions (for instance to correlate feedback with career stage or academic +discipline).

+

We are very grateful for the feedback and suggestions and we will use them to +improve our workshops in the future. We also appreciate very valuable +input on how to improve survey questions by experts at +RISE Research Institutes of Sweden.

+

How much time have you saved?

+

Plot estimating time saving

+

In your estimate, how much time per month have you saved as a result of attending a CodeRefinery workshop?

+
    +
  • No time saved: 20
  • +
  • Minutes: 32
  • +
  • Hours: 59
  • +
  • Days: 17
  • +
+

Is your code more reusable?

+

Plot about whether code is more reusable

+

After attending the workshop, would you judge your code to be more reusable or not more reusable?

+
    +
  • My code is more reusable: 90
  • +
  • My code is not more reusable: 9
  • +
  • Not sure: 30
  • +
+

Has it become easier to collaborate?

+

Plot about whether collaboration is easier

+

After attending the workshop, has it become easier or not for you to collaborate on software development with your colleagues and collaborators?

+
    +
  • Collaboration is easier: 91
  • +
  • Collaboration is not easier: 6
  • +
  • Not sure: 32
  • +
+

Have you introduced your colleagues to new tools and practices?

+

Plot about whether colleagues have been introduced

+

Have you introduced one or more of your colleagues to new tools or practices as a result of the workshop?

+
    +
  • I have introduced one or more of my colleagues to new tools or practices: 79
  • +
  • I have not introduced one or more of my colleagues to new tools or practices: 33
  • +
  • Not sure: 16
  • +
+

How likely are you to recommend?

+

How likely are you to recommend?

+

How likely is it that you would recommend CodeRefinery workshop to a friend or colleague?

+
    +
  • 10: 64
  • +
  • 9: 21
  • +
  • 8: 24
  • +
  • 7: 11
  • +
  • 6: 3
  • +
  • 5: 1
  • +
  • 4: 1
  • +
  • 3: 3
  • +
  • 0: 1
  • +
+

Pre-recorded lectures, live online teaching, or in-person teaching?

+

Would you prefer pre-recorded lectures, live online teaching, or in-person teaching?

+

Would you prefer pre-recorded lectures, live online teaching, or in-person teaching?

+
    +
  • I would prefer pre-recorded lectures combined with live discussions: 36
  • +
  • I would prefer online teaching (lectures are live): 62
  • +
  • I would prefer in-person teaching: 30
  • +
+

What would be the ideal format?

+

What would be the ideal format for you?

+

What would be the ideal format for you?

+
    +
  • One week with half days (3 or 4 half-days): 32
  • +
  • One week with full days (3 or 4 full days): 13
  • +
  • Two weeks (6 half-days): 25
  • +
  • Two weeks (6 half-days) but split into two separate logical courses: 24
  • +
  • Lesson series over 6 weeks with one session per week: 17
  • +
  • Lessons are available in a catalogue of videos and can be followed anytime: 18
  • +
+

Participation style

+

Participation style

+

Participation style

+
    +
  • Individual learner: 95
  • +
  • Learner in a team: 15
  • +
  • Team leader/ helper (online): 9
  • +
  • Team leader/ helper (in person): 8
  • +
+

Career stage

+

Career stage

+

Career stage

+
    +
  • Undergraduate student: 3
  • +
  • Graduate student/ PhD student: 63
  • +
  • Postdoc: 18
  • +
  • Researcher: 19
  • +
  • Professor: 4
  • +
  • Research software engineer/ Scientific programmer: 12
  • +
  • Industry: 4
  • +
  • Other: 6
  • +
+

Academic discipline

+

Academic discipline

+

Academic discipline

+
    +
  • Physical Sciences: 30
  • +
  • Earth and Related Environmental Sciences: 18
  • +
  • Biological Sciences: 13
  • +
  • Chemical Sciences: 11
  • +
  • Computer and Information Sciences: 11
  • +
  • Other Engineering and Technologies: 6
  • +
  • Health Sciences: 5
  • +
  • Psychology: 4
  • +
  • Mathematics: 4
  • +
  • Mechanical Engineering: 3
  • +
  • Civil Engineering: 3
  • +
  • Environmental Engineering: 3
  • +
  • Medical Engineering: 2
  • +
  • Medical Biotechnology: 2
  • +
  • Clinical Medicine: 2
  • +
  • Other Medical and Health Sciences: 2
  • +
  • Other: 2
  • +
  • Other Social Sciences: 2
  • +
  • Chemical Engineering: 1
  • +
  • Electrical Engineering, Electronic Engineering, Information Engineering: 1
  • +
  • Economics and Business: 1
  • +
  • History and Archaeology: 1
  • +
  • Nano-technology: 1
  • +
  • Other Natural Sciences: 1
  • +
+

Has anything else changed in how you write code for your research after attending the workshop?

+
    +
  • +

    I started doing documentation in Read the Docs and it really makes the +difference. Thank you!

    +
  • +
  • +

    Usage of documentation with sphinx to pages planned, not done for now.

    +
  • +
  • +

    I learned to use Git and GitHub.

    +
  • +
  • +

    Optimized coding.

    +
  • +
  • +

    Modularity, smaller functions.

    +
  • +
  • +

    I use Git extensively since attending the workshop.

    +
  • +
  • +

    GitHub, Bash, Python, and others were very useful even if many things I did +already know in advance.

    +
  • +
  • +

    Especially code documentation improved a lot as a consequence of the course.

    +
  • +
  • +

    I use Git for myself and it is nice, but I think so much depends on your +supervisors, so ... there is little leverage for me to change things.

    +
  • +
  • +

    When I don't know how to do something, I use your lesson material as a +reference.

    +
  • +
  • +

    I think I am a lot more confident when writing code now.

    +
  • +
  • +

    I write my code so that it is more easier to read by others.

    +
  • +
  • +

    I write more cleaner code, I think. I have a better understanding of testing +routines, though haven't incorporated them yet myself.

    +
  • +
  • +

    Commenting and code structure.

    +
  • +
  • +

    My code is more streamlined and elegant when it comes to reproducibility.

    +
  • +
  • +

    More comments, splitting files in separate notebooks, etc.

    +
  • +
  • +

    Learned to use Git and GitHub better.

    +
  • +
  • +

    I have changed some of my earlier code to be more "modular", that it is easier +and quicker to run. At least that. Workshop has also made some changes in how I +think about coding, that will probably show in my future work. So, the workshop +felt very useful.

    +
  • +
  • +

    Give more emphasis to code structure (architecture) and adopting a consistent +way of writing code.

    +
  • +
  • +

    I have gotten better at using functions in code, previously it was much more +script-esque. I have referred several junior colleagues to your workshops as +well (and they've also found them valuable).

    +
  • +
  • +

    I try to be tidier but it is hard.

    +
  • +
  • +

    Started using Git.

    +
  • +
  • +

    I have improved my reusability and documentation of my codes.

    +
  • +
  • +

    I thank my past self for writing such clear codes now.

    +
  • +
  • +

    Considering the latest workshop, the most important topic for me is the "How +to document your research software". After the workshop, I have used "GitHub +Pages" and "GitHub Actions" for the main documentation of the project that I +am currently working on.

    +
  • +
  • +

    I document my code more thoroughly.

    +
  • +
  • +

    I didn't know how to use git version control before. Now I find it so useful!

    +
  • +
  • +

    Better documentation + Easier to test.

    +
  • +
  • +

    I have started writing more modular code and I use git more diligently, too.

    +
  • +
  • +

    I use Git in much more sophisticated way and enjoy it!

    +
  • +
  • +

    I think more on the potential reader of my code and make it more comprehensible.

    +
  • +
  • +

    It is hard to tell, since I took CodeRefinery in the beginning in my PhD. I +think the focus on tests and test-driven development has had a good impact on +my coding.

    +
  • +
  • +

    The most important outcome I got from CodeRefinery was learning version control.

    +
  • +
  • +

    I am way more careful to commit regularly to my repositories and keep track of changes better.

    +
  • +
  • +

    No. But I am mainly an experimental scientist. Coding isn't a big part of my work.

    +
  • +
  • +

    I use Git more consistently and I learned that making my code more easily +understandable does not in fact cost me as much more time as it saves. I have +known that I have room to grow for a long time, but would like to mention +that just the fact that I finally made time for the workshop and I focused on +developing my coding for a few days helped as well.

    +
  • +
  • +

    I try to write more functions to reuse code for multiple purposes. +Furthermore, I've started using virtual engines.

    +
  • +
  • +

    Haven't coded a lot since then so hard to say.

    +
  • +
  • +

    I write self explanatory commit messages.

    +
  • +
  • +

    I back up in git repositories almost all my code.

    +
  • +
  • +

    I try to document my code as I am writing it.

    +
  • +
  • +

    I am just starting to apply the information from "HPC Best Practices." From +previous workshops, it has been a useful reference point to discuss +collaborative workflow with colleagues.

    +
  • +
  • +

    My code was always a mess that was meant to be solely my personal playground. +The workshop definitely changed my mindset about it - now I think in the +process of what is the best way to write the code (and comment it) so it can +be used by other people without any (or at least, big) difficulties. I don't +use Git actively at the moment, but it was great to receive the necessary +toolkit for efficiently working with it. I think I will definitely need it at +some point!

    +
  • +
  • +

    I've been trying to use Git for all of my projects.

    +
  • +
  • +

    A lot has changed on the way how I run code and test it. I attended code +refinery while I was still new to programming so it was difficult to put into +use the learning from code refinery. Now that I actually do coding for my +research, I expect to make the most of the workshop.

    +
  • +
  • +

    I am using Snakemake now. Right now I think it might not speed up my work +because I am still learning, but I think the benefits will come over time.

    +
  • +
  • +

    Making my codes easier to share, comment them and version control.

    +
  • +
  • +

    It maybe not directly related to the code itself but I've learned a lot of new +what is always very beneficial in this area.

    +
  • +
  • +

    Slightly. I was aware of much already in the course.

    +
  • +
  • +

    I don't have a lot of versions of my code anymore. I have my codes in a Git +repository that can be shared with my publications.

    +
  • +
  • +

    I can write code more compactly and with high performance.

    +
  • +
  • +

    I tend to write more functions with documentation and test units.

    +
  • +
  • +

    More testing and better documentation.

    +
  • +
  • +

    I try to create new Git branch for every new line of development to always +have a working version of the code.

    +
  • +
  • +

    I haven't been writing a lot of code since the workshop so I haven't really +had a chance to put everything into practice, but I'm trying to create a +project environment for each project and I have been documenting my working +process in RMarkdown notebooks. The notebooks have been really helpful for my +research process.

    +
  • +
  • +

    I am trying to keep good practices in mind. I am trying to use proper workflows +(raise issue ==> create branch ==> deploy fix ==> push ==> merge request), etc.

    +
  • +
  • +

    Not after this workshop just when I tried it in my own projects.

    +
  • +
  • +

    I use more arrays, which speeds up my work a lot.

    +
  • +
  • +

    I try to use GitHub now. try to do at least some version control.

    +
  • +
  • +

    Better commenting.

    +
  • +
  • +

    It has been easier to get to know other's code projects because I have +learned some of the conventions eg. in naming.

    +
  • +
  • +

    Now I use Git for managing the code folders.

    +
  • +
  • +

    I tried to follow the rules to make it more reusable.

    +
  • +
  • +

    I am more organised thanks to the use of Git.

    +
  • +
  • +

    No.

    +
  • +
  • +

    More focus on version control and testing.

    +
  • +
  • +

    My code is still so bad that I haven't benefited from it yet. But I am +definitely going to integrate it. Actually, thanks for asking, I will just +get a few words of advice from my colleague on how best to apply what I +learned at your workshop! :)

    +
  • +
  • +

    Made life easier when I work with git tool.

    +
  • +
  • +

    For me trying to write more readable and reusable code is taking a bit more +time at the moment, but that is because I do not write code very much so I +take a lot of time planning the code and the parts and how they are most +fluently glued together. So I expect it to become easier and take less time +with practice.

    +
  • +
  • +

    I'm actively trying to use Git, and back-up my projects (code, useful +articles) in my personal GitHub. I try to update it and, though I've not done +so yet, I intend to use tags to keep track of milestones along the project.

    +
  • +
  • +

    I started using Git on all my projects.

    +
  • +
  • +

    I started using renv to track which version of packages I am using.

    +
  • +
  • +

    Forcing myself to write function description prior to actually writing the function.

    +
  • +
  • +

    Creating all code under Git control.

    +
  • +
  • +

    Trying more modular approaches.

    +
  • +
  • +

    I think my code now is modular. The way I organize my repositories reflects +it too.

    +
  • +
+

What topic(s) should we add to our workshops?

+

[Answers like "None", "Nothing", "Everything was on point", etc., are not shown +in the results below.]

+
    +
  • +

    More advanced topics on GitLab.

    +
  • +
  • +

    Hands-on with setting up, training and running AI-models.

    +
  • +
  • +

    Java APIs.

    +
  • +
  • +

    Java for beginners.

    +
  • +
  • +

    Automation with Azure.

    +
  • +
  • +

    OOP with Python.

    +
  • +
  • +

    Xarray and/or similar useful libraries

    +
  • +
  • +

    Some stuff related to Quantum Computing could be quite interesting. Also some +more "technical computer skills" (how its works by inside, compilations..) +could be interesting.

    +
  • +
  • +

    It would be good if in the workshop you also showed how to connect GIT to a +private repository on GitHub and later how to synchronize such a connection +with VS Code or RStudio.

    +
  • +
  • +

    I have not managed, unfortunately, to make git a regular part of my workflow. +For that, I find that a short revision few weeks after the course would be +useful.

    +
  • +
  • +

    Linting/debugging and maybe more time for testing.

    +
  • +
  • +

    Besa training.

    +
  • +
  • +

    Matlab training.

    +
  • +
  • +

    Python training.

    +
  • +
  • +

    Visualisation with Python, Matplotlib of gridded data (thinking about maps, +projections). And also setting up figures with multiple plots. Smart ways to +get reusable code for creating figures.

    +
  • +
  • +

    Processing of non-linear timestamp data; Combination of float, string, object data in the same data analysis.

    +
  • +
  • +

    The actual pieces of code shown were minimal and went quite fast whereas +there was a lot of discussion in very general analogy level which wasn't so +helpful.

    +
  • +
  • +

    Could mention VSCode's version control instead of just using the terminal.

    +
  • +
  • +

    Git (always useful).

    +
  • +
  • +

    Python: managing problem with installation packages.

    +
  • +
  • +

    Python: debug (within some environment: Spyder (?).

    +
  • +
  • +

    How to use Google Colab.

    +
  • +
  • +

    Maybe: Docker / code ocean ...

    +
  • +
  • +

    Maybe more on organizing "analysis script" type projects - at least where I +am this is a more common than developing software packages.

    +
  • +
  • +

    I think the program was good, but the Git part was most useful.

    +
  • +
  • +

    I think the current topics are very good. I felt like the course was a nice +introduction to all the topics, even for the length of it it felt a bit +crowded, so I think it is good as it is.

    +
  • +
  • +

    VS Code and GitHub Copilot or using AI for coding.

    +
  • +
  • +

    I know that GitLab Pages and GitLab CI have similar workflows but you might +also consider creating some examples for those alternatives as well.

    +
  • +
  • +

    Maybe something about reproducibility (like Docker containers etc.) or code +publications beyond Zenodo.

    +
  • +
  • +

    A small note on how to correctly version-control Jupyter notebooks would be +useful.

    +
  • +
  • +

    It would have been nice to spend a couple of minutes on GitHub Desktop (not +all of us are Terminal fans).

    +
  • +
  • +

    Build systems: For example Make or CMake.

    +
  • +
  • +

    HPC: What are supercomputers and how to use them. What are GPUs, how to program and use them.

    +
  • +
  • +

    Object Orient Programming (for Python).

    +
  • +
  • +

    Use of AI tools for coding.

    +
  • +
  • +

    Perhaps package building for Python? Or a practical example of Docker +application? But this is more for a subsequent workshop, I would not remove +anything from the workshop as I attended it.

    +
  • +
  • +

    Go further on how to browse some else's code.

    +
  • +
  • +

    Further on recovery options of erroneous commits.

    +
  • +
  • +

    A bit on debugging.

    +
  • +
  • +

    More than additional topics, interactive/exercise segments should be added +after topics to reinforce learning. This was more the case in earlier workshops +than the day 1 HPC best practices workshop.

    +
  • +
  • +

    In terms of content covered, although challenging, more concrete examples on +how to find the right amount of memory and CPUs to allocate a job would be +incredibly valuable.

    +
  • +
  • +

    For the general CodeRefinery workshop, I think a "putting it all together" +unit, including hands-on exercises, would be incredibly helpful, and almost +essential, to see the extent of a baseline application of the knowledge +included.

    +
  • +
  • +

    Since Visual Studio code is quite popular editor it would be good to teach +running Jupyter notebooks in Visual Studio Code.

    +
  • +
  • +

    The courses are very complete, perhaps something about dataset sharing.

    +
  • +
  • +

    ML maybe =)

    +
  • +
  • +

    Something about docker maybe? It's used more and more in my experience.

    +
  • +
  • +

    Perhaps a couple of more advances focused workshops of advances git to save +time and make it easier to manage code and collaborating.

    +
  • +
  • +

    Code for publishing.

    +
  • +
  • +

    PEP 8 style.

    +
  • +
  • +

    Maybe for more advanced courses: Object based coding.

    +
  • +
  • +

    Functionalizing a code.

    +
  • +
  • +

    I think it is just right. Adding more may be too overwhelming for a beginner.

    +
  • +
  • +

    Testing.

    +
  • +
  • +

    Refactoring.

    +
  • +
  • +

    Management in general (partly done already).

    +
  • +
  • +

    I would have liked to spend more time on reproducible environments.

    +
  • +
  • +

    Difficult to know. I recently would have benefited from knowing more about +(c)cmake, but this becomes very specific. Git is likely the one thing that +has most general applicability from your education suite.

    +
  • +
  • +

    More focus on writing statistical code (as opposed to software).

    +
  • +
  • +

    The topics look fine the overall organization of the workshop was a limiting +factor. There were too many participants and it got chaotic due to the +limited number of teachers. Maybe CodeRefinery should focus on quality rather +than on quantity, for instance deliver courses with reduced number of +participants on-line. Also, CodeRefinery can coordinate with universities +where local instructors could teach the courses locally.

    +
  • +
  • +

    Conda environments.

    +
  • +
  • +

    Using pycharm for some code development and version control.

    +
  • +
  • +

    More testing and how to switch from chaotic version control to a good one. +Now there is only from scratch, but it would be helpful to go over from +midpoint.

    +
  • +
  • +

    How to use Chatgpt to assist coding.

    +
  • +
  • +

    Using a IDE for Python programming: Notebook & Git/Github integration, debugging, etc.

    +
  • +
  • +

    Docker or containerization in general.

    +
  • +
  • +

    How about software design for research? How to write reusable and +maintainable code when you don't know today what you need tomorrow, or when +students, who may have been sole authors, move on.

    +
  • +
  • +

    More examples of Pull requests, forks and upstream repositories or local +repositories.

    +
  • +
  • +

    More advanced topics on git collaboration.

    +
  • +
  • +

    Since I work with R I would have liked to get more R specific information. +But I can see how it can be difficult to add specific info if everyone uses a +different language.

    +
  • +
  • +

    Conda vs mamba, module management?

    +
  • +
  • +

    Code architecture and data repository architecture and management.

    +
  • +
+

What topic(s) should we remove?

+

[Answers like "None", "Nothing", "Everything was on point", "All the topics are +relevant", etc., are not shown in the results below.]

+
    +
  • +

    The course is very good as it is ... +However, The 6 half days over 2 consecutive weeks is not very convenient for some people here ... +However, I understand the difficulty to bring together online helpers and instructors. +You are doing a good job ! Keep going !

    +
  • +
  • +

    Reproducible research and social coding are a little vague for my taste. So if you need more time, I'd skip them.

    +
  • +
  • +

    Jupyter

    +
  • +
  • +

    The Open Science workshop day has a lot of potential, but there is too little +time with too few interactions with too many topics to make a difference. The +exercises are not very engaging and you did not go deep enough in the aspects +you try to cover.

    +
  • +
  • +

    Jupyter notebook, because Python is too slow.

    +
  • +
  • +

    I attended the workshop about Git and was surprised that also other topics +were covered. Maybe have shorter, more focused courses instead of the current +format.

    +
  • +
  • +

    In the first workshop I attended, the general code refinery workshop, I did +not get enough of a grasp on Snakemake, and other tools I understood well +mainly because of prior experience. I think this was a wonderful workshop +that I have repeatedly recommended to my colleagues, but I think more time +should be given to fully try out and cement each tool introduced. I would +roughly add 50-100% more time to the course and spend all the added time on +more live exercise walk-through and coaching while people work on exercises +individually. I would not remove any topics.

    +
  • +
  • +

    I found the basic Git introduction to be rather tedious, so I lost my focus +and motivation. This made it difficult to prioritize attending the final +parts of the workshop over other duties, so I eventually opted out +completely.

    +
  • +
  • +

    I would much prefer an approach were participants are assumed to be at a +somewhat competent level from the get-go. Preparation material could be +provided ahead of time for the beginners.

    +
  • +
  • +

    Maybe automated testing and modular coding to put that in a separate workshop about improving coding practices.

    +
  • +
  • +

    Documentation was a lot of things in a very short time. I say just choose one +of the documentation options to explain.

    +
  • +
  • +

    None of them. Or split the topic of collaborative programming (Day 1 to 3) +and documentation (Day 4 to 6) to two separate courses.

    +
  • +
  • +

    I don't think anything should be removed...maybe a second workshop that goes into more depth on reproducibility?

    +
  • +
  • +

    How about you ask registrants to pick their three/five/x favorite topics from +a list upon registration, and you select the N most popular ones? Perhaps +makes it more difficult to prepare, and perhaps makes it more difficult for +participants to commit, but since participation (at least online) is a +relatively low commitment, maybe it is okay anyway?

    +
  • +
  • +

    Maybe a small practice session for some of the presenters - a few of the +presenters could improve their communication skills. I know it is a small +thing, but just adding 10-20% humor or more energy into a presentation can +really significantly affect the learning output for students.

    +
  • +
  • +

    For me personally the Jupyter notebooks session was less helpful. But that +doesn't mean it should necessarily be removed.

    +
  • +
+

Other feedback

+
    +
  • +

    Let me highlight it here: your format is great! +The features I liked in particular:

    +
      +
    • HackMD and very high quality feedback there
    • +
    • type-along sessions
    • +
    • dialogue between the two teachers as a format of the lecture. +Many thanks for your effort!
    • +
    +
  • +
  • +

    It was great that I could watch the few sessions that O unfortunately couldn't attend on video.

    +
  • +
  • +

    Thanks a lot for organizing these super useful workshops +and for promoting/creating a environment very relaxed and inclusive +learning environment.

    +
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/BYOC.png b/blog/BYOC.png new file mode 100644 index 00000000..94702a19 Binary files /dev/null and b/blog/BYOC.png differ diff --git a/blog/CR_organization.png b/blog/CR_organization.png new file mode 100644 index 00000000..7edb73fc Binary files /dev/null and b/blog/CR_organization.png differ diff --git a/blog/TEMPLATE.md.template b/blog/TEMPLATE.md.template new file mode 100644 index 00000000..10c68790 --- /dev/null +++ b/blog/TEMPLATE.md.template @@ -0,0 +1,18 @@ ++++ +title = 'TITLE' +slug = "20ZZ/XX/YY/name" +description = "1-2 sentence description for social media previews" + +[extra] +authors = "NAME, NAME, NAME" ++++ + +Concise introduction. + +Body here. + +More body. + + +See also +* Optional but nice diff --git a/blog/bring-your-own-classroom/index.html b/blog/bring-your-own-classroom/index.html new file mode 100644 index 00000000..17e55068 --- /dev/null +++ b/blog/bring-your-own-classroom/index.html @@ -0,0 +1,992 @@ + + + + Bring your own classroom to a CodeRefinery workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Bring your own classroom to a CodeRefinery workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Bring your own classroom to a CodeRefinery workshop

+ +

+ Join a CodeRefinery workshop with your own classroom and help us scale + +

+ + August 19, 2024 + + - Samantha Wittke + +

+ +
+ + Graphical representation of the possibilities of joining a CodeRefinery workshop: As individual learner, online classroom or local classroom, everyone watches the stream and interacts with the instructors via collaborative notes, learners in classrooms can in addition interact with each other and their team lead +

CodeRefinery, supported by the Nordic e-infrastructure collaboration (NeiC), is dedicated to enhancing FAIR (Findable, Accessible, Interoperable, and Reusable) +research software development practices. Our workshops aim to provide essential training in research software development, and we’re continually exploring +new methods to make this learning process effective and inclusive.

+

A Collaborative Effort Across Borders

+

CodeRefinery hosts two workshops annually, supported by a wide network of Nordic universities and organizations. +This collaboration helps us make Research Software Engineering (RSE) practices widely accessible and inclusive, reaching learners from varied academic backgrounds and levels. +While the current network is concentrated on the Nordics, we welcome learners, instructors and organizations from all over the world to join us.

+

Open Source Learning Materials and Inclusive Workshops

+

At CodeRefinery, we believe in open access to education. Our workshop materials are freely available online (https://coderefinery.org/lessons/), +and sessions are streamed live and recorded for on-demand access on the CodeRefinery YouTube channel. +This supports that anyone, regardless of their location, can benefit from high-quality training.

+

During the workshops, we use a collaborative document that allows participants to interact with instructors in real-time. +For us, the collaborative document bridges the gap between traditional in-person instruction and the virtual environment, fostering an interactive learning experience for everyone.

+

Scaling with Community Support: Bring your own classroom

+

An innovative aspect of CodeRefinery's approach to online workshops is the collaboration with local partners to scale the workshop experience +while maintaining a sense of community. Local partners organize viewing rooms, either online or in-person, where learners can gather to watch the live stream, discuss the material, and collaborate on exercises. A local team leader facilitates discussions and provides learners with support and encouragement.

+

This setup not only scales the workshops to accommodate a larger number of learners but also preserves the interactive and community-centric +atmosphere of smaller workshops. It encourages learners to learn from each other, share their experiences, and apply the skills they are +acquiring in a supportive group environment. Through the support from a local team lead from the same organization, possibly even the same domain, +discussions can be more comfortable and targeted on learners own work.

+

Local partners have the flexibility to engage in the workshop preparation and organization as much as they wish, though it is not required. +This also means that a local partner can provide their learners with a full workshop experience, with possible tailored discussions, +without the need for local instructors or the organizational burden of organizing a full workshop. This way, "bringing your own classroom" to a CodeRefinery workshop can also serve as a testbed for offering this type of course; if a community responds well to certain topics of the workshop, an organization could expand their own course offering based on the experiences collected with us, e.g. by adapting CodeRefinery lesson materials to their own need. +We offer a one-hour onboarding session prior to the workshop to orient you on the workshop proceedings and share insights on managing a local team. +This session also provides ample opportunity for questions and discussions. Following the workshop, we actively seek feedback from both learners +and local hosts, including team leads. This iterative process has been invaluable in refining and enhancing the workshop experience over time.

+

Bring Your Own Classroom Experiences from Previous Workshops

+

Paula Martinez Lavanchy, TU Delft:

+
+

Our collaboration with the CodeRefinery initiative started in 2020, when we collaboratively organised a Train-the-Trainer activity and co-organizing a CodeRefinery online workshop where TU Delft researchers joined as participants and our data stewards and research software engineers joined as helpers. Since then, we have been ‘bringing our own class’ to the CodeRefinery workshops by joining the streaming of the lessons from the classroom with our participants and helpers.

+
+
+

The CodeRefinery initiative has helped us and benefit TU Delft researchers in several ways:

+
    +
  • The possibility of joining the workshops allowed us to advance with the implementation of our Vision for Research Data & Software management training and the implementation of TU Delft Research Software Policy by providing high quality and well-received training on FAIR software practices.
  • +
  • The involvement of our data stewards, software engineers and trainers as helpers in the CodeRefinery workshops have also provided them with a great opportunity to continuously improve their skills and learn from this great community.
  • +
  • The CodeRefinery learning materials are openly available and of excellent quality. We often refer our researchers to use them as consultation materials on our websites and/or guides.
  • +
+
+

Lisanna Paladin, EMBL:

+
+

We represent an established training entity within our institute (EMBL), and decided to present your workshop in the same way we present ours: adding your event to our calendars, having an internal registration to sort out rooms, and explaining that we will have the only role of helpers during your streamed lessons. I think that this worked well in advertising the opportunity and providing locally the essential pre-workshop installation assistance, but it posed a significant challenge: those that didn’t read carefully the workshop description on our website expected us to be the instructors and higher levels of interactivity with them. +Besides this point on expectations management, I think your format really allows to reach the biggest possible audience, while also fostering the creation of local communities. We had in-room discussions during the breaks and created a local chat channel for the participants. That was used also in the following days while they were testing the skills learned on their setups. We were inspired by your format in designing ours for the BioNT project.

+
+

Candy Eugenie Charlotte Anquetil Ep Deck, NTNU:

+
+

First of all, I personally think that CodeRefinery is an excellent way to get familiar with Git. +I am myself an engineer working in academia and helping other in everyday task. +I took this course in 2021 and at first, I did not really know what to think about it ... I thought it was a lot of informations and I was a bit scared that I would have missed something. +However, because all the materials are available online, I knew it was possible to go back and redo things if needed. +As a person taking the course from home during the pandemic I thought it was a bit difficult to motivate myself all along the 6 half days. +This is probably why I thought it could be interesting to organize rooms here at NTNU in order to have people sitting, talking, sharing and helping each other, ... +One of the biggest challenge is to keep the whole classroom from first to last day ... I think it's impossible 🙂 +I think different reasons can be cited here :

+
    +
  • some people are going to conferences (I had the case where someone took the 2 first days and left afterwards)
  • +
  • some have teaching duties
  • +
  • some are taking other mandatory courses (This might be relevant to PhDs)
  • +
  • some people think they are too good and do not need to take the course and drop it (which I think is a mistake)
  • +
  • some people think they are not good enough (same remark here) ... they find the path too fast but they can easily catch up during the breaks when we help onsite.
  • +
  • some people here register and do not bother showing up (This is one of of the free workshop) ... or come the first day and leave then.
  • +
+
+
+

6 half days is time demanding. I would assume the impact would be better if we sort of organise something like what is coming up in Gothenburg (August 27-29, 2024) +People taking the workshop here at NTNU ... from beginning to end (more or less) are usually super happy and enthusiastic when it ends [...] I really think people taking the course learned a lot. +I would assume that in person course would definitely be more successful ... However, I understand the difficulty when the instructors come from different countries and when you want to offer the workshop for free !

+
+

Jakob Sauer Jørgensen, DTU:

+
+

I am a Senior Researcher at the Technical University of Denmark (DTU). On two occasions I have participated in multi-day online CodeRefinery workshops as the local facilitator: In Oct. 2020 with a learner group of six and in Mar. 2024 with a learner group of seven, in both cases a mix of postdocs, PhD, MSc and BSc students. (I have also participated in two other CodeRefinery focused workshops on unit testing in 2021 and “Train the Trainer” in 2024.)

+
+
+

Both workshops were a great success. We organized a physical room with everyone around one big table attending together in a kind of hackathon style, with our employer kindly sponsoring lunch and coffee to keep us going. Through the CodeRefinery online training, my participants were taken from no or very basic knowledge of scientific coding tools and practices to using version control, unit tests and collaborative workflows in the scientific work. I can tell it has helped them in their individual projects and have also been instrumental for a joint effort of a python library we are developing together. The online lecture format with plenty of hands-on exercises worked really well. I had not tried the format with being a local facilitator before and on the first run was a bit nervous if I would be able to “answer everything” and make it a productive event. But it worked really well, there was a prep meeting before the event and lots of support throughout in the form of expert helpers checking in on us in our online breakout room as well as the ingenious collaborative document for asking questions and receiving answers live (I have adopted this technique in online workshops I have run since myself). This made my job as local facilitator very straightforward and it was my impression that participants also felt very well supported through the combination of the local facilitator as a first contact and then further online support. On the second run in 2024, there wasn’t a breakout room and no expert helper coming to see us due to a change in the teaching setup, but it wasn’t a problem as still the format with the collaborative document plus the local facilitator provided plenty of support.

+
+
+

I think the most challenging part for me was perhaps on the second run to facilitate the second of the two weeks, where the format had just been changed to less hands-on exercise based and more discussion based. I didn’t feel so well prepared for what was coming (to be fair I hadn’t had much time to prepare) and I think engagement from my team was a bit less that week. I think the material had perhaps just been reworked and there were some suggestions given and I could probably have prepared more – perhaps there is a way to facilitate this a bit more centrally.

+
+
+

In general, I believe attending these workshops as a group helped tremendously compared to attending individually (and compared to my fall back solution of teaching people individually which is always less effective due to other commitments, distractions etc.) due to being able to learn together and discuss in person with team mates.

+
+

If YOU have hosted your own classroom or have attended a local classroom at a CodeRefinery workshop, please share your feedback with us via support@coderefinery.org. We will continuously add it to this blogpost.

+

Many Ways to Join the Experience

+

CodeRefinery’s workshops are more than just educational events — they are a step towards more open and collaborative research practices. +You can get involved as a learner, team leader, or local partner. We welcome your participation!

+

If you can’t join us directly but want to support our mission, consider becoming a CodeRefinery ambassador.

+

To stay updated on upcoming workshops and opportunities, visit the CodeRefinery website and/or subscribe +to the CodeRefinery newsletter. Let’s work together to advance FAIR research software practices!

+

If you’re interested in bringing your own classroom to our next workshop, contact us at support@coderefinery.org .

+

References to previous blog posts discussing the approach:

+ + + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/cite-this-repository.png b/blog/cite-this-repository.png new file mode 100644 index 00000000..d6554135 Binary files /dev/null and b/blog/cite-this-repository.png differ diff --git a/blog/git-lesson-rewrite.jpg b/blog/git-lesson-rewrite.jpg new file mode 100644 index 00000000..df291205 Binary files /dev/null and b/blog/git-lesson-rewrite.jpg differ diff --git a/blog/image_01.png b/blog/image_01.png new file mode 100644 index 00000000..4108dccb Binary files /dev/null and b/blog/image_01.png differ diff --git a/blog/image_02.png b/blog/image_02.png new file mode 100644 index 00000000..fc924295 Binary files /dev/null and b/blog/image_02.png differ diff --git a/blog/image_03.png b/blog/image_03.png new file mode 100644 index 00000000..0b8621a1 Binary files /dev/null and b/blog/image_03.png differ diff --git a/blog/image_04.png b/blog/image_04.png new file mode 100644 index 00000000..fe25162f Binary files /dev/null and b/blog/image_04.png differ diff --git a/blog/image_05.png b/blog/image_05.png new file mode 100644 index 00000000..8ec04ce6 Binary files /dev/null and b/blog/image_05.png differ diff --git a/blog/image_06.png b/blog/image_06.png new file mode 100644 index 00000000..892d0bc9 Binary files /dev/null and b/blog/image_06.png differ diff --git a/blog/image_07.png b/blog/image_07.png new file mode 100644 index 00000000..628c2790 Binary files /dev/null and b/blog/image_07.png differ diff --git a/blog/image_08.png b/blog/image_08.png new file mode 100644 index 00000000..68607afa Binary files /dev/null and b/blog/image_08.png differ diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 00000000..47ee0453 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,1495 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +

Blog posts

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/project-future-concept-board/index.html b/blog/project-future-concept-board/index.html new file mode 100644 index 00000000..d7fbc4d9 --- /dev/null +++ b/blog/project-future-concept-board/index.html @@ -0,0 +1,873 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/project-future-concept-board/participants.jpg b/blog/project-future-concept-board/participants.jpg new file mode 100644 index 00000000..d171d095 Binary files /dev/null and b/blog/project-future-concept-board/participants.jpg differ diff --git a/blog/project-future-concept-board/timeline.jpg b/blog/project-future-concept-board/timeline.jpg new file mode 100644 index 00000000..33a91d10 Binary files /dev/null and b/blog/project-future-concept-board/timeline.jpg differ diff --git a/blog/project-future-concept-board/vote.jpg b/blog/project-future-concept-board/vote.jpg new file mode 100644 index 00000000..7087c22d Binary files /dev/null and b/blog/project-future-concept-board/vote.jpg differ diff --git a/blog/train-the-trainer/index.html b/blog/train-the-trainer/index.html new file mode 100644 index 00000000..db93fa2b --- /dev/null +++ b/blog/train-the-trainer/index.html @@ -0,0 +1,1181 @@ + + + + CodeRefinery train the trainer workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery train the trainer workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

CodeRefinery train the trainer workshop

+ +

+ Report and insights gathered during our train the trainer workshop in August/September 2024 + +

+ + September 09, 2024 + + - Samantha Wittke + +

+ +
+ +

Supported by the Nordic e-Infrastructure Collaboration (NeiC), CodeRefinery is dedicated to promoting +FAIR (Findable, Accessible, Interoperable, and Reusable) research software development. +Our workshops provide essential training in research software development, and we are constantly evolving our teaching methods to create an effective and inclusive learning environment.

+

Our Train the Trainer workshops are designed to share our best practices and provide insights into our approach. +The sessions are highly interactive, encouraging participants to share their own experiences. +While there’s no obligation to become a CodeRefinery instructor after attending, we warmly welcome anyone interested in joining our community of instructors.

+

This blog post serves as a report on the workshop and a compilation of the invaluable contributions made by participants throughout the sessions.

+

Workshop setup

+

The August/September 2024 workshop was not our first time sharing our methods, but with the many changes over the years, +we updated the materials accordingly. We also introduced more exercises and discussions to help participants connect and learn from each other.

+

We spread the four half-day workshop sessions across four consecutive Tuesdays in an effort to make it more manageable and engaging.

+

Workshop materials

+

All materials from the workshop are available with a DOI on Zenodo). We chose not to record the sessions +to ensure a comfortable and open environment for interaction. However, you can find materials from +previous iterations of our CodeRefinery instructor training +and Community teaching.

+

The materials are licensed under Creative Commons Attribution 4.0 International, and we encourage anyone to reuse them. +If you do, let us know so we can help advertise your materials or course on our website!

+

You can also learn how to create your own lesson materials using the CodeRefinery lesson template in the episode +Lessons with version control episode.

+

Participants

+

This workshop attracted record interest, with 82 registrations from 22 countries. The majority of participants were from +Finland, the United Kingdom, Norway, Sweden, the Netherlands, and Germany, with 10-40 attendees joining each session. +Since the sessions were standalone, participants could choose which ones to attend.

+

We gathered on Zoom, utilizing breakout rooms and collaborative notes for discussions and questions. +The notes are archived on the materials web page.

+

Workshop themes and topics

+

The main topics discussed in the workshop were:

+
    +
  • Session 1: About lesson design, deployment and iterative improvement (Aug 13)
  • +
  • Session 2: Tools and techniques adopted in CodeRefinery workshops (Aug 20)
  • +
  • Session 3: About teaching & cool things we all would like to share (Aug 27)
  • +
  • Session 4: Workshop streaming practices and post-workshop tasks (Sep 3)
  • +
+

Session 1: About lesson design, deployment and iterative improvement

+

In this session, we explored the evolution of CodeRefinery lesson materials and how anyone can contribute to their ongoing development. +A key aspect is version control, which ensures lessons are shareable and easy to contribute to. We discussed our preference for Sphinx with the sphinx-lesson extension.

+

We introduced "backward lesson design," where we start from learning objectives and learner personas, and work backwards to create effective lessons. +Feedback collection, its conversion into actionable improvements, and the impact of these refinements were also key topics.

+

During group work, participants shared their methods for creating lesson materials and gathering feedback.

+

Session 2: Tools and techniques adopted in CodeRefinery workshops

+

This session gave participants a behind-the-scenes look at how we run large CodeRefinery workshops. +We covered event setup, roles, and how we maintain interactivity through collaborative documents and "bring your own classroom" setups.

+

We discussed onboarding new instructors and helpers, teaching preparation (sound, screen sharing), +and the importance of teaching "good enough" practices in intermediate software development tools, given the difficulty of defining "best practices." +Our workshops aim to cater to all skill levels, with a focus on competent practitioners.

+

Collaboration plays a key role in our workshops, and we highlighted the importance of assigning a Collaborative Document Manager +to handle questions and interactions. Participants practiced setting up effective screen shares, ensuring readability, +tested their sound levels and learned different ways to adjust it as well as ways of adjusting terminal prompts for teaching.

+

Session 3: About teaching & cool things we all would like to share

+

This session focused on teaching techniques, co-teaching models, and useful tools. We discussed Computational Thinking, +a framework that breaks problem-solving into four parts: decomposition, pattern recognition, abstraction, and algorithmic design.

+

We also examined the benefits of co-teaching, where complementary skills enhance the learning experience and reduce the workload +for individual instructors. Participants shared their perspectives on teaching and discussed how team teaching can improve lesson delivery.

+

In the "cool gems" session we had a few tool presentations:

+ +

Session 4: Workshop streaming practices and post-workshop tasks

+

In this session, we covered streaming and recording workflows, with a focus on using Open Broadcaster Software (OBS) and ffmpeg. +While managing a streaming setup can seem daunting, we broke down the process to show that each step is manageable. +We also discussed video editing as a valuable tool for improving teaching.

+

Participants had hands-on experience with OBS, a powerful but accessible tool, not just for workshops but for personal projects too. +While OBS may appear complex, once the pieces fall into place, it's an intuitive tool for enhancing online workshops.

+

Interested in joining next time?

+

We are still collecting full workshop feedback and link it here later. You can however already find all notes, +questions and single day feedbacks from the materials - notes archive. +Through this Train the Trainer workshop, we hope to empower more instructors to contribute to CodeRefinery +and foster an inclusive community of practice around research software development. +We look forward to seeing how participants will apply these skills and insights in their own teaching endeavors.

+

No matter if you are an instructor or want to observe or support the project in some other way, you are very welcome. +Learn more about the project and available lesson materials by checking out CodeRefinery webpage +and sign up for the Coderefinery newsletter to get to know about the next iteration. +If you do not have any resources to join, but would like to support the project, +please consider becoming a CodeRefinery ambassador.

+ +

What is the hardest thing about teaching for you?

+
    +
  • Knowing how "it's going", whether learners are happy or not (especially when teaching online) :+1:
  • +
  • The preparation the night before. It is always much more that I would hope, no matter how prepared I want it to be :+1: :+1:
  • +
  • Managing groups with vastly different academic backgrounds
  • +
  • Teaching wide spectrum of skill level at the same time. :+1: :+1: :+1: :+1:
  • +
  • Time management! (Knowing how much can fit in a sessions) :+1: :+1:
  • +
  • General preparation time, how to fit it into the regular work schedule, and estimate how much time is needed for prep.
  • +
  • How to reduce too much text into just the right amount
  • +
  • Preparation of the session material and estimating the right amount of time for each section
  • +
  • Getting learners to take the first step: sign up for and attend a workshop, when they don't think programming is a skill they can learn
  • +
  • Getting learners to take the second step: translating what they've learned in a workshop into something they can apply
  • +
  • preparation and time management
  • +
  • Engaging with the students which was much easier for me when I used to coach
  • +
  • Finding the right depth for an unknown audience for "my topic"
  • +
  • education background of participants and their learning objectives
  • +
+

What is the best thing about teaching for you?

+
    +
  • Seeing when learner gets interested/curious about something and takes inspiration from the course. :+1:
  • +
  • Seeing it works and someone can do something new.
  • +
  • Motivated students grasping new stuff
  • +
  • Students picking up and running with the material and skills I give them and using it for their own work. :+1:
  • +
  • The "ah-ha!" moment when a student gets it! :+1::100: :+1:
  • +
  • Learning from students who know about some topic more than you do. :+1:
  • +
  • Being able to help people reach their goals, by showing them something new.
  • +
  • Teaching is optimism acted out in the hope of making a difference both ways I suppose.
  • +
  • The feeling of accomplishment when you see learning grow and implement the learnings :book:
  • +
  • mutual learning and impact on learners :+1:
  • +
  • Results and feedbacks / Mutual interests and interesting discussions
  • +
  • mutual learning and I can also learn lots of things and new ideas from participants
  • +
+

When you start preparing a new lesson or training material, where do you start?

+
    +
  • I look at existing materials on the same topic, but chose/refine topics based on the perceived needs/interests of the presumed audience
  • +
  • Outline of structure and Material collection for a new lesson :+1:
  • +
  • What material I have already? (what other material is already out there?)
  • +
  • Start by looking for related resources (documents, videos, courses, etc) to have a base data and better understanding of what have been done around the topic
  • +
  • Know your audience
  • +
  • Review existing material
  • +
  • Think about learning objectives (to keep focus on essential things)
  • +
  • Think of three things simple enough that they will be remembered the next day. Design around that.
  • +
  • I write down the thoughts that I have and then go back and structure it.
  • +
+

What tricks help you with “writer’s block” or the empty page problem?

+
    +
  • Write anything down that comes to mind, sometimes draw something, looking out the window :)
  • +
  • Do a mind map - what concepts do I want to get across?
  • +
  • Starting small, for example a list of headings and then building around it. :+1:
  • +
  • What does one know about the target audience and why should they be spending longer than 1 minute listening to what they will eventually get to hear?
  • +
  • Get some inspiration from another source.
  • +
  • Start with the three things above
  • +
  • Start with the plan and the overview design
  • +
  • Some kind of outline / main message(s)
  • +
  • Start with three things. Three supporting points for each of these.
  • +
+

Maybe you haven’t designed training material yet. But how do you start when creating a new presentation?

+
    +
  • Think about the learning objectives and try to break them down into steps
  • +
  • Title, Objectives, target audience and Plan
  • +
  • Some kind of outline / main message(s). Get as many images as I can, instead of words
  • +
  • Draft an outline and use chatgpt to fill in details
  • +
  • Example of how the teaching content is applied in a real-world context
  • +
+

If your design process has changed over time, please describe what you used to do and what you do now instead.

+
    +
  • I look more at existing materials and try to get more information about the audience. Unfortunately getting information about the audience before the event is hard
  • +
  • I used to start from the beginning and get from there but that often meant a very polished start and a rushed end. Now I try an overview first, then fill out sparse details at every section
  • +
  • Updating the data and tweak the presentation
  • +
  • If I am teaching a small group (or one to one) talk to them before hand - find out what they know already, what they want to learn.
  • +
+

What do you know now about preparing lessons/training/presentations that you wish you knew earlier?

+
    +
  • less is more. It's better to have 2-3 main messages rather than trying to show everything in one go :+1: :+1: :+1: :+1:
  • +
  • how much practice time the learners need to master what's taught
  • +
  • Don't worry about something going wrong. It often makes the lesson (and thus the material) more persistent in memory. :+1:
  • +
  • Try and remove everything except what you want the person to learn +
      +
    • That's a very tough part for me in the sense that I never know how much of an underlying "black box" is still ok....
    • +
    +
  • +
  • Designing intermediate materials is hard, and requires putting some "gatekeeping" making sure that learners are directed to appropriate courses
  • +
  • When I see a cool graphic, concept, slide, etc., download it and save it in my 'new-materials' folder to use later on!
  • +
  • I have come to the conclusion that perhaps a more "agile" approach to developing materials (try to do design/teaching iterations quickly) might be the best way to go, but there are risks with this approach too
  • +
+

What tricks/techniques have you tried in your teaching or seen in someone else's teaching that you think have been particularly effective in collecting feedback from learners?

+
    +
  • preparing a survey and emailing it to participants as soon as the event ends (usually get fewer than 50% of answers but it's a representative enough sample)
  • +
  • do engage with the audience, give them the time to get the courage to speak up
  • +
  • Be the audience yourself +
      +
    • yes! some problems/issues I don't notice as instructor, only as listener
    • +
    +
  • +
  • Have time (e.g. 5 min) in the session to fill out the feedback form
  • +
  • If the course/workshop has several days/sections do a couple questions every change, then a full one afterwards
  • +
  • "Traffic light" feedback (e.g. for pacing or progress on exercises): give each learner two different coloured post-it notes for in-person, or use emoji for online, to indicate a current status
  • +
+

Do you teach and organize teaching alone or with others? What would you prefer and why?

+
    +
  • Coming together is a beginning; keeping together is progress; working together is success. – Edward Everett Hale
  • +
  • These days always with others. Alone is easier to prepare but almost always is harder during it.
  • +
  • Teaching with very diverse partners, it can be challenging to find a common language with people very different than you.
  • +
  • I teach alone, in the future there will be more collaboration with multiple team members. Both approaches have their pros and cons.
  • +
  • Both has its own distinct advantages
  • +
  • Most of my teaching is on my own, as a freelancer its more expensive to work with colleagues than to deliver a course on my own.
  • +
  • Teaching together, learns from each other, feedbacks to improve
  • +
  • Not formally taught yet, only given presentations actually .
  • +
  • collective teaching would benefit the teachers with collaborative curriculum and experiences sharing.
  • +
+

If applicable, have you seen any challenges when teaching together and how to overcome them?

+
    +
  • It actually requires preparation,
  • +
  • Is it about teaching or about inspiring ? Discover the answer and get inspired ...
  • +
  • It's like being in a band: you might be great at improvising and your band-partners might be great at improvising too, but a bit of rehearsing makes even the impro gig much better
  • +
  • Need to plan before session, difficult if people don't 'plan' in the same way, e.g. with the same time frame.
  • +
  • Heterogeneity in learners make it impossible to get the same result from everyone. +
      +
    • In fact, the same applies to teachers :D
    • +
    +
  • +
  • Teaching together requires to have similar opinions on how to teach. I share views only with ~40% of my colleagues I think.
  • +
  • No Teaching experience but it is good to give the outline of the lessons beforehand and learning goals.
  • +
+

How might breaking down a complex problem into smaller parts change your approach to problem-solving in your current projects?

+
    +
  • Avoids cognitive overload
  • +
  • I used to give an example about this in workshops of cutting long tree into pieces from top to avoid that it falls and destroy a house bloc.
  • +
  • Easier to start on something small
  • +
  • Each individual part is familiar and can take existing solutions.
  • +
  • Only focus on the new things
  • +
  • One can lose oversight of where is supposed to be getting to due to problems with summation of biases introduced during the solving of the parts.
  • +
+

Can you think of a research project where identifying patterns in your data led to new insights or breakthroughs?

+
    +
  • Multi-targeted drug design where you need to identify both chemical and biological pathways/patterns
  • +
  • Distilling complex physics problems into simpler 1D statistics is very often done.
  • +
  • I used to do bioinformatics, pretty much everything in biology is about patterns in strings of characters (DNA, proteins). Finding those patterns and using them is the way to go
  • +
  • Pattern recognition DOES NOT lead to new insight, it is new insight which allows for the recognition of a 'pattern', the latter being an allocation of possible bias.
  • +
+

What challenges do you face when trying to simplify complex concepts in your field, and how do you decide which details to focus on?

+
    +
  • Absence of a terminology / jargon to describe a new idea. :+1:
  • +
  • Similar to above, when teaching often students know what they want to achieve, but don't have the terminology to express it, so working through what they want is helpful, after teaching them some terminology.
  • +
  • Whatever is most useful to the learner first?
  • +
  • I work with researchers in different fields. I don't always fully understand their domain knowledge but I can take the basics or generalities and get code that works for them
  • +
  • A very practical problem is trying to resist going for a coffee in the midst of taking a shot at a complex concept, in the hope that the true details are to be found in the coffee.
  • +
  • not all information is easy to find or a lot of conflicting information or even sometimes information explosion
  • +
+

How do you determine the priority of tasks when designing algorithms for your academic projects, and what criteria do you use to ensure that the most critical tasks are addressed first?

+
    +
  • Working chronologically when going through a problem - start at the beginning.
  • +
  • What gives the more insight with the least effort can be a nice start
  • +
  • Talk to colleagues and Subject matter experts to understand various perspective to decide and prioritize.
  • +
  • Logic will get you from A to B. Imagination will take you everywhere. - Albert Einstein.
  • +
+

Has anyone found a nice online tool to draw?

+
    +
  • I love this tool suite https://excalideck.com/ +
      +
    • For drawing https://excalidraw.com/
    • +
    +
  • +
  • I have seen Miro ...
  • +
  • I think the Code Refineries use something for their graphics that looks a bit 'cartoony' - but I cannot remember what it is called! +
      +
    • Drawn on remarkable and then coloured and tidied up in Inkscape. :+1: +
        +
      • I am a big fan of remarkable. I think sharing option is fairly good. Unfortunately bit expensive tool.
      • +
      • true, for me it was worth it already for the pdf annotation for research papers, cannot read on computer screen
      • +
      +
    • +
    +
  • +
  • https://webwhiteboard.com/
  • +
  • https://www.youtube.com/watch?v=4-l8MY5kYGc
  • +
  • Figma and Kahoot are useful as well
  • +
+

Showing keyboard shortcuts on screen

+
    +
  • Screenkey: Screenkey for showing keyboard shortcuts +
      +
    • Is there a Windows version people can recommend? +
        +
      • I found this list of alternative for windows users like me: https://alternativeto.net/software/screenkey/ :+1:
      • +
      • I sometimes use the on-screen keyboard already provided by the OS :+1:
      • +
      +
    • +
    +
  • +
+

What’s the most interesting or useful thing you’ve learned from an online workshop (not specifically this one), and how have you applied it/planning to apply in your life or work

+
    +
  • Having breaks every hour or so
  • +
  • New approach to screensharing, using the 'portrait' approach
  • +
  • Manage breathing: reduce stress and use silence to let the audience grasp what you're saying
  • +
  • Well, the most interesting or useful thing I've learned from online workshops is how not to conduct a workshop, or at least some elements of the same, and I have applied this understanding by engaging in the global effort to discover more about how not to conduct a workshop, or at least some elements of the same, with the motto: That's one small step for a man, one giant leap for mankind..
  • +
+

How can you divide teaching into separate independent tasks?

+
    +
  • By content blocks, having roles like main and assistant...
  • +
  • Having responsibility for different sections of the course.
  • +
  • Wow, now that's what we call a question... bravo... indeed, how does one separate sleeping and snoring into separate independent tasks...
  • +
  • Course, exercises, resources, tools and forms.
  • +
  • Different people teach different topics
  • +
  • CodeRefinery answer: the big logical blocks are instructors, in-person and breakout room helpers, and Notes-questions answers.
  • +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/blog/workshop-plan/index.html b/blog/workshop-plan/index.html new file mode 100644 index 00000000..ec51460d --- /dev/null +++ b/blog/workshop-plan/index.html @@ -0,0 +1,1042 @@ + + + + Workshop format - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Workshop format + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+ +

Workshop format

+ +

+ Discussions on Workshop format and how it affects lesson development +

+ + February 27, 2024 + + - Sabry Razick + +

+ +
+ +

Possible workshop-formats [V 1.0]

+

During the CodeRefinery writing retreat in Tromsø, we tried to formulate the best workshop format +considering following factors.

+
    +
  1. Best way to reach the audience.
  2. +
  3. Best use of available resources to CR and foreseen challenges due to end of funding period.
  4. +
  5. Best value for host institutes, of CR staff and CR workshop participants
  6. +
+

We evaluated four possible formats.

+
    +
  1. In-person workshops
  2. +
  3. Small scale online workshop
  4. +
  5. Large scale online workshops
  6. +
  7. Large scale workshop with local in-person meetups
  8. +
+

Summary

+

In-person workshops

+

the host institution invites participants and covers the costs associated with the workshop, including travel expenses for speakers. CodeRefinery workshops can add value to the competence of employees, and the training can be included as part of grant proposals. In-person workshops require high-quality courses and may involve training the trainers. In-person workshops have a maximum attendance limit of around 40 participants and offer benefits such as better feedback, increased learner commitment, improved evaluation of productivity, and individualized help.

+

Small scale online workshop

+

Sustainability of the program relies on effective publicity and promotional activities. Small scale online workshops can be initiated by the host or organization and offer flexibility in terms of spreading content, providing continuous feedback, and offering individualized help.

+

Large scale online workshops

+

Large scale online workshops initiated by the CodeRefinery require more organizational work and face challenges in receiving continuous feedback, learner commitment, and individualized help.

+

Large scale workshop with local in-person meetups

+

Large scale workshops with local in-person meetups offer better individualized help and continuous feedback but require logistical coordination. The cost per learner can be estimated, and the physical space should accommodate breaks and exercise sessions for collaboration. Local in-person meetups have shown benefits, particularly on day 3, while the impact decreases in later days.

+

Details of the discussions

+
    +
  1. +

    In-person workshops

    +
      +
    • Invited by host
    • +
    • Costs reimbursed by host (Travel money etc.), maybe speaker paid by host +
        +
      • Host institution facilitate employee competence
      • +
      • Make it easy for people to add this to their grant proposals (give them template text)
      • +
      +
    • +
    • More obligations for CR (high-quality course) +
        +
      • We should train the trainers
      • +
      • We have co-teaching which gives added value
      • +
      +
    • +
    • More work delegation to host
    • +
    • Needs some limit of attendance eg. Max 40 per class +
        +
      • Usually not everyone show up -> Tweak the maximum so that it is manageable but no-shows bring some added comfort
      • +
      +
    • +
    • Benefits of in-person +
        +
      • Better continues feedback
      • +
      • Better commitment by learners
      • +
      • Better evaluation of productivity
      • +
      • Better individual help
      • +
      • Can do few days longer sessions
      • +
      +
    • +
    • Sustainability in a long run comes down to publicity +
        +
      • This model is very localised -> we need to have the networks up in various places +
          +
        • Current staff is localised in nordics
        • +
        +
      • +
      • Teasers of the workshop in conferences
      • +
      • Webpages should be rewritten to accomodate and advertise the new model
      • +
      • Other webinars and talks to advertise more
      • +
      +
    • +
    +
  2. +
  3. +

    Small scale online workshop

    +
      +
    • Initiated by host or CR +
        +
      • If initiated by a host as tailored workshop then should be possible to reimburse for the speaker
      • +
      +
    • +
    • Less costs +
        +
      • No travel funding required
      • +
      +
    • +
    • Benefits of small online +
        +
      • Can be spread across multiple days with shorter courses
      • +
      • Good continues feedback
      • +
      • Good commitment by learners +
          +
        • if active participation
        • +
        +
      • +
      • Good evaluation of productivity
      • +
      • Good individual help +
          +
        • more helpers with expertise in using windows os, linux, and mac os
        • +
        • in-person helpers are more difficult to arrange anyway
        • +
        +
      • +
      +
    • +
    • Max 40 participants +
        +
      • effective interactions with participents
      • +
      +
    • +
    +
  4. +
  5. +

    Large scale online workshops

    +
      +
    • Initiated by CR
    • +
    • More organizational work for CR
    • +
    • Low level of obligation (by learners)
    • +
    • Can accommodate 100s of participants
    • +
    • Inadequate continues feedback
    • +
    • Hard to judge learner commitment
    • +
    • Harder to evaluate productivity
    • +
    • Harder and not scalable to provide individual help
    • +
    • All questions are documented and answers reusable
    • +
    • More prone to technical issues
    • +
    • Technical problems of learners become more visible as events get larger
    • +
    • Can be spread across multiple days with shorter courses
    • +
    • It became harder to motivate persons to join as instructors
    • +
    • Communicating pre-requisites becomes harder, pre-requisites less likely followed
    • +
    • More questions get asked and more answers get seen
    • +
    +
  6. +
  7. +

    Large scale workshop with local in-person meetups

    +
      +
    • Better Individual help
    • +
    • Better continuous feed back issues +
        +
      • Continous quizzes after each exercise to gauge in real-time how the students understand the material. (must be anonymous)
      • +
      +
    • +
    • More than one host needs to handle logistics
    • +
    • Disparate learner competence groups
    • +
    • Better commitment by hosts
    • +
    • Better commitment by learners
    • +
    • Possible distraction due to technical issues
    • +
    • Better to confine to few longer days
    • +
    • What has the highest cost, physical courses or online courses? Can we estimate cost per learner in different scenaria?
    • +
    • The room requires breaks and exercise session so that they have enough room/time to work together.
    • +
    • Based on personal experience, day 3 benefited from local in-person meetups, the remaining days (especially week 2) barely did.
    • +
    +
  8. +
+ + +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/calendars/index.html b/calendars/index.html new file mode 100644 index 00000000..6926fd87 --- /dev/null +++ b/calendars/index.html @@ -0,0 +1,887 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + + +
+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 00000000..a2df0fb6 Binary files /dev/null and b/img/favicon.ico differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..16cfdf6a --- /dev/null +++ b/index.html @@ -0,0 +1,1337 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +
+
+
+ + + NeIC logo + +
+
+ + CodeRefinery logo + +
+
+
+ +

We train you in research software development

+

Are you an academic researcher using computing/data, and your work is +held back by struggling with the programming or data management? Or +your research isn't reproducible or open enough? CodeRefinery +understands and has free online courses and materials for you.

+

We teach all the essential tools which are usually skipped in academic +education so everyone can make full use of software, computing, and +data with focus on reusability, reproducibility, and openness. +We don't just give courses, but we are a training network that you +can join to share the effort and bring better courses to your +community.

+

Our standard workshop is well known in Nordic +academic circles and our engaging online teaching +style is considered best-in-class even +compared to in-person teaching. CodeRefinery is publicly funded and +operates as a community project.

+ +
+
+ + +
+

News

+

Upcoming workshops and other news

+
    +
  • Don't worry there will be more workshops in 2025 and you can plan them with us!
  • +
  • We have a short slideset about CodeRefinery which you can reuse in own presentations.
  • +
  • CodeRefinery stickers, patches and more: Goodies
  • +
  • Get weekly or monthly updates: Newsletter
  • +
+

Recent workshops

+ + +
+ +
+

Become part of the team

+ +

+ Come and join our team. Let us create something amazing together! +

+ +
+ Tasks/roadmap + Join as individual + As staff + As organization +
+ +
+ +
+
+

Feedback and testimonials

+ +
+
    + + +

    I've been on many courses, I organize some bioinformatics courses myself, +but it was certainly one of the best if not the best course I've attended. +Thank you for your time and engagement :) +

    + +

    I'm more conscious about the way I write programs and organize their 'organic' +growth. I try to modularize more and write proper tests. I also use git more +extensive to keep track about my different development branches +

    + +

    The main thing I got out of the workshop is that I'm now extensively using the +issue-tracking systems on GitHub and GitLab. Also on one of my major projects +we have moved towards having shorter lived feature branches and using merge +requests for more frequent merges and less code divergence. I also started +using GitLab's issues system more frequently. It made it easier for people in +my lab to report bugs, and easier for me to keep track of them +

    + +

    My code became much more 'sustainable' in the sense for others to +read/use/modify it. In detail the most significant is improved use of git +(forking workflow) and more strict 'purity' of functions. Use of PyCharm +increased speed of development +

    + +

    I take more time to think about long term solutions than 'quick fixes' even if +it's short of time. Another aspect is that I try to make the code reproducible +in the sense of documentation, code readability, clear log files, etc, both for +helping myself and my collaborators +

    + +

    My code is better documented, and I use version control much more. I have also +started writing more unit tests +

    + +

    I write my codes now in such a way that the person who will be taking over my +job would have less time figuring out what is going on. The emphasis of writing +modular codes in the workshop was very helpful for me and for the people using +my code +

    + +

    For me the most important thing was to learn to use git better. Now I make +frequent commented commits so it is far easier to see what I actually did for +me and others too +

    + +

    This was an extremely useful workshop. Thank you very much! I wish I had known +this stuff already as a grad student 10+ years ago. It is now easier to +collaborate with co-developers and easier to keep things in order and +structured +

    + +

    Constantly making sure my code is as accessible as possible to ensure future me +and others can understand and use it, i.e. writing explanatory comments +everywhere no matter how simple the code may be. +

    + +

    Increased confidence. Sense of community (extremely valuable during the +pandemic times). The value of volunteering. +

    + +

    I'm significantly more confident in navigating and creating versions and +branches in git and on GitHub. +

    + +

    It was a great experience, it just did sum up all the necessary tools and step +to build more sustainable code. That saved me A LOT of time trying to figuring +out everything by myself!! :) +

    + +

    I am an experienced developer and instructor and attended the workshop mainly +to help out. It did not change much for me in terms of the course content. +However, the course was am absolutely great experience for me in terms of +seeing how to conduct a massive online course with live participation. The +HackMD "backchannel" and breakout rooms with helpers are features I now +incorporate in teaching at my own university. +

    + +

    Think much more before starting a coding project and overall better structure: +coding with a structure in mind (making modules, simplifying), using a +structured approach to coding (knowing which tools, which steps, doing reviews, +etc.), etc. +

    + +

    I have a much broader understanding of these tools and why they are important. +I regularly use the tutorials and movies to help teach new incoming students in +between CodeRefinery workshops. +

    + +

    The project team has a common understanding of why and how to track code +versions and collaborate on processing scripts +

    + +

    More focus on that results and papers should be reproducible, ideally even for +referees. +

    + +
+
+ +

+ More feedback and testimonials can be found in + this GitHub repository. +

+ +
+
+ +
+
+

Latest blog posts

+ + + + +

+ All our blog posts are summarized in the + blog post overview page. +

+ +
+ +
+

Mastodon

+ +

+ We are at @coderefinery@fosstodon.org + (joining hints). + On Twitter, we are @coderefine (without the -ry). +

+ + + +
+
+ +
+
+
+ + + picture of a classroom + +

Training opportunities

+

+ We offer training opportunities to researchers from Nordic + research groups (but we aim to expand beyond Nordics) to learn + basic-to-advanced research computing skills and become confident + in using state-of-the-art tools and practices from modern + collaborative software engineering. +

+ More ›

+
+
+ +
+
+ + + wordcloud + +

Lesson materials

+

+ We develop and maintain training material on software best + practices for researchers that already write code. Our material + addresses all academic disciplines and tries to be as programming + language-independent as possible. +

+ More ›

+
+
+ +
+
+ + + terminal screen output + +

Code Repository Hosting

+

+ Our code repository hosting service is open and free for all + researchers based in Nordic universities and research institutes + and their collaborators. +

+ More ›

+
+
+ +
+
+ + ResearchSoftwareHour logo + +

Research Software Hour

+

+ Online stream/show about scientific computing and research + software. It is designed to provide the skills typically picked up + via informal networks: we explore and discuss tools and how we + program and compute. +

+ More ›

+
+
+
+ + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/index/description/index.html b/index/description/index.html new file mode 100644 index 00000000..0b984876 --- /dev/null +++ b/index/description/index.html @@ -0,0 +1,891 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + +

We train you in research software development

+

Are you an academic researcher using computing/data, and your work is +held back by struggling with the programming or data management? Or +your research isn't reproducible or open enough? CodeRefinery +understands and has free online courses and materials for you.

+

We teach all the essential tools which are usually skipped in academic +education so everyone can make full use of software, computing, and +data with focus on reusability, reproducibility, and openness. +We don't just give courses, but we are a training network that you +can join to share the effort and bring better courses to your +community.

+

Our standard workshop is well known in Nordic +academic circles and our engaging online teaching +style is considered best-in-class even +compared to in-person teaching. CodeRefinery is publicly funded and +operates as a community project.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/index/index.html b/index/index.html new file mode 100644 index 00000000..d7fbc4d9 --- /dev/null +++ b/index/index.html @@ -0,0 +1,873 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/index/news/index.html b/index/news/index.html new file mode 100644 index 00000000..97505425 --- /dev/null +++ b/index/news/index.html @@ -0,0 +1,898 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + +

News

+

Upcoming workshops and other news

+ +

Recent workshops

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/chat/index.html b/join/chat/index.html new file mode 100644 index 00000000..a4f0a94e --- /dev/null +++ b/join/chat/index.html @@ -0,0 +1,892 @@ + + + + Chat with us - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Chat with us + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Chat with us

+ + + +

We use Zulip to discuss within our team and community.

+

You don't need an invite to join our Zulip +chat - simply sign up and join.

+

This is the place where we discuss lesson development, plan events, share +lessons learned and new tools and tricks, and where we ask and answer questions +about computing and programming. No question is too simple. Drop by and ask and +talk with us! You can listen in, follow certain threads, participate, and +influence. Learn how CodeRefinery uses +it.

+

We are supported by Zulip

+Zulip logo +

Zulip is an open-source modern team chat app designed to keep both live and +asynchronous conversations organized. We very much appreciate their support by +hosting our chat for free.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/community-teaching-training/index.html b/join/community-teaching-training/index.html new file mode 100644 index 00000000..9f0ab13b --- /dev/null +++ b/join/community-teaching-training/index.html @@ -0,0 +1,915 @@ + + + + Community teaching training - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Community teaching training + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Community teaching training

+ + + +

Want to learn about the CodeRefinery teaching +style? Want to be able to run your own +workshop as a livestream and invite others to attend. Want to join +forces to make teaching more open, accessible, and available? Attend +our community teaching training.

+

Our community teaching training recognizes that in the connected +era, teaching doesn't have to be a solitary or small team affair. +CodeRefinery's workshops are done as a broad team with many diverse +roles, and this allows us to reach a huge number of people.

+ +

Courses are offered as we need to (contact us if you want one), +usually around once a year - but really, right now we onboard most +people to our style by working together.

+

"Community teaching training" is much more broad and doesn't duplicate +the Carpentries instructor +training - attending both +is useful.

+

See also

+

The material can be found at https://coderefinery.github.io/train-the-trainer/.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/index.html b/join/index.html new file mode 100644 index 00000000..c0495f58 --- /dev/null +++ b/join/index.html @@ -0,0 +1,947 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Why and how to join

+ + +
+ +
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/individuals/index.html b/join/individuals/index.html new file mode 100644 index 00000000..8b00be81 --- /dev/null +++ b/join/individuals/index.html @@ -0,0 +1,956 @@ + + + + For individuals - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - For individuals + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

For individuals

+ + + +

As individuals, there are plenty of ways to join CodeRefinery, regardless of +what you do now. Also see what professional staff +supporting a local community and organizations can +do.

+

For any of these, you can get started by joining a +meeting and say hi, or join our +chat and introduce yourself in +the "#new members" stream. We also have collected all important links and info on +our onboarding page. +If things are not clear, please let us know in the Zulip chat so that we can improve.

+
+
+

As a learner

+

Anyone may attend our workshops, and this is a great way to get +started. Our courses are free to the whole world and designed for +individual learners, too.

+

As a team leader

+

Even during your first workshop, you could help others attend. Get +your friends together and watch the course. We have "exercise breaks" +where you can work together, locally. You don't need to know +everything, only be able to keep the flow and read error messages a +bit better than others. We have some basic on-boarding +training for +you!

+

Maybe you want to bring all the rest of your research group as your team?

+

As a co-instructor or expert helper

+

We don't teach alone, and thus it's remarkably easy to get started as an +instructor! In fact, we almost recommend it as a starting point, since it's +good to have a co-instructor who understands the difficulty of doing and +learning the topics. Joining as co-instructor means that you will be in touch +with other instructors. It is great learning and a necessary step to call +yourself "CodeRefinery instructor".

+

If teaching isn't for you, you can help by supporting learners and team leaders +during a workshop. If you like reading about how we work, see the roles +overview for all the +varying responsibilities in a workshop (surely there is something for you +there).

+
+
+

CodeRefinery ambassador

+

Do you like what we do and would like to help spread the word to your community?

+
    +
  • Become an ambassador!
  • +
+

We will provide materials for you to include in your talks, posters and trainings at events (you may anyway be attending). +You can also get CodeRefinery goodies to distribute at events.

+

We can also support you to start your own local community of CodeRefinery enthusiasts or other activities.

+

What we can offer:

+
    +
  • A chance to influence the future of the project
  • +
  • Visibility in social media and on our webpage
  • +
  • Weekly community news
  • +
  • Support for organizing local events or other activities
  • +
+

Note that to be an ambassador, you do not have to be active as a CodeRefinery instructor, helper or even community member.

+

Let us know if you want to be an ambassador by +signing up for our ambassador e-mail list +and/or if you have any questions you can contact us in our chat (#coderefinery > CodeRefinery ambassador program).

+

Lesson contributions

+

We would love to see more contributions to our lessons. We are a normal open +source project on GitHub, and you can contribute via issues, pull requests, or +by discussing in our chat. You are +welcome to reuse our lessons as well.

+

A good starting point is to either open a topic on our +chat or to open an issue on one of the +lesson repositories in our GitHub +organization where you can describe what you +would like to change to collect feedback and possibly also contributors.

+

No contribution is too small and ideas for changes are very often very good +ideas and we would love to work with you on making our lessons better and more +modular and even more relevant.

+

Help out the CodeRefinery project itself

+

As an open project, there are always things to do to keep us running! We're +especially interested in people who know how to grow a community, do better +communications, or manage many events better than we do now. On this +page we list the many tasks where you can join and contribute.

+
+
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/meetings/index.html b/join/meetings/index.html new file mode 100644 index 00000000..b2dad527 --- /dev/null +++ b/join/meetings/index.html @@ -0,0 +1,909 @@ + + + + CodeRefinery meetings - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery meetings + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

CodeRefinery meetings

+ + + +

Team & community meetings: Every Monday at 14 CET/CEST

+ +

We welcome everyone interested in CodeRefinery to join our weekly meetings. +This is the place to drop by if you have questions or would like to get +involved but don't know where to start.

+

Our weekly meetings are topical (but you can also ask questions about other topics):

+

The next large CodeRefinery workshop is coming up in September, so we dedicate our meetings to the preparation and planning of it. +If you have any questions or suggestions about the workshop or want to teach with us, please join for any of the upcoming sessions:

+ +

Open house events

+

We invite everyone interested in CodeRefinery and CodeRefinery adjacent topics to join us for ~monthly open house events. +These half-day sessions are intended for discussion and co-working. Topics will be announced here:

+ +

Archive of earlier meetings

+

Please see https://github.com/coderefinery/meeting-minutes where we keep +an archive of meeting minutes and agendas.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/organizations/index.html b/join/organizations/index.html new file mode 100644 index 00000000..e5ff5c81 --- /dev/null +++ b/join/organizations/index.html @@ -0,0 +1,923 @@ + + + + For organizations - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - For organizations + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

For organizations

+ + + +

CodeRefinery is a collaboration between different organizations (most +are universities or research computing infrastructure providers), and +your organization can join!

+
+
+

Provide CodeRefinery workshops to your community

+

Joining as an organization isn't that different than what is +described on the staff page, but you can do so even +more systematically and take part in decision-making about what +workshops we offer and when.

+

Do your own teaching better

+

Do you need to teach and reach a broader audience? Do you put on your own +workshops? Join CodeRefinery, learn our teaching +strategies, and let's +improve our events together. Plenty of technical staff (who aren't primarily +teachers) need to teach as part of their jobs, and this is the kind of +community that CodeRefinery provides.

+

Open up your workshops to the CodeRefinery community

+

You might offer some of your own workshops to be live-streamed to a +wide audience, and we can help you to develop the workshop and do the +streaming - including finding many expert co-instructors to help with +the writing and teaching. This exchange of teaching also leads to +lots of other technical skill exchange, which is excellent for your +staff skills as well.

+
+
+

Joining CodeRefinery as a partner/sponsor

+

In the future, there will be some way to officially join CodeRefinery +as a sponsor, but that will come when it's time. For now, if +you express interest, you can join almost immediately and help figure +out the way we will work later. Currently, you could consider +yourself a partner if (criteria are subject to change):

+
    +
  • You have at least one staff member who has a significant interest in +teaching intermediate-level practical skills in scientific computing.
  • +
  • You have some staff who follows and is interested in contributing to +CodeRefinery meetings + activities.
  • +
  • You help out with CodeRefinery workshops in +proportion to your resources, possibly offering some of yours to a +wider audience.
  • +
  • You open a pull request adding yourself to the partners +page.
  • +
+
+
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/staff/index.html b/join/staff/index.html new file mode 100644 index 00000000..b2f28dc9 --- /dev/null +++ b/join/staff/index.html @@ -0,0 +1,913 @@ + + + + For staff - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - For staff + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

For staff

+ + + +

If you support computational research, lead a team to join our +courses! Don't forget you can do everything on the for +individuals page as part of your job, and +your whole organization could join.

+
+
+

Run your own breakout rooms and/or provide local support

+

The idea is simple: you form a team to attend a workshop. You watch +the main stream however you want (in a meeting room or online), and we +have "exercise breaks" where your team works locally under your +guidance. The teaching is "free" and you can focus on local, +impactful support and mentoring.

+

Our workshops are designed with this in mind, and it's one attendance +option at our own universities. We try to provide clear guides (as +best we can), and are happy to have you join our channels to +coordinate. You don't have to be an expert, you can learn at the same +time. Read more about local +advertisement and breakout +rooms.

+

For any of these, you can get started by join a meeting +and say hi, or join our chat +and introduce yourself in the "#greetings" or specific workshop stream.

+
+
+ +

Letting your local audience know about our events is a simple way to +provide a high-impact training opportunity to your community (no +effort needed on your part). Many of our workshops are online and +live-streamed, so anyone can attend.

+

Request in-person workshops

+

This is currently somewhat on hiatus, since our online workshops work +so well, but you could request your +own workshop.

+
+
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/join/zulip-icon-circle.svg b/join/zulip-icon-circle.svg new file mode 100644 index 00000000..72466de7 --- /dev/null +++ b/join/zulip-icon-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lessons/contributing/index.html b/lessons/contributing/index.html new file mode 100644 index 00000000..cce05baa --- /dev/null +++ b/lessons/contributing/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/lessons/core/index.html b/lessons/core/index.html new file mode 100644 index 00000000..c40e3a62 --- /dev/null +++ b/lessons/core/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/lessons/from-coderefinery/index.html b/lessons/from-coderefinery/index.html new file mode 100644 index 00000000..c40e3a62 --- /dev/null +++ b/lessons/from-coderefinery/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/lessons/index.html b/lessons/index.html new file mode 100644 index 00000000..514c8416 --- /dev/null +++ b/lessons/index.html @@ -0,0 +1,1081 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

CodeRefinery lessons

+ + + + + + + + +

Lessons that we teach in our tools workshops

+

These are the lessons which are included in the "standard" CodeRefinery +workshop, and what we believe that every computational scientist (even those +with very small amounts of computation) should know.

+ +

Shorter formats

+ +

Video recordings

+

A number of video recordings of CodeRefinery lessons and workshops and +Research Software Hour sessions can be +found on our YouTube +channel.

+

Installation guides

+ +

Instructor training and manuals

+ +

Special topics

+ +

Reusing/teaching our lessons?

+

Here you can read how you can reuse our lessons and +also see a list of derivative works based on our material.

+

Other lessons we recommend

+

Here we list lessons by our partners and other lessons we +recommend or have contributed to.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/lessons/other/index.html b/lessons/other/index.html new file mode 100644 index 00000000..8ba723d4 --- /dev/null +++ b/lessons/other/index.html @@ -0,0 +1,996 @@ + + + + Other lessons we recommend - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Other lessons we recommend + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Other lessons we recommend

+ + + +

Other lessons by our partners

+

You can expect these to be open-source, reusable, in a git repository, and with +a community you can join and give contributions to:

+ +

Lessons we contributed to as instructors or helpers

+ +

Other lessons we recommend

+ +

Interesting organisations and projects to follow

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/lessons/reusing/index.html b/lessons/reusing/index.html new file mode 100644 index 00000000..aca3a0e9 --- /dev/null +++ b/lessons/reusing/index.html @@ -0,0 +1,919 @@ + + + + Reusing/teaching our lessons - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Reusing/teaching our lessons + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Reusing/teaching our lessons

+ + + +

All of our material is open source and reuse is encouraged. In +general, we only recommend similarly open-source, reusable lessons. +Check the license from each repository in case of questions (most +CodeRefinery-developed lessons use CC BY +4.0).

+

Teaching these lessons independently is encouraged, just make sure the +distinction between the "CodeRefinery" project and your workshop is +clear. For example, give your own name to the workshop but say +"(CodeRefinery lessons)".

+

Our lessons are designed to be generic, (mostly) stand-alone, and +re-used in place without forking so that anyone can use them and +they can fit into different types of programs. We welcome +contributions which make the lessons more reusable - send changes +using standard open-source practices (you know, what we teach in +CodeRefinery and all).

+

Please let us know if the material is helpful - it is important for us to +know whether this material has impact outside of our workshops. Some +courses/workshops we know of are listed below but we would like to list more.

+

Derivative work based on our material

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/blog-posts/index.html b/open-house/blog-posts/index.html new file mode 100644 index 00000000..be66a24d --- /dev/null +++ b/open-house/blog-posts/index.html @@ -0,0 +1,907 @@ + + + + Work on blog posts - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Work on blog posts + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + April 24, 2020 + +
+ + coderefinery open house logo + +
+

CodeRefinery is organizing a one day online "open house" dedicated to +collaboratively writing up blog posts which have been in +the pipeline for some time and which will be published in the next +CodeRefinery newsletter.

+

Tentative list of articles:

+
    +
  • Online lessons, what we're working on, how we'll be delivering online workshops
  • +
  • Merge vs rebase
  • +
  • Nordic-RSE conference
  • +
  • NordicHPC tools
  • +
+

Anyone who would like to contribute to these articles or suggests new +topics is welcome to join!

+

We will collect notes in a shared +document. +Please note that this document will be archived in our Open House +event repository.

+

We first meet online at 9:00 am (UTC+1) via video (connection link +will be shared in our shared +document and then work on +the instructor training material. During the day, we will coordinate +the work through our Zulip chat +with possibilities to further discuss via video if necessary.

+

We conclude the day around 4:00 pm (UTC+1) by writing a short +/summary in our shared +document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/coderefinery_openhouse.jpg b/open-house/coderefinery_openhouse.jpg new file mode 100644 index 00000000..ad5d89de Binary files /dev/null and b/open-house/coderefinery_openhouse.jpg differ diff --git a/open-house/coderefinery_openhouse.png b/open-house/coderefinery_openhouse.png new file mode 100644 index 00000000..9c830b2e Binary files /dev/null and b/open-house/coderefinery_openhouse.png differ diff --git a/open-house/credit/index.html b/open-house/credit/index.html new file mode 100644 index 00000000..d3d00d24 --- /dev/null +++ b/open-house/credit/index.html @@ -0,0 +1,895 @@ + + + + Making lessons citable and giving credits for contributors - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Making lessons citable and giving credits for contributors + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + October 02, 2020 + +
+ + coderefinery open house logo + +
+

CodeRefinery is organizing a half day online "open house" dedicated to +collaboratively working on making CodeRefinery lessons citable as well as giving credits for contributors! +Here, contributors are not only those who developed lesson materials, but also lesson mainteners.

+

Anyone interested is welcome to contribute to discussion on how to realize these in practice!

+

We will collect notes in a shared +document. +Please note that this document will be archived in our Open House +event repository.

+

We first meet online at 9:00 am (CEST) / 10:00 am (EEST) via video (connection link +will be shared in our shared document. +If we decide on working individually during the day, we will coordinate +the work through our Zulip chat +with possibilities to further discuss via video if necessary.

+

We conclude the day around 12:00 pm (UTC+1).

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/index.html b/open-house/index.html new file mode 100644 index 00000000..d7fbc4d9 --- /dev/null +++ b/open-house/index.html @@ -0,0 +1,873 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/instructor-training-material/index.html b/open-house/instructor-training-material/index.html new file mode 100644 index 00000000..2cd1efa1 --- /dev/null +++ b/open-house/instructor-training-material/index.html @@ -0,0 +1,908 @@ + + + + Work on instructor training material - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Work on instructor training material + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + March 24, 2020 + +
+ + coderefinery open house logo + +
+

CodeRefinery is organizing a one day online "open house" dedicated to +work together on revising and +improving our instructor training +material. +Issues are filed +here, +notes from the first workshop can be in the shared +document, and we +are taking what each of us wants to work on. Input for the further +improvement are also very welcome.

+

Anyone who would like to contribute to the instructor training +material, or learn how to contribute to any CodeRefinery lesson in +general, is welcome!

+

We will collect nodes in a shared +document. +Please note that this document will be archived in our Open House +event repository.

+

We first meet online at 9:00 am (UTC+1) via video (connection link +will be shared in our shared +document and +then work on the instructor training material. During the day, we will +coordinate the work through our Zulip +chat with possibilities to +further discuss via video if necessary.

+

We conclude the day around 4:00 pm (UTC+1) by writing a short +blog/summary in our shared +document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/newsletter/index.html b/open-house/newsletter/index.html new file mode 100644 index 00000000..fea061e3 --- /dev/null +++ b/open-house/newsletter/index.html @@ -0,0 +1,908 @@ + + + + Writing newsletter articles and blog posts - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Writing newsletter articles and blog posts + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + August 24, 2020 + +
+ + coderefinery open house logo + +
+

CodeRefinery is organizing a one day online "open house" dedicated to +collaboratively writing up blog posts which have been in +the pipeline for some time and which will be published in the next +CodeRefinery newsletter.

+

Tentative list of articles:

+
    +
  • Future mega-CR
  • +
  • Update on citable lessons and credit/visibility for instructor and helpers
  • +
  • Update on sustainability efforts?
  • +
  • Manuals : how they can be used for your lessons
  • +
  • git-pr
  • +
+

Anyone who would like to contribute to these articles or suggests new +topics is welcome to join!

+

We will collect notes in a shared +document. +Please note that this document will be archived in our Open House +event repository.

+

We first meet online at 9:00 am (CEST) / 10:00 am (EEST) via video (connection link +will be shared in our shared +document and then work on +the instructor training material. During the day, we will coordinate +the work through our Zulip chat +with possibilities to further discuss via video if necessary.

+

We conclude the day around 4:00 pm (UTC+1) by writing a short +/summary in our shared +document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/online-teaching/index.html b/open-house/online-teaching/index.html new file mode 100644 index 00000000..0a393170 --- /dev/null +++ b/open-house/online-teaching/index.html @@ -0,0 +1,888 @@ + + + + Preparing for online teaching - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Preparing for online teaching + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + March 20, 2020 + +
+ + coderefinery open house logo + +
+

We will meet on video (9:00 am, UTC+1) +and chat and discuss techniques, +solutions, and tricks for online teaching and collect our notes in a shared +document.

+

Anyone who would like to contribute or learn is most welcome!

+

We will conclude the day around 4:00 pm (UTC+1) by writing a short blog/summary +in our shared document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/training-material/index.html b/open-house/training-material/index.html new file mode 100644 index 00000000..8ad9f308 --- /dev/null +++ b/open-house/training-material/index.html @@ -0,0 +1,897 @@ + + + + Collaborative work on the training material - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Collaborative work on the training material + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + December 13, 2019 + +
+ + coderefinery open house logo + +
+

Welcome to the first CodeRefinery Open House!

+

The idea behind this event is to bring together people who are interesting in +contributing to the CodeRefinery training +material.

+

Anyone who would like to contribute, learn how to contribute to the +CodeRefinery training material is very welcome to join.

+

We will collect nodes in a shared document. +Please note that this document will be archived in our +Open House event repository.

+

We first meet online at 9:00 am (UTC+1) via video (connection link will be +shared in our shared document) and +then work on CodeRefinery training material. During the day, we will coordinate +the work through our Zulip chat with +possibilities to further discuss via video if necessary.

+

We conclude the day around 4:00pm (UTC+1) by writing a short blog/summary in +our shared document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/open-house/website/index.html b/open-house/website/index.html new file mode 100644 index 00000000..2efb60f1 --- /dev/null +++ b/open-house/website/index.html @@ -0,0 +1,901 @@ + + + + Collaborative work on the website - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Collaborative work on the website + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + February 11, 2020 + +
+ + coderefinery open house logo + +
+

Welcome to the second CodeRefinery Open House!

+

Following up on our successful first CodeRefinery Open House, we will have our +second online Open house!

+

The idea behind this event is to work together on revising and improving +coderefinery.org. Issues are +filed and we are +taking what each of us wants to work on. Input for the further improvement are +very welcome!

+

Anyone who would like to contribute, or learn how to contribute to +coderefinery.org is very welcome to join.

+

We will collect nodes in a shared document. +Please note that this document will be archived in our +Open House event repository.

+

We first meet online at 9:00 am (UTC+1) via video (connection link will be +shared in our shared document) and +then work on CodeRefinery training material. During the day, we will coordinate +the work through our Zulip chat with +possibilities to further discuss via video if necessary.

+

We conclude the day around 4:00pm (UTC+1) by writing a short blog/summary in +our shared document.

+ +
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/organization/contact/index.html b/organization/contact/index.html new file mode 100644 index 00000000..1a41594a --- /dev/null +++ b/organization/contact/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/organization/contributors/index.html b/organization/contributors/index.html new file mode 100644 index 00000000..78a6e9f8 --- /dev/null +++ b/organization/contributors/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/organization/get-involved/index.html b/organization/get-involved/index.html new file mode 100644 index 00000000..cce05baa --- /dev/null +++ b/organization/get-involved/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/organization/how-to-help/index.html b/organization/how-to-help/index.html new file mode 100644 index 00000000..cce05baa --- /dev/null +++ b/organization/how-to-help/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/organization/meetings/index.html b/organization/meetings/index.html new file mode 100644 index 00000000..c0a6afe8 --- /dev/null +++ b/organization/meetings/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/organization/partners/index.html b/organization/partners/index.html new file mode 100644 index 00000000..8f13fea7 --- /dev/null +++ b/organization/partners/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/privacy-policy/index.html b/privacy-policy/index.html new file mode 100644 index 00000000..b787b5ce --- /dev/null +++ b/privacy-policy/index.html @@ -0,0 +1,1063 @@ + + + + CodeRefinery privacy policy - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - CodeRefinery privacy policy + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

CodeRefinery privacy policy

+ + + +

Update, 13th March 2023

+

We may use anonymous web analytics on our webpages and lessons. This +is not identifiable, does not have client-side identifiers, and can't +re-identify people between visits (or even for single visits) any more +than normal web browsing can. Because this is (by design) not +identifiable, this should not need to be mentioned here, but we are +for completeness. (The technical implementation is +plausible.io, self-hosted by a CodeRefinery +partner).

+

Update, 12th October 2021

+

In short:

+ +

On the 1st October 2021, it was announced that CodeRefinery will receive +partial financial support by NeIC for the next 3 years (CodeRefinery +Sustainability Phase, CodeRefinery SP, see +https://neic.no/news/2021/10/01/2021-open-call-results/). The next phase of +the CodeRefinery project is mainly consisting of in-kind contributions by +diverse partner organizations. In this new phase, we need to renew our privacy +policy, but we need some time before the new privacy policy is set.

+

We will continue using our online community spaces and the current +owners/administrators will remain until new roles are set in the CodeRefinery +SP.

+

Previously we have written that "Stored names and email addresses of users +will be removed with the end of this project (2021-10-31)". However, we need +to keep participation data from 2020 and 2021 workshops at least until the end +of 2022 since we often get asked for participation certificates long after the +workshop is concluded. Therefore, we will keep information of the +participants who are qualified to certificates (either as learner, helper, +expert helper, or team lead) in the currently used platform, Indico, +managed by NeIC. The currently participating staff who is also committed to be +a part of the CodeRefinery SP have access to the information.

+

We continue using the newsletter in the new phase but +we may switch to other services but in this case we would notify all +subscribers about deletion of their contact information and invite them to +re-register to the new services that we may migrate to. If a user wants to +unsubscribe before that, they are welcome to do so anytime.

+
+

This Privacy Policy covers person identifiable information that may be +provided to CodeRefinery. Your data only comes from what you decide to provide +to us by understanding privacy policy of the platforms we are using for +different purposes as shown below. Changes to this Privacy Policy will be +posted on this page. Any changes will only apply to information collected +after the posted date of any such change. Additionally, information may be +provided to governmental bodies and other entities as required by law.

+

Definitions

+ +

What information do we obtain and why?

+

We obtain user data including person identifiable information in the following manner for each purpose:

+ +

Information you provide in our Online community spaces are visible and +accessible according to each service's privacy policy. Please note that your +information may be visible to other users in the Online community spaces than +CodeRefinery team members. We use your information within each Online +community space for communication purpose in a reasonable and respectful +manner. We will not use your person identifiable information provided in our +Online community spaces for other purposes than communication with you and +within the community. When we archive a note taken in +HackMD during a workshop, we will delete all the +person identifiable information of users.

+

We obtain the following data anonymously and voluntarily from users.

+ +

We use anonymous web analytics on some of our websites and lesson +pages. These are done without client-side IDs or storing identifiable +information on either the client or server side.

+

Who has access to the personally identifiable information?

+ +

Where we store the data

+ +

How long we store the data

+ +

Anonymity and right to be forgotten

+ +

Questions/concerns?

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/processed_images/classroom.79bbc72a78aecc7b.png b/processed_images/classroom.79bbc72a78aecc7b.png new file mode 100644 index 00000000..0169a679 Binary files /dev/null and b/processed_images/classroom.79bbc72a78aecc7b.png differ diff --git a/processed_images/coderefinery.9da32dbc0a0d3d31.png b/processed_images/coderefinery.9da32dbc0a0d3d31.png new file mode 100644 index 00000000..dc53f308 Binary files /dev/null and b/processed_images/coderefinery.9da32dbc0a0d3d31.png differ diff --git a/processed_images/coderefinery_openhouse.6a2b083d3437b72f.png b/processed_images/coderefinery_openhouse.6a2b083d3437b72f.png new file mode 100644 index 00000000..207c0991 Binary files /dev/null and b/processed_images/coderefinery_openhouse.6a2b083d3437b72f.png differ diff --git a/processed_images/neic.4f9dbfc902d4e8e3.png b/processed_images/neic.4f9dbfc902d4e8e3.png new file mode 100644 index 00000000..87cb321a Binary files /dev/null and b/processed_images/neic.4f9dbfc902d4e8e3.png differ diff --git a/processed_images/terminal.77eae35442d20777.png b/processed_images/terminal.77eae35442d20777.png new file mode 100644 index 00000000..a3f40c02 Binary files /dev/null and b/processed_images/terminal.77eae35442d20777.png differ diff --git a/processed_images/wordcloud.d92bee814d2c09a7.png b/processed_images/wordcloud.d92bee814d2c09a7.png new file mode 100644 index 00000000..3b3b1622 Binary files /dev/null and b/processed_images/wordcloud.d92bee814d2c09a7.png differ diff --git a/registration/index.html b/registration/index.html new file mode 100644 index 00000000..6ce6e788 --- /dev/null +++ b/registration/index.html @@ -0,0 +1,900 @@ + + + + Registration procedure - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Registration procedure + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Registration procedure

+ + + +

Confirmation email

+

After filling out the registration form you will receive an automatic +confirmation email but please note that your registration is only tentative +until we confirm it with another (human-written) email which should happen +typically within a week.

+

Waiting list

+

We maintain a waiting list for seats but this is currently not automatic so we +need this short time buffer to manually confirm participants and inform those who +are on the waiting list.

+

First come, first serve

+

The seats are assigned on a first come first serve basis but we need to also +make sure that registered participants are affiliated with a Nordic academic +institution since the course is free for participants and financed by the +Nordic e-Infrastructure Collaboration (unless this is an event outside of Nordics +funded by a different organization).

+

Cancellation

+

We ask confirmed participants who are not able to participate at the course +they have signed up for, to inform us as soon as possible so that people on the +waiting list can take the vacant seat.

+

Questions?

+

If you have any questions about your registration status, please write to +support@coderefinery.org.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/repository/index.html b/repository/index.html new file mode 100644 index 00000000..ae76c04b --- /dev/null +++ b/repository/index.html @@ -0,0 +1,977 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + +
+

Code repository hosting for Nordic research software

+
    +
  • Over 288 active users, 226 groups, with over 390 active projects.
  • +
  • The service is hosted at https://source.coderefinery.org.
  • +
  • The is currently run from and the data is stored on servers at the +Danish e-Infrastructure Consortium (DeiC). DeiC is part of the Nordic +e-Infrastructure collaboration funding this project.
  • +
  • To inform us about issues, please contact support@coderefinery.org.
  • +
  • We announce service breaks through messages displayed once you log into the +platform but we try to announce them well in advance and to keep them very +short.
  • +
  • This service is for collaborating on code and scripts. It is not designed to be +a data sharing or data archive service. There are other services for data +sharing and archival. In doubt please ask support@coderefinery.org.
  • +
  • We are currently funded until 2025. We are actively working on +securing long-term funding for this service. The goal is to create a service +for many years to come. If we do not manage to secure long-term funding, we +will notify users well in advance and assist in migrating repository and data.
  • +
  • The entire file system is backed up every day. The schedule is 1/month full +backup, 3 out of 4 weeks differential backup, 1/day incremental backup. We +reserve the right to reduce the number of days backed up if space becomes an +issue.
  • +
+
+

Why use this service, rather than a service like GitHub or BitBucket?

+

The service we provide is a GitLab instance which targets persons and groups who:

+ +

GitHub, Bitbucket, +GitLab.com, and similar services are popular code +repository hosting services. If you already use them, please continue to do +so! They allow hosting public repositories and to some extent also private +repositories. They may offer higher visibility and discoverability than the +instance offered by our project.

+

Who can use this service?

+

Students, researchers, and staff affiliated with a Nordic academic institution. +If you are not sure whether you can use the system, please contact +support@coderefinery.org. +  +Your collaborators outside the Nordics can join your projects but cannot create new projects. +Ask them to register and then you can add them to your projects or groups as collaborators. +No need to ask us or inform us in order to add external collaborators.

+

You need to be first enabled before you can create projects and groups

+

Newly signed-in users need to first be enabled before they can create projects and groups. +This is to prevent abuse.

+

Please follow these steps:

+ +

How about federated access such as Feide or HAKA or eduGAIN or Kalmar2?

+

We support sign in with eduGAIN. Otherwise you need a specific user account +for this instance. We recommend creating an account with the email address your +identity federation gives you, as this will make it easier to enable other +federated access providers seamlessly. + 

+

Is there a data limit per project?

+

Currently no limit is enforced but we recommend less than 100 MB per project. +This should really be for code and not for persistent storage of data. If you +use more, we may contact you. If you need more, please contact us and motivate +why you need more and we will see what we can do about it. If you have a good +motivation, you will probably get a larger soft limit.

+

Can I serve GitLab pages?

+

Yes! GitLab pages now serve via *.pages.coderefinery.org. +Currently only HTTP. TLS is in the works.

+

Does the service include shared continuous integration runners?

+

No, shared runners are not part of the offering but you can connect +your own CI runners to your projects for automated tests and builds.

+

SSH key fingerprints

+

Public key fingerprints can be used to validate a connection to a remote server.

+

These are the public key fingerprints for source.coderefinery.org (in hexadecimal format):

+
MD5:b8:c9:43:24:33:96:ba:5d:88:84:73:81:38:ac:e6:0f (RSA)
+MD5:21:dc:4e:ef:4f:1c:44:f8:d8:5e:3a:30:15:32:e3:4c (ECDSA)
+MD5:57:3f:dd:7e:52:5a:83:ec:68:7e:c9:58:d3:f2:21:c4 (ED25519)
+
+

These are the SHA256 hashes:

+
SHA256:dQ6iP+E6PZ2Ureynaw1eGKqRLJ5RtL4C7qUJlNSvLW8 (RSA)
+SHA256:dtWo53mvtXVv3NxZf44kpRIfvJ8edcEqv7HFEltPpa4 (ECDSA)
+SHA256:6vV2a0zfcMuls1KkGlzbrJPQP5yC+z5v+2pKtGMNx8Y (ED25519)
+
+

How to check these without logging in:

+
$ ssh-keyscan source.coderefinery.org | ssh-keygen -E md5 -lf -
+$ ssh-keyscan source.coderefinery.org | ssh-keygen -lf -
+
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..71c44fae --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://coderefinery.org/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..75985db5 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,355 @@ + + + + https://coderefinery.org/ + + + https://coderefinery.org/about/ + + + https://coderefinery.org/about/code-of-conduct/ + + + https://coderefinery.org/about/contact/ + + + https://coderefinery.org/about/contributors/ + + + https://coderefinery.org/about/funding/ + + + https://coderefinery.org/about/goodies/ + + + https://coderefinery.org/about/history/ + + + https://coderefinery.org/about/impact/ + + + https://coderefinery.org/about/newsletter/ + + + https://coderefinery.org/about/partners/ + + + https://coderefinery.org/about/presentations/ + + + https://coderefinery.org/about/project/ + + + https://coderefinery.org/about/reports/ + + + https://coderefinery.org/about/statistics/ + + + https://coderefinery.org/blog/ + + + https://coderefinery.org/blog/2020/04/14/first-online-workshop/ + 2020-04-14 + + + https://coderefinery.org/blog/2020/04/24/nordic-rse-conference/ + 2020-04-24 + + + https://coderefinery.org/blog/2020/04/24/online-workshops-update/ + 2020-04-24 + + + https://coderefinery.org/blog/2020/04/24/rebase-vs-merge/ + 2020-04-24 + + + https://coderefinery.org/blog/2020/04/24/rsh/ + 2020-04-24 + + + https://coderefinery.org/blog/2020/04/27/nordichpc-tools/ + 2020-04-27 + + + https://coderefinery.org/blog/2020/07/31/mega-coderefinery/ + 2020-07-31 + + + https://coderefinery.org/blog/2020/09/29/git-pr/ + 2020-09-29 + + + https://coderefinery.org/blog/2020/11/13/carpentry-community-discussion-nordic/ + 2020-11-13 + + + https://coderefinery.org/blog/2021/09/01/bi-weekly-community-calls/ + 2021-09-01 + + + https://coderefinery.org/blog/2021/11/20/phase-2-lessons-learned/ + 2021-11-20 + + + https://coderefinery.org/blog/2021/11/21/towards-citable-lessons/ + 2021-11-21 + + + https://coderefinery.org/blog/2021/11/25/lessons-learned-may-2021/ + 2021-11-25 + + + https://coderefinery.org/blog/2022/05/04/improving-workshop-registration/ + 2022-05-04 + + + https://coderefinery.org/blog/2022/05/18/measuring-impact/ + 2022-05-18 + + + https://coderefinery.org/blog/2022/10/17/future-of-teaching/ + 2022-10-17 + + + https://coderefinery.org/blog/2022/10/21/python-for-scicomp/ + 2022-10-21 + + + https://coderefinery.org/blog/2022/10/24/parallel-chat/ + 2022-10-24 + + + https://coderefinery.org/blog/2022/10/31/co-teaching/ + 2022-10-31 + + + https://coderefinery.org/blog/2022/11/07/reverse-hybrid/ + 2022-11-07 + + + https://coderefinery.org/blog/2022/11/08/lessons-learned-Sep-2022/ + 2022-11-08 + + + https://coderefinery.org/blog/2022/11/08/mastodon/ + 2022-11-08 + + + https://coderefinery.org/blog/2022/11/14/livestreaming-courses/ + 2022-11-14 + + + https://coderefinery.org/blog/2022/11/21/video-publishing/ + 2022-11-08 + + + https://coderefinery.org/blog/2022/11/28/teams/ + 2022-11-28 + + + https://coderefinery.org/blog/2023/02/14/march-workshop/ + 2023-02-14 + + + https://coderefinery.org/blog/2023/04/12/lessons-learned-mar-2023/ + 2023-04-12 + + + https://coderefinery.org/blog/2023/06/25/planning-sep-workshop/ + 2023-06-25 + + + https://coderefinery.org/blog/2023/12/05/lessons-learned-sep-2023/ + 2023-12-05 + + + https://coderefinery.org/blog/2024/01/24/project-future-concept-board/ + 2024-01-24 + + + https://coderefinery.org/blog/2024/02/29/install-instructions/ + 2024-02-29 + + + https://coderefinery.org/blog/2024/03/15/week1-march-workshop-rework/ + 2024-03-15 + + + https://coderefinery.org/blog/2024/03/17/streaming-training-workshop/ + 2024-03-17 + + + https://coderefinery.org/blog/2024/03/25/next-cr-workshop-help-needed/ + 2024-03-25 + + + https://coderefinery.org/blog/2024/04/04/in-person-install-instructions-session/ + 2024-04-04 + + + https://coderefinery.org/blog/2024/04/04/in-person-video-production-session.md/ + 2024-04-04 + + + https://coderefinery.org/blog/2024/04/10/writing-retreat-community.md/ + 2024-04-20 + + + https://coderefinery.org/blog/2024/04/10/writing-retreat-onboarding.md/ + 2024-04-20 + + + https://coderefinery.org/blog/2024/04/18/in-person-asynchronous-versus-live-online-teaching/ + 2024-04-18 + + + https://coderefinery.org/blog/2024/04/19/drafting-a-governance/ + 2024-04-19 + + + https://coderefinery.org/blog/2024/04/19/git-lesson-rewrite/ + 2024-04-19 + + + https://coderefinery.org/blog/2024/04/19/in-person-modular-code-development-lesson/ + 2024-04-19 + + + https://coderefinery.org/blog/2024/04/19/in-person-social-media-strategy/ + 2024-04-19 + + + https://coderefinery.org/blog/2024/06/07/organisation-info-support-cr-how/ + 2024-06-07 + + + https://coderefinery.org/blog/2024/06/17/finance-models/ + 2024-06-17 + + + https://coderefinery.org/blog/2024/07/30/lesson-cffs/ + 2024-07-30 + + + https://coderefinery.org/blog/2024/08/10/post-workshop-survey/ + 2024-08-10 + + + https://coderefinery.org/blog/bring-your-own-classroom/ + 2024-08-19 + + + https://coderefinery.org/blog/project-future-concept-board/ + + + https://coderefinery.org/blog/train-the-trainer/ + 2024-09-09 + + + https://coderefinery.org/blog/workshop-plan/ + 2024-02-27 + + + https://coderefinery.org/calendars/ + + + https://coderefinery.org/index/ + + + https://coderefinery.org/index/description/ + + + https://coderefinery.org/index/news/ + + + https://coderefinery.org/join/ + + + https://coderefinery.org/join/chat/ + + + https://coderefinery.org/join/community-teaching-training/ + + + https://coderefinery.org/join/individuals/ + + + https://coderefinery.org/join/meetings/ + + + https://coderefinery.org/join/organizations/ + + + https://coderefinery.org/join/staff/ + + + https://coderefinery.org/lessons/ + + + https://coderefinery.org/lessons/other/ + + + https://coderefinery.org/lessons/reusing/ + + + https://coderefinery.org/open-house/ + + + https://coderefinery.org/open-house/blog-posts/ + 2020-04-24 + + + https://coderefinery.org/open-house/credit/ + 2020-10-02 + + + https://coderefinery.org/open-house/instructor-training-material/ + 2020-03-24 + + + https://coderefinery.org/open-house/newsletter/ + 2020-08-24 + + + https://coderefinery.org/open-house/online-teaching/ + 2020-03-20 + + + https://coderefinery.org/open-house/training-material/ + 2019-12-13 + + + https://coderefinery.org/open-house/website/ + 2020-02-11 + + + https://coderefinery.org/privacy-policy/ + + + https://coderefinery.org/registration/ + + + https://coderefinery.org/repository/ + + + https://coderefinery.org/tasks/ + + + https://coderefinery.org/workshops/ + + + https://coderefinery.org/workshops/past/ + + + https://coderefinery.org/workshops/request/ + + + https://coderefinery.org/workshops/teaching-style/ + + + https://coderefinery.org/workshops/upcoming/ + 2024-09-29 + + diff --git a/style.css b/style.css new file mode 100644 index 00000000..0b67ef37 --- /dev/null +++ b/style.css @@ -0,0 +1 @@ +html{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:16px;font-weight:normal;line-height:1.5;-webkit-text-size-adjust:100%;background:#fff;color:#666}body{margin:0}a,.uk-link{color:#36d;text-decoration:none;cursor:pointer}a:hover,.uk-link:hover,.uk-link-toggle:hover .uk-link{color:#0f6ecd;text-decoration:underline}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration-style:dotted}b,strong{font-weight:bolder}:not(pre)>code,:not(pre)>kbd,:not(pre)>samp{font-family:Consolas,monaco,monospace;font-size:.875rem;color:#c09;white-space:nowrap;padding:2px 6px;background:#f8f8f8}em{color:#f0506e}ins{background:#ffd;color:#666;text-decoration:none}mark{background:#ffd;color:#666}q{font-style:italic}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}audio,canvas,iframe,img,svg,video{vertical-align:middle}canvas,img,svg,video{max-width:100%;height:auto;box-sizing:border-box}img:not([src]){visibility:hidden;min-width:1px}iframe{border:0}p,ul,ol,dl,pre,address,fieldset,figure{margin:0 0 20px 0}*+p,*+ul,*+ol,*+dl,*+pre,*+address,*+fieldset,*+figure{margin-top:20px}h1,.uk-h1,h2,.uk-h2,.markdown h1,h3,.uk-h3,.markdown h2,h4,.uk-h4,.markdown h3,h5,.uk-h5,h6,.uk-h6,.uk-heading-small,.uk-heading-medium,.uk-heading-large,.uk-heading-xlarge,.uk-heading-2xlarge,.uk-heading-3xlarge{margin:0 0 20px 0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:normal;color:#333;text-transform:none}*+h1,*+.uk-h1,*+h2,*+.uk-h2,.markdown *+h1,*+h3,*+.uk-h3,.markdown *+h2,*+h4,*+.uk-h4,.markdown *+h3,*+h5,*+.uk-h5,*+h6,*+.uk-h6,*+.uk-heading-small,*+.uk-heading-medium,*+.uk-heading-large,*+.uk-heading-xlarge,*+.uk-heading-2xlarge,*+.uk-heading-3xlarge{margin-top:40px}h1,.uk-h1{font-size:2.23125rem;line-height:1.2}h2,.uk-h2,.markdown h1{font-size:1.7rem;line-height:1.3}h3,.uk-h3,.markdown h2{font-size:1.5rem;line-height:1.4}h4,.uk-h4,.markdown h3{font-size:1.25rem;line-height:1.4}h5,.uk-h5{font-size:16px;line-height:1.4}h6,.uk-h6{font-size:.875rem;line-height:1.4}@media (min-width: 960px){h1,.uk-h1{font-size:2.625rem}h2,.uk-h2,.markdown h1{font-size:2rem}}ul,ol{padding-left:30px}ul>li>ul,ul>li>ol,ol>li>ol,ol>li>ul{margin:0}dt{font-weight:bold}dd{margin-left:0}hr,.uk-hr{overflow:visible;text-align:inherit;margin:0 0 20px 0;border:0;border-top:1px solid #e5e5e5}*+hr,*+.uk-hr{margin-top:20px}address{font-style:normal}blockquote{margin:0 0 20px 0;font-size:1.25rem;line-height:1.5;font-style:italic;color:#333}*+blockquote{margin-top:20px}blockquote p:last-of-type{margin-bottom:0}blockquote footer{margin-top:10px;font-size:.875rem;line-height:1.5;color:#666}blockquote footer::before{content:"— "}pre{font:.875rem / 1.5 Consolas,monaco,monospace;color:#666;-moz-tab-size:4;tab-size:4;overflow:auto;padding:10px;border:1px solid #e5e5e5;border-radius:3px;background:#fff}pre code{font-family:Consolas,monaco,monospace}:focus{outline:none}:focus-visible{outline:2px dotted #333}::selection{background:#39f;color:#fff;text-shadow:none}details,main{display:block}summary{display:list-item}template{display:none}:root{--uk-breakpoint-s: 640px;--uk-breakpoint-m: 960px;--uk-breakpoint-l: 1200px;--uk-breakpoint-xl: 1600px}a.uk-link-muted,.uk-link-muted a,.uk-link-toggle .uk-link-muted{color:#999}a.uk-link-muted:hover,.uk-link-muted a:hover,.uk-link-toggle:hover .uk-link-muted{color:#666}a.uk-link-text,.uk-link-text a,.uk-link-toggle .uk-link-text{color:inherit}a.uk-link-text:hover,.uk-link-text a:hover,.uk-link-toggle:hover .uk-link-text{color:#999}a.uk-link-heading,.uk-link-heading a,.uk-link-toggle .uk-link-heading{color:inherit}a.uk-link-heading:hover,.uk-link-heading a:hover,.uk-link-toggle:hover .uk-link-heading{color:#36c;text-decoration:none}a.uk-link-reset,.uk-link-reset a{color:inherit !important;text-decoration:none !important}.uk-link-toggle{color:inherit !important;text-decoration:none !important}.uk-heading-small{font-size:2.6rem;line-height:1.2}.uk-heading-medium{font-size:2.8875rem;line-height:1.1}.uk-heading-large{font-size:3.4rem;line-height:1.1}.uk-heading-xlarge{font-size:4rem;line-height:1}.uk-heading-2xlarge{font-size:6rem;line-height:1}.uk-heading-3xlarge{font-size:8rem;line-height:1}@media (min-width: 960px){.uk-heading-small{font-size:3.25rem}.uk-heading-medium{font-size:3.5rem}.uk-heading-large{font-size:4rem}.uk-heading-xlarge{font-size:6rem}.uk-heading-2xlarge{font-size:8rem}.uk-heading-3xlarge{font-size:11rem}}@media (min-width: 1200px){.uk-heading-medium{font-size:4rem}.uk-heading-large{font-size:6rem}.uk-heading-xlarge{font-size:8rem}.uk-heading-2xlarge{font-size:11rem}.uk-heading-3xlarge{font-size:15rem}}.uk-heading-divider{padding-bottom:calc(5px + 0.1em);border-bottom:calc(0.2px + 0.05em) solid #e5e5e5}.uk-heading-bullet{position:relative}.uk-heading-bullet::before{content:"";display:inline-block;position:relative;top:calc(-0.1 * 1em);vertical-align:middle;height:calc(4px + 0.7em);margin-right:calc(5px + 0.2em);border-left:calc(5px + 0.1em) solid #e5e5e5}.uk-heading-line{overflow:hidden}.uk-heading-line>*{display:inline-block;position:relative}.uk-heading-line>::before,.uk-heading-line>::after{content:"";position:absolute;top:calc(50% - (calc(0.2px + 0.05em) / 2));width:2000px;border-bottom:calc(0.2px + 0.05em) solid #e5e5e5}.uk-heading-line>::before{right:100%;margin-right:calc(5px + 0.3em)}.uk-heading-line>::after{left:100%;margin-left:calc(5px + 0.3em)}[class*=uk-divider]{border:none;margin-bottom:20px}*+[class*=uk-divider]{margin-top:20px}.uk-divider-icon{position:relative;height:20px;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23e5e5e5%22%20stroke-width%3D%222%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%227%22%20%2F%3E%0A%3C%2Fsvg%3E%0A");background-repeat:no-repeat;background-position:50% 50%}.uk-divider-icon::before,.uk-divider-icon::after{content:"";position:absolute;top:50%;max-width:calc(50% - (50px / 2));border-bottom:1px solid #e5e5e5}.uk-divider-icon::before{right:calc(50% + (50px / 2));width:100%}.uk-divider-icon::after{left:calc(50% + (50px / 2));width:100%}.uk-divider-small{line-height:0}.uk-divider-small::after{content:"";display:inline-block;width:100px;max-width:100%;border-top:1px solid #e5e5e5;vertical-align:top}.uk-divider-vertical{width:max-content;height:100px;margin-left:auto;margin-right:auto;border-left:1px solid #e5e5e5}.uk-list,.markdown ul{padding:0;list-style:none}.uk-list>*,.markdown ul>*{break-inside:avoid-column}.uk-list>*>:last-child,.markdown ul>*>:last-child{margin-bottom:0}.uk-list>:nth-child(n+2),.markdown ul>:nth-child(n+2),.uk-list>*>ul,.markdown ul>*>ul{margin-top:10px}.uk-list-disc>*,.uk-list-circle>*,.uk-list-square>*,.markdown ul>*,.uk-list-decimal>*,.uk-list-hyphen>*{padding-left:30px}.uk-list-decimal{counter-reset:decimal}.uk-list-decimal>*{counter-increment:decimal}.uk-list-disc>::before,.uk-list-circle>::before,.uk-list-square>::before,.markdown ul>::before,.uk-list-decimal>::before,.uk-list-hyphen>::before{content:"";position:relative;left:-30px;width:30px;height:1.5em;margin-bottom:-1.5em;display:list-item;list-style-position:inside;text-align:right}.uk-list-disc>::before{list-style-type:disc}.uk-list-circle>::before{list-style-type:circle}.uk-list-square>::before,.markdown ul>::before{list-style-type:square}.uk-list-decimal>::before{content:counter(decimal, decimal) " . "}.uk-list-hyphen>::before{content:"–  "}.uk-list-muted>::before{color:#999 !important}.uk-list-emphasis>::before{color:#333 !important}.uk-list-primary>::before{color:#36c !important}.uk-list-secondary>::before{color:#936 !important}.uk-list-bullet>*{padding-left:30px}.uk-list-bullet>::before{content:"";display:list-item;position:relative;left:-30px;width:30px;height:1.5em;margin-bottom:-1.5em;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23666%22%20cx%3D%223%22%20cy%3D%223%22%20r%3D%223%22%20%2F%3E%0A%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50% 50%}.uk-list-divider>:nth-child(n+2){margin-top:10px;padding-top:10px;border-top:1px solid #e5e5e5}.uk-list-striped>*{padding:10px 10px}.uk-list-striped>*:nth-of-type(odd){border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5}.uk-list-striped>:nth-of-type(odd){background:#f8f8f8}.uk-list-striped>:nth-child(n+2){margin-top:0}.uk-list-large>:nth-child(n+2),.uk-list-large>*>ul{margin-top:20px}.uk-list-collapse>:nth-child(n+2),.uk-list-collapse>*>ul{margin-top:0}.uk-list-large.uk-list-divider>:nth-child(n+2){margin-top:20px;padding-top:20px}.uk-list-collapse.uk-list-divider>:nth-child(n+2){margin-top:0;padding-top:0}.uk-list-large.uk-list-striped>*{padding:20px 10px}.uk-list-collapse.uk-list-striped>*{padding-top:0;padding-bottom:0}.uk-list-large.uk-list-striped>:nth-child(n+2),.uk-list-collapse.uk-list-striped>:nth-child(n+2){margin-top:0}.uk-description-list>dt{color:#333;font-size:.875rem;font-weight:normal;text-transform:uppercase}.uk-description-list>dt:nth-child(n+2){margin-top:20px}.uk-description-list-divider>dt:nth-child(n+2){margin-top:20px;padding-top:20px;border-top:1px solid #e5e5e5}.uk-table{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:20px}*+.uk-table{margin-top:20px}.uk-table th{padding:16px 12px;text-align:left;vertical-align:bottom;font-size:.875rem;font-weight:normal;color:#666;text-transform:uppercase}.uk-table td{padding:16px 12px;vertical-align:top}.uk-table td>:last-child{margin-bottom:0}.uk-table tfoot{font-size:.875rem}.uk-table caption{font-size:.875rem;text-align:left;color:#999}.uk-table-middle,.uk-table-middle td{vertical-align:middle !important}.uk-table-divider>tr:not(:first-child),.uk-table-divider>:not(:first-child)>tr,.uk-table-divider>:first-child>tr:not(:first-child){border-top:1px solid #e5e5e5}.uk-table-striped>tr:nth-of-type(odd),.uk-table-striped tbody tr:nth-of-type(odd){background:#f8f8f8;border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5}.uk-table-hover>tr:hover,.uk-table-hover tbody tr:hover{background:#ffd}.uk-table>tr.uk-active,.uk-table tbody tr.uk-active{background:#ffd}.uk-table-small th,.uk-table-small td{padding:10px 12px}.uk-table-large th,.uk-table-large td{padding:22px 12px}.uk-table-justify th:first-child,.uk-table-justify td:first-child{padding-left:0}.uk-table-justify th:last-child,.uk-table-justify td:last-child{padding-right:0}.uk-table-shrink{width:1px}.uk-table-expand{min-width:150px}.uk-table-link{padding:0 !important}.uk-table-link>a{display:block;padding:16px 12px}.uk-table-small .uk-table-link>a{padding:10px 12px}@media (max-width: 959px){.uk-table-responsive,.uk-table-responsive tbody,.uk-table-responsive th,.uk-table-responsive td,.uk-table-responsive tr{display:block}.uk-table-responsive thead{display:none}.uk-table-responsive th,.uk-table-responsive td{width:auto !important;max-width:none !important;min-width:0 !important;overflow:visible !important;white-space:normal !important}.uk-table-responsive th:not(:first-child):not(.uk-table-link),.uk-table-responsive td:not(:first-child):not(.uk-table-link),.uk-table-responsive .uk-table-link:not(:first-child)>a{padding-top:5px !important}.uk-table-responsive th:not(:last-child):not(.uk-table-link),.uk-table-responsive td:not(:last-child):not(.uk-table-link),.uk-table-responsive .uk-table-link:not(:last-child)>a{padding-bottom:5px !important}.uk-table-justify.uk-table-responsive th,.uk-table-justify.uk-table-responsive td{padding-left:0;padding-right:0}}.uk-table tbody tr{transition:background-color .1s linear}.uk-table-striped>tr:nth-of-type(even):last-child,.uk-table-striped tbody tr:nth-of-type(even):last-child{border-bottom:1px solid #e5e5e5}.uk-icon{margin:0;border:none;border-radius:0;overflow:visible;font:inherit;color:inherit;text-transform:none;padding:0;background-color:rgba(0,0,0,0);display:inline-block;fill:currentcolor;line-height:0}button.uk-icon:not(:disabled){cursor:pointer}.uk-icon::-moz-focus-inner{border:0;padding:0}.uk-icon:not(.uk-preserve) [fill*="#"]:not(.uk-preserve){fill:currentcolor}.uk-icon:not(.uk-preserve) [stroke*="#"]:not(.uk-preserve){stroke:currentcolor}.uk-icon>*{transform:translate(0, 0)}.uk-icon-image{width:20px;height:20px;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;vertical-align:middle;object-fit:scale-down;max-width:none}.uk-icon-link{color:#999;text-decoration:none !important}.uk-icon-link:hover{color:#666}.uk-icon-link:active,.uk-active>.uk-icon-link{color:#595959}.uk-icon-button{box-sizing:border-box;width:36px;height:36px;border-radius:500px;background:#f8f8f8;color:#999;vertical-align:middle;display:inline-flex;justify-content:center;align-items:center;transition:.1s ease-in-out;transition-property:color,background-color}.uk-icon-button:hover{background-color:#ebebeb;color:#666}.uk-icon-button:active,.uk-active>.uk-icon-button{background-color:#dfdfdf;color:#666}.uk-range{-webkit-appearance:none;box-sizing:border-box;margin:0;vertical-align:middle;max-width:100%;width:100%;background:rgba(0,0,0,0)}.uk-range:focus{outline:none}.uk-range::-moz-focus-outer{border:none}.uk-range:not(:disabled)::-webkit-slider-thumb{cursor:pointer}.uk-range:not(:disabled)::-moz-range-thumb{cursor:pointer}.uk-range::-webkit-slider-runnable-track{height:3px;background:#ebebeb;border-radius:500px}.uk-range:focus::-webkit-slider-runnable-track,.uk-range:active::-webkit-slider-runnable-track{background:#dfdfdf}.uk-range::-moz-range-track{height:3px;background:#ebebeb;border-radius:500px}.uk-range:focus::-moz-range-track{background:#dfdfdf}.uk-range::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-7px;height:15px;width:15px;border-radius:500px;background:#fff;border:1px solid #ccc}.uk-range::-moz-range-thumb{border:none;height:15px;width:15px;margin-top:-7px;border-radius:500px;background:#fff;border:1px solid #ccc}.uk-input,.uk-select,.uk-textarea,.uk-radio,.uk-checkbox{box-sizing:border-box;margin:0;border-radius:0;font:inherit}.uk-input{overflow:visible}.uk-select{text-transform:none}.uk-select optgroup{font:inherit;font-weight:bold}.uk-textarea{overflow:auto}.uk-input[type=search]::-webkit-search-cancel-button,.uk-input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.uk-input[type=number]::-webkit-inner-spin-button,.uk-input[type=number]::-webkit-outer-spin-button{height:auto}.uk-input::-moz-placeholder,.uk-textarea::-moz-placeholder{opacity:1}.uk-radio:not(:disabled),.uk-checkbox:not(:disabled){cursor:pointer}.uk-fieldset{border:none;margin:0;padding:0;min-width:0}.uk-input,.uk-textarea{-webkit-appearance:none}.uk-input,.uk-select,.uk-textarea{max-width:100%;width:100%;border:0 none;padding:0 10px;background:#fff;color:#666;border:1px solid #e5e5e5;transition:.2s ease-in-out;transition-property:color,background-color,border}.uk-input,.uk-select:not([multiple]):not([size]){height:40px;vertical-align:middle;display:inline-block}.uk-input:not(input),.uk-select:not(select){line-height:38px}.uk-select[multiple],.uk-select[size],.uk-textarea{padding-top:6px;padding-bottom:6px;vertical-align:top}.uk-select[multiple],.uk-select[size]{resize:vertical}.uk-input:focus,.uk-select:focus,.uk-textarea:focus{outline:none;background-color:#fff;color:#666;border-color:#36c}.uk-input:disabled,.uk-select:disabled,.uk-textarea:disabled{background-color:#f8f8f8;color:#999;border-color:#e5e5e5}.uk-input::placeholder{color:#999}.uk-textarea::placeholder{color:#999}.uk-form-small{font-size:.875rem}.uk-form-small:not(textarea):not([multiple]):not([size]){height:30px;padding-left:8px;padding-right:8px}textarea.uk-form-small,[multiple].uk-form-small,[size].uk-form-small{padding:5px 8px}.uk-form-small:not(select):not(input):not(textarea){line-height:28px}.uk-form-large{font-size:1.25rem}.uk-form-large:not(textarea):not([multiple]):not([size]){height:55px;padding-left:12px;padding-right:12px}textarea.uk-form-large,[multiple].uk-form-large,[size].uk-form-large{padding:7px 12px}.uk-form-large:not(select):not(input):not(textarea){line-height:53px}.uk-form-danger,.uk-form-danger:focus{color:#f0506e;border-color:#f0506e}.uk-form-success,.uk-form-success:focus{color:#32d296;border-color:#32d296}.uk-form-blank{background:none;border-color:rgba(0,0,0,0)}.uk-form-blank:focus{border-color:#e5e5e5;border-style:solid}input.uk-form-width-xsmall{width:50px}select.uk-form-width-xsmall{width:75px}.uk-form-width-small{width:130px}.uk-form-width-medium{width:200px}.uk-form-width-large{width:500px}.uk-select:not([multiple]):not([size]){-webkit-appearance:none;-moz-appearance:none;padding-right:20px;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A");background-repeat:no-repeat;background-position:100% 50%}.uk-select:not([multiple]):not([size]) option{color:#666}.uk-select:not([multiple]):not([size]):disabled{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-input[list]{padding-right:20px;background-repeat:no-repeat;background-position:100% 50%}.uk-input[list]:hover,.uk-input[list]:focus{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2012%208%206%2016%206%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-input[list]::-webkit-calendar-picker-indicator{display:none !important}.uk-radio,.uk-checkbox{display:inline-block;height:16px;width:16px;overflow:hidden;margin-top:-4px;vertical-align:middle;-webkit-appearance:none;-moz-appearance:none;background-color:rgba(0,0,0,0);background-repeat:no-repeat;background-position:50% 50%;border:1px solid #ccc;transition:.2s ease-in-out;transition-property:background-color,border}.uk-radio{border-radius:50%}.uk-radio:focus,.uk-checkbox:focus{background-color:rgba(0,0,0,0);outline:none;border-color:#36c}.uk-radio:checked,.uk-checkbox:checked,.uk-checkbox:indeterminate{background-color:#36c;border-color:rgba(0,0,0,0)}.uk-radio:checked:focus,.uk-checkbox:checked:focus,.uk-checkbox:indeterminate:focus{background-color:#2952a3}.uk-radio:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23fff%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-checkbox:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23fff%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-checkbox:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23fff%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-radio:disabled,.uk-checkbox:disabled{background-color:#f8f8f8;border-color:#e5e5e5}.uk-radio:disabled:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23999%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-checkbox:disabled:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-checkbox:disabled:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23999%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-legend{width:100%;color:inherit;padding:0;font-size:1.5rem;line-height:1.4}.uk-form-custom{display:inline-block;position:relative;max-width:100%;vertical-align:middle}.uk-form-custom select,.uk-form-custom input[type=file]{position:absolute;top:0;z-index:1;width:100%;height:100%;left:0;-webkit-appearance:none;opacity:0;cursor:pointer}.uk-form-custom input[type=file]{font-size:500px;overflow:hidden}.uk-form-label{color:#333;font-size:.875rem}.uk-form-stacked .uk-form-label{display:block;margin-bottom:5px}@media (max-width: 959px){.uk-form-horizontal .uk-form-label{display:block;margin-bottom:5px}}@media (min-width: 960px){.uk-form-horizontal .uk-form-label{width:200px;margin-top:7px;float:left}.uk-form-horizontal .uk-form-controls{margin-left:215px}.uk-form-horizontal .uk-form-controls-text{padding-top:7px}}.uk-form-icon{position:absolute;top:0;bottom:0;left:0;width:40px;display:inline-flex;justify-content:center;align-items:center;color:#999}.uk-form-icon:hover{color:#666}.uk-form-icon:not(a):not(button):not(input){pointer-events:none}.uk-form-icon:not(.uk-form-icon-flip)~.uk-input{padding-left:40px !important}.uk-form-icon-flip{right:0;left:auto}.uk-form-icon-flip~.uk-input{padding-right:40px !important}.uk-button{margin:0;border:none;overflow:visible;font:inherit;color:inherit;text-transform:none;-webkit-appearance:none;border-radius:0;display:inline-block;box-sizing:border-box;padding:0 30px;vertical-align:middle;font-size:.875rem;line-height:38px;text-align:center;text-decoration:none;text-transform:uppercase;transition:.1s ease-in-out;transition-property:color,background-color,border-color}.uk-button:not(:disabled){cursor:pointer}.uk-button::-moz-focus-inner{border:0;padding:0}.uk-button:hover{text-decoration:none}.uk-button-default{background-color:rgba(0,0,0,0);color:#333;border:1px solid #e5e5e5}.uk-button-default:hover{background-color:rgba(0,0,0,0);color:#333;border-color:#b2b2b2}.uk-button-default:active,.uk-button-default.uk-active{background-color:rgba(0,0,0,0);color:#333;border-color:#999}.uk-button-primary{background-color:#36c;color:#fff;border:1px solid rgba(0,0,0,0)}.uk-button-primary:hover{background-color:#2e5cb8;color:#fff}.uk-button-primary:active,.uk-button-primary.uk-active{background-color:#2952a3;color:#fff}.uk-button-secondary{background-color:#936;color:#fff;border:1px solid rgba(0,0,0,0)}.uk-button-secondary:hover{background-color:#862d59;color:#fff}.uk-button-secondary:active,.uk-button-secondary.uk-active{background-color:#73264d;color:#fff}.uk-button-danger{background-color:#f0506e;color:#fff;border:1px solid rgba(0,0,0,0)}.uk-button-danger:hover{background-color:#ee395b;color:#fff}.uk-button-danger:active,.uk-button-danger.uk-active{background-color:#ec2147;color:#fff}.uk-button-default:disabled,.uk-button-primary:disabled,.uk-button-secondary:disabled,.uk-button-danger:disabled{background-color:rgba(0,0,0,0);color:#999;border-color:#e5e5e5}.uk-button-small{padding:0 15px;line-height:28px;font-size:.875rem}.uk-button-large{padding:0 40px;line-height:53px;font-size:.875rem}.uk-button-text{padding:0;line-height:1.5;background:none;color:#333;position:relative}.uk-button-text::before{content:"";position:absolute;bottom:0;left:0;right:100%;border-bottom:1px solid currentColor;transition:right .3s ease-out}.uk-button-text:hover{color:#333}.uk-button-text:hover::before{right:0}.uk-button-text:disabled{color:#999}.uk-button-text:disabled::before{display:none}.uk-button-link{padding:0;line-height:1.5;background:none;color:#333}.uk-button-link:hover{color:#999;text-decoration:none}.uk-button-link:disabled{color:#999;text-decoration:none}.uk-button-group{display:inline-flex;vertical-align:middle;position:relative}.uk-button-group>.uk-button:nth-child(n+2),.uk-button-group>div:nth-child(n+2) .uk-button{margin-left:-1px}.uk-button-group .uk-button:hover,.uk-button-group .uk-button:focus,.uk-button-group .uk-button:active,.uk-button-group .uk-button.uk-active{position:relative;z-index:1}.uk-progress{vertical-align:baseline;display:block;width:100%;border:0;background-color:#f8f8f8;margin-bottom:20px;height:15px;border-radius:500px;overflow:hidden}*+.uk-progress{margin-top:20px}.uk-progress::-webkit-progress-bar{background-color:rgba(0,0,0,0)}.uk-progress::-webkit-progress-value{background-color:#36c;transition:width .6s ease}.uk-progress::-moz-progress-bar{background-color:#36c;transition:width .6s ease}.uk-section{display:flow-root;box-sizing:border-box;padding-top:40px;padding-bottom:40px}@media (min-width: 960px){.uk-section{padding-top:70px;padding-bottom:70px}}.uk-section>:last-child{margin-bottom:0}.uk-section-xsmall{padding-top:20px;padding-bottom:20px}.uk-section-small{padding-top:40px;padding-bottom:40px}.uk-section-large{padding-top:70px;padding-bottom:70px}@media (min-width: 960px){.uk-section-large{padding-top:140px;padding-bottom:140px}}.uk-section-xlarge{padding-top:140px;padding-bottom:140px}@media (min-width: 960px){.uk-section-xlarge{padding-top:210px;padding-bottom:210px}}.uk-section-default{--uk-inverse: dark;background:#fff}.uk-section-muted{--uk-inverse: dark;background:#f8f8f8}.uk-section-primary{--uk-inverse: light;background:#36c}.uk-section-secondary{--uk-inverse: light;background:#936}.uk-container{display:flow-root;box-sizing:content-box;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}@media (min-width: 640px){.uk-container{padding-left:30px;padding-right:30px}}@media (min-width: 960px){.uk-container{padding-left:40px;padding-right:40px}}.uk-container>:last-child{margin-bottom:0}.uk-container .uk-container{padding-left:0;padding-right:0}.uk-container-xsmall{max-width:750px}.uk-container-small{max-width:900px}.uk-container-large{max-width:1400px}.uk-container-xlarge{max-width:1600px}.uk-container-expand{max-width:none}.uk-container-expand-left{margin-left:0}.uk-container-expand-right{margin-right:0}@media (min-width: 640px){.uk-container-expand-left.uk-container-xsmall,.uk-container-expand-right.uk-container-xsmall{max-width:calc(50% + (750px / 2) - 30px)}.uk-container-expand-left.uk-container-small,.uk-container-expand-right.uk-container-small{max-width:calc(50% + (900px / 2) - 30px)}}@media (min-width: 960px){.uk-container-expand-left,.uk-container-expand-right{max-width:calc(50% + (1200px / 2) - 40px)}.uk-container-expand-left.uk-container-xsmall,.uk-container-expand-right.uk-container-xsmall{max-width:calc(50% + (750px / 2) - 40px)}.uk-container-expand-left.uk-container-small,.uk-container-expand-right.uk-container-small{max-width:calc(50% + (900px / 2) - 40px)}.uk-container-expand-left.uk-container-large,.uk-container-expand-right.uk-container-large{max-width:calc(50% + (1400px / 2) - 40px)}.uk-container-expand-left.uk-container-xlarge,.uk-container-expand-right.uk-container-xlarge{max-width:calc(50% + (1600px / 2) - 40px)}}.uk-container-item-padding-remove-left,.uk-container-item-padding-remove-right{width:calc(100% + 15px)}.uk-container-item-padding-remove-left{margin-left:-15px}.uk-container-item-padding-remove-right{margin-right:-15px}@media (min-width: 640px){.uk-container-item-padding-remove-left,.uk-container-item-padding-remove-right{width:calc(100% + 30px)}.uk-container-item-padding-remove-left{margin-left:-30px}.uk-container-item-padding-remove-right{margin-right:-30px}}@media (min-width: 960px){.uk-container-item-padding-remove-left,.uk-container-item-padding-remove-right{width:calc(100% + 40px)}.uk-container-item-padding-remove-left{margin-left:-40px}.uk-container-item-padding-remove-right{margin-right:-40px}}.uk-tile{display:flow-root;position:relative;box-sizing:border-box;padding-left:15px;padding-right:15px;padding-top:40px;padding-bottom:40px}@media (min-width: 640px){.uk-tile{padding-left:30px;padding-right:30px}}@media (min-width: 960px){.uk-tile{padding-left:40px;padding-right:40px;padding-top:70px;padding-bottom:70px}}.uk-tile>:last-child{margin-bottom:0}.uk-tile-xsmall{padding-top:20px;padding-bottom:20px}.uk-tile-small{padding-top:40px;padding-bottom:40px}.uk-tile-large{padding-top:70px;padding-bottom:70px}@media (min-width: 960px){.uk-tile-large{padding-top:140px;padding-bottom:140px}}.uk-tile-xlarge{padding-top:140px;padding-bottom:140px}@media (min-width: 960px){.uk-tile-xlarge{padding-top:210px;padding-bottom:210px}}.uk-tile-default{--uk-inverse: dark;background-color:#fff}.uk-tile-muted{--uk-inverse: dark;background-color:#f8f8f8}.uk-tile-primary{--uk-inverse: light;background-color:#36c}.uk-tile-secondary{--uk-inverse: light;background-color:#936}.uk-card{position:relative;box-sizing:border-box;transition:box-shadow .1s ease-in-out}.uk-card-body{display:flow-root;padding:30px 30px}.uk-card-header{display:flow-root;padding:15px 30px}.uk-card-footer{display:flow-root;padding:15px 30px}@media (min-width: 1200px){.uk-card-body{padding:40px 40px}.uk-card-header{padding:20px 40px}.uk-card-footer{padding:20px 40px}}.uk-card-body>:last-child,.uk-card-header>:last-child,.uk-card-footer>:last-child{margin-bottom:0}.uk-card-title{font-size:1.5rem;line-height:1.4}.uk-card-badge{position:absolute;top:15px;right:15px;z-index:1;height:22px;padding:0 10px;background:#36c;color:#fff;font-size:.875rem;display:flex;justify-content:center;align-items:center;line-height:0;border-radius:2px;text-transform:uppercase}.uk-card-badge:first-child+*{margin-top:0}.uk-card-hover:not(.uk-card-default):not(.uk-card-primary):not(.uk-card-secondary):hover{background-color:#fff;box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-card-default{--uk-inverse: dark;background-color:#fff;color:#666;box-shadow:0 5px 15px rgba(0,0,0,.08)}.uk-card-default .uk-card-title{color:#333}.uk-card-default.uk-card-hover:hover{background-color:#fff;box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-card-default .uk-card-header{border-bottom:1px solid #e5e5e5}.uk-card-default .uk-card-footer{border-top:1px solid #e5e5e5}.uk-card-primary{--uk-inverse: light;background-color:#36c;color:#fff;box-shadow:0 5px 15px rgba(0,0,0,.08)}.uk-card-primary .uk-card-title{color:#fff}.uk-card-primary.uk-card-hover:hover{background-color:#36c;box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-card-secondary{--uk-inverse: light;background-color:#936;color:#fff;box-shadow:0 5px 15px rgba(0,0,0,.08)}.uk-card-secondary .uk-card-title{color:#fff}.uk-card-secondary.uk-card-hover:hover{background-color:#936;box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-card-small.uk-card-body,.uk-card-small .uk-card-body{padding:20px 20px}.uk-card-small .uk-card-header{padding:13px 20px}.uk-card-small .uk-card-footer{padding:13px 20px}@media (min-width: 1200px){.uk-card-large.uk-card-body,.uk-card-large .uk-card-body{padding:70px 70px}.uk-card-large .uk-card-header{padding:35px 70px}.uk-card-large .uk-card-footer{padding:35px 70px}}.uk-card-body>.uk-nav-default{margin-left:-30px;margin-right:-30px}.uk-card-body>.uk-nav-default:only-child{margin-top:-15px;margin-bottom:-15px}.uk-card-body>.uk-nav-default>li>a,.uk-card-body>.uk-nav-default .uk-nav-header,.uk-card-body>.uk-nav-default .uk-nav-divider{padding-left:30px;padding-right:30px}.uk-card-body>.uk-nav-default .uk-nav-sub{padding-left:45px}@media (min-width: 1200px){.uk-card-body>.uk-nav-default{margin-left:-40px;margin-right:-40px}.uk-card-body>.uk-nav-default:only-child{margin-top:-25px;margin-bottom:-25px}.uk-card-body>.uk-nav-default>li>a,.uk-card-body>.uk-nav-default .uk-nav-header,.uk-card-body>.uk-nav-default .uk-nav-divider{padding-left:40px;padding-right:40px}.uk-card-body>.uk-nav-default .uk-nav-sub{padding-left:55px}}.uk-card-small>.uk-nav-default{margin-left:-20px;margin-right:-20px}.uk-card-small>.uk-nav-default:only-child{margin-top:-5px;margin-bottom:-5px}.uk-card-small>.uk-nav-default>li>a,.uk-card-small>.uk-nav-default .uk-nav-header,.uk-card-small>.uk-nav-default .uk-nav-divider{padding-left:20px;padding-right:20px}.uk-card-small>.uk-nav-default .uk-nav-sub{padding-left:35px}@media (min-width: 1200px){.uk-card-large>.uk-nav-default{margin:0}.uk-card-large>.uk-nav-default:only-child{margin:0}.uk-card-large>.uk-nav-default>li>a,.uk-card-large>.uk-nav-default .uk-nav-header,.uk-card-large>.uk-nav-default .uk-nav-divider{padding-left:0;padding-right:0}.uk-card-large>.uk-nav-default .uk-nav-sub{padding-left:15px}}.uk-close{color:#999;transition:.1s ease-in-out;transition-property:color,opacity}.uk-close:hover{color:#666}.uk-spinner>*{animation:uk-spinner-rotate 1.4s linear infinite}@keyframes uk-spinner-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(270deg)}}.uk-spinner>*>*{stroke-dasharray:88px;stroke-dashoffset:0;transform-origin:center;animation:uk-spinner-dash 1.4s ease-in-out infinite;stroke-width:1;stroke-linecap:round}@keyframes uk-spinner-dash{0%{stroke-dashoffset:88px}50%{stroke-dashoffset:22px;transform:rotate(135deg)}100%{stroke-dashoffset:88px;transform:rotate(450deg)}}.uk-totop{padding:5px;color:#999;transition:color .1s ease-in-out}.uk-totop:hover{color:#666}.uk-totop:active{color:#333}.uk-marker{padding:5px;background:#936;color:#fff;border-radius:500px}.uk-marker:hover{color:#fff}.uk-alert{position:relative;margin-bottom:20px;padding:15px 29px 15px 15px;background:#f8f8f8;color:#666}*+.uk-alert{margin-top:20px}.uk-alert>:last-child{margin-bottom:0}.uk-alert-close{position:absolute;top:20px;right:15px;color:inherit;opacity:.4}.uk-alert-close:first-child+*{margin-top:0}.uk-alert-close:hover{color:inherit;opacity:.8}.uk-alert-primary{background:#d6e0f5;color:#36c}.uk-alert-success{background:#edfbf6;color:#32d296}.uk-alert-warning{background:#fef5ee;color:#faa05a}.uk-alert-danger{background:#fef4f6;color:#f0506e}.uk-alert h1,.uk-alert h2,.uk-alert h3,.uk-alert h4,.uk-alert h5,.uk-alert h6{color:inherit}.uk-alert a:not([class]){color:inherit;text-decoration:underline}.uk-alert a:not([class]):hover{color:inherit;text-decoration:underline}.uk-placeholder{margin-bottom:20px;padding:30px 30px;background:rgba(0,0,0,0);border:1px dashed #e5e5e5}*+.uk-placeholder{margin-top:20px}.uk-placeholder>:last-child{margin-bottom:0}.uk-badge{box-sizing:border-box;min-width:18px;height:18px;padding:0 5px;border-radius:500px;vertical-align:middle;background:#36c;color:#fff !important;font-size:11px;display:inline-flex;justify-content:center;align-items:center;line-height:0}.uk-badge:hover{text-decoration:none}.uk-label{display:inline-block;padding:0 10px;background:#36c;line-height:1.5;font-size:.875rem;color:#fff;vertical-align:middle;white-space:nowrap;border-radius:2px;text-transform:uppercase}.uk-label-success{background-color:#32d296;color:#fff}.uk-label-warning{background-color:#faa05a;color:#fff}.uk-label-danger{background-color:#f0506e;color:#fff}.uk-overlay{padding:30px 30px}.uk-overlay>:last-child{margin-bottom:0}.uk-overlay-default{--uk-inverse: dark;background:rgba(255,255,255,.8)}.uk-overlay-primary{--uk-inverse: light;background:rgba(153,51,102,.8)}.uk-article{display:flow-root}.uk-article>:last-child{margin-bottom:0}.uk-article+.uk-article{margin-top:70px}.uk-article-title{font-size:2.23125rem;line-height:1.2}@media (min-width: 960px){.uk-article-title{font-size:2.625rem}}.uk-article-meta{font-size:.875rem;line-height:1.4;color:#999}.uk-article-meta a{color:#999}.uk-article-meta a:hover{color:#666;text-decoration:none}.uk-comment-body{display:flow-root;overflow-wrap:break-word;word-wrap:break-word}.uk-comment-header{display:flow-root;margin-bottom:20px}.uk-comment-body>:last-child,.uk-comment-header>:last-child{margin-bottom:0}.uk-comment-title{font-size:1.25rem;line-height:1.4}.uk-comment-meta{font-size:.875rem;line-height:1.4;color:#999}.uk-comment-list{padding:0;list-style:none}.uk-comment-list>:nth-child(n+2){margin-top:70px}.uk-comment-list .uk-comment~ul{margin:70px 0 0 0;padding-left:30px;list-style:none}@media (min-width: 960px){.uk-comment-list .uk-comment~ul{padding-left:100px}}.uk-comment-list .uk-comment~ul>:nth-child(n+2){margin-top:70px}.uk-comment-primary{padding:30px;background-color:#f8f8f8}.uk-search{display:inline-block;position:relative;max-width:100%;margin:0}.uk-search-input::-webkit-search-cancel-button,.uk-search-input::-webkit-search-decoration{-webkit-appearance:none}.uk-search-input::-moz-placeholder{opacity:1}.uk-search-input{box-sizing:border-box;margin:0;border-radius:0;font:inherit;overflow:visible;-webkit-appearance:none;vertical-align:middle;width:100%;border:none;color:#666}.uk-search-input:focus{outline:none}.uk-search-input::placeholder{color:#999}.uk-search .uk-search-icon{position:absolute;top:0;bottom:0;left:0;display:inline-flex;justify-content:center;align-items:center;color:#999}.uk-search .uk-search-icon:hover{color:#999}.uk-search .uk-search-icon:not(a):not(button):not(input){pointer-events:none}.uk-search .uk-search-icon-flip{right:0;left:auto}.uk-search-default{width:240px}.uk-search-default .uk-search-input{height:40px;padding-left:10px;padding-right:10px;background:rgba(0,0,0,0);border:1px solid #e5e5e5}.uk-search-default .uk-search-input:focus{background-color:rgba(0,0,0,0);border-color:#36c}.uk-search-default .uk-search-icon{width:40px}.uk-search-default:has(.uk-search-icon:not(.uk-search-icon-flip)) .uk-search-input{padding-left:40px}.uk-search-default:has(.uk-search-icon-flip) .uk-search-input{padding-right:40px}.uk-search-navbar{width:240px}.uk-search-navbar .uk-search-input{height:40px;padding-left:10px;padding-right:10px;background:#fff;border:1px solid #e5e5e5}.uk-search-navbar .uk-search-input:focus{background-color:#fff;border-color:#36c}.uk-search-navbar .uk-search-icon{width:40px}.uk-search-navbar:has(.uk-search-icon:not(.uk-search-icon-flip)) .uk-search-input{padding-left:40px}.uk-search-navbar:has(.uk-search-icon-flip) .uk-search-input{padding-right:40px}.uk-search-medium{width:400px}.uk-search-medium .uk-search-input{height:40px;background:rgba(0,0,0,0);font-size:1.5rem}.uk-search-medium .uk-search-icon{width:24px}.uk-search-medium:has(.uk-search-icon:not(.uk-search-icon-flip)) .uk-search-input{padding-left:34px}.uk-search-medium:has(.uk-search-icon-flip) .uk-search-input{padding-right:34px}.uk-search-large{width:500px}.uk-search-large .uk-search-input{height:80px;background:rgba(0,0,0,0);font-size:2.625rem}.uk-search-large .uk-search-icon{width:40px}.uk-search-large:has(.uk-search-icon:not(.uk-search-icon-flip)) .uk-search-input{padding-left:60px}.uk-search-large:has(.uk-search-icon-flip) .uk-search-input{padding-right:60px}.uk-search-toggle{color:#999}.uk-search-toggle:hover{color:#666}.uk-accordion{padding:0;list-style:none}.uk-accordion>:nth-child(n+2){margin-top:20px}.uk-accordion-title{display:block;font-size:1.25rem;line-height:1.4;color:#333;overflow:hidden}.uk-accordion-title::before{content:"";width:1.4em;height:1.4em;margin-left:10px;float:right;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%20%2F%3E%0A%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50% 50%}.uk-open>.uk-accordion-title::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-accordion-title:hover{color:#666;text-decoration:none}.uk-accordion-content{display:flow-root;margin-top:20px}.uk-accordion-content>:last-child{margin-bottom:0}.uk-drop{display:none;position:absolute;z-index:1020;--uk-position-offset: 20px;--uk-position-viewport-offset: 15px;box-sizing:border-box;width:300px}.uk-drop.uk-open{display:block}.uk-drop-stack .uk-drop-grid>*{width:100% !important}.uk-drop-parent-icon{margin-left:.25em;transition:transform .3s ease-out}[aria-expanded=true]>.uk-drop-parent-icon{transform:rotateX(180deg)}.uk-dropbar{--uk-position-offset: 0;--uk-position-shift-offset: 0;--uk-position-viewport-offset: 0;--uk-inverse: dark;width:auto;padding:25px 15px 25px 15px;background:#fff;color:#666}.uk-dropbar>:last-child{margin-bottom:0}@media (min-width: 640px){.uk-dropbar{padding-left:30px;padding-right:30px}}@media (min-width: 960px){.uk-dropbar{padding-left:40px;padding-right:40px}}.uk-dropbar :focus-visible{outline-color:#333 !important}.uk-dropbar-large{padding-top:40px;padding-bottom:40px}.uk-dropbar-top{box-shadow:0 12px 7px -6px rgba(0,0,0,.05)}.uk-dropbar-bottom{box-shadow:0 -12px 7px -6px rgba(0,0,0,.05)}.uk-dropbar-left{box-shadow:12px 0 7px -6px rgba(0,0,0,.05)}.uk-dropbar-right{box-shadow:-12px 0 7px -6px rgba(0,0,0,.05)}.uk-dropnav-dropbar{position:absolute;z-index:980;padding:0;left:0;right:0}.uk-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1010;overflow-y:auto;padding:15px 15px;background:rgba(0,0,0,.6);opacity:0;transition:opacity .15s linear}@media (min-width: 640px){.uk-modal{padding:50px 30px}}@media (min-width: 960px){.uk-modal{padding-left:40px;padding-right:40px}}.uk-modal.uk-open{opacity:1}.uk-modal-page{overflow:hidden}.uk-modal-dialog{position:relative;box-sizing:border-box;margin:0 auto;width:600px;max-width:100% !important;background:#fff;opacity:0;transform:translateY(-100px);transition:.3s linear;transition-property:opacity,transform}.uk-open>.uk-modal-dialog{opacity:1;transform:translateY(0)}.uk-modal-container .uk-modal-dialog{width:1200px}.uk-modal-full{padding:0;background:none}.uk-modal-full .uk-modal-dialog{margin:0;width:100%;max-width:100%;transform:translateY(0)}.uk-modal-body{display:flow-root;padding:20px 20px}.uk-modal-header{display:flow-root;padding:10px 20px;background:#fff;border-bottom:1px solid #e5e5e5}.uk-modal-footer{display:flow-root;padding:10px 20px;background:#fff;border-top:1px solid #e5e5e5}@media (min-width: 640px){.uk-modal-body{padding:30px 30px}.uk-modal-header{padding:15px 30px}.uk-modal-footer{padding:15px 30px}}.uk-modal-body>:last-child,.uk-modal-header>:last-child,.uk-modal-footer>:last-child{margin-bottom:0}.uk-modal-title{font-size:2rem;line-height:1.3}[class*=uk-modal-close-]{position:absolute;z-index:1010;top:10px;right:10px;padding:5px}[class*=uk-modal-close-]:first-child+*{margin-top:0}.uk-modal-close-outside{top:0;right:-5px;transform:translate(0, -100%);color:#fff}.uk-modal-close-outside:hover{color:#fff}@media (min-width: 960px){.uk-modal-close-outside{right:0;transform:translate(100%, -100%)}}.uk-modal-close-full{top:0;right:0;padding:10px;background:#fff}@media (min-width: 960px){.uk-modal-close-full{padding:20px}}.uk-slideshow{-webkit-tap-highlight-color:rgba(0,0,0,0)}.uk-slideshow-items{position:relative;z-index:0;margin:0;padding:0;list-style:none;overflow:hidden;-webkit-touch-callout:none;touch-action:pan-y}.uk-slideshow-items>*{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;will-change:transform,opacity}.uk-slideshow-items>:not(.uk-active){display:none}.uk-slider{-webkit-tap-highlight-color:rgba(0,0,0,0)}.uk-slider-container{overflow:hidden;overflow:clip}.uk-slider-container-offset{margin:-11px -25px -39px -25px;padding:11px 25px 39px 25px}.uk-slider-items{will-change:transform;position:relative;touch-action:pan-y}.uk-slider-items:not(.uk-grid){display:flex;margin:0;padding:0;list-style:none;-webkit-touch-callout:none}.uk-slider-items.uk-grid{flex-wrap:nowrap}.uk-slider-items>*{flex:none !important;box-sizing:border-box;max-width:100%;position:relative}.uk-sticky{position:relative;z-index:980;box-sizing:border-box}.uk-sticky-fixed{margin:0 !important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.uk-sticky[class*=uk-animation-]{animation-duration:.2s}.uk-sticky.uk-animation-reverse{animation-duration:.2s}.uk-sticky-placeholder{pointer-events:none}.uk-offcanvas{display:none;position:fixed;top:0;bottom:0;left:0;z-index:1000}.uk-offcanvas-flip .uk-offcanvas{right:0;left:auto}.uk-offcanvas-bar{--uk-inverse: light;position:absolute;top:0;bottom:0;left:-270px;box-sizing:border-box;width:270px;padding:20px 20px;background:#936;overflow-y:auto}@media (min-width: 640px){.uk-offcanvas-bar{left:-350px;width:350px;padding:30px 30px}}.uk-offcanvas-flip .uk-offcanvas-bar{left:auto;right:-270px}@media (min-width: 640px){.uk-offcanvas-flip .uk-offcanvas-bar{right:-350px}}.uk-open>.uk-offcanvas-bar{left:0}.uk-offcanvas-flip .uk-open>.uk-offcanvas-bar{left:auto;right:0}.uk-offcanvas-bar-animation{transition:left .3s ease-out}.uk-offcanvas-flip .uk-offcanvas-bar-animation{transition-property:right}.uk-offcanvas-reveal{position:absolute;top:0;bottom:0;left:0;width:0;overflow:hidden;transition:width .3s ease-out}.uk-offcanvas-reveal .uk-offcanvas-bar{left:0}.uk-offcanvas-flip .uk-offcanvas-reveal .uk-offcanvas-bar{left:auto;right:0}.uk-open>.uk-offcanvas-reveal{width:270px}@media (min-width: 640px){.uk-open>.uk-offcanvas-reveal{width:350px}}.uk-offcanvas-flip .uk-offcanvas-reveal{right:0;left:auto}.uk-offcanvas-close{position:absolute;z-index:1000;top:5px;right:5px;padding:5px}@media (min-width: 640px){.uk-offcanvas-close{top:10px;right:10px}}.uk-offcanvas-close:first-child+*{margin-top:0}.uk-offcanvas-overlay{width:100vw;touch-action:none}.uk-offcanvas-overlay::before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,.1);opacity:0;transition:opacity .15s linear}.uk-offcanvas-overlay.uk-open::before{opacity:1}.uk-offcanvas-page,.uk-offcanvas-container{overflow-x:hidden;overflow-x:clip}.uk-offcanvas-container{position:relative;left:0;transition:left .3s ease-out;box-sizing:border-box;width:100%}:not(.uk-offcanvas-flip).uk-offcanvas-container-animation{left:270px}.uk-offcanvas-flip.uk-offcanvas-container-animation{left:-270px}@media (min-width: 640px){:not(.uk-offcanvas-flip).uk-offcanvas-container-animation{left:350px}.uk-offcanvas-flip.uk-offcanvas-container-animation{left:-350px}}.uk-switcher{margin:0;padding:0;list-style:none}.uk-switcher>:not(.uk-active){display:none}.uk-switcher>*>:last-child{margin-bottom:0}.uk-leader{overflow:hidden}.uk-leader-fill::after{display:inline-block;margin-left:15px;width:0;content:attr(data-fill);white-space:nowrap}.uk-leader-fill.uk-leader-hide::after{display:none}:root{--uk-leader-fill-content: .}.uk-notification{position:fixed;top:10px;left:10px;z-index:1040;box-sizing:border-box;width:350px}.uk-notification-top-right,.uk-notification-bottom-right{left:auto;right:10px}.uk-notification-top-center,.uk-notification-bottom-center{left:50%;margin-left:-175px}.uk-notification-bottom-left,.uk-notification-bottom-right,.uk-notification-bottom-center{top:auto;bottom:10px}@media (max-width: 639px){.uk-notification{left:10px;right:10px;width:auto;margin:0}}.uk-notification-message{position:relative;padding:15px;background:#f8f8f8;color:#666;font-size:1.25rem;line-height:1.4;cursor:pointer}*+.uk-notification-message{margin-top:10px}.uk-notification-close{display:none;position:absolute;top:20px;right:15px}.uk-notification-message:hover .uk-notification-close{display:block}.uk-notification-message-primary{color:#36c}.uk-notification-message-success{color:#32d296}.uk-notification-message-warning{color:#faa05a}.uk-notification-message-danger{color:#f0506e}.uk-tooltip{display:none;position:absolute;z-index:1030;--uk-position-offset: 10px;--uk-position-viewport-offset: 10;top:0;box-sizing:border-box;max-width:200px;padding:3px 6px;background:#666;border-radius:2px;color:#fff;font-size:12px}.uk-tooltip.uk-active{display:block}.uk-sortable{position:relative}.uk-sortable>:last-child{margin-bottom:0}.uk-sortable-drag{position:fixed !important;z-index:1050 !important;pointer-events:none}.uk-sortable-placeholder{opacity:0;pointer-events:none}.uk-sortable-empty{min-height:50px}.uk-sortable-handle:hover{cursor:move}.uk-countdown-number{font-variant-numeric:tabular-nums;font-size:2rem;line-height:.8}@media (min-width: 640px){.uk-countdown-number{font-size:4rem}}@media (min-width: 960px){.uk-countdown-number{font-size:6rem}}.uk-countdown-separator{font-size:1rem;line-height:1.6}@media (min-width: 640px){.uk-countdown-separator{font-size:2rem}}@media (min-width: 960px){.uk-countdown-separator{font-size:3rem}}.uk-thumbnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-15px}.uk-thumbnav>*{padding-left:15px}.uk-thumbnav>*>*{display:inline-block;position:relative}.uk-thumbnav>*>*::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-image:linear-gradient(180deg, rgba(255,255,255,0), rgba(255,255,255,.4));transition:opacity .1s ease-in-out}.uk-thumbnav>*>:hover::after{opacity:0}.uk-thumbnav>.uk-active>*::after{opacity:0}.uk-thumbnav-vertical{flex-direction:column;margin-left:0;margin-top:-15px}.uk-thumbnav-vertical>*{padding-left:0;padding-top:15px}.uk-iconnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-10px}.uk-iconnav>*{padding-left:10px}.uk-iconnav>*>a{display:flex;align-items:center;column-gap:.25em;line-height:0;color:#36d;text-decoration:none;font-size:.875rem;transition:.1s ease-in-out;transition-property:color,background-color}.uk-iconnav>*>a:hover{color:#c09}.uk-iconnav>.uk-active>a{color:#666}.uk-iconnav-vertical{flex-direction:column;margin-left:0;margin-top:-10px}.uk-iconnav-vertical>*{padding-left:0;padding-top:10px}.uk-grid{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.uk-grid>*{margin:0}.uk-grid>*>:last-child{margin-bottom:0}.uk-grid{margin-left:-30px}.uk-grid>*{padding-left:30px}.uk-grid+.uk-grid,.uk-grid>.uk-grid-margin,*+.uk-grid-margin{margin-top:30px}@media (min-width: 1200px){.uk-grid{margin-left:-40px}.uk-grid>*{padding-left:40px}.uk-grid+.uk-grid,.uk-grid>.uk-grid-margin,*+.uk-grid-margin{margin-top:40px}}.uk-grid-small,.uk-grid-column-small{margin-left:-15px}.uk-grid-small>*,.uk-grid-column-small>*{padding-left:15px}.uk-grid+.uk-grid-small,.uk-grid+.uk-grid-row-small,.uk-grid-small>.uk-grid-margin,.uk-grid-row-small>.uk-grid-margin,*+.uk-grid-margin-small{margin-top:15px}.uk-grid-medium,.uk-grid-column-medium{margin-left:-30px}.uk-grid-medium>*,.uk-grid-column-medium>*{padding-left:30px}.uk-grid+.uk-grid-medium,.uk-grid+.uk-grid-row-medium,.uk-grid-medium>.uk-grid-margin,.uk-grid-row-medium>.uk-grid-margin,*+.uk-grid-margin-medium{margin-top:30px}.uk-grid-large,.uk-grid-column-large{margin-left:-40px}.uk-grid-large>*,.uk-grid-column-large>*{padding-left:40px}.uk-grid+.uk-grid-large,.uk-grid+.uk-grid-row-large,.uk-grid-large>.uk-grid-margin,.uk-grid-row-large>.uk-grid-margin,*+.uk-grid-margin-large{margin-top:40px}@media (min-width: 1200px){.uk-grid-large,.uk-grid-column-large{margin-left:-70px}.uk-grid-large>*,.uk-grid-column-large>*{padding-left:70px}.uk-grid+.uk-grid-large,.uk-grid+.uk-grid-row-large,.uk-grid-large>.uk-grid-margin,.uk-grid-row-large>.uk-grid-margin,*+.uk-grid-margin-large{margin-top:70px}}.uk-grid-collapse,.uk-grid-column-collapse{margin-left:0}.uk-grid-collapse>*,.uk-grid-column-collapse>*{padding-left:0}.uk-grid+.uk-grid-collapse,.uk-grid+.uk-grid-row-collapse,.uk-grid-collapse>.uk-grid-margin,.uk-grid-row-collapse>.uk-grid-margin{margin-top:0}.uk-grid-divider>*{position:relative}.uk-grid-divider>:not(.uk-first-column)::before{content:"";position:absolute;top:0;bottom:0;border-left:1px solid #e5e5e5}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{content:"";position:absolute;left:0;right:0;border-top:1px solid #e5e5e5}.uk-grid-divider{margin-left:-60px}.uk-grid-divider>*{padding-left:60px}.uk-grid-divider>:not(.uk-first-column)::before{left:30px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin{margin-top:60px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{top:-30px;left:60px}@media (min-width: 1200px){.uk-grid-divider{margin-left:-80px}.uk-grid-divider>*{padding-left:80px}.uk-grid-divider>:not(.uk-first-column)::before{left:40px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin{margin-top:80px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{top:-40px;left:80px}}.uk-grid-divider.uk-grid-small,.uk-grid-divider.uk-grid-column-small{margin-left:-30px}.uk-grid-divider.uk-grid-small>*,.uk-grid-divider.uk-grid-column-small>*{padding-left:30px}.uk-grid-divider.uk-grid-small>:not(.uk-first-column)::before,.uk-grid-divider.uk-grid-column-small>:not(.uk-first-column)::before{left:15px}.uk-grid-divider.uk-grid-small.uk-grid-stack>.uk-grid-margin,.uk-grid-divider.uk-grid-row-small.uk-grid-stack>.uk-grid-margin{margin-top:30px}.uk-grid-divider.uk-grid-small.uk-grid-stack>.uk-grid-margin::before{top:-15px;left:30px}.uk-grid-divider.uk-grid-row-small.uk-grid-stack>.uk-grid-margin::before{top:-15px}.uk-grid-divider.uk-grid-column-small.uk-grid-stack>.uk-grid-margin::before{left:30px}.uk-grid-divider.uk-grid-medium,.uk-grid-divider.uk-grid-column-medium{margin-left:-60px}.uk-grid-divider.uk-grid-medium>*,.uk-grid-divider.uk-grid-column-medium>*{padding-left:60px}.uk-grid-divider.uk-grid-medium>:not(.uk-first-column)::before,.uk-grid-divider.uk-grid-column-medium>:not(.uk-first-column)::before{left:30px}.uk-grid-divider.uk-grid-medium.uk-grid-stack>.uk-grid-margin,.uk-grid-divider.uk-grid-row-medium.uk-grid-stack>.uk-grid-margin{margin-top:60px}.uk-grid-divider.uk-grid-medium.uk-grid-stack>.uk-grid-margin::before{top:-30px;left:60px}.uk-grid-divider.uk-grid-row-medium.uk-grid-stack>.uk-grid-margin::before{top:-30px}.uk-grid-divider.uk-grid-column-medium.uk-grid-stack>.uk-grid-margin::before{left:60px}.uk-grid-divider.uk-grid-large,.uk-grid-divider.uk-grid-column-large{margin-left:-80px}.uk-grid-divider.uk-grid-large>*,.uk-grid-divider.uk-grid-column-large>*{padding-left:80px}.uk-grid-divider.uk-grid-large>:not(.uk-first-column)::before,.uk-grid-divider.uk-grid-column-large>:not(.uk-first-column)::before{left:40px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin,.uk-grid-divider.uk-grid-row-large.uk-grid-stack>.uk-grid-margin{margin-top:80px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin::before{top:-40px;left:80px}.uk-grid-divider.uk-grid-row-large.uk-grid-stack>.uk-grid-margin::before{top:-40px}.uk-grid-divider.uk-grid-column-large.uk-grid-stack>.uk-grid-margin::before{left:80px}@media (min-width: 1200px){.uk-grid-divider.uk-grid-large,.uk-grid-divider.uk-grid-column-large{margin-left:-140px}.uk-grid-divider.uk-grid-large>*,.uk-grid-divider.uk-grid-column-large>*{padding-left:140px}.uk-grid-divider.uk-grid-large>:not(.uk-first-column)::before,.uk-grid-divider.uk-grid-column-large>:not(.uk-first-column)::before{left:70px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin,.uk-grid-divider.uk-grid-row-large.uk-grid-stack>.uk-grid-margin{margin-top:140px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin::before{top:-70px;left:140px}.uk-grid-divider.uk-grid-row-large.uk-grid-stack>.uk-grid-margin::before{top:-70px}.uk-grid-divider.uk-grid-column-large.uk-grid-stack>.uk-grid-margin::before{left:140px}}.uk-grid-match>*,.uk-grid-item-match{display:flex;flex-wrap:wrap}.uk-grid-match>*>:not([class*=uk-width]),.uk-grid-item-match>:not([class*=uk-width]){box-sizing:border-box;width:100%;flex:auto}.uk-nav,.uk-nav ul{margin:0;padding:0;list-style:none}.uk-nav li>a{display:flex;align-items:center;column-gap:.25em;text-decoration:none}.uk-nav>li>a{padding:5px 0}ul.uk-nav-sub{padding:5px 0 5px 15px}.uk-nav-sub ul{padding-left:15px}.uk-nav-sub a{padding:2px 0}.uk-nav-parent-icon{margin-left:auto;transition:transform .3s ease-out}.uk-nav>li.uk-open>a .uk-nav-parent-icon{transform:rotateX(180deg)}.uk-nav-header{padding:5px 0;text-transform:uppercase;font-size:.875rem}.uk-nav-header:not(:first-child){margin-top:20px}.uk-nav .uk-nav-divider{margin:5px 0}.uk-nav-default{font-size:.875rem;line-height:1.5}.uk-nav-default>li>a{color:#999}.uk-nav-default>li>a:hover{color:#666}.uk-nav-default>li.uk-active>a{color:#333}.uk-nav-default .uk-nav-subtitle{font-size:12px}.uk-nav-default .uk-nav-header{color:#333}.uk-nav-default .uk-nav-divider{border-top:1px solid #e5e5e5}.uk-nav-default .uk-nav-sub{font-size:.875rem;line-height:1.5}.uk-nav-default .uk-nav-sub a{color:#999}.uk-nav-default .uk-nav-sub a:hover{color:#666}.uk-nav-default .uk-nav-sub li.uk-active>a{color:#333}.uk-nav-primary{font-size:1.5rem;line-height:1.5}.uk-nav-primary>li>a{color:#999}.uk-nav-primary>li>a:hover{color:#666}.uk-nav-primary>li.uk-active>a{color:#333}.uk-nav-primary .uk-nav-subtitle{font-size:1.25rem}.uk-nav-primary .uk-nav-header{color:#333}.uk-nav-primary .uk-nav-divider{border-top:1px solid #e5e5e5}.uk-nav-primary .uk-nav-sub{font-size:1.25rem;line-height:1.5}.uk-nav-primary .uk-nav-sub a{color:#999}.uk-nav-primary .uk-nav-sub a:hover{color:#666}.uk-nav-primary .uk-nav-sub li.uk-active>a{color:#333}.uk-nav-secondary{font-size:16px;line-height:1.5}.uk-nav-secondary>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider){margin-top:0}.uk-nav-secondary>li>a{color:#333;padding:10px 10px}.uk-nav-secondary>li>a:hover{color:#333;background-color:#f8f8f8}.uk-nav-secondary>li.uk-active>a{color:#333;background-color:#f8f8f8}.uk-nav-secondary .uk-nav-subtitle{font-size:.875rem;color:#999}.uk-nav-secondary>li>a:hover .uk-nav-subtitle{color:#666}.uk-nav-secondary>li.uk-active>a .uk-nav-subtitle{color:#333}.uk-nav-secondary .uk-nav-header{color:#333}.uk-nav-secondary .uk-nav-divider{border-top:1px solid #e5e5e5}.uk-nav-secondary .uk-nav-sub{font-size:.875rem;line-height:1.5}.uk-nav-secondary .uk-nav-sub a{color:#999}.uk-nav-secondary .uk-nav-sub a:hover{color:#666}.uk-nav-secondary .uk-nav-sub li.uk-active>a{color:#333}.uk-nav-medium{font-size:2.8875rem;line-height:1}.uk-nav-large{font-size:3.4rem;line-height:1}.uk-nav-xlarge{font-size:4rem;line-height:1}@media (min-width: 960px){.uk-nav-medium{font-size:3.5rem}.uk-nav-large{font-size:4rem}.uk-nav-xlarge{font-size:6rem}}@media (min-width: 1200px){.uk-nav-medium{font-size:4rem}.uk-nav-large{font-size:6rem}.uk-nav-xlarge{font-size:8rem}}.uk-nav-center{text-align:center}.uk-nav-center li>a{justify-content:center}.uk-nav-center .uk-nav-sub,.uk-nav-center .uk-nav-sub ul{padding-left:0}.uk-nav-center .uk-nav-parent-icon{margin-left:.25em}.uk-nav.uk-nav-divider>:not(.uk-nav-header,.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider){margin-top:5px;padding-top:5px;border-top:1px solid #e5e5e5}.uk-navbar{display:flex;position:relative}.uk-navbar-container:not(.uk-navbar-transparent){background:#f8f8f8}.uk-navbar-left,.uk-navbar-right,[class*=uk-navbar-center]{display:flex;gap:15px;align-items:center}.uk-navbar-right{margin-left:auto}.uk-navbar-center:only-child{margin-left:auto;margin-right:auto;position:relative}.uk-navbar-center:not(:only-child){position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:max-content;box-sizing:border-box;z-index:990}.uk-navbar-center-left,.uk-navbar-center-right{position:absolute;top:0}.uk-navbar-center-left{right:calc(100% + 15px)}.uk-navbar-center-right{left:calc(100% + 15px)}[class*=uk-navbar-center-]{width:max-content;box-sizing:border-box}.uk-navbar-nav{display:flex;gap:15px;margin:0;padding:0;list-style:none}.uk-navbar-left,.uk-navbar-right,.uk-navbar-center:only-child{flex-wrap:wrap}.uk-navbar-nav>li>a,.uk-navbar-item,.uk-navbar-toggle{display:flex;justify-content:center;align-items:center;column-gap:.25em;box-sizing:border-box;min-height:80px;font-size:.875rem;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";text-decoration:none}.uk-navbar-nav>li>a{padding:0 0;color:#36d;text-transform:uppercase;transition:.1s ease-in-out;transition-property:color,background-color}.uk-navbar-nav>li:hover>a,.uk-navbar-nav>li>a[aria-expanded=true]{color:#c09}.uk-navbar-nav>li>a:active{color:#333}.uk-navbar-nav>li.uk-active>a{color:#333}.uk-navbar-parent-icon{margin-left:4px;transition:transform .3s ease-out}.uk-navbar-nav>li>a[aria-expanded=true] .uk-navbar-parent-icon{transform:rotateX(180deg)}.uk-navbar-item{padding:0 0;color:#666}.uk-navbar-item>:last-child{margin-bottom:0}.uk-navbar-toggle{padding:0 0;color:#999}.uk-navbar-toggle:hover,.uk-navbar-toggle[aria-expanded=true]{color:#666;text-decoration:none}.uk-navbar-subtitle{font-size:.875rem}.uk-navbar-justify .uk-navbar-left,.uk-navbar-justify .uk-navbar-right,.uk-navbar-justify .uk-navbar-nav,.uk-navbar-justify .uk-navbar-nav>li,.uk-navbar-justify .uk-navbar-item,.uk-navbar-justify .uk-navbar-toggle{flex-grow:1}.uk-navbar-dropdown{--uk-position-offset: 15px;--uk-position-shift-offset: 0;--uk-position-viewport-offset: 15px;--uk-inverse: dark;width:200px;padding:25px;background:#fff;color:#666;box-shadow:0 5px 12px rgba(0,0,0,.15)}.uk-navbar-dropdown>:last-child{margin-bottom:0}.uk-navbar-dropdown :focus-visible{outline-color:#333 !important}.uk-navbar-dropdown .uk-drop-grid{margin-left:-30px}.uk-navbar-dropdown .uk-drop-grid>*{padding-left:30px}.uk-navbar-dropdown .uk-drop-grid>.uk-grid-margin{margin-top:30px}.uk-navbar-dropdown-width-2:not(.uk-drop-stack){width:400px}.uk-navbar-dropdown-width-3:not(.uk-drop-stack){width:600px}.uk-navbar-dropdown-width-4:not(.uk-drop-stack){width:800px}.uk-navbar-dropdown-width-5:not(.uk-drop-stack){width:1000px}.uk-navbar-dropdown-large{--uk-position-shift-offset: 0;padding:40px}.uk-navbar-dropdown-dropbar{width:auto;background:rgba(0,0,0,0);padding:25px 0 25px 0;--uk-position-offset: 0;--uk-position-shift-offset: 0;--uk-position-viewport-offset: 15px;box-shadow:none}@media (min-width: 640px){.uk-navbar-dropdown-dropbar{--uk-position-viewport-offset: 30px}}@media (min-width: 960px){.uk-navbar-dropdown-dropbar{--uk-position-viewport-offset: 40px}}.uk-navbar-dropdown-dropbar-large{--uk-position-shift-offset: 0;padding-top:40px;padding-bottom:40px}.uk-navbar-dropdown-nav{font-size:.875rem}.uk-navbar-dropdown-nav>li>a{color:#999}.uk-navbar-dropdown-nav>li>a:hover{color:#666}.uk-navbar-dropdown-nav>li.uk-active>a{color:#333}.uk-navbar-dropdown-nav .uk-nav-subtitle{font-size:12px}.uk-navbar-dropdown-nav .uk-nav-header{color:#333}.uk-navbar-dropdown-nav .uk-nav-divider{border-top:1px solid #e5e5e5}.uk-navbar-dropdown-nav .uk-nav-sub a{color:#999}.uk-navbar-dropdown-nav .uk-nav-sub a:hover{color:#666}.uk-navbar-dropdown-nav .uk-nav-sub li.uk-active>a{color:#333}.uk-navbar-container{transition:.1s ease-in-out;transition-property:background-color}@media (min-width: 960px){.uk-navbar-left,.uk-navbar-right,[class*=uk-navbar-center]{gap:30px}.uk-navbar-center-left{right:calc(100% + 30px)}.uk-navbar-center-right{left:calc(100% + 30px)}}@media (min-width: 960px){.uk-navbar-nav{gap:30px}}.uk-subnav{display:flex;flex-wrap:wrap;align-items:center;margin-left:-20px;padding:0;list-style:none}.uk-subnav>*{flex:none;padding-left:20px;position:relative}.uk-subnav>*>:first-child{display:flex;align-items:center;column-gap:.25em;color:#999;font-size:.875rem;text-transform:uppercase;transition:.1s ease-in-out;transition-property:color,background-color}.uk-subnav>*>a:hover{color:#666;text-decoration:none}.uk-subnav>.uk-active>a{color:#333}.uk-subnav-divider{margin-left:-41px}.uk-subnav-divider>*{display:flex;align-items:center}.uk-subnav-divider>::before{content:"";height:1.5em;margin-left:0px;margin-right:20px;border-left:1px solid rgba(0,0,0,0)}.uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before{border-left-color:#e5e5e5}.uk-subnav-pill>*>:first-child{padding:5px 10px;background:rgba(0,0,0,0);color:#999}.uk-subnav-pill>*>a:hover{background-color:#f8f8f8;color:#666}.uk-subnav-pill>*>a:active{background-color:#f8f8f8;color:#666}.uk-subnav-pill>.uk-active>a{background-color:#36c;color:#fff}.uk-subnav>.uk-disabled>a{color:#999}.uk-breadcrumb{padding:0;list-style:none}.uk-breadcrumb>*{display:contents}.uk-breadcrumb>*>*{font-size:.875rem;color:#999}.uk-breadcrumb>*>:hover{color:#666;text-decoration:none}.uk-breadcrumb>:last-child>span,.uk-breadcrumb>:last-child>a:not([href]){color:#666}.uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before{content:"/";display:inline-block;margin:0 20px 0 calc(20px - 4px);font-size:.875rem;color:#999}.uk-pagination{display:flex;flex-wrap:wrap;align-items:center;margin-left:0;padding:0;list-style:none}.uk-pagination>*{flex:none;padding-left:0;position:relative}.uk-pagination>*>*{display:flex;align-items:center;column-gap:.25em;padding:5px 10px;color:#999;transition:color .1s ease-in-out}.uk-pagination>*>:hover{color:#666;text-decoration:none}.uk-pagination>.uk-active>*{color:#666}.uk-pagination>.uk-disabled>*{color:#999}.uk-tab{display:flex;flex-wrap:wrap;margin-left:-20px;padding:0;list-style:none;position:relative}.uk-tab::before{content:"";position:absolute;bottom:0;left:20px;right:0;border-bottom:1px solid #e5e5e5}.uk-tab>*{flex:none;padding-left:20px;position:relative}.uk-tab>*>a{display:flex;align-items:center;column-gap:.25em;justify-content:center;padding:5px 10px;color:#999;border-bottom:1px solid rgba(0,0,0,0);font-size:.875rem;text-transform:uppercase;transition:color .1s ease-in-out}.uk-tab>*>a:hover{color:#666;text-decoration:none}.uk-tab>.uk-active>a{color:#333;border-color:#36c}.uk-tab>.uk-disabled>a{color:#999}.uk-tab-bottom::before{top:0;bottom:auto}.uk-tab-bottom>*>a{border-top:1px solid rgba(0,0,0,0);border-bottom:none}.uk-tab-left,.uk-tab-right{flex-direction:column;margin-left:0}.uk-tab-left>*,.uk-tab-right>*{padding-left:0}.uk-tab-left::before{top:0;bottom:0;left:auto;right:0;border-left:1px solid #e5e5e5;border-bottom:none}.uk-tab-right::before{top:0;bottom:0;left:0;right:auto;border-left:1px solid #e5e5e5;border-bottom:none}.uk-tab-left>*>a{justify-content:left;border-right:1px solid rgba(0,0,0,0);border-bottom:none}.uk-tab-right>*>a{justify-content:left;border-left:1px solid rgba(0,0,0,0);border-bottom:none}.uk-tab .uk-dropdown{margin-left:30px}.uk-slidenav{padding:5px 10px;color:rgba(102,102,102,.5);transition:color .1s ease-in-out}.uk-slidenav:hover{color:rgba(102,102,102,.9)}.uk-slidenav:active{color:rgba(102,102,102,.5)}.uk-slidenav-large{padding:10px 10px}.uk-slidenav-container{display:flex}.uk-dotnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-12px}.uk-dotnav>*{flex:none;padding-left:12px}.uk-dotnav>*>*{display:block;box-sizing:border-box;width:10px;height:10px;border-radius:50%;background:rgba(0,0,0,0);text-indent:100%;overflow:hidden;white-space:nowrap;border:1px solid rgba(102,102,102,.4);transition:.2s ease-in-out;transition-property:background-color,border-color}.uk-dotnav>*>:hover{background-color:rgba(102,102,102,.6);border-color:rgba(0,0,0,0)}.uk-dotnav>*>:active{background-color:rgba(102,102,102,.2);border-color:rgba(0,0,0,0)}.uk-dotnav>.uk-active>*{background-color:rgba(102,102,102,.6);border-color:rgba(0,0,0,0)}.uk-dotnav-vertical{flex-direction:column;margin-left:0;margin-top:-12px}.uk-dotnav-vertical>*{padding-left:0;padding-top:12px}.uk-dropdown{--uk-position-offset: 10px;--uk-position-viewport-offset: 15px;--uk-inverse: dark;width:auto;min-width:200px;padding:25px;background:#fff;color:#666;box-shadow:0 5px 12px rgba(0,0,0,.15)}.uk-dropdown>:last-child{margin-bottom:0}.uk-dropdown :focus-visible{outline-color:#333 !important}.uk-dropdown-large{padding:40px}.uk-dropdown-dropbar{width:auto;background:rgba(0,0,0,0);padding:5px 0 25px 0;--uk-position-viewport-offset: 15px;box-shadow:none}@media (min-width: 640px){.uk-dropdown-dropbar{--uk-position-viewport-offset: 30px}}@media (min-width: 960px){.uk-dropdown-dropbar{--uk-position-viewport-offset: 40px}}.uk-dropdown-dropbar-large{padding-top:40px;padding-bottom:40px}.uk-dropdown-nav{font-size:.875rem}.uk-dropdown-nav>li>a{color:#999}.uk-dropdown-nav>li>a:hover,.uk-dropdown-nav>li.uk-active>a{color:#666}.uk-dropdown-nav .uk-nav-subtitle{font-size:12px}.uk-dropdown-nav .uk-nav-header{color:#333}.uk-dropdown-nav .uk-nav-divider{border-top:1px solid #e5e5e5}.uk-dropdown-nav .uk-nav-sub a{color:#999}.uk-dropdown-nav .uk-nav-sub a:hover,.uk-dropdown-nav .uk-nav-sub li.uk-active>a{color:#666}.uk-lightbox{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1010;background:#000;opacity:0;transition:opacity .15s linear;touch-action:pinch-zoom}.uk-lightbox.uk-open{display:block;opacity:1}.uk-lightbox :focus-visible{outline-color:rgba(255,255,255,.7)}.uk-lightbox-page{overflow:hidden}.uk-lightbox-items>*{position:absolute;top:0;right:0;bottom:0;left:0;display:none;justify-content:center;align-items:center;color:rgba(255,255,255,.7);will-change:transform,opacity}.uk-lightbox-items>*>*{max-width:100vw;max-height:100vh}.uk-lightbox-items>*>:not(iframe){width:auto;height:auto}.uk-lightbox-items>.uk-active{display:flex}.uk-lightbox-toolbar{padding:10px 10px;background:rgba(0,0,0,.3);color:rgba(255,255,255,.7)}.uk-lightbox-toolbar>*{color:rgba(255,255,255,.7)}.uk-lightbox-toolbar-icon{padding:5px;color:rgba(255,255,255,.7)}.uk-lightbox-toolbar-icon:hover{color:#fff}.uk-lightbox-button{box-sizing:border-box;width:50px;height:50px;background:rgba(0,0,0,.3);color:rgba(255,255,255,.7);display:inline-flex;justify-content:center;align-items:center}.uk-lightbox-button:hover{color:#fff}.uk-lightbox-caption:empty{display:none}.uk-lightbox-iframe{width:80%;height:80%}[class*=uk-animation-]{animation:.5s ease-out both}.uk-animation-fade{animation-name:uk-fade;animation-duration:.8s;animation-timing-function:linear}.uk-animation-scale-up{animation-name:uk-fade,uk-scale-up}.uk-animation-scale-down{animation-name:uk-fade,uk-scale-down}.uk-animation-slide-top{animation-name:uk-fade,uk-slide-top}.uk-animation-slide-bottom{animation-name:uk-fade,uk-slide-bottom}.uk-animation-slide-left{animation-name:uk-fade,uk-slide-left}.uk-animation-slide-right{animation-name:uk-fade,uk-slide-right}.uk-animation-slide-top-small{animation-name:uk-fade,uk-slide-top-small}.uk-animation-slide-bottom-small{animation-name:uk-fade,uk-slide-bottom-small}.uk-animation-slide-left-small{animation-name:uk-fade,uk-slide-left-small}.uk-animation-slide-right-small{animation-name:uk-fade,uk-slide-right-small}.uk-animation-slide-top-medium{animation-name:uk-fade,uk-slide-top-medium}.uk-animation-slide-bottom-medium{animation-name:uk-fade,uk-slide-bottom-medium}.uk-animation-slide-left-medium{animation-name:uk-fade,uk-slide-left-medium}.uk-animation-slide-right-medium{animation-name:uk-fade,uk-slide-right-medium}.uk-animation-kenburns{animation-name:uk-kenburns;animation-duration:15s}.uk-animation-shake{animation-name:uk-shake}.uk-animation-stroke{animation-name:uk-stroke;animation-duration:2s;stroke-dasharray:var(--uk-animation-stroke)}.uk-animation-reverse{animation-direction:reverse;animation-timing-function:ease-in}.uk-animation-fast{animation-duration:.1s}.uk-animation-toggle:not(:hover):not(:focus) [class*=uk-animation-]{animation-name:none}@keyframes uk-fade{0%{opacity:0}100%{opacity:1}}@keyframes uk-scale-up{0%{transform:scale(.9)}100%{transform:scale(1)}}@keyframes uk-scale-down{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes uk-slide-top{0%{transform:translateY(-100%)}100%{transform:translateY(0)}}@keyframes uk-slide-bottom{0%{transform:translateY(100%)}100%{transform:translateY(0)}}@keyframes uk-slide-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes uk-slide-right{0%{transform:translateX(100%)}100%{transform:translateX(0)}}@keyframes uk-slide-top-small{0%{transform:translateY(-10px)}100%{transform:translateY(0)}}@keyframes uk-slide-bottom-small{0%{transform:translateY(10px)}100%{transform:translateY(0)}}@keyframes uk-slide-left-small{0%{transform:translateX(-10px)}100%{transform:translateX(0)}}@keyframes uk-slide-right-small{0%{transform:translateX(10px)}100%{transform:translateX(0)}}@keyframes uk-slide-top-medium{0%{transform:translateY(-50px)}100%{transform:translateY(0)}}@keyframes uk-slide-bottom-medium{0%{transform:translateY(50px)}100%{transform:translateY(0)}}@keyframes uk-slide-left-medium{0%{transform:translateX(-50px)}100%{transform:translateX(0)}}@keyframes uk-slide-right-medium{0%{transform:translateX(50px)}100%{transform:translateX(0)}}@keyframes uk-kenburns{0%{transform:scale(1)}100%{transform:scale(1.2)}}@keyframes uk-shake{0%, 100%{transform:translateX(0)}10%{transform:translateX(-9px)}20%{transform:translateX(8px)}30%{transform:translateX(-7px)}40%{transform:translateX(6px)}50%{transform:translateX(-5px)}60%{transform:translateX(4px)}70%{transform:translateX(-3px)}80%{transform:translateX(2px)}90%{transform:translateX(-1px)}}@keyframes uk-stroke{0%{stroke-dashoffset:var(--uk-animation-stroke)}100%{stroke-dashoffset:0}}[class*=uk-child-width]>*{box-sizing:border-box;width:100%}.uk-child-width-1-2>*{width:50%}.uk-child-width-1-3>*{width:calc(100% / 3)}.uk-child-width-1-4>*{width:25%}.uk-child-width-1-5>*{width:20%}.uk-child-width-1-6>*{width:calc(100% / 6)}.uk-child-width-auto>*{width:auto}.uk-child-width-expand>:not([class*=uk-width]){flex:1;min-width:1px}@media (min-width: 640px){.uk-child-width-1-1\@s>*{width:100%}.uk-child-width-1-2\@s>*{width:50%}.uk-child-width-1-3\@s>*{width:calc(100% / 3)}.uk-child-width-1-4\@s>*{width:25%}.uk-child-width-1-5\@s>*{width:20%}.uk-child-width-1-6\@s>*{width:calc(100% / 6)}.uk-child-width-auto\@s>*{width:auto}.uk-child-width-expand\@s>:not([class*=uk-width]){flex:1;min-width:1px}.uk-child-width-1-1\@s>:not([class*=uk-width]),.uk-child-width-1-2\@s>:not([class*=uk-width]),.uk-child-width-1-3\@s>:not([class*=uk-width]),.uk-child-width-1-4\@s>:not([class*=uk-width]),.uk-child-width-1-5\@s>:not([class*=uk-width]),.uk-child-width-1-6\@s>:not([class*=uk-width]),.uk-child-width-auto\@s>:not([class*=uk-width]){flex:initial}}@media (min-width: 960px){.uk-child-width-1-1\@m>*{width:100%}.uk-child-width-1-2\@m>*{width:50%}.uk-child-width-1-3\@m>*{width:calc(100% / 3)}.uk-child-width-1-4\@m>*{width:25%}.uk-child-width-1-5\@m>*{width:20%}.uk-child-width-1-6\@m>*{width:calc(100% / 6)}.uk-child-width-auto\@m>*{width:auto}.uk-child-width-expand\@m>:not([class*=uk-width]){flex:1;min-width:1px}.uk-child-width-1-1\@m>:not([class*=uk-width]),.uk-child-width-1-2\@m>:not([class*=uk-width]),.uk-child-width-1-3\@m>:not([class*=uk-width]),.uk-child-width-1-4\@m>:not([class*=uk-width]),.uk-child-width-1-5\@m>:not([class*=uk-width]),.uk-child-width-1-6\@m>:not([class*=uk-width]),.uk-child-width-auto\@m>:not([class*=uk-width]){flex:initial}}@media (min-width: 1200px){.uk-child-width-1-1\@l>*{width:100%}.uk-child-width-1-2\@l>*{width:50%}.uk-child-width-1-3\@l>*{width:calc(100% / 3)}.uk-child-width-1-4\@l>*{width:25%}.uk-child-width-1-5\@l>*{width:20%}.uk-child-width-1-6\@l>*{width:calc(100% / 6)}.uk-child-width-auto\@l>*{width:auto}.uk-child-width-expand\@l>:not([class*=uk-width]){flex:1;min-width:1px}.uk-child-width-1-1\@l>:not([class*=uk-width]),.uk-child-width-1-2\@l>:not([class*=uk-width]),.uk-child-width-1-3\@l>:not([class*=uk-width]),.uk-child-width-1-4\@l>:not([class*=uk-width]),.uk-child-width-1-5\@l>:not([class*=uk-width]),.uk-child-width-1-6\@l>:not([class*=uk-width]),.uk-child-width-auto\@l>:not([class*=uk-width]){flex:initial}}@media (min-width: 1600px){.uk-child-width-1-1\@xl>*{width:100%}.uk-child-width-1-2\@xl>*{width:50%}.uk-child-width-1-3\@xl>*{width:calc(100% / 3)}.uk-child-width-1-4\@xl>*{width:25%}.uk-child-width-1-5\@xl>*{width:20%}.uk-child-width-1-6\@xl>*{width:calc(100% / 6)}.uk-child-width-auto\@xl>*{width:auto}.uk-child-width-expand\@xl>:not([class*=uk-width]){flex:1;min-width:1px}.uk-child-width-1-1\@xl>:not([class*=uk-width]),.uk-child-width-1-2\@xl>:not([class*=uk-width]),.uk-child-width-1-3\@xl>:not([class*=uk-width]),.uk-child-width-1-4\@xl>:not([class*=uk-width]),.uk-child-width-1-5\@xl>:not([class*=uk-width]),.uk-child-width-1-6\@xl>:not([class*=uk-width]),.uk-child-width-auto\@xl>:not([class*=uk-width]){flex:initial}}[class*=uk-width]{box-sizing:border-box;width:100%;max-width:100%}.uk-width-1-2{width:50%}.uk-width-1-3{width:calc(100% / 3)}.uk-width-2-3{width:calc(200% / 3)}.uk-width-1-4{width:25%}.uk-width-3-4{width:75%}.uk-width-1-5{width:20%}.uk-width-2-5{width:40%}.uk-width-3-5{width:60%}.uk-width-4-5{width:80%}.uk-width-1-6{width:calc(100% / 6)}.uk-width-5-6{width:calc(500% / 6)}.uk-width-small{width:150px}.uk-width-medium{width:300px}.uk-width-large{width:450px}.uk-width-xlarge{width:600px}.uk-width-2xlarge{width:750px}.uk-width-auto{width:auto}.uk-width-expand{flex:1;min-width:1px}@media (min-width: 640px){.uk-width-1-1\@s{width:100%}.uk-width-1-2\@s{width:50%}.uk-width-1-3\@s{width:calc(100% / 3)}.uk-width-2-3\@s{width:calc(200% / 3)}.uk-width-1-4\@s{width:25%}.uk-width-3-4\@s{width:75%}.uk-width-1-5\@s{width:20%}.uk-width-2-5\@s{width:40%}.uk-width-3-5\@s{width:60%}.uk-width-4-5\@s{width:80%}.uk-width-1-6\@s{width:calc(100% / 6)}.uk-width-5-6\@s{width:calc(500% / 6)}.uk-width-small\@s{width:150px}.uk-width-medium\@s{width:300px}.uk-width-large\@s{width:450px}.uk-width-xlarge\@s{width:600px}.uk-width-2xlarge\@s{width:750px}.uk-width-auto\@s{width:auto}.uk-width-expand\@s{flex:1;min-width:1px}.uk-width-1-1\@s,.uk-width-1-2\@s,.uk-width-1-3\@s,.uk-width-2-3\@s,.uk-width-1-4\@s,.uk-width-3-4\@s,.uk-width-1-5\@s,.uk-width-2-5\@s,.uk-width-3-5\@s,.uk-width-4-5\@s,.uk-width-1-6\@s,.uk-width-5-6\@s,.uk-width-small\@s,.uk-width-medium\@s,.uk-width-large\@s,.uk-width-xlarge\@s,.uk-width-2xlarge\@s,.uk-width-auto\@s{flex:initial}}@media (min-width: 960px){.uk-width-1-1\@m{width:100%}.uk-width-1-2\@m{width:50%}.uk-width-1-3\@m{width:calc(100% / 3)}.uk-width-2-3\@m{width:calc(200% / 3)}.uk-width-1-4\@m{width:25%}.uk-width-3-4\@m{width:75%}.uk-width-1-5\@m{width:20%}.uk-width-2-5\@m{width:40%}.uk-width-3-5\@m{width:60%}.uk-width-4-5\@m{width:80%}.uk-width-1-6\@m{width:calc(100% / 6)}.uk-width-5-6\@m{width:calc(500% / 6)}.uk-width-small\@m{width:150px}.uk-width-medium\@m{width:300px}.uk-width-large\@m{width:450px}.uk-width-xlarge\@m{width:600px}.uk-width-2xlarge\@m{width:750px}.uk-width-auto\@m{width:auto}.uk-width-expand\@m{flex:1;min-width:1px}.uk-width-1-1\@m,.uk-width-1-2\@m,.uk-width-1-3\@m,.uk-width-2-3\@m,.uk-width-1-4\@m,.uk-width-3-4\@m,.uk-width-1-5\@m,.uk-width-2-5\@m,.uk-width-3-5\@m,.uk-width-4-5\@m,.uk-width-1-6\@m,.uk-width-5-6\@m,.uk-width-small\@m,.uk-width-medium\@m,.uk-width-large\@m,.uk-width-xlarge\@m,.uk-width-2xlarge\@m,.uk-width-auto\@m{flex:initial}}@media (min-width: 1200px){.uk-width-1-1\@l{width:100%}.uk-width-1-2\@l{width:50%}.uk-width-1-3\@l{width:calc(100% / 3)}.uk-width-2-3\@l{width:calc(200% / 3)}.uk-width-1-4\@l{width:25%}.uk-width-3-4\@l{width:75%}.uk-width-1-5\@l{width:20%}.uk-width-2-5\@l{width:40%}.uk-width-3-5\@l{width:60%}.uk-width-4-5\@l{width:80%}.uk-width-1-6\@l{width:calc(100% / 6)}.uk-width-5-6\@l{width:calc(500% / 6)}.uk-width-small\@l{width:150px}.uk-width-medium\@l{width:300px}.uk-width-large\@l{width:450px}.uk-width-xlarge\@l{width:600px}.uk-width-2xlarge\@l{width:750px}.uk-width-auto\@l{width:auto}.uk-width-expand\@l{flex:1;min-width:1px}.uk-width-1-1\@l,.uk-width-1-2\@l,.uk-width-1-3\@l,.uk-width-2-3\@l,.uk-width-1-4\@l,.uk-width-3-4\@l,.uk-width-1-5\@l,.uk-width-2-5\@l,.uk-width-3-5\@l,.uk-width-4-5\@l,.uk-width-1-6\@l,.uk-width-5-6\@l,.uk-width-small\@l,.uk-width-medium\@l,.uk-width-large\@l,.uk-width-xlarge\@l,.uk-width-2xlarge\@l,.uk-width-auto\@l{flex:initial}}@media (min-width: 1600px){.uk-width-1-1\@xl{width:100%}.uk-width-1-2\@xl{width:50%}.uk-width-1-3\@xl{width:calc(100% / 3)}.uk-width-2-3\@xl{width:calc(200% / 3)}.uk-width-1-4\@xl{width:25%}.uk-width-3-4\@xl{width:75%}.uk-width-1-5\@xl{width:20%}.uk-width-2-5\@xl{width:40%}.uk-width-3-5\@xl{width:60%}.uk-width-4-5\@xl{width:80%}.uk-width-1-6\@xl{width:calc(100% / 6)}.uk-width-5-6\@xl{width:calc(500% / 6)}.uk-width-small\@xl{width:150px}.uk-width-medium\@xl{width:300px}.uk-width-large\@xl{width:450px}.uk-width-xlarge\@xl{width:600px}.uk-width-2xlarge\@xl{width:750px}.uk-width-auto\@xl{width:auto}.uk-width-expand\@xl{flex:1;min-width:1px}.uk-width-1-1\@xl,.uk-width-1-2\@xl,.uk-width-1-3\@xl,.uk-width-2-3\@xl,.uk-width-1-4\@xl,.uk-width-3-4\@xl,.uk-width-1-5\@xl,.uk-width-2-5\@xl,.uk-width-3-5\@xl,.uk-width-4-5\@xl,.uk-width-1-6\@xl,.uk-width-5-6\@xl,.uk-width-small\@xl,.uk-width-medium\@xl,.uk-width-large\@xl,.uk-width-xlarge\@xl,.uk-width-2xlarge\@xl,.uk-width-auto\@xl{flex:initial}}.uk-width-max-content{width:max-content}.uk-width-min-content{width:min-content}[class*=uk-height]{box-sizing:border-box}.uk-height-1-1{height:100%}.uk-height-viewport{min-height:100vh}.uk-height-viewport-2{min-height:200vh}.uk-height-viewport-3{min-height:300vh}.uk-height-viewport-4{min-height:400vh}.uk-height-small{height:150px}.uk-height-medium{height:300px}.uk-height-large{height:450px}.uk-height-max-small{max-height:150px}.uk-height-max-medium{max-height:300px}.uk-height-max-large{max-height:450px}.uk-text-lead{font-size:1.5rem;line-height:1.5;color:#333}.uk-text-meta{font-size:.875rem;line-height:1.4;color:#666}.uk-text-meta>a{color:#666}.uk-text-meta>a:hover{color:#666;text-decoration:none}.uk-text-small{font-size:.875rem;line-height:1.5}.uk-text-large{font-size:1.5rem;line-height:1.5}.uk-text-default{font-size:16px;line-height:1.5}.uk-text-light{font-weight:300}.uk-text-normal{font-weight:400}.uk-text-bold{font-weight:700}.uk-text-lighter{font-weight:lighter}.uk-text-bolder{font-weight:bolder}.uk-text-italic{font-style:italic}.uk-text-capitalize{text-transform:capitalize !important}.uk-text-uppercase{text-transform:uppercase !important}.uk-text-lowercase{text-transform:lowercase !important}.uk-text-decoration-none{text-decoration:none !important}.uk-text-muted{color:#999 !important}.uk-text-emphasis{color:#333 !important}.uk-text-primary{color:#36c !important}.uk-text-secondary{color:#936 !important}.uk-text-success{color:#32d296 !important}.uk-text-warning{color:#faa05a !important}.uk-text-danger{color:#f0506e !important}.uk-text-background{-webkit-background-clip:text;color:rgba(0,0,0,0) !important;display:inline-block;background-color:#36c;background-image:linear-gradient(90deg, #36c 0%, #63c 100%)}.uk-text-left{text-align:left !important}.uk-text-right{text-align:right !important}.uk-text-center{text-align:center !important}.uk-text-justify{text-align:justify !important}@media (min-width: 640px){.uk-text-left\@s{text-align:left !important}.uk-text-right\@s{text-align:right !important}.uk-text-center\@s{text-align:center !important}}@media (min-width: 960px){.uk-text-left\@m{text-align:left !important}.uk-text-right\@m{text-align:right !important}.uk-text-center\@m{text-align:center !important}}@media (min-width: 1200px){.uk-text-left\@l{text-align:left !important}.uk-text-right\@l{text-align:right !important}.uk-text-center\@l{text-align:center !important}}@media (min-width: 1600px){.uk-text-left\@xl{text-align:left !important}.uk-text-right\@xl{text-align:right !important}.uk-text-center\@xl{text-align:center !important}}.uk-text-top{vertical-align:top !important}.uk-text-middle{vertical-align:middle !important}.uk-text-bottom{vertical-align:bottom !important}.uk-text-baseline{vertical-align:baseline !important}.uk-text-nowrap{white-space:nowrap}.uk-text-truncate{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}th.uk-text-truncate,td.uk-text-truncate{max-width:0}.uk-text-break{overflow-wrap:break-word}th.uk-text-break,td.uk-text-break{word-break:break-word}[class*=uk-column-]{column-gap:30px}@media (min-width: 1200px){[class*=uk-column-]{column-gap:40px}}[class*=uk-column-] img{transform:translate3d(0, 0, 0)}.uk-column-divider{column-rule:1px solid #e5e5e5;column-gap:60px}@media (min-width: 1200px){.uk-column-divider{column-gap:80px}}.uk-column-1-2{column-count:2}.uk-column-1-3{column-count:3}.uk-column-1-4{column-count:4}.uk-column-1-5{column-count:5}.uk-column-1-6{column-count:6}@media (min-width: 640px){.uk-column-1-2\@s{column-count:2}.uk-column-1-3\@s{column-count:3}.uk-column-1-4\@s{column-count:4}.uk-column-1-5\@s{column-count:5}.uk-column-1-6\@s{column-count:6}}@media (min-width: 960px){.uk-column-1-2\@m{column-count:2}.uk-column-1-3\@m{column-count:3}.uk-column-1-4\@m{column-count:4}.uk-column-1-5\@m{column-count:5}.uk-column-1-6\@m{column-count:6}}@media (min-width: 1200px){.uk-column-1-2\@l{column-count:2}.uk-column-1-3\@l{column-count:3}.uk-column-1-4\@l{column-count:4}.uk-column-1-5\@l{column-count:5}.uk-column-1-6\@l{column-count:6}}@media (min-width: 1600px){.uk-column-1-2\@xl{column-count:2}.uk-column-1-3\@xl{column-count:3}.uk-column-1-4\@xl{column-count:4}.uk-column-1-5\@xl{column-count:5}.uk-column-1-6\@xl{column-count:6}}.uk-column-span{column-span:all}[uk-cover]:where(canvas,iframe,svg),[data-uk-cover]:where(canvas,iframe,svg){max-width:none;position:absolute;left:50%;top:50%;--uk-position-translate-x: -50%;--uk-position-translate-y: -50%;transform:translate(var(--uk-position-translate-x), var(--uk-position-translate-y))}iframe[uk-cover],iframe[data-uk-cover]{pointer-events:none}[uk-cover]:where(img,video),[data-uk-cover]:where(img,video){position:absolute;top:0;left:0;width:100%;height:100%;box-sizing:border-box;object-fit:cover;object-position:center}.uk-cover-container{overflow:hidden;position:relative}.uk-background-default{background-color:#fff}.uk-background-muted{background-color:#f8f8f8}.uk-background-primary{background-color:#36c}.uk-background-secondary{background-color:#936}.uk-background-cover,.uk-background-contain,.uk-background-width-1-1,.uk-background-height-1-1{background-position:50% 50%;background-repeat:no-repeat}.uk-background-cover{background-size:cover}.uk-background-contain{background-size:contain}.uk-background-width-1-1{background-size:100%}.uk-background-height-1-1{background-size:auto 100%}.uk-background-top-left{background-position:0 0}.uk-background-top-center{background-position:50% 0}.uk-background-top-right{background-position:100% 0}.uk-background-center-left{background-position:0 50%}.uk-background-center-center{background-position:50% 50%}.uk-background-center-right{background-position:100% 50%}.uk-background-bottom-left{background-position:0 100%}.uk-background-bottom-center{background-position:50% 100%}.uk-background-bottom-right{background-position:100% 100%}.uk-background-norepeat{background-repeat:no-repeat}.uk-background-fixed{background-attachment:fixed;backface-visibility:hidden}@media (pointer: coarse){.uk-background-fixed{background-attachment:scroll}}@media (max-width: 639px){.uk-background-image\@s{background-image:none !important}}@media (max-width: 959px){.uk-background-image\@m{background-image:none !important}}@media (max-width: 1199px){.uk-background-image\@l{background-image:none !important}}@media (max-width: 1599px){.uk-background-image\@xl{background-image:none !important}}.uk-background-blend-multiply{background-blend-mode:multiply}.uk-background-blend-screen{background-blend-mode:screen}.uk-background-blend-overlay{background-blend-mode:overlay}.uk-background-blend-darken{background-blend-mode:darken}.uk-background-blend-lighten{background-blend-mode:lighten}.uk-background-blend-color-dodge{background-blend-mode:color-dodge}.uk-background-blend-color-burn{background-blend-mode:color-burn}.uk-background-blend-hard-light{background-blend-mode:hard-light}.uk-background-blend-soft-light{background-blend-mode:soft-light}.uk-background-blend-difference{background-blend-mode:difference}.uk-background-blend-exclusion{background-blend-mode:exclusion}.uk-background-blend-hue{background-blend-mode:hue}.uk-background-blend-saturation{background-blend-mode:saturation}.uk-background-blend-color{background-blend-mode:color}.uk-background-blend-luminosity{background-blend-mode:luminosity}[class*=uk-align]{display:block;margin-bottom:30px}*+[class*=uk-align]{margin-top:30px}.uk-align-center{margin-left:auto;margin-right:auto}.uk-align-left{margin-top:0;margin-right:30px;float:left}.uk-align-right{margin-top:0;margin-left:30px;float:right}@media (min-width: 640px){.uk-align-left\@s{margin-top:0;margin-right:30px;float:left}.uk-align-right\@s{margin-top:0;margin-left:30px;float:right}}@media (min-width: 960px){.uk-align-left\@m{margin-top:0;margin-right:30px;float:left}.uk-align-right\@m{margin-top:0;margin-left:30px;float:right}}@media (min-width: 1200px){.uk-align-left\@l{margin-top:0;float:left}.uk-align-right\@l{margin-top:0;float:right}.uk-align-left,.uk-align-left\@s,.uk-align-left\@m,.uk-align-left\@l{margin-right:40px}.uk-align-right,.uk-align-right\@s,.uk-align-right\@m,.uk-align-right\@l{margin-left:40px}}@media (min-width: 1600px){.uk-align-left\@xl{margin-top:0;margin-right:40px;float:left}.uk-align-right\@xl{margin-top:0;margin-left:40px;float:right}}.uk-svg,.uk-svg:not(.uk-preserve) [fill*="#"]:not(.uk-preserve){fill:currentcolor}.uk-svg:not(.uk-preserve) [stroke*="#"]:not(.uk-preserve){stroke:currentcolor}.uk-svg{transform:translate(0, 0)}.uk-panel{display:flow-root;position:relative;box-sizing:border-box}.uk-panel>:last-child{margin-bottom:0}.uk-panel-scrollable{height:170px;padding:10px;border:1px solid #e5e5e5;overflow:auto;resize:both}.uk-clearfix::before{content:"";display:table-cell}.uk-clearfix::after{content:"";display:table;clear:both}.uk-float-left{float:left}.uk-float-right{float:right}[class*=uk-float-]{max-width:100%}.uk-overflow-hidden{overflow:hidden}.uk-overflow-auto{overflow:auto}.uk-overflow-auto>:last-child{margin-bottom:0}.uk-box-sizing-content{box-sizing:content-box}.uk-box-sizing-border{box-sizing:border-box}.uk-resize{resize:both}.uk-resize-horizontal{resize:horizontal}.uk-resize-vertical{resize:vertical}.uk-display-block{display:block !important}.uk-display-inline{display:inline !important}.uk-display-inline-block{display:inline-block !important}[class*=uk-inline]{display:inline-block;position:relative;max-width:100%;vertical-align:middle;-webkit-backface-visibility:hidden}.uk-inline-clip{overflow:hidden}.uk-preserve-width,.uk-preserve-width canvas,.uk-preserve-width img,.uk-preserve-width svg,.uk-preserve-width video{max-width:none}.uk-responsive-width,.uk-responsive-height{box-sizing:border-box}.uk-responsive-width{max-width:100% !important;height:auto}.uk-responsive-height{max-height:100%;width:auto;max-width:none}[uk-responsive],[data-uk-responsive]{max-width:100%}.uk-object-cover{object-fit:cover}.uk-object-contain{object-fit:contain}.uk-object-fill{object-fit:fill}.uk-object-none{object-fit:none}.uk-object-scale-down{object-fit:scale-down}.uk-object-top-left{object-position:0 0}.uk-object-top-center{object-position:50% 0}.uk-object-top-right{object-position:100% 0}.uk-object-center-left{object-position:0 50%}.uk-object-center-center{object-position:50% 50%}.uk-object-center-right{object-position:100% 50%}.uk-object-bottom-left{object-position:0 100%}.uk-object-bottom-center{object-position:50% 100%}.uk-object-bottom-right{object-position:100% 100%}.uk-border-circle{border-radius:50%}.uk-border-pill{border-radius:500px}.uk-border-rounded{border-radius:5px}.uk-inline-clip[class*=uk-border-]{-webkit-transform:translateZ(0)}.uk-box-shadow-small{box-shadow:0 2px 8px rgba(0,0,0,.08)}.uk-box-shadow-medium{box-shadow:0 5px 15px rgba(0,0,0,.08)}.uk-box-shadow-large{box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-box-shadow-xlarge{box-shadow:0 28px 50px rgba(0,0,0,.16)}[class*=uk-box-shadow-hover]{transition:box-shadow .1s ease-in-out}.uk-box-shadow-hover-small:hover{box-shadow:0 2px 8px rgba(0,0,0,.08)}.uk-box-shadow-hover-medium:hover{box-shadow:0 5px 15px rgba(0,0,0,.08)}.uk-box-shadow-hover-large:hover{box-shadow:0 14px 25px rgba(0,0,0,.16)}.uk-box-shadow-hover-xlarge:hover{box-shadow:0 28px 50px rgba(0,0,0,.16)}@supports (filter: blur(0)){.uk-box-shadow-bottom{display:inline-block;position:relative;z-index:0;max-width:100%;vertical-align:middle}.uk-box-shadow-bottom::after{content:"";position:absolute;bottom:-30px;left:0;right:0;z-index:-1;height:30px;border-radius:100%;background:#444;filter:blur(20px);will-change:filter}}.uk-dropcap::first-letter,.uk-dropcap>p:first-of-type::first-letter{display:block;margin-right:10px;float:left;font-size:4.5em;line-height:1;margin-bottom:-2px}@-moz-document url-prefix(){.uk-dropcap::first-letter,.uk-dropcap>p:first-of-type::first-letter{margin-top:1.1%}}.uk-logo{font-size:1.5rem;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";color:#333;text-decoration:none}:where(.uk-logo){display:inline-block;vertical-align:middle}.uk-logo:hover{color:#333;text-decoration:none}.uk-logo :where(img,svg,video){display:block}.uk-logo-inverse{display:none}.uk-disabled{pointer-events:none}.uk-drag,.uk-drag *{cursor:move}.uk-drag iframe{pointer-events:none}.uk-dragover{box-shadow:0 0 20px rgba(100,100,100,.3)}.uk-blend-multiply{mix-blend-mode:multiply}.uk-blend-screen{mix-blend-mode:screen}.uk-blend-overlay{mix-blend-mode:overlay}.uk-blend-darken{mix-blend-mode:darken}.uk-blend-lighten{mix-blend-mode:lighten}.uk-blend-color-dodge{mix-blend-mode:color-dodge}.uk-blend-color-burn{mix-blend-mode:color-burn}.uk-blend-hard-light{mix-blend-mode:hard-light}.uk-blend-soft-light{mix-blend-mode:soft-light}.uk-blend-difference{mix-blend-mode:difference}.uk-blend-exclusion{mix-blend-mode:exclusion}.uk-blend-hue{mix-blend-mode:hue}.uk-blend-saturation{mix-blend-mode:saturation}.uk-blend-color{mix-blend-mode:color}.uk-blend-luminosity{mix-blend-mode:luminosity}.uk-transform-center{transform:translate(-50%, -50%)}.uk-transform-origin-top-left{transform-origin:0 0}.uk-transform-origin-top-center{transform-origin:50% 0}.uk-transform-origin-top-right{transform-origin:100% 0}.uk-transform-origin-center-left{transform-origin:0 50%}.uk-transform-origin-center-right{transform-origin:100% 50%}.uk-transform-origin-bottom-left{transform-origin:0 100%}.uk-transform-origin-bottom-center{transform-origin:50% 100%}.uk-transform-origin-bottom-right{transform-origin:100% 100%}.uk-flex{display:flex}.uk-flex-inline{display:inline-flex}.uk-flex-left{justify-content:flex-start}.uk-flex-center{justify-content:center}.uk-flex-right{justify-content:flex-end}.uk-flex-between{justify-content:space-between}.uk-flex-around{justify-content:space-around}@media (min-width: 640px){.uk-flex-left\@s{justify-content:flex-start}.uk-flex-center\@s{justify-content:center}.uk-flex-right\@s{justify-content:flex-end}.uk-flex-between\@s{justify-content:space-between}.uk-flex-around\@s{justify-content:space-around}}@media (min-width: 960px){.uk-flex-left\@m{justify-content:flex-start}.uk-flex-center\@m{justify-content:center}.uk-flex-right\@m{justify-content:flex-end}.uk-flex-between\@m{justify-content:space-between}.uk-flex-around\@m{justify-content:space-around}}@media (min-width: 1200px){.uk-flex-left\@l{justify-content:flex-start}.uk-flex-center\@l{justify-content:center}.uk-flex-right\@l{justify-content:flex-end}.uk-flex-between\@l{justify-content:space-between}.uk-flex-around\@l{justify-content:space-around}}@media (min-width: 1600px){.uk-flex-left\@xl{justify-content:flex-start}.uk-flex-center\@xl{justify-content:center}.uk-flex-right\@xl{justify-content:flex-end}.uk-flex-between\@xl{justify-content:space-between}.uk-flex-around\@xl{justify-content:space-around}}.uk-flex-stretch{align-items:stretch}.uk-flex-top{align-items:flex-start}.uk-flex-middle{align-items:center}.uk-flex-bottom{align-items:flex-end}@media (min-width: 640px){.uk-flex-stretch\@s{align-items:stretch}.uk-flex-top\@s{align-items:flex-start}.uk-flex-middle\@s{align-items:center}.uk-flex-bottom\@s{align-items:flex-end}}@media (min-width: 960px){.uk-flex-stretch\@m{align-items:stretch}.uk-flex-top\@m{align-items:flex-start}.uk-flex-middle\@m{align-items:center}.uk-flex-bottom\@m{align-items:flex-end}}@media (min-width: 1200px){.uk-flex-stretch\@l{align-items:stretch}.uk-flex-top\@l{align-items:flex-start}.uk-flex-middle\@l{align-items:center}.uk-flex-bottom\@l{align-items:flex-end}}@media (min-width: 1600px){.uk-flex-stretch\@xl{align-items:stretch}.uk-flex-top\@xl{align-items:flex-start}.uk-flex-middle\@xl{align-items:center}.uk-flex-bottom\@xl{align-items:flex-end}}.uk-flex-row{flex-direction:row}.uk-flex-row-reverse{flex-direction:row-reverse}.uk-flex-column{flex-direction:column}.uk-flex-column-reverse{flex-direction:column-reverse}@media (min-width: 640px){.uk-flex-row\@s{flex-direction:row}.uk-flex-column\@s{flex-direction:column}}@media (min-width: 960px){.uk-flex-row\@m{flex-direction:row}.uk-flex-column\@m{flex-direction:column}}@media (min-width: 1200px){.uk-flex-row\@l{flex-direction:row}.uk-flex-column\@l{flex-direction:column}}@media (min-width: 1600px){.uk-flex-row\@xl{flex-direction:row}.uk-flex-column\@xl{flex-direction:column}}.uk-flex-nowrap{flex-wrap:nowrap}.uk-flex-wrap{flex-wrap:wrap}.uk-flex-wrap-reverse{flex-wrap:wrap-reverse}.uk-flex-wrap-stretch{align-content:stretch}.uk-flex-wrap-top{align-content:flex-start}.uk-flex-wrap-middle{align-content:center}.uk-flex-wrap-bottom{align-content:flex-end}.uk-flex-wrap-between{align-content:space-between}.uk-flex-wrap-around{align-content:space-around}.uk-flex-first{order:-1}.uk-flex-last{order:99}@media (min-width: 640px){.uk-flex-first\@s{order:-1}.uk-flex-last\@s{order:99}}@media (min-width: 960px){.uk-flex-first\@m{order:-1}.uk-flex-last\@m{order:99}}@media (min-width: 1200px){.uk-flex-first\@l{order:-1}.uk-flex-last\@l{order:99}}@media (min-width: 1600px){.uk-flex-first\@xl{order:-1}.uk-flex-last\@xl{order:99}}.uk-flex-initial{flex:initial}.uk-flex-none{flex:none}.uk-flex-auto{flex:auto}.uk-flex-1{flex:1}@media (min-width: 640px){.uk-flex-initial\@s{flex:initial}.uk-flex-none\@s{flex:none}.uk-flex-1\@s{flex:1}}@media (min-width: 960px){.uk-flex-initial\@m{flex:initial}.uk-flex-none\@m{flex:none}.uk-flex-1\@m{flex:1}}@media (min-width: 1200px){.uk-flex-initial\@l{flex:initial}.uk-flex-none\@l{flex:none}.uk-flex-1\@l{flex:1}}@media (min-width: 1600px){.uk-flex-initial\@xl{flex:initial}.uk-flex-none\@xl{flex:none}.uk-flex-1\@xl{flex:1}}.uk-margin{margin-bottom:20px}*+.uk-margin{margin-top:20px !important}.uk-margin-top{margin-top:20px !important}.uk-margin-bottom{margin-bottom:20px !important}.uk-margin-left{margin-left:20px !important}.uk-margin-right{margin-right:20px !important}.uk-margin-small{margin-bottom:10px}*+.uk-margin-small{margin-top:10px !important}.uk-margin-small-top{margin-top:10px !important}.uk-margin-small-bottom{margin-bottom:10px !important}.uk-margin-small-left{margin-left:10px !important}.uk-margin-small-right{margin-right:10px !important}.uk-margin-medium{margin-bottom:40px}*+.uk-margin-medium{margin-top:40px !important}.uk-margin-medium-top{margin-top:40px !important}.uk-margin-medium-bottom{margin-bottom:40px !important}.uk-margin-medium-left{margin-left:40px !important}.uk-margin-medium-right{margin-right:40px !important}.uk-margin-large{margin-bottom:40px}*+.uk-margin-large{margin-top:40px !important}.uk-margin-large-top{margin-top:40px !important}.uk-margin-large-bottom{margin-bottom:40px !important}.uk-margin-large-left{margin-left:40px !important}.uk-margin-large-right{margin-right:40px !important}@media (min-width: 1200px){.uk-margin-large{margin-bottom:70px}*+.uk-margin-large{margin-top:70px !important}.uk-margin-large-top{margin-top:70px !important}.uk-margin-large-bottom{margin-bottom:70px !important}.uk-margin-large-left{margin-left:70px !important}.uk-margin-large-right{margin-right:70px !important}}.uk-margin-xlarge{margin-bottom:70px}*+.uk-margin-xlarge{margin-top:70px !important}.uk-margin-xlarge-top{margin-top:70px !important}.uk-margin-xlarge-bottom{margin-bottom:70px !important}.uk-margin-xlarge-left{margin-left:70px !important}.uk-margin-xlarge-right{margin-right:70px !important}@media (min-width: 1200px){.uk-margin-xlarge{margin-bottom:140px}*+.uk-margin-xlarge{margin-top:140px !important}.uk-margin-xlarge-top{margin-top:140px !important}.uk-margin-xlarge-bottom{margin-bottom:140px !important}.uk-margin-xlarge-left{margin-left:140px !important}.uk-margin-xlarge-right{margin-right:140px !important}}.uk-margin-auto{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-top{margin-top:auto !important}.uk-margin-auto-bottom{margin-bottom:auto !important}.uk-margin-auto-left{margin-left:auto !important}.uk-margin-auto-right{margin-right:auto !important}.uk-margin-auto-vertical{margin-top:auto !important;margin-bottom:auto !important}@media (min-width: 640px){.uk-margin-auto\@s{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-left\@s{margin-left:auto !important}.uk-margin-auto-right\@s{margin-right:auto !important}}@media (min-width: 960px){.uk-margin-auto\@m{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-left\@m{margin-left:auto !important}.uk-margin-auto-right\@m{margin-right:auto !important}}@media (min-width: 1200px){.uk-margin-auto\@l{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-left\@l{margin-left:auto !important}.uk-margin-auto-right\@l{margin-right:auto !important}}@media (min-width: 1600px){.uk-margin-auto\@xl{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-left\@xl{margin-left:auto !important}.uk-margin-auto-right\@xl{margin-right:auto !important}}.uk-margin-remove{margin:0 !important}.uk-margin-remove-top{margin-top:0 !important}.uk-margin-remove-bottom{margin-bottom:0 !important}.uk-margin-remove-left{margin-left:0 !important}.uk-margin-remove-right{margin-right:0 !important}.uk-margin-remove-vertical{margin-top:0 !important;margin-bottom:0 !important}.uk-margin-remove-adjacent+*,.uk-margin-remove-first-child>:first-child{margin-top:0 !important}.uk-margin-remove-last-child>:last-child{margin-bottom:0 !important}@media (min-width: 640px){.uk-margin-remove-left\@s{margin-left:0 !important}.uk-margin-remove-right\@s{margin-right:0 !important}}@media (min-width: 960px){.uk-margin-remove-left\@m{margin-left:0 !important}.uk-margin-remove-right\@m{margin-right:0 !important}}@media (min-width: 1200px){.uk-margin-remove-left\@l{margin-left:0 !important}.uk-margin-remove-right\@l{margin-right:0 !important}}@media (min-width: 1600px){.uk-margin-remove-left\@xl{margin-left:0 !important}.uk-margin-remove-right\@xl{margin-right:0 !important}}.uk-padding{padding:30px}@media (min-width: 1200px){.uk-padding{padding:40px}}.uk-padding-small{padding:15px}.uk-padding-large{padding:40px}@media (min-width: 1200px){.uk-padding-large{padding:70px}}.uk-padding-remove{padding:0 !important}.uk-padding-remove-top{padding-top:0 !important}.uk-padding-remove-bottom{padding-bottom:0 !important}.uk-padding-remove-left{padding-left:0 !important}.uk-padding-remove-right{padding-right:0 !important}.uk-padding-remove-vertical{padding-top:0 !important;padding-bottom:0 !important}.uk-padding-remove-horizontal{padding-left:0 !important;padding-right:0 !important}:root{--uk-position-margin-offset: 0px}[class*=uk-position-top],[class*=uk-position-bottom],[class*=uk-position-left],[class*=uk-position-right],[class*=uk-position-center]{position:absolute !important;max-width:calc(100% - (var(--uk-position-margin-offset) * 2));box-sizing:border-box}.uk-position-top{top:0;left:0;right:0}.uk-position-bottom{bottom:0;left:0;right:0}.uk-position-left{top:0;bottom:0;left:0}.uk-position-right{top:0;bottom:0;right:0}.uk-position-top-left{top:0;left:0}.uk-position-top-right{top:0;right:0}.uk-position-bottom-left{bottom:0;left:0}.uk-position-bottom-right{bottom:0;right:0}.uk-position-center{top:calc(50% - var(--uk-position-margin-offset));left:calc(50% - var(--uk-position-margin-offset));--uk-position-translate-x: -50%;--uk-position-translate-y: -50%;transform:translate(var(--uk-position-translate-x), var(--uk-position-translate-y));width:max-content}[class*=uk-position-center-left],[class*=uk-position-center-right],.uk-position-center-vertical{top:calc(50% - var(--uk-position-margin-offset));--uk-position-translate-y: -50%;transform:translate(0, var(--uk-position-translate-y))}.uk-position-center-left{left:0}.uk-position-center-right{right:0}.uk-position-center-vertical{left:0;right:0}.uk-position-center-left-out{right:100%;width:max-content}.uk-position-center-right-out{left:100%;width:max-content}.uk-position-top-center,.uk-position-bottom-center,.uk-position-center-horizontal{left:calc(50% - var(--uk-position-margin-offset));--uk-position-translate-x: -50%;transform:translate(var(--uk-position-translate-x), 0);width:max-content}.uk-position-top-center{top:0}.uk-position-bottom-center{bottom:0}.uk-position-center-horizontal{top:0;bottom:0}.uk-position-cover{position:absolute;top:0;bottom:0;left:0;right:0}.uk-position-small{margin:15px;--uk-position-margin-offset: 15px}.uk-position-medium{margin:30px;--uk-position-margin-offset: 30px}.uk-position-large{margin:30px;--uk-position-margin-offset: 30px}@media (min-width: 1200px){.uk-position-large{margin:50px;--uk-position-margin-offset: 50px}}.uk-position-relative{position:relative !important}.uk-position-absolute{position:absolute !important}.uk-position-fixed{position:fixed !important}.uk-position-sticky{position:sticky !important}.uk-position-z-index{z-index:1}.uk-position-z-index-zero{z-index:0}.uk-position-z-index-negative{z-index:-1}.uk-position-z-index-high{z-index:990}:where(.uk-transition-fade),:where([class*=uk-transition-scale]),:where([class*=uk-transition-slide]){--uk-position-translate-x: 0;--uk-position-translate-y: 0}.uk-transition-fade,[class*=uk-transition-scale],[class*=uk-transition-slide]{--uk-translate-x: 0;--uk-translate-y: 0;--uk-scale-x: 1;--uk-scale-y: 1;transform:translate(var(--uk-position-translate-x), var(--uk-position-translate-y)) translate(var(--uk-translate-x), var(--uk-translate-y)) scale(var(--uk-scale-x), var(--uk-scale-y));transition:.3s ease-out;transition-property:opacity,transform,filter;opacity:0}.uk-transition-toggle:hover .uk-transition-fade,.uk-transition-toggle:focus .uk-transition-fade,.uk-transition-toggle .uk-transition-fade:focus-within,.uk-transition-active.uk-active .uk-transition-fade{opacity:1}[class*=uk-transition-scale]{-webkit-backface-visibility:hidden}.uk-transition-scale-up{--uk-scale-x: 1;--uk-scale-y: 1}.uk-transition-scale-down{--uk-scale-x: 1.03;--uk-scale-y: 1.03}.uk-transition-toggle:hover .uk-transition-scale-up,.uk-transition-toggle:focus .uk-transition-scale-up,.uk-transition-toggle .uk-transition-scale-up:focus-within,.uk-transition-active.uk-active .uk-transition-scale-up{--uk-scale-x: 1.03;--uk-scale-y: 1.03;opacity:1}.uk-transition-toggle:hover .uk-transition-scale-down,.uk-transition-toggle:focus .uk-transition-scale-down,.uk-transition-toggle .uk-transition-scale-down:focus-within,.uk-transition-active.uk-active .uk-transition-scale-down{--uk-scale-x: 1;--uk-scale-y: 1;opacity:1}.uk-transition-slide-top{--uk-translate-y: -100%}.uk-transition-slide-bottom{--uk-translate-y: 100%}.uk-transition-slide-left{--uk-translate-x: -100%}.uk-transition-slide-right{--uk-translate-x: 100%}.uk-transition-slide-top-small{--uk-translate-y: calc(-1 * 10px)}.uk-transition-slide-bottom-small{--uk-translate-y: 10px}.uk-transition-slide-left-small{--uk-translate-x: calc(-1 * 10px)}.uk-transition-slide-right-small{--uk-translate-x: 10px}.uk-transition-slide-top-medium{--uk-translate-y: calc(-1 * 50px)}.uk-transition-slide-bottom-medium{--uk-translate-y: 50px}.uk-transition-slide-left-medium{--uk-translate-x: calc(-1 * 50px)}.uk-transition-slide-right-medium{--uk-translate-x: 50px}.uk-transition-toggle:hover [class*=uk-transition-slide],.uk-transition-toggle:focus [class*=uk-transition-slide],.uk-transition-toggle [class*=uk-transition-slide]:focus-within,.uk-transition-active.uk-active [class*=uk-transition-slide]{--uk-translate-x: 0;--uk-translate-y: 0;opacity:1}.uk-transition-opaque{opacity:1}.uk-transition-slow{transition-duration:.7s}.uk-transition-disable,.uk-transition-disable *{transition:none !important}[hidden],.uk-hidden{display:none !important}@media (min-width: 640px){.uk-hidden\@s{display:none !important}}@media (min-width: 960px){.uk-hidden\@m{display:none !important}}@media (min-width: 1200px){.uk-hidden\@l{display:none !important}}@media (min-width: 1600px){.uk-hidden\@xl{display:none !important}}@media (max-width: 639px){.uk-visible\@s{display:none !important}}@media (max-width: 959px){.uk-visible\@m{display:none !important}}@media (max-width: 1199px){.uk-visible\@l{display:none !important}}@media (max-width: 1599px){.uk-visible\@xl{display:none !important}}.uk-invisible{visibility:hidden !important}.uk-hidden-visually:not(:focus):not(:active):not(:focus-within),.uk-visible-toggle:not(:hover):not(:focus) .uk-hidden-hover:not(:focus-within){position:absolute !important;width:0 !important;height:0 !important;padding:0 !important;border:0 !important;margin:0 !important;overflow:hidden !important}.uk-visible-toggle:not(:hover):not(:focus) .uk-invisible-hover:not(:focus-within){opacity:0 !important}@media (hover: none){.uk-hidden-touch{display:none !important}}@media (hover){.uk-hidden-notouch{display:none !important}}.uk-light,.uk-section-primary:not(.uk-preserve-color),.uk-section-secondary:not(.uk-preserve-color),.uk-tile-primary:not(.uk-preserve-color),.uk-tile-secondary:not(.uk-preserve-color),.uk-card-primary.uk-card-body,.uk-card-primary>:not([class*=uk-card-media]),.uk-card-secondary.uk-card-body,.uk-card-secondary>:not([class*=uk-card-media]),.uk-overlay-primary,.uk-offcanvas-bar{color:rgba(255,255,255,.7)}.uk-light .uk-accordion-title::before,.uk-section-primary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-section-secondary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-tile-primary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-card-primary.uk-card-body .uk-accordion-title::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-accordion-title::before,.uk-card-secondary.uk-card-body .uk-accordion-title::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-accordion-title::before,.uk-overlay-primary .uk-accordion-title::before,.uk-offcanvas-bar .uk-accordion-title::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-open>.uk-accordion-title::before,.uk-section-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-section-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-tile-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-card-primary.uk-card-body .uk-open>.uk-accordion-title::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-open>.uk-accordion-title::before,.uk-card-secondary.uk-card-body .uk-open>.uk-accordion-title::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-open>.uk-accordion-title::before,.uk-overlay-primary .uk-open>.uk-accordion-title::before,.uk-offcanvas-bar .uk-open>.uk-accordion-title::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-article-meta,.uk-section-primary:not(.uk-preserve-color) .uk-article-meta,.uk-section-secondary:not(.uk-preserve-color) .uk-article-meta,.uk-tile-primary:not(.uk-preserve-color) .uk-article-meta,.uk-tile-secondary:not(.uk-preserve-color) .uk-article-meta,.uk-card-primary.uk-card-body .uk-article-meta,.uk-card-primary>:not([class*=uk-card-media]) .uk-article-meta,.uk-card-secondary.uk-card-body .uk-article-meta,.uk-card-secondary>:not([class*=uk-card-media]) .uk-article-meta,.uk-overlay-primary .uk-article-meta,.uk-offcanvas-bar .uk-article-meta{color:rgba(255,255,255,.5)}.uk-light .uk-badge,.uk-section-primary:not(.uk-preserve-color) .uk-badge,.uk-section-secondary:not(.uk-preserve-color) .uk-badge,.uk-tile-primary:not(.uk-preserve-color) .uk-badge,.uk-tile-secondary:not(.uk-preserve-color) .uk-badge,.uk-card-primary.uk-card-body .uk-badge,.uk-card-primary>:not([class*=uk-card-media]) .uk-badge,.uk-card-secondary.uk-card-body .uk-badge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-badge,.uk-overlay-primary .uk-badge,.uk-offcanvas-bar .uk-badge{background-color:#fff;color:#666 !important}.uk-light a,.uk-light .uk-link,.uk-section-primary:not(.uk-preserve-color) a,.uk-section-primary:not(.uk-preserve-color) .uk-link,.uk-section-secondary:not(.uk-preserve-color) a,.uk-section-secondary:not(.uk-preserve-color) .uk-link,.uk-tile-primary:not(.uk-preserve-color) a,.uk-tile-primary:not(.uk-preserve-color) .uk-link,.uk-tile-secondary:not(.uk-preserve-color) a,.uk-tile-secondary:not(.uk-preserve-color) .uk-link,.uk-card-primary.uk-card-body a,.uk-card-primary.uk-card-body .uk-link,.uk-card-primary>:not([class*=uk-card-media]) a,.uk-card-primary>:not([class*=uk-card-media]) .uk-link,.uk-card-secondary.uk-card-body a,.uk-card-secondary.uk-card-body .uk-link,.uk-card-secondary>:not([class*=uk-card-media]) a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link,.uk-overlay-primary a,.uk-overlay-primary .uk-link,.uk-offcanvas-bar a,.uk-offcanvas-bar .uk-link{color:#fff}.uk-light a:hover,.uk-light .uk-link:hover,.uk-light .uk-link-toggle:hover .uk-link,.uk-section-primary:not(.uk-preserve-color) a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link,.uk-section-secondary:not(.uk-preserve-color) a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link,.uk-tile-primary:not(.uk-preserve-color) a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link,.uk-tile-secondary:not(.uk-preserve-color) a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link,.uk-card-primary.uk-card-body a:hover,.uk-card-primary.uk-card-body .uk-link:hover,.uk-card-primary.uk-card-body .uk-link-toggle:hover .uk-link,.uk-card-primary>:not([class*=uk-card-media]) a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link,.uk-card-secondary.uk-card-body a:hover,.uk-card-secondary.uk-card-body .uk-link:hover,.uk-card-secondary.uk-card-body .uk-link-toggle:hover .uk-link,.uk-card-secondary>:not([class*=uk-card-media]) a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link,.uk-overlay-primary a:hover,.uk-overlay-primary .uk-link:hover,.uk-overlay-primary .uk-link-toggle:hover .uk-link,.uk-offcanvas-bar a:hover,.uk-offcanvas-bar .uk-link:hover,.uk-offcanvas-bar .uk-link-toggle:hover .uk-link{color:#fff}.uk-light :not(pre)>code,.uk-light :not(pre)>kbd,.uk-light :not(pre)>samp,.uk-section-primary:not(.uk-preserve-color) :not(pre)>code,.uk-section-primary:not(.uk-preserve-color) :not(pre)>kbd,.uk-section-primary:not(.uk-preserve-color) :not(pre)>samp,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>code,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>kbd,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>samp,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>code,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>kbd,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>samp,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>code,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>kbd,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>samp,.uk-card-primary.uk-card-body :not(pre)>code,.uk-card-primary.uk-card-body :not(pre)>kbd,.uk-card-primary.uk-card-body :not(pre)>samp,.uk-card-primary>:not([class*=uk-card-media]) :not(pre)>code,.uk-card-primary>:not([class*=uk-card-media]) :not(pre)>kbd,.uk-card-primary>:not([class*=uk-card-media]) :not(pre)>samp,.uk-card-secondary.uk-card-body :not(pre)>code,.uk-card-secondary.uk-card-body :not(pre)>kbd,.uk-card-secondary.uk-card-body :not(pre)>samp,.uk-card-secondary>:not([class*=uk-card-media]) :not(pre)>code,.uk-card-secondary>:not([class*=uk-card-media]) :not(pre)>kbd,.uk-card-secondary>:not([class*=uk-card-media]) :not(pre)>samp,.uk-overlay-primary :not(pre)>code,.uk-overlay-primary :not(pre)>kbd,.uk-overlay-primary :not(pre)>samp,.uk-offcanvas-bar :not(pre)>code,.uk-offcanvas-bar :not(pre)>kbd,.uk-offcanvas-bar :not(pre)>samp{color:rgba(255,255,255,.7);background-color:rgba(255,255,255,.1)}.uk-light em,.uk-section-primary:not(.uk-preserve-color) em,.uk-section-secondary:not(.uk-preserve-color) em,.uk-tile-primary:not(.uk-preserve-color) em,.uk-tile-secondary:not(.uk-preserve-color) em,.uk-card-primary.uk-card-body em,.uk-card-primary>:not([class*=uk-card-media]) em,.uk-card-secondary.uk-card-body em,.uk-card-secondary>:not([class*=uk-card-media]) em,.uk-overlay-primary em,.uk-offcanvas-bar em{color:#fff}.uk-light h1,.uk-section-primary:not(.uk-preserve-color) h1,.uk-section-secondary:not(.uk-preserve-color) h1,.uk-tile-primary:not(.uk-preserve-color) h1,.uk-tile-secondary:not(.uk-preserve-color) h1,.uk-card-primary.uk-card-body h1,.uk-card-primary>:not([class*=uk-card-media]) h1,.uk-card-secondary.uk-card-body h1,.uk-card-secondary>:not([class*=uk-card-media]) h1,.uk-overlay-primary h1,.uk-offcanvas-bar h1,.uk-light .uk-h1,.uk-section-primary:not(.uk-preserve-color) .uk-h1,.uk-section-secondary:not(.uk-preserve-color) .uk-h1,.uk-tile-primary:not(.uk-preserve-color) .uk-h1,.uk-tile-secondary:not(.uk-preserve-color) .uk-h1,.uk-card-primary.uk-card-body .uk-h1,.uk-card-primary>:not([class*=uk-card-media]) .uk-h1,.uk-card-secondary.uk-card-body .uk-h1,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h1,.uk-overlay-primary .uk-h1,.uk-offcanvas-bar .uk-h1,.uk-light h2,.uk-section-primary:not(.uk-preserve-color) h2,.uk-section-secondary:not(.uk-preserve-color) h2,.uk-tile-primary:not(.uk-preserve-color) h2,.uk-tile-secondary:not(.uk-preserve-color) h2,.uk-card-primary.uk-card-body h2,.uk-card-primary>:not([class*=uk-card-media]) h2,.uk-card-secondary.uk-card-body h2,.uk-card-secondary>:not([class*=uk-card-media]) h2,.uk-overlay-primary h2,.uk-offcanvas-bar h2,.uk-light .uk-h2,.uk-light .markdown h1,.markdown .uk-light h1,.uk-section-primary:not(.uk-preserve-color) .uk-h2,.uk-section-primary:not(.uk-preserve-color) .markdown h1,.markdown .uk-section-primary:not(.uk-preserve-color) h1,.uk-section-secondary:not(.uk-preserve-color) .uk-h2,.uk-section-secondary:not(.uk-preserve-color) .markdown h1,.markdown .uk-section-secondary:not(.uk-preserve-color) h1,.uk-tile-primary:not(.uk-preserve-color) .uk-h2,.uk-tile-primary:not(.uk-preserve-color) .markdown h1,.markdown .uk-tile-primary:not(.uk-preserve-color) h1,.uk-tile-secondary:not(.uk-preserve-color) .uk-h2,.uk-tile-secondary:not(.uk-preserve-color) .markdown h1,.markdown .uk-tile-secondary:not(.uk-preserve-color) h1,.uk-card-primary.uk-card-body .uk-h2,.uk-card-primary.uk-card-body .markdown h1,.markdown .uk-card-primary.uk-card-body h1,.uk-card-primary>:not([class*=uk-card-media]) .uk-h2,.uk-card-primary>:not([class*=uk-card-media]) .markdown h1,.markdown .uk-card-primary>:not([class*=uk-card-media]) h1,.uk-card-secondary.uk-card-body .uk-h2,.uk-card-secondary.uk-card-body .markdown h1,.markdown .uk-card-secondary.uk-card-body h1,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h2,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h1,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h1,.uk-overlay-primary .uk-h2,.uk-overlay-primary .markdown h1,.markdown .uk-overlay-primary h1,.uk-offcanvas-bar .uk-h2,.uk-offcanvas-bar .markdown h1,.markdown .uk-offcanvas-bar h1,.uk-light h3,.uk-section-primary:not(.uk-preserve-color) h3,.uk-section-secondary:not(.uk-preserve-color) h3,.uk-tile-primary:not(.uk-preserve-color) h3,.uk-tile-secondary:not(.uk-preserve-color) h3,.uk-card-primary.uk-card-body h3,.uk-card-primary>:not([class*=uk-card-media]) h3,.uk-card-secondary.uk-card-body h3,.uk-card-secondary>:not([class*=uk-card-media]) h3,.uk-overlay-primary h3,.uk-offcanvas-bar h3,.uk-light .uk-h3,.uk-light .markdown h2,.markdown .uk-light h2,.uk-section-primary:not(.uk-preserve-color) .uk-h3,.uk-section-primary:not(.uk-preserve-color) .markdown h2,.markdown .uk-section-primary:not(.uk-preserve-color) h2,.uk-section-secondary:not(.uk-preserve-color) .uk-h3,.uk-section-secondary:not(.uk-preserve-color) .markdown h2,.markdown .uk-section-secondary:not(.uk-preserve-color) h2,.uk-tile-primary:not(.uk-preserve-color) .uk-h3,.uk-tile-primary:not(.uk-preserve-color) .markdown h2,.markdown .uk-tile-primary:not(.uk-preserve-color) h2,.uk-tile-secondary:not(.uk-preserve-color) .uk-h3,.uk-tile-secondary:not(.uk-preserve-color) .markdown h2,.markdown .uk-tile-secondary:not(.uk-preserve-color) h2,.uk-card-primary.uk-card-body .uk-h3,.uk-card-primary.uk-card-body .markdown h2,.markdown .uk-card-primary.uk-card-body h2,.uk-card-primary>:not([class*=uk-card-media]) .uk-h3,.uk-card-primary>:not([class*=uk-card-media]) .markdown h2,.markdown .uk-card-primary>:not([class*=uk-card-media]) h2,.uk-card-secondary.uk-card-body .uk-h3,.uk-card-secondary.uk-card-body .markdown h2,.markdown .uk-card-secondary.uk-card-body h2,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h3,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h2,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h2,.uk-overlay-primary .uk-h3,.uk-overlay-primary .markdown h2,.markdown .uk-overlay-primary h2,.uk-offcanvas-bar .uk-h3,.uk-offcanvas-bar .markdown h2,.markdown .uk-offcanvas-bar h2,.uk-light h4,.uk-section-primary:not(.uk-preserve-color) h4,.uk-section-secondary:not(.uk-preserve-color) h4,.uk-tile-primary:not(.uk-preserve-color) h4,.uk-tile-secondary:not(.uk-preserve-color) h4,.uk-card-primary.uk-card-body h4,.uk-card-primary>:not([class*=uk-card-media]) h4,.uk-card-secondary.uk-card-body h4,.uk-card-secondary>:not([class*=uk-card-media]) h4,.uk-overlay-primary h4,.uk-offcanvas-bar h4,.uk-light .uk-h4,.uk-light .markdown h3,.markdown .uk-light h3,.uk-section-primary:not(.uk-preserve-color) .uk-h4,.uk-section-primary:not(.uk-preserve-color) .markdown h3,.markdown .uk-section-primary:not(.uk-preserve-color) h3,.uk-section-secondary:not(.uk-preserve-color) .uk-h4,.uk-section-secondary:not(.uk-preserve-color) .markdown h3,.markdown .uk-section-secondary:not(.uk-preserve-color) h3,.uk-tile-primary:not(.uk-preserve-color) .uk-h4,.uk-tile-primary:not(.uk-preserve-color) .markdown h3,.markdown .uk-tile-primary:not(.uk-preserve-color) h3,.uk-tile-secondary:not(.uk-preserve-color) .uk-h4,.uk-tile-secondary:not(.uk-preserve-color) .markdown h3,.markdown .uk-tile-secondary:not(.uk-preserve-color) h3,.uk-card-primary.uk-card-body .uk-h4,.uk-card-primary.uk-card-body .markdown h3,.markdown .uk-card-primary.uk-card-body h3,.uk-card-primary>:not([class*=uk-card-media]) .uk-h4,.uk-card-primary>:not([class*=uk-card-media]) .markdown h3,.markdown .uk-card-primary>:not([class*=uk-card-media]) h3,.uk-card-secondary.uk-card-body .uk-h4,.uk-card-secondary.uk-card-body .markdown h3,.markdown .uk-card-secondary.uk-card-body h3,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h4,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h3,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h3,.uk-overlay-primary .uk-h4,.uk-overlay-primary .markdown h3,.markdown .uk-overlay-primary h3,.uk-offcanvas-bar .uk-h4,.uk-offcanvas-bar .markdown h3,.markdown .uk-offcanvas-bar h3,.uk-light h5,.uk-section-primary:not(.uk-preserve-color) h5,.uk-section-secondary:not(.uk-preserve-color) h5,.uk-tile-primary:not(.uk-preserve-color) h5,.uk-tile-secondary:not(.uk-preserve-color) h5,.uk-card-primary.uk-card-body h5,.uk-card-primary>:not([class*=uk-card-media]) h5,.uk-card-secondary.uk-card-body h5,.uk-card-secondary>:not([class*=uk-card-media]) h5,.uk-overlay-primary h5,.uk-offcanvas-bar h5,.uk-light .uk-h5,.uk-section-primary:not(.uk-preserve-color) .uk-h5,.uk-section-secondary:not(.uk-preserve-color) .uk-h5,.uk-tile-primary:not(.uk-preserve-color) .uk-h5,.uk-tile-secondary:not(.uk-preserve-color) .uk-h5,.uk-card-primary.uk-card-body .uk-h5,.uk-card-primary>:not([class*=uk-card-media]) .uk-h5,.uk-card-secondary.uk-card-body .uk-h5,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h5,.uk-overlay-primary .uk-h5,.uk-offcanvas-bar .uk-h5,.uk-light h6,.uk-section-primary:not(.uk-preserve-color) h6,.uk-section-secondary:not(.uk-preserve-color) h6,.uk-tile-primary:not(.uk-preserve-color) h6,.uk-tile-secondary:not(.uk-preserve-color) h6,.uk-card-primary.uk-card-body h6,.uk-card-primary>:not([class*=uk-card-media]) h6,.uk-card-secondary.uk-card-body h6,.uk-card-secondary>:not([class*=uk-card-media]) h6,.uk-overlay-primary h6,.uk-offcanvas-bar h6,.uk-light .uk-h6,.uk-section-primary:not(.uk-preserve-color) .uk-h6,.uk-section-secondary:not(.uk-preserve-color) .uk-h6,.uk-tile-primary:not(.uk-preserve-color) .uk-h6,.uk-tile-secondary:not(.uk-preserve-color) .uk-h6,.uk-card-primary.uk-card-body .uk-h6,.uk-card-primary>:not([class*=uk-card-media]) .uk-h6,.uk-card-secondary.uk-card-body .uk-h6,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h6,.uk-overlay-primary .uk-h6,.uk-offcanvas-bar .uk-h6,.uk-light .uk-heading-small,.uk-section-primary:not(.uk-preserve-color) .uk-heading-small,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-small,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-small,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-small,.uk-card-primary.uk-card-body .uk-heading-small,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-small,.uk-card-secondary.uk-card-body .uk-heading-small,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-small,.uk-overlay-primary .uk-heading-small,.uk-offcanvas-bar .uk-heading-small,.uk-light .uk-heading-medium,.uk-section-primary:not(.uk-preserve-color) .uk-heading-medium,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-medium,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-medium,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-medium,.uk-card-primary.uk-card-body .uk-heading-medium,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-medium,.uk-card-secondary.uk-card-body .uk-heading-medium,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-medium,.uk-overlay-primary .uk-heading-medium,.uk-offcanvas-bar .uk-heading-medium,.uk-light .uk-heading-large,.uk-section-primary:not(.uk-preserve-color) .uk-heading-large,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-large,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-large,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-large,.uk-card-primary.uk-card-body .uk-heading-large,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-large,.uk-card-secondary.uk-card-body .uk-heading-large,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-large,.uk-overlay-primary .uk-heading-large,.uk-offcanvas-bar .uk-heading-large,.uk-light .uk-heading-xlarge,.uk-section-primary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-card-primary.uk-card-body .uk-heading-xlarge,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-xlarge,.uk-card-secondary.uk-card-body .uk-heading-xlarge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-xlarge,.uk-overlay-primary .uk-heading-xlarge,.uk-offcanvas-bar .uk-heading-xlarge,.uk-light .uk-heading-2xlarge,.uk-section-primary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-card-primary.uk-card-body .uk-heading-2xlarge,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-2xlarge,.uk-card-secondary.uk-card-body .uk-heading-2xlarge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-2xlarge,.uk-overlay-primary .uk-heading-2xlarge,.uk-offcanvas-bar .uk-heading-2xlarge,.uk-light .uk-heading-3xlarge,.uk-section-primary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-card-primary.uk-card-body .uk-heading-3xlarge,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-3xlarge,.uk-card-secondary.uk-card-body .uk-heading-3xlarge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-3xlarge,.uk-overlay-primary .uk-heading-3xlarge,.uk-offcanvas-bar .uk-heading-3xlarge,.uk-section-primary:not(.uk-preserve-color) h1,.uk-section-primary:not(.uk-preserve-color) .uk-h1,.uk-section-primary:not(.uk-preserve-color) h2,.uk-section-primary:not(.uk-preserve-color) .uk-h2,.uk-section-primary:not(.uk-preserve-color) .markdown h1,.markdown .uk-section-primary:not(.uk-preserve-color) h1,.uk-section-primary:not(.uk-preserve-color) h3,.uk-section-primary:not(.uk-preserve-color) .uk-h3,.uk-section-primary:not(.uk-preserve-color) .markdown h2,.markdown .uk-section-primary:not(.uk-preserve-color) h2,.uk-section-primary:not(.uk-preserve-color) h4,.uk-section-primary:not(.uk-preserve-color) .uk-h4,.uk-section-primary:not(.uk-preserve-color) .markdown h3,.markdown .uk-section-primary:not(.uk-preserve-color) h3,.uk-section-primary:not(.uk-preserve-color) h5,.uk-section-primary:not(.uk-preserve-color) .uk-h5,.uk-section-primary:not(.uk-preserve-color) h6,.uk-section-primary:not(.uk-preserve-color) .uk-h6,.uk-section-primary:not(.uk-preserve-color) .uk-heading-small,.uk-section-primary:not(.uk-preserve-color) .uk-heading-medium,.uk-section-primary:not(.uk-preserve-color) .uk-heading-large,.uk-section-primary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-section-primary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-section-primary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-section-secondary:not(.uk-preserve-color) h1,.uk-section-secondary:not(.uk-preserve-color) .uk-h1,.uk-section-secondary:not(.uk-preserve-color) h2,.uk-section-secondary:not(.uk-preserve-color) .uk-h2,.uk-section-secondary:not(.uk-preserve-color) .markdown h1,.markdown .uk-section-secondary:not(.uk-preserve-color) h1,.uk-section-secondary:not(.uk-preserve-color) h3,.uk-section-secondary:not(.uk-preserve-color) .uk-h3,.uk-section-secondary:not(.uk-preserve-color) .markdown h2,.markdown .uk-section-secondary:not(.uk-preserve-color) h2,.uk-section-secondary:not(.uk-preserve-color) h4,.uk-section-secondary:not(.uk-preserve-color) .uk-h4,.uk-section-secondary:not(.uk-preserve-color) .markdown h3,.markdown .uk-section-secondary:not(.uk-preserve-color) h3,.uk-section-secondary:not(.uk-preserve-color) h5,.uk-section-secondary:not(.uk-preserve-color) .uk-h5,.uk-section-secondary:not(.uk-preserve-color) h6,.uk-section-secondary:not(.uk-preserve-color) .uk-h6,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-small,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-medium,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-large,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-tile-primary:not(.uk-preserve-color) h1,.uk-tile-primary:not(.uk-preserve-color) .uk-h1,.uk-tile-primary:not(.uk-preserve-color) h2,.uk-tile-primary:not(.uk-preserve-color) .uk-h2,.uk-tile-primary:not(.uk-preserve-color) .markdown h1,.markdown .uk-tile-primary:not(.uk-preserve-color) h1,.uk-tile-primary:not(.uk-preserve-color) h3,.uk-tile-primary:not(.uk-preserve-color) .uk-h3,.uk-tile-primary:not(.uk-preserve-color) .markdown h2,.markdown .uk-tile-primary:not(.uk-preserve-color) h2,.uk-tile-primary:not(.uk-preserve-color) h4,.uk-tile-primary:not(.uk-preserve-color) .uk-h4,.uk-tile-primary:not(.uk-preserve-color) .markdown h3,.markdown .uk-tile-primary:not(.uk-preserve-color) h3,.uk-tile-primary:not(.uk-preserve-color) h5,.uk-tile-primary:not(.uk-preserve-color) .uk-h5,.uk-tile-primary:not(.uk-preserve-color) h6,.uk-tile-primary:not(.uk-preserve-color) .uk-h6,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-small,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-medium,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-large,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-tile-secondary:not(.uk-preserve-color) h1,.uk-tile-secondary:not(.uk-preserve-color) .uk-h1,.uk-tile-secondary:not(.uk-preserve-color) h2,.uk-tile-secondary:not(.uk-preserve-color) .uk-h2,.uk-tile-secondary:not(.uk-preserve-color) .markdown h1,.markdown .uk-tile-secondary:not(.uk-preserve-color) h1,.uk-tile-secondary:not(.uk-preserve-color) h3,.uk-tile-secondary:not(.uk-preserve-color) .uk-h3,.uk-tile-secondary:not(.uk-preserve-color) .markdown h2,.markdown .uk-tile-secondary:not(.uk-preserve-color) h2,.uk-tile-secondary:not(.uk-preserve-color) h4,.uk-tile-secondary:not(.uk-preserve-color) .uk-h4,.uk-tile-secondary:not(.uk-preserve-color) .markdown h3,.markdown .uk-tile-secondary:not(.uk-preserve-color) h3,.uk-tile-secondary:not(.uk-preserve-color) h5,.uk-tile-secondary:not(.uk-preserve-color) .uk-h5,.uk-tile-secondary:not(.uk-preserve-color) h6,.uk-tile-secondary:not(.uk-preserve-color) .uk-h6,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-small,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-medium,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-large,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-xlarge,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-2xlarge,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-3xlarge,.uk-card-primary.uk-card-body h1,.uk-card-primary.uk-card-body .uk-h1,.uk-card-primary.uk-card-body h2,.uk-card-primary.uk-card-body .uk-h2,.uk-card-primary.uk-card-body .markdown h1,.markdown .uk-card-primary.uk-card-body h1,.uk-card-primary.uk-card-body h3,.uk-card-primary.uk-card-body .uk-h3,.uk-card-primary.uk-card-body .markdown h2,.markdown .uk-card-primary.uk-card-body h2,.uk-card-primary.uk-card-body h4,.uk-card-primary.uk-card-body .uk-h4,.uk-card-primary.uk-card-body .markdown h3,.markdown .uk-card-primary.uk-card-body h3,.uk-card-primary.uk-card-body h5,.uk-card-primary.uk-card-body .uk-h5,.uk-card-primary.uk-card-body h6,.uk-card-primary.uk-card-body .uk-h6,.uk-card-primary.uk-card-body .uk-heading-small,.uk-card-primary.uk-card-body .uk-heading-medium,.uk-card-primary.uk-card-body .uk-heading-large,.uk-card-primary.uk-card-body .uk-heading-xlarge,.uk-card-primary.uk-card-body .uk-heading-2xlarge,.uk-card-primary.uk-card-body .uk-heading-3xlarge,.uk-card-primary>:not([class*=uk-card-media]) h1,.uk-card-primary>:not([class*=uk-card-media]) .uk-h1,.uk-card-primary>:not([class*=uk-card-media]) h2,.uk-card-primary>:not([class*=uk-card-media]) .uk-h2,.uk-card-primary>:not([class*=uk-card-media]) .markdown h1,.markdown .uk-card-primary>:not([class*=uk-card-media]) h1,.uk-card-primary>:not([class*=uk-card-media]) h3,.uk-card-primary>:not([class*=uk-card-media]) .uk-h3,.uk-card-primary>:not([class*=uk-card-media]) .markdown h2,.markdown .uk-card-primary>:not([class*=uk-card-media]) h2,.uk-card-primary>:not([class*=uk-card-media]) h4,.uk-card-primary>:not([class*=uk-card-media]) .uk-h4,.uk-card-primary>:not([class*=uk-card-media]) .markdown h3,.markdown .uk-card-primary>:not([class*=uk-card-media]) h3,.uk-card-primary>:not([class*=uk-card-media]) h5,.uk-card-primary>:not([class*=uk-card-media]) .uk-h5,.uk-card-primary>:not([class*=uk-card-media]) h6,.uk-card-primary>:not([class*=uk-card-media]) .uk-h6,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-small,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-medium,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-large,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-xlarge,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-2xlarge,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-3xlarge,.uk-card-secondary.uk-card-body h1,.uk-card-secondary.uk-card-body .uk-h1,.uk-card-secondary.uk-card-body h2,.uk-card-secondary.uk-card-body .uk-h2,.uk-card-secondary.uk-card-body .markdown h1,.markdown .uk-card-secondary.uk-card-body h1,.uk-card-secondary.uk-card-body h3,.uk-card-secondary.uk-card-body .uk-h3,.uk-card-secondary.uk-card-body .markdown h2,.markdown .uk-card-secondary.uk-card-body h2,.uk-card-secondary.uk-card-body h4,.uk-card-secondary.uk-card-body .uk-h4,.uk-card-secondary.uk-card-body .markdown h3,.markdown .uk-card-secondary.uk-card-body h3,.uk-card-secondary.uk-card-body h5,.uk-card-secondary.uk-card-body .uk-h5,.uk-card-secondary.uk-card-body h6,.uk-card-secondary.uk-card-body .uk-h6,.uk-card-secondary.uk-card-body .uk-heading-small,.uk-card-secondary.uk-card-body .uk-heading-medium,.uk-card-secondary.uk-card-body .uk-heading-large,.uk-card-secondary.uk-card-body .uk-heading-xlarge,.uk-card-secondary.uk-card-body .uk-heading-2xlarge,.uk-card-secondary.uk-card-body .uk-heading-3xlarge,.uk-card-secondary>:not([class*=uk-card-media]) h1,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h1,.uk-card-secondary>:not([class*=uk-card-media]) h2,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h2,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h1,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h1,.uk-card-secondary>:not([class*=uk-card-media]) h3,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h3,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h2,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h2,.uk-card-secondary>:not([class*=uk-card-media]) h4,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h4,.uk-card-secondary>:not([class*=uk-card-media]) .markdown h3,.markdown .uk-card-secondary>:not([class*=uk-card-media]) h3,.uk-card-secondary>:not([class*=uk-card-media]) h5,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h5,.uk-card-secondary>:not([class*=uk-card-media]) h6,.uk-card-secondary>:not([class*=uk-card-media]) .uk-h6,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-small,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-medium,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-large,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-xlarge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-2xlarge,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-3xlarge,.uk-overlay-primary h1,.uk-overlay-primary .uk-h1,.uk-overlay-primary h2,.uk-overlay-primary .uk-h2,.uk-overlay-primary .markdown h1,.markdown .uk-overlay-primary h1,.uk-overlay-primary h3,.uk-overlay-primary .uk-h3,.uk-overlay-primary .markdown h2,.markdown .uk-overlay-primary h2,.uk-overlay-primary h4,.uk-overlay-primary .uk-h4,.uk-overlay-primary .markdown h3,.markdown .uk-overlay-primary h3,.uk-overlay-primary h5,.uk-overlay-primary .uk-h5,.uk-overlay-primary h6,.uk-overlay-primary .uk-h6,.uk-overlay-primary .uk-heading-small,.uk-overlay-primary .uk-heading-medium,.uk-overlay-primary .uk-heading-large,.uk-overlay-primary .uk-heading-xlarge,.uk-overlay-primary .uk-heading-2xlarge,.uk-overlay-primary .uk-heading-3xlarge,.uk-offcanvas-bar h1,.uk-offcanvas-bar .uk-h1,.uk-offcanvas-bar h2,.uk-offcanvas-bar .uk-h2,.uk-offcanvas-bar .markdown h1,.markdown .uk-offcanvas-bar h1,.uk-offcanvas-bar h3,.uk-offcanvas-bar .uk-h3,.uk-offcanvas-bar .markdown h2,.markdown .uk-offcanvas-bar h2,.uk-offcanvas-bar h4,.uk-offcanvas-bar .uk-h4,.uk-offcanvas-bar .markdown h3,.markdown .uk-offcanvas-bar h3,.uk-offcanvas-bar h5,.uk-offcanvas-bar .uk-h5,.uk-offcanvas-bar h6,.uk-offcanvas-bar .uk-h6,.uk-offcanvas-bar .uk-heading-small,.uk-offcanvas-bar .uk-heading-medium,.uk-offcanvas-bar .uk-heading-large,.uk-offcanvas-bar .uk-heading-xlarge,.uk-offcanvas-bar .uk-heading-2xlarge,.uk-offcanvas-bar .uk-heading-3xlarge{color:#fff}.uk-light blockquote,.uk-section-primary:not(.uk-preserve-color) blockquote,.uk-section-secondary:not(.uk-preserve-color) blockquote,.uk-tile-primary:not(.uk-preserve-color) blockquote,.uk-tile-secondary:not(.uk-preserve-color) blockquote,.uk-card-primary.uk-card-body blockquote,.uk-card-primary>:not([class*=uk-card-media]) blockquote,.uk-card-secondary.uk-card-body blockquote,.uk-card-secondary>:not([class*=uk-card-media]) blockquote,.uk-overlay-primary blockquote,.uk-offcanvas-bar blockquote{color:#fff}.uk-light blockquote footer,.uk-section-primary:not(.uk-preserve-color) blockquote footer,.uk-section-secondary:not(.uk-preserve-color) blockquote footer,.uk-tile-primary:not(.uk-preserve-color) blockquote footer,.uk-tile-secondary:not(.uk-preserve-color) blockquote footer,.uk-card-primary.uk-card-body blockquote footer,.uk-card-primary>:not([class*=uk-card-media]) blockquote footer,.uk-card-secondary.uk-card-body blockquote footer,.uk-card-secondary>:not([class*=uk-card-media]) blockquote footer,.uk-overlay-primary blockquote footer,.uk-offcanvas-bar blockquote footer{color:rgba(255,255,255,.7)}.uk-light hr,.uk-light .uk-hr,.uk-section-primary:not(.uk-preserve-color) hr,.uk-section-primary:not(.uk-preserve-color) .uk-hr,.uk-section-secondary:not(.uk-preserve-color) hr,.uk-section-secondary:not(.uk-preserve-color) .uk-hr,.uk-tile-primary:not(.uk-preserve-color) hr,.uk-tile-primary:not(.uk-preserve-color) .uk-hr,.uk-tile-secondary:not(.uk-preserve-color) hr,.uk-tile-secondary:not(.uk-preserve-color) .uk-hr,.uk-card-primary.uk-card-body hr,.uk-card-primary.uk-card-body .uk-hr,.uk-card-primary>:not([class*=uk-card-media]) hr,.uk-card-primary>:not([class*=uk-card-media]) .uk-hr,.uk-card-secondary.uk-card-body hr,.uk-card-secondary.uk-card-body .uk-hr,.uk-card-secondary>:not([class*=uk-card-media]) hr,.uk-card-secondary>:not([class*=uk-card-media]) .uk-hr,.uk-overlay-primary hr,.uk-overlay-primary .uk-hr,.uk-offcanvas-bar hr,.uk-offcanvas-bar .uk-hr{border-top-color:rgba(255,255,255,.2)}.uk-light :focus-visible,.uk-section-primary:not(.uk-preserve-color) :focus-visible,.uk-section-secondary:not(.uk-preserve-color) :focus-visible,.uk-tile-primary:not(.uk-preserve-color) :focus-visible,.uk-tile-secondary:not(.uk-preserve-color) :focus-visible,.uk-card-primary.uk-card-body :focus-visible,.uk-card-primary>:not([class*=uk-card-media]) :focus-visible,.uk-card-secondary.uk-card-body :focus-visible,.uk-card-secondary>:not([class*=uk-card-media]) :focus-visible,.uk-overlay-primary :focus-visible,.uk-offcanvas-bar :focus-visible{outline-color:#fff}.uk-light .uk-breadcrumb>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-card-primary.uk-card-body .uk-breadcrumb>*>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-breadcrumb>*>*,.uk-card-secondary.uk-card-body .uk-breadcrumb>*>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-breadcrumb>*>*,.uk-overlay-primary .uk-breadcrumb>*>*,.uk-offcanvas-bar .uk-breadcrumb>*>*{color:rgba(255,255,255,.5)}.uk-light .uk-breadcrumb>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-card-primary.uk-card-body .uk-breadcrumb>*>:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-breadcrumb>*>:hover,.uk-card-secondary.uk-card-body .uk-breadcrumb>*>:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-breadcrumb>*>:hover,.uk-overlay-primary .uk-breadcrumb>*>:hover,.uk-offcanvas-bar .uk-breadcrumb>*>:hover{color:rgba(255,255,255,.7)}.uk-light .uk-breadcrumb>:last-child>*,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-card-primary.uk-card-body .uk-breadcrumb>:last-child>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-breadcrumb>:last-child>*,.uk-card-secondary.uk-card-body .uk-breadcrumb>:last-child>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-breadcrumb>:last-child>*,.uk-overlay-primary .uk-breadcrumb>:last-child>*,.uk-offcanvas-bar .uk-breadcrumb>:last-child>*{color:rgba(255,255,255,.7)}.uk-light .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-overlay-primary .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-offcanvas-bar .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before{color:rgba(255,255,255,.5)}.uk-light .uk-button-default,.uk-section-primary:not(.uk-preserve-color) .uk-button-default,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default,.uk-card-primary.uk-card-body .uk-button-default,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-default,.uk-card-secondary.uk-card-body .uk-button-default,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-default,.uk-overlay-primary .uk-button-default,.uk-offcanvas-bar .uk-button-default{background-color:rgba(0,0,0,0);color:#fff;border-color:rgba(255,255,255,.7)}.uk-light .uk-button-default:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-default:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default:hover,.uk-card-primary.uk-card-body .uk-button-default:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-default:hover,.uk-card-secondary.uk-card-body .uk-button-default:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-default:hover,.uk-overlay-primary .uk-button-default:hover,.uk-offcanvas-bar .uk-button-default:hover{background-color:rgba(0,0,0,0);color:#fff;border-color:#fff}.uk-light .uk-button-default:active,.uk-light .uk-button-default.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-default:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-card-primary.uk-card-body .uk-button-default:active,.uk-card-primary.uk-card-body .uk-button-default.uk-active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-default:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-default.uk-active,.uk-card-secondary.uk-card-body .uk-button-default:active,.uk-card-secondary.uk-card-body .uk-button-default.uk-active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-default:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-default.uk-active,.uk-overlay-primary .uk-button-default:active,.uk-overlay-primary .uk-button-default.uk-active,.uk-offcanvas-bar .uk-button-default:active,.uk-offcanvas-bar .uk-button-default.uk-active{background-color:rgba(0,0,0,0);color:#fff;border-color:#fff}.uk-light .uk-button-primary,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary,.uk-card-primary.uk-card-body .uk-button-primary,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-primary,.uk-card-secondary.uk-card-body .uk-button-primary,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-primary,.uk-overlay-primary .uk-button-primary,.uk-offcanvas-bar .uk-button-primary{background-color:#fff;color:#666}.uk-light .uk-button-primary:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-card-primary.uk-card-body .uk-button-primary:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-primary:hover,.uk-card-secondary.uk-card-body .uk-button-primary:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-primary:hover,.uk-overlay-primary .uk-button-primary:hover,.uk-offcanvas-bar .uk-button-primary:hover{background-color:#f2f2f2;color:#666}.uk-light .uk-button-primary:active,.uk-light .uk-button-primary.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-card-primary.uk-card-body .uk-button-primary:active,.uk-card-primary.uk-card-body .uk-button-primary.uk-active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-primary:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-primary.uk-active,.uk-card-secondary.uk-card-body .uk-button-primary:active,.uk-card-secondary.uk-card-body .uk-button-primary.uk-active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-primary:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-primary.uk-active,.uk-overlay-primary .uk-button-primary:active,.uk-overlay-primary .uk-button-primary.uk-active,.uk-offcanvas-bar .uk-button-primary:active,.uk-offcanvas-bar .uk-button-primary.uk-active{background-color:#e6e6e6;color:#666}.uk-light .uk-button-secondary,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary,.uk-card-primary.uk-card-body .uk-button-secondary,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-secondary,.uk-card-secondary.uk-card-body .uk-button-secondary,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-secondary,.uk-overlay-primary .uk-button-secondary,.uk-offcanvas-bar .uk-button-secondary{background-color:#fff;color:#666}.uk-light .uk-button-secondary:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-card-primary.uk-card-body .uk-button-secondary:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-secondary:hover,.uk-card-secondary.uk-card-body .uk-button-secondary:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-secondary:hover,.uk-overlay-primary .uk-button-secondary:hover,.uk-offcanvas-bar .uk-button-secondary:hover{background-color:#f2f2f2;color:#666}.uk-light .uk-button-secondary:active,.uk-light .uk-button-secondary.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-card-primary.uk-card-body .uk-button-secondary:active,.uk-card-primary.uk-card-body .uk-button-secondary.uk-active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-secondary:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-secondary.uk-active,.uk-card-secondary.uk-card-body .uk-button-secondary:active,.uk-card-secondary.uk-card-body .uk-button-secondary.uk-active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-secondary:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-secondary.uk-active,.uk-overlay-primary .uk-button-secondary:active,.uk-overlay-primary .uk-button-secondary.uk-active,.uk-offcanvas-bar .uk-button-secondary:active,.uk-offcanvas-bar .uk-button-secondary.uk-active{background-color:#e6e6e6;color:#666}.uk-light .uk-button-text,.uk-section-primary:not(.uk-preserve-color) .uk-button-text,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text,.uk-card-primary.uk-card-body .uk-button-text,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-text,.uk-card-secondary.uk-card-body .uk-button-text,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-text,.uk-overlay-primary .uk-button-text,.uk-offcanvas-bar .uk-button-text{color:#fff}.uk-light .uk-button-text::before,.uk-section-primary:not(.uk-preserve-color) .uk-button-text::before,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text::before,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text::before,.uk-card-primary.uk-card-body .uk-button-text::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-text::before,.uk-card-secondary.uk-card-body .uk-button-text::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-text::before,.uk-overlay-primary .uk-button-text::before,.uk-offcanvas-bar .uk-button-text::before{border-bottom-color:#fff}.uk-light .uk-button-text:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-text:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text:hover,.uk-card-primary.uk-card-body .uk-button-text:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-text:hover,.uk-card-secondary.uk-card-body .uk-button-text:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-text:hover,.uk-overlay-primary .uk-button-text:hover,.uk-offcanvas-bar .uk-button-text:hover{color:#fff}.uk-light .uk-button-text:disabled,.uk-section-primary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-card-primary.uk-card-body .uk-button-text:disabled,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-text:disabled,.uk-card-secondary.uk-card-body .uk-button-text:disabled,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-text:disabled,.uk-overlay-primary .uk-button-text:disabled,.uk-offcanvas-bar .uk-button-text:disabled{color:rgba(255,255,255,.5)}.uk-light .uk-button-link,.uk-section-primary:not(.uk-preserve-color) .uk-button-link,.uk-section-secondary:not(.uk-preserve-color) .uk-button-link,.uk-tile-primary:not(.uk-preserve-color) .uk-button-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-link,.uk-card-primary.uk-card-body .uk-button-link,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-link,.uk-card-secondary.uk-card-body .uk-button-link,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-link,.uk-overlay-primary .uk-button-link,.uk-offcanvas-bar .uk-button-link{color:#fff}.uk-light .uk-button-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-link:hover,.uk-card-primary.uk-card-body .uk-button-link:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-button-link:hover,.uk-card-secondary.uk-card-body .uk-button-link:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-button-link:hover,.uk-overlay-primary .uk-button-link:hover,.uk-offcanvas-bar .uk-button-link:hover{color:rgba(255,255,255,.5)}.uk-light.uk-card-badge,.uk-section-primary:not(.uk-preserve-color).uk-card-badge,.uk-section-secondary:not(.uk-preserve-color).uk-card-badge,.uk-tile-primary:not(.uk-preserve-color).uk-card-badge,.uk-tile-secondary:not(.uk-preserve-color).uk-card-badge,.uk-card-primary.uk-card-body.uk-card-badge,.uk-card-primary>:not([class*=uk-card-media]).uk-card-badge,.uk-card-secondary.uk-card-body.uk-card-badge,.uk-card-secondary>:not([class*=uk-card-media]).uk-card-badge,.uk-overlay-primary.uk-card-badge,.uk-offcanvas-bar.uk-card-badge{background-color:#fff;color:#666}.uk-light .uk-close,.uk-section-primary:not(.uk-preserve-color) .uk-close,.uk-section-secondary:not(.uk-preserve-color) .uk-close,.uk-tile-primary:not(.uk-preserve-color) .uk-close,.uk-tile-secondary:not(.uk-preserve-color) .uk-close,.uk-card-primary.uk-card-body .uk-close,.uk-card-primary>:not([class*=uk-card-media]) .uk-close,.uk-card-secondary.uk-card-body .uk-close,.uk-card-secondary>:not([class*=uk-card-media]) .uk-close,.uk-overlay-primary .uk-close,.uk-offcanvas-bar .uk-close{color:rgba(255,255,255,.5)}.uk-light .uk-close:hover,.uk-section-primary:not(.uk-preserve-color) .uk-close:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-close:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-close:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-close:hover,.uk-card-primary.uk-card-body .uk-close:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-close:hover,.uk-card-secondary.uk-card-body .uk-close:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-close:hover,.uk-overlay-primary .uk-close:hover,.uk-offcanvas-bar .uk-close:hover{color:rgba(255,255,255,.7)}.uk-light .uk-column-divider,.uk-section-primary:not(.uk-preserve-color) .uk-column-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-column-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-column-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-column-divider,.uk-card-primary.uk-card-body .uk-column-divider,.uk-card-primary>:not([class*=uk-card-media]) .uk-column-divider,.uk-card-secondary.uk-card-body .uk-column-divider,.uk-card-secondary>:not([class*=uk-card-media]) .uk-column-divider,.uk-overlay-primary .uk-column-divider,.uk-offcanvas-bar .uk-column-divider{column-rule-color:rgba(255,255,255,.2)}.uk-light .uk-divider-icon,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon,.uk-card-primary.uk-card-body .uk-divider-icon,.uk-card-primary>:not([class*=uk-card-media]) .uk-divider-icon,.uk-card-secondary.uk-card-body .uk-divider-icon,.uk-card-secondary>:not([class*=uk-card-media]) .uk-divider-icon,.uk-overlay-primary .uk-divider-icon,.uk-offcanvas-bar .uk-divider-icon{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22none%22%20stroke%3D%22rgba(255,255,255,.2)%22%20stroke-width%3D%222%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%227%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-divider-icon::before,.uk-light .uk-divider-icon::after,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-card-primary.uk-card-body .uk-divider-icon::before,.uk-card-primary.uk-card-body .uk-divider-icon::after,.uk-card-primary>:not([class*=uk-card-media]) .uk-divider-icon::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-divider-icon::after,.uk-card-secondary.uk-card-body .uk-divider-icon::before,.uk-card-secondary.uk-card-body .uk-divider-icon::after,.uk-card-secondary>:not([class*=uk-card-media]) .uk-divider-icon::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-divider-icon::after,.uk-overlay-primary .uk-divider-icon::before,.uk-overlay-primary .uk-divider-icon::after,.uk-offcanvas-bar .uk-divider-icon::before,.uk-offcanvas-bar .uk-divider-icon::after{border-bottom-color:rgba(255,255,255,.2)}.uk-light .uk-divider-small::after,.uk-section-primary:not(.uk-preserve-color) .uk-divider-small::after,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-small::after,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-small::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-small::after,.uk-card-primary.uk-card-body .uk-divider-small::after,.uk-card-primary>:not([class*=uk-card-media]) .uk-divider-small::after,.uk-card-secondary.uk-card-body .uk-divider-small::after,.uk-card-secondary>:not([class*=uk-card-media]) .uk-divider-small::after,.uk-overlay-primary .uk-divider-small::after,.uk-offcanvas-bar .uk-divider-small::after{border-top-color:rgba(255,255,255,.2)}.uk-light .uk-divider-vertical,.uk-section-primary:not(.uk-preserve-color) .uk-divider-vertical,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-vertical,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-vertical,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-vertical,.uk-card-primary.uk-card-body .uk-divider-vertical,.uk-card-primary>:not([class*=uk-card-media]) .uk-divider-vertical,.uk-card-secondary.uk-card-body .uk-divider-vertical,.uk-card-secondary>:not([class*=uk-card-media]) .uk-divider-vertical,.uk-overlay-primary .uk-divider-vertical,.uk-offcanvas-bar .uk-divider-vertical{border-left-color:rgba(255,255,255,.2)}.uk-light .uk-dotnav>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-card-primary.uk-card-body .uk-dotnav>*>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-dotnav>*>*,.uk-card-secondary.uk-card-body .uk-dotnav>*>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-dotnav>*>*,.uk-overlay-primary .uk-dotnav>*>*,.uk-offcanvas-bar .uk-dotnav>*>*{background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,.9)}.uk-light .uk-dotnav>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-card-primary.uk-card-body .uk-dotnav>*>:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-dotnav>*>:hover,.uk-card-secondary.uk-card-body .uk-dotnav>*>:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-dotnav>*>:hover,.uk-overlay-primary .uk-dotnav>*>:hover,.uk-offcanvas-bar .uk-dotnav>*>:hover{background-color:rgba(255,255,255,.9);border-color:rgba(0,0,0,0)}.uk-light .uk-dotnav>*>:active,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-card-primary.uk-card-body .uk-dotnav>*>:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-dotnav>*>:active,.uk-card-secondary.uk-card-body .uk-dotnav>*>:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-dotnav>*>:active,.uk-overlay-primary .uk-dotnav>*>:active,.uk-offcanvas-bar .uk-dotnav>*>:active{background-color:rgba(255,255,255,.5);border-color:rgba(0,0,0,0)}.uk-light .uk-dotnav>.uk-active>*,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-card-primary.uk-card-body .uk-dotnav>.uk-active>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-dotnav>.uk-active>*,.uk-card-secondary.uk-card-body .uk-dotnav>.uk-active>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-dotnav>.uk-active>*,.uk-overlay-primary .uk-dotnav>.uk-active>*,.uk-offcanvas-bar .uk-dotnav>.uk-active>*{background-color:rgba(255,255,255,.9);border-color:rgba(0,0,0,0)}.uk-light .uk-input,.uk-light .uk-select,.uk-light .uk-textarea,.uk-section-primary:not(.uk-preserve-color) .uk-input,.uk-section-primary:not(.uk-preserve-color) .uk-select,.uk-section-primary:not(.uk-preserve-color) .uk-textarea,.uk-section-secondary:not(.uk-preserve-color) .uk-input,.uk-section-secondary:not(.uk-preserve-color) .uk-select,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea,.uk-tile-primary:not(.uk-preserve-color) .uk-input,.uk-tile-primary:not(.uk-preserve-color) .uk-select,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea,.uk-tile-secondary:not(.uk-preserve-color) .uk-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-select,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea,.uk-card-primary.uk-card-body .uk-input,.uk-card-primary.uk-card-body .uk-select,.uk-card-primary.uk-card-body .uk-textarea,.uk-card-primary>:not([class*=uk-card-media]) .uk-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-select,.uk-card-primary>:not([class*=uk-card-media]) .uk-textarea,.uk-card-secondary.uk-card-body .uk-input,.uk-card-secondary.uk-card-body .uk-select,.uk-card-secondary.uk-card-body .uk-textarea,.uk-card-secondary>:not([class*=uk-card-media]) .uk-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-select,.uk-card-secondary>:not([class*=uk-card-media]) .uk-textarea,.uk-overlay-primary .uk-input,.uk-overlay-primary .uk-select,.uk-overlay-primary .uk-textarea,.uk-offcanvas-bar .uk-input,.uk-offcanvas-bar .uk-select,.uk-offcanvas-bar .uk-textarea{background-color:rgba(255,255,255,.1);color:rgba(255,255,255,.7);background-clip:padding-box;border-color:rgba(255,255,255,.2)}.uk-light .uk-input:focus,.uk-light .uk-select:focus,.uk-light .uk-textarea:focus,.uk-section-primary:not(.uk-preserve-color) .uk-input:focus,.uk-section-primary:not(.uk-preserve-color) .uk-select:focus,.uk-section-primary:not(.uk-preserve-color) .uk-textarea:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-input:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-select:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-input:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-select:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-input:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-select:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea:focus,.uk-card-primary.uk-card-body .uk-input:focus,.uk-card-primary.uk-card-body .uk-select:focus,.uk-card-primary.uk-card-body .uk-textarea:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-input:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-select:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-textarea:focus,.uk-card-secondary.uk-card-body .uk-input:focus,.uk-card-secondary.uk-card-body .uk-select:focus,.uk-card-secondary.uk-card-body .uk-textarea:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-input:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-select:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-textarea:focus,.uk-overlay-primary .uk-input:focus,.uk-overlay-primary .uk-select:focus,.uk-overlay-primary .uk-textarea:focus,.uk-offcanvas-bar .uk-input:focus,.uk-offcanvas-bar .uk-select:focus,.uk-offcanvas-bar .uk-textarea:focus{background-color:rgba(255,255,255,.15);color:rgba(255,255,255,.7);border-color:rgba(255,255,255,.7)}.uk-light .uk-input::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-input::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-input::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-input::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-input::placeholder,.uk-card-primary.uk-card-body .uk-input::placeholder,.uk-card-primary>:not([class*=uk-card-media]) .uk-input::placeholder,.uk-card-secondary.uk-card-body .uk-input::placeholder,.uk-card-secondary>:not([class*=uk-card-media]) .uk-input::placeholder,.uk-overlay-primary .uk-input::placeholder,.uk-offcanvas-bar .uk-input::placeholder{color:rgba(255,255,255,.5)}.uk-light .uk-textarea::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-card-primary.uk-card-body .uk-textarea::placeholder,.uk-card-primary>:not([class*=uk-card-media]) .uk-textarea::placeholder,.uk-card-secondary.uk-card-body .uk-textarea::placeholder,.uk-card-secondary>:not([class*=uk-card-media]) .uk-textarea::placeholder,.uk-overlay-primary .uk-textarea::placeholder,.uk-offcanvas-bar .uk-textarea::placeholder{color:rgba(255,255,255,.5)}.uk-light .uk-select:not([multiple]):not([size]),.uk-section-primary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-section-secondary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-tile-primary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-tile-secondary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-card-primary.uk-card-body .uk-select:not([multiple]):not([size]),.uk-card-primary>:not([class*=uk-card-media]) .uk-select:not([multiple]):not([size]),.uk-card-secondary.uk-card-body .uk-select:not([multiple]):not([size]),.uk-card-secondary>:not([class*=uk-card-media]) .uk-select:not([multiple]):not([size]),.uk-overlay-primary .uk-select:not([multiple]):not([size]),.uk-offcanvas-bar .uk-select:not([multiple]):not([size]){background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22rgba(255,255,255,.7)%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22rgba(255,255,255,.7)%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-input[list]:hover,.uk-light .uk-input[list]:focus,.uk-section-primary:not(.uk-preserve-color) .uk-input[list]:hover,.uk-section-primary:not(.uk-preserve-color) .uk-input[list]:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-input[list]:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-input[list]:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-input[list]:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-input[list]:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-input[list]:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-input[list]:focus,.uk-card-primary.uk-card-body .uk-input[list]:hover,.uk-card-primary.uk-card-body .uk-input[list]:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-input[list]:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-input[list]:focus,.uk-card-secondary.uk-card-body .uk-input[list]:hover,.uk-card-secondary.uk-card-body .uk-input[list]:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-input[list]:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-input[list]:focus,.uk-overlay-primary .uk-input[list]:hover,.uk-overlay-primary .uk-input[list]:focus,.uk-offcanvas-bar .uk-input[list]:hover,.uk-offcanvas-bar .uk-input[list]:focus{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22rgba(255,255,255,.7)%22%20points%3D%2212%2012%208%206%2016%206%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-radio,.uk-light .uk-checkbox,.uk-section-primary:not(.uk-preserve-color) .uk-radio,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox,.uk-section-secondary:not(.uk-preserve-color) .uk-radio,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox,.uk-tile-primary:not(.uk-preserve-color) .uk-radio,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox,.uk-card-primary.uk-card-body .uk-radio,.uk-card-primary.uk-card-body .uk-checkbox,.uk-card-primary>:not([class*=uk-card-media]) .uk-radio,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox,.uk-card-secondary.uk-card-body .uk-radio,.uk-card-secondary.uk-card-body .uk-checkbox,.uk-card-secondary>:not([class*=uk-card-media]) .uk-radio,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox,.uk-overlay-primary .uk-radio,.uk-overlay-primary .uk-checkbox,.uk-offcanvas-bar .uk-radio,.uk-offcanvas-bar .uk-checkbox{background-color:rgba(255,255,255,.1);border-color:rgba(255,255,255,.2)}.uk-light .uk-radio:focus,.uk-light .uk-checkbox:focus,.uk-section-primary:not(.uk-preserve-color) .uk-radio:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-card-primary.uk-card-body .uk-radio:focus,.uk-card-primary.uk-card-body .uk-checkbox:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-radio:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:focus,.uk-card-secondary.uk-card-body .uk-radio:focus,.uk-card-secondary.uk-card-body .uk-checkbox:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-radio:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:focus,.uk-overlay-primary .uk-radio:focus,.uk-overlay-primary .uk-checkbox:focus,.uk-offcanvas-bar .uk-radio:focus,.uk-offcanvas-bar .uk-checkbox:focus{background-color:rgba(255,255,255,.15);border-color:rgba(255,255,255,.7)}.uk-light .uk-radio:checked,.uk-light .uk-checkbox:checked,.uk-light .uk-checkbox:indeterminate,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-card-primary.uk-card-body .uk-radio:checked,.uk-card-primary.uk-card-body .uk-checkbox:checked,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate,.uk-card-primary>:not([class*=uk-card-media]) .uk-radio:checked,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:checked,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate,.uk-card-secondary.uk-card-body .uk-radio:checked,.uk-card-secondary.uk-card-body .uk-checkbox:checked,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate,.uk-card-secondary>:not([class*=uk-card-media]) .uk-radio:checked,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:checked,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate,.uk-overlay-primary .uk-radio:checked,.uk-overlay-primary .uk-checkbox:checked,.uk-overlay-primary .uk-checkbox:indeterminate,.uk-offcanvas-bar .uk-radio:checked,.uk-offcanvas-bar .uk-checkbox:checked,.uk-offcanvas-bar .uk-checkbox:indeterminate{background-color:#fff;border-color:#fff}.uk-light .uk-radio:checked:focus,.uk-light .uk-checkbox:checked:focus,.uk-light .uk-checkbox:indeterminate:focus,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-card-primary.uk-card-body .uk-radio:checked:focus,.uk-card-primary.uk-card-body .uk-checkbox:checked:focus,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-radio:checked:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:checked:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate:focus,.uk-card-secondary.uk-card-body .uk-radio:checked:focus,.uk-card-secondary.uk-card-body .uk-checkbox:checked:focus,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-radio:checked:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:checked:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate:focus,.uk-overlay-primary .uk-radio:checked:focus,.uk-overlay-primary .uk-checkbox:checked:focus,.uk-overlay-primary .uk-checkbox:indeterminate:focus,.uk-offcanvas-bar .uk-radio:checked:focus,.uk-offcanvas-bar .uk-checkbox:checked:focus,.uk-offcanvas-bar .uk-checkbox:indeterminate:focus{background-color:#fff}.uk-light .uk-radio:checked,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-card-primary.uk-card-body .uk-radio:checked,.uk-card-primary>:not([class*=uk-card-media]) .uk-radio:checked,.uk-card-secondary.uk-card-body .uk-radio:checked,.uk-card-secondary>:not([class*=uk-card-media]) .uk-radio:checked,.uk-overlay-primary .uk-radio:checked,.uk-offcanvas-bar .uk-radio:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23666%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-checkbox:checked,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-card-primary.uk-card-body .uk-checkbox:checked,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:checked,.uk-card-secondary.uk-card-body .uk-checkbox:checked,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:checked,.uk-overlay-primary .uk-checkbox:checked,.uk-offcanvas-bar .uk-checkbox:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-checkbox:indeterminate,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate,.uk-card-primary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate,.uk-card-secondary>:not([class*=uk-card-media]) .uk-checkbox:indeterminate,.uk-overlay-primary .uk-checkbox:indeterminate,.uk-offcanvas-bar .uk-checkbox:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-form-label,.uk-section-primary:not(.uk-preserve-color) .uk-form-label,.uk-section-secondary:not(.uk-preserve-color) .uk-form-label,.uk-tile-primary:not(.uk-preserve-color) .uk-form-label,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-label,.uk-card-primary.uk-card-body .uk-form-label,.uk-card-primary>:not([class*=uk-card-media]) .uk-form-label,.uk-card-secondary.uk-card-body .uk-form-label,.uk-card-secondary>:not([class*=uk-card-media]) .uk-form-label,.uk-overlay-primary .uk-form-label,.uk-offcanvas-bar .uk-form-label{color:#fff}.uk-light .uk-form-icon,.uk-section-primary:not(.uk-preserve-color) .uk-form-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-form-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-form-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-icon,.uk-card-primary.uk-card-body .uk-form-icon,.uk-card-primary>:not([class*=uk-card-media]) .uk-form-icon,.uk-card-secondary.uk-card-body .uk-form-icon,.uk-card-secondary>:not([class*=uk-card-media]) .uk-form-icon,.uk-overlay-primary .uk-form-icon,.uk-offcanvas-bar .uk-form-icon{color:rgba(255,255,255,.5)}.uk-light .uk-form-icon:hover,.uk-section-primary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-card-primary.uk-card-body .uk-form-icon:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-form-icon:hover,.uk-card-secondary.uk-card-body .uk-form-icon:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-form-icon:hover,.uk-overlay-primary .uk-form-icon:hover,.uk-offcanvas-bar .uk-form-icon:hover{color:rgba(255,255,255,.7)}.uk-light .uk-grid-divider>:not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-grid-divider>:not(.uk-first-column)::before,.uk-overlay-primary .uk-grid-divider>:not(.uk-first-column)::before,.uk-offcanvas-bar .uk-grid-divider>:not(.uk-first-column)::before{border-left-color:rgba(255,255,255,.2)}.uk-light .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-section-primary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-section-secondary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-tile-primary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-primary.uk-card-body .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-secondary.uk-card-body .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-overlay-primary .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-offcanvas-bar .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{border-top-color:rgba(255,255,255,.2)}.uk-light .uk-heading-divider,.uk-section-primary:not(.uk-preserve-color) .uk-heading-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-divider,.uk-card-primary.uk-card-body .uk-heading-divider,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-divider,.uk-card-secondary.uk-card-body .uk-heading-divider,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-divider,.uk-overlay-primary .uk-heading-divider,.uk-offcanvas-bar .uk-heading-divider{border-bottom-color:rgba(255,255,255,.2)}.uk-light .uk-heading-bullet::before,.uk-section-primary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-card-primary.uk-card-body .uk-heading-bullet::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-bullet::before,.uk-card-secondary.uk-card-body .uk-heading-bullet::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-bullet::before,.uk-overlay-primary .uk-heading-bullet::before,.uk-offcanvas-bar .uk-heading-bullet::before{border-left-color:rgba(255,255,255,.2)}.uk-light .uk-heading-line>::before,.uk-light .uk-heading-line>::after,.uk-section-primary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-section-primary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-card-primary.uk-card-body .uk-heading-line>::before,.uk-card-primary.uk-card-body .uk-heading-line>::after,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-line>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-heading-line>::after,.uk-card-secondary.uk-card-body .uk-heading-line>::before,.uk-card-secondary.uk-card-body .uk-heading-line>::after,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-line>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-heading-line>::after,.uk-overlay-primary .uk-heading-line>::before,.uk-overlay-primary .uk-heading-line>::after,.uk-offcanvas-bar .uk-heading-line>::before,.uk-offcanvas-bar .uk-heading-line>::after{border-bottom-color:rgba(255,255,255,.2)}.uk-light .uk-icon-link,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link,.uk-card-primary.uk-card-body .uk-icon-link,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-link,.uk-card-secondary.uk-card-body .uk-icon-link,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-link,.uk-overlay-primary .uk-icon-link,.uk-offcanvas-bar .uk-icon-link{color:rgba(255,255,255,.5)}.uk-light .uk-icon-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-card-primary.uk-card-body .uk-icon-link:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-link:hover,.uk-card-secondary.uk-card-body .uk-icon-link:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-link:hover,.uk-overlay-primary .uk-icon-link:hover,.uk-offcanvas-bar .uk-icon-link:hover{color:rgba(255,255,255,.7)}.uk-light .uk-icon-link:active,.uk-light .uk-active>.uk-icon-link,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link:active,.uk-section-primary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link:active,.uk-section-secondary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link:active,.uk-tile-primary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-card-primary.uk-card-body .uk-icon-link:active,.uk-card-primary.uk-card-body .uk-active>.uk-icon-link,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-link:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-active>.uk-icon-link,.uk-card-secondary.uk-card-body .uk-icon-link:active,.uk-card-secondary.uk-card-body .uk-active>.uk-icon-link,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-link:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-active>.uk-icon-link,.uk-overlay-primary .uk-icon-link:active,.uk-overlay-primary .uk-active>.uk-icon-link,.uk-offcanvas-bar .uk-icon-link:active,.uk-offcanvas-bar .uk-active>.uk-icon-link{color:rgba(255,255,255,.7)}.uk-light .uk-icon-button,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button,.uk-card-primary.uk-card-body .uk-icon-button,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-button,.uk-card-secondary.uk-card-body .uk-icon-button,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-button,.uk-overlay-primary .uk-icon-button,.uk-offcanvas-bar .uk-icon-button{background-color:rgba(255,255,255,.1);color:rgba(255,255,255,.5)}.uk-light .uk-icon-button:hover,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-card-primary.uk-card-body .uk-icon-button:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-button:hover,.uk-card-secondary.uk-card-body .uk-icon-button:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-button:hover,.uk-overlay-primary .uk-icon-button:hover,.uk-offcanvas-bar .uk-icon-button:hover{background-color:rgba(255,255,255,.15);color:rgba(255,255,255,.7)}.uk-light .uk-icon-button:active,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button:active,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button:active,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button:active,.uk-card-primary.uk-card-body .uk-icon-button:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-icon-button:active,.uk-card-secondary.uk-card-body .uk-icon-button:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-icon-button:active,.uk-overlay-primary .uk-icon-button:active,.uk-offcanvas-bar .uk-icon-button:active{background-color:rgba(255,255,255,.2);color:rgba(255,255,255,.7)}.uk-light .uk-iconnav>*>a,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-card-primary.uk-card-body .uk-iconnav>*>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-iconnav>*>a,.uk-card-secondary.uk-card-body .uk-iconnav>*>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-iconnav>*>a,.uk-overlay-primary .uk-iconnav>*>a,.uk-offcanvas-bar .uk-iconnav>*>a{color:rgba(255,255,255,.5)}.uk-light .uk-iconnav>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-card-primary.uk-card-body .uk-iconnav>*>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-iconnav>*>a:hover,.uk-card-secondary.uk-card-body .uk-iconnav>*>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-iconnav>*>a:hover,.uk-overlay-primary .uk-iconnav>*>a:hover,.uk-offcanvas-bar .uk-iconnav>*>a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-iconnav>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-card-primary.uk-card-body .uk-iconnav>.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-iconnav>.uk-active>a,.uk-card-secondary.uk-card-body .uk-iconnav>.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-iconnav>.uk-active>a,.uk-overlay-primary .uk-iconnav>.uk-active>a,.uk-offcanvas-bar .uk-iconnav>.uk-active>a{color:rgba(255,255,255,.7)}.uk-light .uk-label,.uk-section-primary:not(.uk-preserve-color) .uk-label,.uk-section-secondary:not(.uk-preserve-color) .uk-label,.uk-tile-primary:not(.uk-preserve-color) .uk-label,.uk-tile-secondary:not(.uk-preserve-color) .uk-label,.uk-card-primary.uk-card-body .uk-label,.uk-card-primary>:not([class*=uk-card-media]) .uk-label,.uk-card-secondary.uk-card-body .uk-label,.uk-card-secondary>:not([class*=uk-card-media]) .uk-label,.uk-overlay-primary .uk-label,.uk-offcanvas-bar .uk-label{background-color:#fff;color:#666}.uk-light a.uk-link-muted,.uk-light .uk-link-muted a,.uk-section-primary:not(.uk-preserve-color) a.uk-link-muted,.uk-section-primary:not(.uk-preserve-color) .uk-link-muted a,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-muted,.uk-section-secondary:not(.uk-preserve-color) .uk-link-muted a,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-muted,.uk-tile-primary:not(.uk-preserve-color) .uk-link-muted a,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-muted,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-muted a,.uk-card-primary.uk-card-body a.uk-link-muted,.uk-card-primary.uk-card-body .uk-link-muted a,.uk-card-primary>:not([class*=uk-card-media]) a.uk-link-muted,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-muted a,.uk-card-secondary.uk-card-body a.uk-link-muted,.uk-card-secondary.uk-card-body .uk-link-muted a,.uk-card-secondary>:not([class*=uk-card-media]) a.uk-link-muted,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-muted a,.uk-overlay-primary a.uk-link-muted,.uk-overlay-primary .uk-link-muted a,.uk-offcanvas-bar a.uk-link-muted,.uk-offcanvas-bar .uk-link-muted a{color:rgba(255,255,255,.5)}.uk-light a.uk-link-muted:hover,.uk-light .uk-link-muted a:hover,.uk-light .uk-link-toggle:hover .uk-link-muted,.uk-section-primary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-muted,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-muted,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-muted,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-muted,.uk-card-primary.uk-card-body a.uk-link-muted:hover,.uk-card-primary.uk-card-body .uk-link-muted a:hover,.uk-card-primary.uk-card-body .uk-link-toggle:hover .uk-link-muted,.uk-card-primary>:not([class*=uk-card-media]) a.uk-link-muted:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-muted a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-muted,.uk-card-secondary.uk-card-body a.uk-link-muted:hover,.uk-card-secondary.uk-card-body .uk-link-muted a:hover,.uk-card-secondary.uk-card-body .uk-link-toggle:hover .uk-link-muted,.uk-card-secondary>:not([class*=uk-card-media]) a.uk-link-muted:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-muted a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-muted,.uk-overlay-primary a.uk-link-muted:hover,.uk-overlay-primary .uk-link-muted a:hover,.uk-overlay-primary .uk-link-toggle:hover .uk-link-muted,.uk-offcanvas-bar a.uk-link-muted:hover,.uk-offcanvas-bar .uk-link-muted a:hover,.uk-offcanvas-bar .uk-link-toggle:hover .uk-link-muted{color:rgba(255,255,255,.7)}.uk-light a.uk-link-text:hover,.uk-light .uk-link-text a:hover,.uk-light .uk-link-toggle:hover .uk-link-text,.uk-section-primary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-text,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-text,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-text,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-text,.uk-card-primary.uk-card-body a.uk-link-text:hover,.uk-card-primary.uk-card-body .uk-link-text a:hover,.uk-card-primary.uk-card-body .uk-link-toggle:hover .uk-link-text,.uk-card-primary>:not([class*=uk-card-media]) a.uk-link-text:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-text a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-text,.uk-card-secondary.uk-card-body a.uk-link-text:hover,.uk-card-secondary.uk-card-body .uk-link-text a:hover,.uk-card-secondary.uk-card-body .uk-link-toggle:hover .uk-link-text,.uk-card-secondary>:not([class*=uk-card-media]) a.uk-link-text:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-text a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-text,.uk-overlay-primary a.uk-link-text:hover,.uk-overlay-primary .uk-link-text a:hover,.uk-overlay-primary .uk-link-toggle:hover .uk-link-text,.uk-offcanvas-bar a.uk-link-text:hover,.uk-offcanvas-bar .uk-link-text a:hover,.uk-offcanvas-bar .uk-link-toggle:hover .uk-link-text{color:rgba(255,255,255,.5)}.uk-light a.uk-link-heading:hover,.uk-light .uk-link-heading a:hover,.uk-light .uk-link-toggle:hover .uk-link-heading,.uk-section-primary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-heading,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-heading,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-heading,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-toggle:hover .uk-link-heading,.uk-card-primary.uk-card-body a.uk-link-heading:hover,.uk-card-primary.uk-card-body .uk-link-heading a:hover,.uk-card-primary.uk-card-body .uk-link-toggle:hover .uk-link-heading,.uk-card-primary>:not([class*=uk-card-media]) a.uk-link-heading:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-heading a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-heading,.uk-card-secondary.uk-card-body a.uk-link-heading:hover,.uk-card-secondary.uk-card-body .uk-link-heading a:hover,.uk-card-secondary.uk-card-body .uk-link-toggle:hover .uk-link-heading,.uk-card-secondary>:not([class*=uk-card-media]) a.uk-link-heading:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-heading a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-link-toggle:hover .uk-link-heading,.uk-overlay-primary a.uk-link-heading:hover,.uk-overlay-primary .uk-link-heading a:hover,.uk-overlay-primary .uk-link-toggle:hover .uk-link-heading,.uk-offcanvas-bar a.uk-link-heading:hover,.uk-offcanvas-bar .uk-link-heading a:hover,.uk-offcanvas-bar .uk-link-toggle:hover .uk-link-heading{color:#fff}.uk-light .uk-list-muted>::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-muted>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-muted>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-muted>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-muted>::before,.uk-card-primary.uk-card-body .uk-list-muted>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-list-muted>::before,.uk-card-secondary.uk-card-body .uk-list-muted>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-muted>::before,.uk-overlay-primary .uk-list-muted>::before,.uk-offcanvas-bar .uk-list-muted>::before{color:rgba(255,255,255,.5) !important}.uk-light .uk-list-emphasis>::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-emphasis>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-emphasis>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-emphasis>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-emphasis>::before,.uk-card-primary.uk-card-body .uk-list-emphasis>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-list-emphasis>::before,.uk-card-secondary.uk-card-body .uk-list-emphasis>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-emphasis>::before,.uk-overlay-primary .uk-list-emphasis>::before,.uk-offcanvas-bar .uk-list-emphasis>::before{color:#fff !important}.uk-light .uk-list-primary>::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-primary>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-primary>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-primary>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-primary>::before,.uk-card-primary.uk-card-body .uk-list-primary>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-list-primary>::before,.uk-card-secondary.uk-card-body .uk-list-primary>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-primary>::before,.uk-overlay-primary .uk-list-primary>::before,.uk-offcanvas-bar .uk-list-primary>::before{color:#fff !important}.uk-light .uk-list-secondary>::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-secondary>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-secondary>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-secondary>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-secondary>::before,.uk-card-primary.uk-card-body .uk-list-secondary>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-list-secondary>::before,.uk-card-secondary.uk-card-body .uk-list-secondary>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-secondary>::before,.uk-overlay-primary .uk-list-secondary>::before,.uk-offcanvas-bar .uk-list-secondary>::before{color:#fff !important}.uk-light .uk-list-bullet>::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-bullet>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-bullet>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-bullet>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-bullet>::before,.uk-card-primary.uk-card-body .uk-list-bullet>::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-list-bullet>::before,.uk-card-secondary.uk-card-body .uk-list-bullet>::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-bullet>::before,.uk-overlay-primary .uk-list-bullet>::before,.uk-offcanvas-bar .uk-list-bullet>::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22rgba(255,255,255,.7)%22%20cx%3D%223%22%20cy%3D%223%22%20r%3D%223%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-list-divider>:nth-child(n+2),.uk-section-primary:not(.uk-preserve-color) .uk-list-divider>:nth-child(n+2),.uk-section-secondary:not(.uk-preserve-color) .uk-list-divider>:nth-child(n+2),.uk-tile-primary:not(.uk-preserve-color) .uk-list-divider>:nth-child(n+2),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-divider>:nth-child(n+2),.uk-card-primary.uk-card-body .uk-list-divider>:nth-child(n+2),.uk-card-primary>:not([class*=uk-card-media]) .uk-list-divider>:nth-child(n+2),.uk-card-secondary.uk-card-body .uk-list-divider>:nth-child(n+2),.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-divider>:nth-child(n+2),.uk-overlay-primary .uk-list-divider>:nth-child(n+2),.uk-offcanvas-bar .uk-list-divider>:nth-child(n+2){border-top-color:rgba(255,255,255,.2)}.uk-light .uk-list-striped>*:nth-of-type(odd),.uk-section-primary:not(.uk-preserve-color) .uk-list-striped>*:nth-of-type(odd),.uk-section-secondary:not(.uk-preserve-color) .uk-list-striped>*:nth-of-type(odd),.uk-tile-primary:not(.uk-preserve-color) .uk-list-striped>*:nth-of-type(odd),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-striped>*:nth-of-type(odd),.uk-card-primary.uk-card-body .uk-list-striped>*:nth-of-type(odd),.uk-card-primary>:not([class*=uk-card-media]) .uk-list-striped>*:nth-of-type(odd),.uk-card-secondary.uk-card-body .uk-list-striped>*:nth-of-type(odd),.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-striped>*:nth-of-type(odd),.uk-overlay-primary .uk-list-striped>*:nth-of-type(odd),.uk-offcanvas-bar .uk-list-striped>*:nth-of-type(odd){border-top-color:rgba(255,255,255,.2);border-bottom-color:rgba(255,255,255,.2)}.uk-light .uk-list-striped>:nth-of-type(odd),.uk-section-primary:not(.uk-preserve-color) .uk-list-striped>:nth-of-type(odd),.uk-section-secondary:not(.uk-preserve-color) .uk-list-striped>:nth-of-type(odd),.uk-tile-primary:not(.uk-preserve-color) .uk-list-striped>:nth-of-type(odd),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-striped>:nth-of-type(odd),.uk-card-primary.uk-card-body .uk-list-striped>:nth-of-type(odd),.uk-card-primary>:not([class*=uk-card-media]) .uk-list-striped>:nth-of-type(odd),.uk-card-secondary.uk-card-body .uk-list-striped>:nth-of-type(odd),.uk-card-secondary>:not([class*=uk-card-media]) .uk-list-striped>:nth-of-type(odd),.uk-overlay-primary .uk-list-striped>:nth-of-type(odd),.uk-offcanvas-bar .uk-list-striped>:nth-of-type(odd){background-color:rgba(255,255,255,.1)}.uk-light .uk-marker,.uk-section-primary:not(.uk-preserve-color) .uk-marker,.uk-section-secondary:not(.uk-preserve-color) .uk-marker,.uk-tile-primary:not(.uk-preserve-color) .uk-marker,.uk-tile-secondary:not(.uk-preserve-color) .uk-marker,.uk-card-primary.uk-card-body .uk-marker,.uk-card-primary>:not([class*=uk-card-media]) .uk-marker,.uk-card-secondary.uk-card-body .uk-marker,.uk-card-secondary>:not([class*=uk-card-media]) .uk-marker,.uk-overlay-primary .uk-marker,.uk-offcanvas-bar .uk-marker{background:#f8f8f8;color:#666}.uk-light .uk-marker:hover,.uk-section-primary:not(.uk-preserve-color) .uk-marker:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-marker:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-marker:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-marker:hover,.uk-card-primary.uk-card-body .uk-marker:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-marker:hover,.uk-card-secondary.uk-card-body .uk-marker:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-marker:hover,.uk-overlay-primary .uk-marker:hover,.uk-offcanvas-bar .uk-marker:hover{color:#666}.uk-light .uk-nav-default>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-card-primary.uk-card-body .uk-nav-default>li>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default>li>a,.uk-card-secondary.uk-card-body .uk-nav-default>li>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default>li>a,.uk-overlay-primary .uk-nav-default>li>a,.uk-offcanvas-bar .uk-nav-default>li>a{color:rgba(255,255,255,.5)}.uk-light .uk-nav-default>li>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-card-primary.uk-card-body .uk-nav-default>li>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default>li>a:hover,.uk-card-secondary.uk-card-body .uk-nav-default>li>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default>li>a:hover,.uk-overlay-primary .uk-nav-default>li>a:hover,.uk-offcanvas-bar .uk-nav-default>li>a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-nav-default>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-default>li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-default>li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default>li.uk-active>a,.uk-overlay-primary .uk-nav-default>li.uk-active>a,.uk-offcanvas-bar .uk-nav-default>li.uk-active>a{color:#fff}.uk-light .uk-nav-default .uk-nav-header,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-header,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-header,.uk-overlay-primary .uk-nav-default .uk-nav-header,.uk-offcanvas-bar .uk-nav-default .uk-nav-header{color:#fff}.uk-light .uk-nav-default .uk-nav-divider,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-divider,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-divider,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-divider,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-divider,.uk-overlay-primary .uk-nav-default .uk-nav-divider,.uk-offcanvas-bar .uk-nav-default .uk-nav-divider{border-top-color:rgba(255,255,255,.2)}.uk-light .uk-nav-default .uk-nav-sub a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub a,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub a,.uk-overlay-primary .uk-nav-default .uk-nav-sub a,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub a{color:rgba(255,255,255,.5)}.uk-light .uk-nav-default .uk-nav-sub a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub a:hover,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub a:hover,.uk-overlay-primary .uk-nav-default .uk-nav-sub a:hover,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-overlay-primary .uk-nav-default .uk-nav-sub li.uk-active>a,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub li.uk-active>a{color:#fff}.uk-light .uk-nav-primary>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-card-primary.uk-card-body .uk-nav-primary>li>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary>li>a,.uk-card-secondary.uk-card-body .uk-nav-primary>li>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary>li>a,.uk-overlay-primary .uk-nav-primary>li>a,.uk-offcanvas-bar .uk-nav-primary>li>a{color:rgba(255,255,255,.5)}.uk-light .uk-nav-primary>li>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-card-primary.uk-card-body .uk-nav-primary>li>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary>li>a:hover,.uk-card-secondary.uk-card-body .uk-nav-primary>li>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary>li>a:hover,.uk-overlay-primary .uk-nav-primary>li>a:hover,.uk-offcanvas-bar .uk-nav-primary>li>a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-nav-primary>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-primary>li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-primary>li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary>li.uk-active>a,.uk-overlay-primary .uk-nav-primary>li.uk-active>a,.uk-offcanvas-bar .uk-nav-primary>li.uk-active>a{color:#fff}.uk-light .uk-nav-primary .uk-nav-header,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-header,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-header,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-header,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-header,.uk-overlay-primary .uk-nav-primary .uk-nav-header,.uk-offcanvas-bar .uk-nav-primary .uk-nav-header{color:#fff}.uk-light .uk-nav-primary .uk-nav-divider,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-divider,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-divider,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-divider,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-divider,.uk-overlay-primary .uk-nav-primary .uk-nav-divider,.uk-offcanvas-bar .uk-nav-primary .uk-nav-divider{border-top-color:rgba(255,255,255,.2)}.uk-light .uk-nav-primary .uk-nav-sub a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub a,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub a,.uk-overlay-primary .uk-nav-primary .uk-nav-sub a,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub a{color:rgba(255,255,255,.5)}.uk-light .uk-nav-primary .uk-nav-sub a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub a:hover,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub a:hover,.uk-overlay-primary .uk-nav-primary .uk-nav-sub a:hover,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-overlay-primary .uk-nav-primary .uk-nav-sub li.uk-active>a,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub li.uk-active>a{color:#fff}.uk-light .uk-nav-secondary>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a,.uk-card-primary.uk-card-body .uk-nav-secondary>li>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a,.uk-card-secondary.uk-card-body .uk-nav-secondary>li>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a,.uk-overlay-primary .uk-nav-secondary>li>a,.uk-offcanvas-bar .uk-nav-secondary>li>a{color:#fff}.uk-light .uk-nav-secondary>li>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover,.uk-card-primary.uk-card-body .uk-nav-secondary>li>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a:hover,.uk-card-secondary.uk-card-body .uk-nav-secondary>li>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a:hover,.uk-overlay-primary .uk-nav-secondary>li>a:hover,.uk-offcanvas-bar .uk-nav-secondary>li>a:hover{color:#fff;background-color:rgba(255,255,255,.1)}.uk-light .uk-nav-secondary>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-secondary>li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-secondary>li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary>li.uk-active>a,.uk-overlay-primary .uk-nav-secondary>li.uk-active>a,.uk-offcanvas-bar .uk-nav-secondary>li.uk-active>a{color:#fff;background-color:rgba(255,255,255,.1)}.uk-light .uk-nav-secondary .uk-nav-subtitle,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-subtitle,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-subtitle,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-subtitle,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-subtitle,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-subtitle,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-subtitle,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-subtitle,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-subtitle,.uk-overlay-primary .uk-nav-secondary .uk-nav-subtitle,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-subtitle{color:rgba(255,255,255,.5)}.uk-light .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-card-primary.uk-card-body .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-card-secondary.uk-card-body .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-overlay-primary .uk-nav-secondary>li>a:hover .uk-nav-subtitle,.uk-offcanvas-bar .uk-nav-secondary>li>a:hover .uk-nav-subtitle{color:rgba(255,255,255,.7)}.uk-light .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-card-primary.uk-card-body .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-card-secondary.uk-card-body .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-overlay-primary .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle,.uk-offcanvas-bar .uk-nav-secondary>li.uk-active>a .uk-nav-subtitle{color:#fff}.uk-light .uk-nav-secondary .uk-nav-header,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-header,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-header,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-header,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-header,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-header,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-header,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-header,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-header,.uk-overlay-primary .uk-nav-secondary .uk-nav-header,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-header{color:#fff}.uk-light .uk-nav-secondary .uk-nav-divider,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-divider,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-divider,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-divider,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-divider,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-divider,.uk-overlay-primary .uk-nav-secondary .uk-nav-divider,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-divider{border-top-color:rgba(255,255,255,.2)}.uk-light .uk-nav-secondary .uk-nav-sub a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-sub a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub a,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-sub a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub a,.uk-overlay-primary .uk-nav-secondary .uk-nav-sub a,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-sub a{color:rgba(255,255,255,.5)}.uk-light .uk-nav-secondary .uk-nav-sub a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub a:hover,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-sub a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub a:hover,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-sub a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub a:hover,.uk-overlay-primary .uk-nav-secondary .uk-nav-sub a:hover,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-sub a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-overlay-primary .uk-nav-secondary .uk-nav-sub li.uk-active>a,.uk-offcanvas-bar .uk-nav-secondary .uk-nav-sub li.uk-active>a{color:#fff}.uk-light .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-section-primary:not(.uk-preserve-color) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-section-secondary:not(.uk-preserve-color) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-tile-primary:not(.uk-preserve-color) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-tile-secondary:not(.uk-preserve-color) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-card-primary.uk-card-body .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-card-primary>:not([class*=uk-card-media]) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-card-secondary.uk-card-body .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-card-secondary>:not([class*=uk-card-media]) .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-overlay-primary .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider),.uk-offcanvas-bar .uk-nav.uk-nav-divider>:not(.uk-nav-divider)+:not(.uk-nav-header,.uk-nav-divider){border-top-color:rgba(255,255,255,.2)}.uk-light .uk-navbar-nav>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a,.uk-overlay-primary .uk-navbar-nav>li>a,.uk-offcanvas-bar .uk-navbar-nav>li>a{color:rgba(255,255,255,.5)}.uk-light .uk-navbar-nav>li:hover>a,.uk-light .uk-navbar-nav>li>a[aria-expanded=true],.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a[aria-expanded=true],.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a[aria-expanded=true],.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a[aria-expanded=true],.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a[aria-expanded=true],.uk-card-primary.uk-card-body .uk-navbar-nav>li:hover>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a[aria-expanded=true],.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-nav>li:hover>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a[aria-expanded=true],.uk-card-secondary.uk-card-body .uk-navbar-nav>li:hover>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a[aria-expanded=true],.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-nav>li:hover>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a[aria-expanded=true],.uk-overlay-primary .uk-navbar-nav>li:hover>a,.uk-overlay-primary .uk-navbar-nav>li>a[aria-expanded=true],.uk-offcanvas-bar .uk-navbar-nav>li:hover>a,.uk-offcanvas-bar .uk-navbar-nav>li>a[aria-expanded=true]{color:rgba(255,255,255,.7)}.uk-light .uk-navbar-nav>li>a:active,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a:active,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-nav>li>a:active,.uk-overlay-primary .uk-navbar-nav>li>a:active,.uk-offcanvas-bar .uk-navbar-nav>li>a:active{color:#fff}.uk-light .uk-navbar-nav>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-nav>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-nav>li.uk-active>a,.uk-overlay-primary .uk-navbar-nav>li.uk-active>a,.uk-offcanvas-bar .uk-navbar-nav>li.uk-active>a{color:#fff}.uk-light .uk-navbar-item,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-item,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-item,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-item,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-item,.uk-card-primary.uk-card-body .uk-navbar-item,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-item,.uk-card-secondary.uk-card-body .uk-navbar-item,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-item,.uk-overlay-primary .uk-navbar-item,.uk-offcanvas-bar .uk-navbar-item{color:rgba(255,255,255,.7)}.uk-light .uk-navbar-toggle,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-card-primary.uk-card-body .uk-navbar-toggle,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-toggle,.uk-card-secondary.uk-card-body .uk-navbar-toggle,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-toggle,.uk-overlay-primary .uk-navbar-toggle,.uk-offcanvas-bar .uk-navbar-toggle{color:rgba(255,255,255,.5)}.uk-light .uk-navbar-toggle:hover,.uk-light .uk-navbar-toggle[aria-expanded=true],.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle[aria-expanded=true],.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle[aria-expanded=true],.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle[aria-expanded=true],.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle[aria-expanded=true],.uk-card-primary.uk-card-body .uk-navbar-toggle:hover,.uk-card-primary.uk-card-body .uk-navbar-toggle[aria-expanded=true],.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-toggle:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-navbar-toggle[aria-expanded=true],.uk-card-secondary.uk-card-body .uk-navbar-toggle:hover,.uk-card-secondary.uk-card-body .uk-navbar-toggle[aria-expanded=true],.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-toggle:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-navbar-toggle[aria-expanded=true],.uk-overlay-primary .uk-navbar-toggle:hover,.uk-overlay-primary .uk-navbar-toggle[aria-expanded=true],.uk-offcanvas-bar .uk-navbar-toggle:hover,.uk-offcanvas-bar .uk-navbar-toggle[aria-expanded=true]{color:rgba(255,255,255,.7)}.uk-light .uk-pagination>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-card-primary.uk-card-body .uk-pagination>*>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-pagination>*>*,.uk-card-secondary.uk-card-body .uk-pagination>*>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-pagination>*>*,.uk-overlay-primary .uk-pagination>*>*,.uk-offcanvas-bar .uk-pagination>*>*{color:rgba(255,255,255,.5)}.uk-light .uk-pagination>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-card-primary.uk-card-body .uk-pagination>*>:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-pagination>*>:hover,.uk-card-secondary.uk-card-body .uk-pagination>*>:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-pagination>*>:hover,.uk-overlay-primary .uk-pagination>*>:hover,.uk-offcanvas-bar .uk-pagination>*>:hover{color:rgba(255,255,255,.7)}.uk-light .uk-pagination>.uk-active>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-card-primary.uk-card-body .uk-pagination>.uk-active>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-pagination>.uk-active>*,.uk-card-secondary.uk-card-body .uk-pagination>.uk-active>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-pagination>.uk-active>*,.uk-overlay-primary .uk-pagination>.uk-active>*,.uk-offcanvas-bar .uk-pagination>.uk-active>*{color:rgba(255,255,255,.7)}.uk-light .uk-pagination>.uk-disabled>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-card-primary.uk-card-body .uk-pagination>.uk-disabled>*,.uk-card-primary>:not([class*=uk-card-media]) .uk-pagination>.uk-disabled>*,.uk-card-secondary.uk-card-body .uk-pagination>.uk-disabled>*,.uk-card-secondary>:not([class*=uk-card-media]) .uk-pagination>.uk-disabled>*,.uk-overlay-primary .uk-pagination>.uk-disabled>*,.uk-offcanvas-bar .uk-pagination>.uk-disabled>*{color:rgba(255,255,255,.5)}.uk-light .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-input,.uk-card-primary.uk-card-body .uk-search-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-input,.uk-overlay-primary .uk-search-input,.uk-offcanvas-bar .uk-search-input{color:rgba(255,255,255,.7)}.uk-light .uk-search-input::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-card-primary.uk-card-body .uk-search-input::placeholder,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-input::placeholder,.uk-card-secondary.uk-card-body .uk-search-input::placeholder,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-input::placeholder,.uk-overlay-primary .uk-search-input::placeholder,.uk-offcanvas-bar .uk-search-input::placeholder{color:rgba(255,255,255,.5)}.uk-light .uk-search .uk-search-icon,.uk-section-primary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-card-primary.uk-card-body .uk-search .uk-search-icon,.uk-card-primary>:not([class*=uk-card-media]) .uk-search .uk-search-icon,.uk-card-secondary.uk-card-body .uk-search .uk-search-icon,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search .uk-search-icon,.uk-overlay-primary .uk-search .uk-search-icon,.uk-offcanvas-bar .uk-search .uk-search-icon{color:rgba(255,255,255,.5)}.uk-light .uk-search .uk-search-icon:hover,.uk-section-primary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-card-primary.uk-card-body .uk-search .uk-search-icon:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-search .uk-search-icon:hover,.uk-card-secondary.uk-card-body .uk-search .uk-search-icon:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search .uk-search-icon:hover,.uk-overlay-primary .uk-search .uk-search-icon:hover,.uk-offcanvas-bar .uk-search .uk-search-icon:hover{color:rgba(255,255,255,.5)}.uk-light .uk-search-default .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-card-primary.uk-card-body .uk-search-default .uk-search-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-default .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-default .uk-search-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-default .uk-search-input,.uk-overlay-primary .uk-search-default .uk-search-input,.uk-offcanvas-bar .uk-search-default .uk-search-input{background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,.2)}.uk-light .uk-search-default .uk-search-input:focus,.uk-section-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-card-primary.uk-card-body .uk-search-default .uk-search-input:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-default .uk-search-input:focus,.uk-card-secondary.uk-card-body .uk-search-default .uk-search-input:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-default .uk-search-input:focus,.uk-overlay-primary .uk-search-default .uk-search-input:focus,.uk-offcanvas-bar .uk-search-default .uk-search-input:focus{background-color:rgba(0,0,0,.05)}.uk-light .uk-search-navbar .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-card-primary.uk-card-body .uk-search-navbar .uk-search-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-navbar .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-navbar .uk-search-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-navbar .uk-search-input,.uk-overlay-primary .uk-search-navbar .uk-search-input,.uk-offcanvas-bar .uk-search-navbar .uk-search-input{background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,.2)}.uk-light .uk-search-navbar .uk-search-input:focus,.uk-section-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input:focus,.uk-card-primary.uk-card-body .uk-search-navbar .uk-search-input:focus,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-navbar .uk-search-input:focus,.uk-card-secondary.uk-card-body .uk-search-navbar .uk-search-input:focus,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-navbar .uk-search-input:focus,.uk-overlay-primary .uk-search-navbar .uk-search-input:focus,.uk-offcanvas-bar .uk-search-navbar .uk-search-input:focus{background-color:rgba(0,0,0,.05)}.uk-light .uk-search-medium .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-medium .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-medium .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-medium .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-medium .uk-search-input,.uk-card-primary.uk-card-body .uk-search-medium .uk-search-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-medium .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-medium .uk-search-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-medium .uk-search-input,.uk-overlay-primary .uk-search-medium .uk-search-input,.uk-offcanvas-bar .uk-search-medium .uk-search-input{background-color:rgba(0,0,0,0)}.uk-light .uk-search-large .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-card-primary.uk-card-body .uk-search-large .uk-search-input,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-large .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-large .uk-search-input,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-large .uk-search-input,.uk-overlay-primary .uk-search-large .uk-search-input,.uk-offcanvas-bar .uk-search-large .uk-search-input{background-color:rgba(0,0,0,0)}.uk-light .uk-search-toggle,.uk-section-primary:not(.uk-preserve-color) .uk-search-toggle,.uk-section-secondary:not(.uk-preserve-color) .uk-search-toggle,.uk-tile-primary:not(.uk-preserve-color) .uk-search-toggle,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-toggle,.uk-card-primary.uk-card-body .uk-search-toggle,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-toggle,.uk-card-secondary.uk-card-body .uk-search-toggle,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-toggle,.uk-overlay-primary .uk-search-toggle,.uk-offcanvas-bar .uk-search-toggle{color:rgba(255,255,255,.5)}.uk-light .uk-search-toggle:hover,.uk-section-primary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-card-primary.uk-card-body .uk-search-toggle:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-search-toggle:hover,.uk-card-secondary.uk-card-body .uk-search-toggle:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-search-toggle:hover,.uk-overlay-primary .uk-search-toggle:hover,.uk-offcanvas-bar .uk-search-toggle:hover{color:rgba(255,255,255,.7)}.uk-light .uk-slidenav,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav,.uk-card-primary.uk-card-body .uk-slidenav,.uk-card-primary>:not([class*=uk-card-media]) .uk-slidenav,.uk-card-secondary.uk-card-body .uk-slidenav,.uk-card-secondary>:not([class*=uk-card-media]) .uk-slidenav,.uk-overlay-primary .uk-slidenav,.uk-offcanvas-bar .uk-slidenav{color:rgba(255,255,255,.7)}.uk-light .uk-slidenav:hover,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-card-primary.uk-card-body .uk-slidenav:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-slidenav:hover,.uk-card-secondary.uk-card-body .uk-slidenav:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-slidenav:hover,.uk-overlay-primary .uk-slidenav:hover,.uk-offcanvas-bar .uk-slidenav:hover{color:rgba(255,255,255,.95)}.uk-light .uk-slidenav:active,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav:active,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav:active,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav:active,.uk-card-primary.uk-card-body .uk-slidenav:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-slidenav:active,.uk-card-secondary.uk-card-body .uk-slidenav:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-slidenav:active,.uk-overlay-primary .uk-slidenav:active,.uk-offcanvas-bar .uk-slidenav:active{color:rgba(255,255,255,.7)}.uk-light .uk-subnav>*>:first-child,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-card-primary.uk-card-body .uk-subnav>*>:first-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav>*>:first-child,.uk-card-secondary.uk-card-body .uk-subnav>*>:first-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav>*>:first-child,.uk-overlay-primary .uk-subnav>*>:first-child,.uk-offcanvas-bar .uk-subnav>*>:first-child{color:rgba(255,255,255,.5)}.uk-light .uk-subnav>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-card-primary.uk-card-body .uk-subnav>*>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav>*>a:hover,.uk-card-secondary.uk-card-body .uk-subnav>*>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav>*>a:hover,.uk-overlay-primary .uk-subnav>*>a:hover,.uk-offcanvas-bar .uk-subnav>*>a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-subnav>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-card-primary.uk-card-body .uk-subnav>.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav>.uk-active>a,.uk-card-secondary.uk-card-body .uk-subnav>.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav>.uk-active>a,.uk-overlay-primary .uk-subnav>.uk-active>a,.uk-offcanvas-bar .uk-subnav>.uk-active>a{color:#fff}.uk-light .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-overlay-primary .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-offcanvas-bar .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before{border-left-color:rgba(255,255,255,.2)}.uk-light .uk-subnav-pill>*>:first-child,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-card-primary.uk-card-body .uk-subnav-pill>*>:first-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav-pill>*>:first-child,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>:first-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav-pill>*>:first-child,.uk-overlay-primary .uk-subnav-pill>*>:first-child,.uk-offcanvas-bar .uk-subnav-pill>*>:first-child{background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5)}.uk-light .uk-subnav-pill>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-card-primary.uk-card-body .uk-subnav-pill>*>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav-pill>*>a:hover,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav-pill>*>a:hover,.uk-overlay-primary .uk-subnav-pill>*>a:hover,.uk-offcanvas-bar .uk-subnav-pill>*>a:hover{background-color:rgba(255,255,255,.1);color:rgba(255,255,255,.7)}.uk-light .uk-subnav-pill>*>a:active,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-card-primary.uk-card-body .uk-subnav-pill>*>a:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav-pill>*>a:active,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>a:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav-pill>*>a:active,.uk-overlay-primary .uk-subnav-pill>*>a:active,.uk-offcanvas-bar .uk-subnav-pill>*>a:active{background-color:rgba(255,255,255,.1);color:rgba(255,255,255,.7)}.uk-light .uk-subnav-pill>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-card-primary.uk-card-body .uk-subnav-pill>.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav-pill>.uk-active>a,.uk-card-secondary.uk-card-body .uk-subnav-pill>.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav-pill>.uk-active>a,.uk-overlay-primary .uk-subnav-pill>.uk-active>a,.uk-offcanvas-bar .uk-subnav-pill>.uk-active>a{background-color:#fff;color:#666}.uk-light .uk-subnav>.uk-disabled>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-card-primary.uk-card-body .uk-subnav>.uk-disabled>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-subnav>.uk-disabled>a,.uk-card-secondary.uk-card-body .uk-subnav>.uk-disabled>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-subnav>.uk-disabled>a,.uk-overlay-primary .uk-subnav>.uk-disabled>a,.uk-offcanvas-bar .uk-subnav>.uk-disabled>a{color:rgba(255,255,255,.5)}.uk-light .uk-tab::before,.uk-section-primary:not(.uk-preserve-color) .uk-tab::before,.uk-section-secondary:not(.uk-preserve-color) .uk-tab::before,.uk-tile-primary:not(.uk-preserve-color) .uk-tab::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab::before,.uk-card-primary.uk-card-body .uk-tab::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-tab::before,.uk-card-secondary.uk-card-body .uk-tab::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-tab::before,.uk-overlay-primary .uk-tab::before,.uk-offcanvas-bar .uk-tab::before{border-color:rgba(255,255,255,.2)}.uk-light .uk-tab>*>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>*>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>*>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>*>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>*>a,.uk-card-primary.uk-card-body .uk-tab>*>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-tab>*>a,.uk-card-secondary.uk-card-body .uk-tab>*>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-tab>*>a,.uk-overlay-primary .uk-tab>*>a,.uk-offcanvas-bar .uk-tab>*>a{color:rgba(255,255,255,.5)}.uk-light .uk-tab>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-card-primary.uk-card-body .uk-tab>*>a:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-tab>*>a:hover,.uk-card-secondary.uk-card-body .uk-tab>*>a:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-tab>*>a:hover,.uk-overlay-primary .uk-tab>*>a:hover,.uk-offcanvas-bar .uk-tab>*>a:hover{color:rgba(255,255,255,.7)}.uk-light .uk-tab>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-card-primary.uk-card-body .uk-tab>.uk-active>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-tab>.uk-active>a,.uk-card-secondary.uk-card-body .uk-tab>.uk-active>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-tab>.uk-active>a,.uk-overlay-primary .uk-tab>.uk-active>a,.uk-offcanvas-bar .uk-tab>.uk-active>a{color:#fff;border-color:#fff}.uk-light .uk-tab>.uk-disabled>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-card-primary.uk-card-body .uk-tab>.uk-disabled>a,.uk-card-primary>:not([class*=uk-card-media]) .uk-tab>.uk-disabled>a,.uk-card-secondary.uk-card-body .uk-tab>.uk-disabled>a,.uk-card-secondary>:not([class*=uk-card-media]) .uk-tab>.uk-disabled>a,.uk-overlay-primary .uk-tab>.uk-disabled>a,.uk-offcanvas-bar .uk-tab>.uk-disabled>a{color:rgba(255,255,255,.5)}.uk-light .uk-table-striped>tr:nth-of-type(even):last-child,.uk-light .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-section-primary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-section-primary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-section-secondary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-section-secondary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-tile-primary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-tile-primary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-primary.uk-card-body .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-primary.uk-card-body .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-secondary.uk-card-body .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-secondary.uk-card-body .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-overlay-primary .uk-table-striped>tr:nth-of-type(even):last-child,.uk-overlay-primary .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-offcanvas-bar .uk-table-striped>tr:nth-of-type(even):last-child,.uk-offcanvas-bar .uk-table-striped tbody tr:nth-of-type(even):last-child{border-bottom-color:rgba(255,255,255,.2)}.uk-light .uk-text-lead,.uk-section-primary:not(.uk-preserve-color) .uk-text-lead,.uk-section-secondary:not(.uk-preserve-color) .uk-text-lead,.uk-tile-primary:not(.uk-preserve-color) .uk-text-lead,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-lead,.uk-card-primary.uk-card-body .uk-text-lead,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-lead,.uk-card-secondary.uk-card-body .uk-text-lead,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-lead,.uk-overlay-primary .uk-text-lead,.uk-offcanvas-bar .uk-text-lead{color:rgba(255,255,255,.7)}.uk-light .uk-text-meta,.uk-section-primary:not(.uk-preserve-color) .uk-text-meta,.uk-section-secondary:not(.uk-preserve-color) .uk-text-meta,.uk-tile-primary:not(.uk-preserve-color) .uk-text-meta,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-meta,.uk-card-primary.uk-card-body .uk-text-meta,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-meta,.uk-card-secondary.uk-card-body .uk-text-meta,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-meta,.uk-overlay-primary .uk-text-meta,.uk-offcanvas-bar .uk-text-meta{color:rgba(255,255,255,.5)}.uk-light .uk-text-muted,.uk-section-primary:not(.uk-preserve-color) .uk-text-muted,.uk-section-secondary:not(.uk-preserve-color) .uk-text-muted,.uk-tile-primary:not(.uk-preserve-color) .uk-text-muted,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-muted,.uk-card-primary.uk-card-body .uk-text-muted,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-muted,.uk-card-secondary.uk-card-body .uk-text-muted,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-muted,.uk-overlay-primary .uk-text-muted,.uk-offcanvas-bar .uk-text-muted{color:rgba(255,255,255,.5) !important}.uk-light .uk-text-emphasis,.uk-section-primary:not(.uk-preserve-color) .uk-text-emphasis,.uk-section-secondary:not(.uk-preserve-color) .uk-text-emphasis,.uk-tile-primary:not(.uk-preserve-color) .uk-text-emphasis,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-emphasis,.uk-card-primary.uk-card-body .uk-text-emphasis,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-emphasis,.uk-card-secondary.uk-card-body .uk-text-emphasis,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-emphasis,.uk-overlay-primary .uk-text-emphasis,.uk-offcanvas-bar .uk-text-emphasis{color:#fff !important}.uk-light .uk-text-primary,.uk-section-primary:not(.uk-preserve-color) .uk-text-primary,.uk-section-secondary:not(.uk-preserve-color) .uk-text-primary,.uk-tile-primary:not(.uk-preserve-color) .uk-text-primary,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-primary,.uk-card-primary.uk-card-body .uk-text-primary,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-primary,.uk-card-secondary.uk-card-body .uk-text-primary,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-primary,.uk-overlay-primary .uk-text-primary,.uk-offcanvas-bar .uk-text-primary{color:#fff !important}.uk-light .uk-text-secondary,.uk-section-primary:not(.uk-preserve-color) .uk-text-secondary,.uk-section-secondary:not(.uk-preserve-color) .uk-text-secondary,.uk-tile-primary:not(.uk-preserve-color) .uk-text-secondary,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-secondary,.uk-card-primary.uk-card-body .uk-text-secondary,.uk-card-primary>:not([class*=uk-card-media]) .uk-text-secondary,.uk-card-secondary.uk-card-body .uk-text-secondary,.uk-card-secondary>:not([class*=uk-card-media]) .uk-text-secondary,.uk-overlay-primary .uk-text-secondary,.uk-offcanvas-bar .uk-text-secondary{color:#fff !important}.uk-light .uk-thumbnav>*>*::after,.uk-section-primary:not(.uk-preserve-color) .uk-thumbnav>*>*::after,.uk-section-secondary:not(.uk-preserve-color) .uk-thumbnav>*>*::after,.uk-tile-primary:not(.uk-preserve-color) .uk-thumbnav>*>*::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-thumbnav>*>*::after,.uk-card-primary.uk-card-body .uk-thumbnav>*>*::after,.uk-card-primary>:not([class*=uk-card-media]) .uk-thumbnav>*>*::after,.uk-card-secondary.uk-card-body .uk-thumbnav>*>*::after,.uk-card-secondary>:not([class*=uk-card-media]) .uk-thumbnav>*>*::after,.uk-overlay-primary .uk-thumbnav>*>*::after,.uk-offcanvas-bar .uk-thumbnav>*>*::after{background-image:linear-gradient(180deg, rgba(0,0,0,0), rgba(0,0,0,.4))}.uk-light .uk-totop,.uk-section-primary:not(.uk-preserve-color) .uk-totop,.uk-section-secondary:not(.uk-preserve-color) .uk-totop,.uk-tile-primary:not(.uk-preserve-color) .uk-totop,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop,.uk-card-primary.uk-card-body .uk-totop,.uk-card-primary>:not([class*=uk-card-media]) .uk-totop,.uk-card-secondary.uk-card-body .uk-totop,.uk-card-secondary>:not([class*=uk-card-media]) .uk-totop,.uk-overlay-primary .uk-totop,.uk-offcanvas-bar .uk-totop{color:rgba(255,255,255,.5)}.uk-light .uk-totop:hover,.uk-section-primary:not(.uk-preserve-color) .uk-totop:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-totop:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-totop:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop:hover,.uk-card-primary.uk-card-body .uk-totop:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-totop:hover,.uk-card-secondary.uk-card-body .uk-totop:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-totop:hover,.uk-overlay-primary .uk-totop:hover,.uk-offcanvas-bar .uk-totop:hover{color:rgba(255,255,255,.7)}.uk-light .uk-totop:active,.uk-section-primary:not(.uk-preserve-color) .uk-totop:active,.uk-section-secondary:not(.uk-preserve-color) .uk-totop:active,.uk-tile-primary:not(.uk-preserve-color) .uk-totop:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop:active,.uk-card-primary.uk-card-body .uk-totop:active,.uk-card-primary>:not([class*=uk-card-media]) .uk-totop:active,.uk-card-secondary.uk-card-body .uk-totop:active,.uk-card-secondary>:not([class*=uk-card-media]) .uk-totop:active,.uk-overlay-primary .uk-totop:active,.uk-offcanvas-bar .uk-totop:active{color:#fff}.uk-light .uk-logo,.uk-section-primary:not(.uk-preserve-color) .uk-logo,.uk-section-secondary:not(.uk-preserve-color) .uk-logo,.uk-tile-primary:not(.uk-preserve-color) .uk-logo,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo,.uk-card-primary.uk-card-body .uk-logo,.uk-card-primary>:not([class*=uk-card-media]) .uk-logo,.uk-card-secondary.uk-card-body .uk-logo,.uk-card-secondary>:not([class*=uk-card-media]) .uk-logo,.uk-overlay-primary .uk-logo,.uk-offcanvas-bar .uk-logo{color:#fff}.uk-light .uk-logo:hover,.uk-section-primary:not(.uk-preserve-color) .uk-logo:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-logo:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-logo:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo:hover,.uk-card-primary.uk-card-body .uk-logo:hover,.uk-card-primary>:not([class*=uk-card-media]) .uk-logo:hover,.uk-card-secondary.uk-card-body .uk-logo:hover,.uk-card-secondary>:not([class*=uk-card-media]) .uk-logo:hover,.uk-overlay-primary .uk-logo:hover,.uk-offcanvas-bar .uk-logo:hover{color:#fff}.uk-light .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-section-primary:not(.uk-preserve-color) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-section-secondary:not(.uk-preserve-color) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-tile-primary:not(.uk-preserve-color) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-tile-secondary:not(.uk-preserve-color) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-card-primary.uk-card-body .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-card-primary>:not([class*=uk-card-media]) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-card-secondary.uk-card-body .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-card-secondary>:not([class*=uk-card-media]) .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-overlay-primary .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse),.uk-offcanvas-bar .uk-logo:has(.uk-logo-inverse)>:not(picture:has(.uk-logo-inverse)):not(.uk-logo-inverse){display:none}.uk-light .uk-logo-inverse,.uk-section-primary:not(.uk-preserve-color) .uk-logo-inverse,.uk-section-secondary:not(.uk-preserve-color) .uk-logo-inverse,.uk-tile-primary:not(.uk-preserve-color) .uk-logo-inverse,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo-inverse,.uk-card-primary.uk-card-body .uk-logo-inverse,.uk-card-primary>:not([class*=uk-card-media]) .uk-logo-inverse,.uk-card-secondary.uk-card-body .uk-logo-inverse,.uk-card-secondary>:not([class*=uk-card-media]) .uk-logo-inverse,.uk-overlay-primary .uk-logo-inverse,.uk-offcanvas-bar .uk-logo-inverse{display:block}.uk-light .uk-accordion-title::before,.uk-section-primary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-section-secondary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-tile-primary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-accordion-title::before,.uk-card-primary.uk-card-body .uk-accordion-title::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-accordion-title::before,.uk-card-secondary.uk-card-body .uk-accordion-title::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-accordion-title::before,.uk-overlay-primary .uk-accordion-title::before,.uk-offcanvas-bar .uk-accordion-title::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-open>.uk-accordion-title::before,.uk-section-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-section-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-tile-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::before,.uk-card-primary.uk-card-body .uk-open>.uk-accordion-title::before,.uk-card-primary>:not([class*=uk-card-media]) .uk-open>.uk-accordion-title::before,.uk-card-secondary.uk-card-body .uk-open>.uk-accordion-title::before,.uk-card-secondary>:not([class*=uk-card-media]) .uk-open>.uk-accordion-title::before,.uk-overlay-primary .uk-open>.uk-accordion-title::before,.uk-offcanvas-bar .uk-open>.uk-accordion-title::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-table-striped>tr:nth-of-type(even):last-child,.uk-light .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-section-primary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-section-primary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-section-secondary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-section-secondary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-tile-primary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-tile-primary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-primary.uk-card-body .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-primary.uk-card-body .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-primary>:not([class*=uk-card-media]) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-secondary.uk-card-body .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-secondary.uk-card-body .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-table-striped>tr:nth-of-type(even):last-child,.uk-card-secondary>:not([class*=uk-card-media]) .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-overlay-primary .uk-table-striped>tr:nth-of-type(even):last-child,.uk-overlay-primary .uk-table-striped tbody tr:nth-of-type(even):last-child,.uk-offcanvas-bar .uk-table-striped>tr:nth-of-type(even):last-child,.uk-offcanvas-bar .uk-table-striped tbody tr:nth-of-type(even):last-child{border-bottom-color:rgba(255,255,255,.2)}*{--uk-inverse: initial}.uk-light,.uk-section-primary:not(.uk-preserve-color),.uk-section-secondary:not(.uk-preserve-color),.uk-tile-primary:not(.uk-preserve-color),.uk-tile-secondary:not(.uk-preserve-color),.uk-card-primary.uk-card-body,.uk-card-primary>:not([class*=uk-card-media]),.uk-card-secondary.uk-card-body,.uk-card-secondary>:not([class*=uk-card-media]),.uk-overlay-primary,.uk-offcanvas-bar{--uk-inverse: light}.uk-dark,.uk-section-default:not(.uk-preserve-color),.uk-section-muted:not(.uk-preserve-color),.uk-tile-default:not(.uk-preserve-color),.uk-tile-muted:not(.uk-preserve-color),.uk-card-default.uk-card-body,.uk-card-default>:not([class*=uk-card-media]),.uk-overlay-default,.uk-dropbar,.uk-navbar-container:not(.uk-navbar-transparent),.uk-navbar-dropdown,.uk-dropdown{--uk-inverse: dark}.uk-inverse-light{--uk-inverse: light !important}.uk-inverse-dark{--uk-inverse: dark !important}@media print{*,*::before,*::after{background:rgba(0,0,0,0) !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:url(Roboto.ttf) format("truetype")}*{font-family:"Roboto",sans-serif}.markdown h1{color:#404040}.markdown h2{color:#404040}.markdown h3{color:#404040} \ No newline at end of file diff --git a/tasks/index.html b/tasks/index.html new file mode 100644 index 00000000..d8a633b1 --- /dev/null +++ b/tasks/index.html @@ -0,0 +1,937 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + + + +
+

Tasks and roadmap

+

This page exists to make it easier to help and easier to see what project +members are working on and what tasks they prioritize.

+

We wanted to make our work more +visible and accessible for everybody who wants to help and be involved.

+

If somebody has 1 hour +time per week or month and would like to help out, it should be easy to find +a meaningful task and to get the necessary context and contact. Bigger +tasks are too big for volunteers but we still find it useful to communicate +what we work on or would like to work on if we had more time, so that volunteer +individuals and organizations can stay informed.

+
+
+
+

Our project board with all tasks

+ +

Good first issues if you have 1 hour

+ +
+
+

If you have 1 day

+
    +
  • +

    Take a lesson issue which looks +interesting and easy to you from one of our +lessons. Ask on chat +or in the GitHub issue if you want more context about any of these.

    +
  • +
  • +

    Take an issue from +our install instructions.

    +
  • +
  • +

    Draft a blog post about the tools we use based on a nice chat thread (GitHub +issue).

    +
  • +
+
+
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/discipline-online.png b/workshops/discipline-online.png new file mode 100644 index 00000000..dac295cd Binary files /dev/null and b/workshops/discipline-online.png differ diff --git a/workshops/disciplines_positions.png b/workshops/disciplines_positions.png new file mode 100644 index 00000000..83df85b0 Binary files /dev/null and b/workshops/disciplines_positions.png differ diff --git a/workshops/full-workshops.yml b/workshops/full-workshops.yml new file mode 100644 index 00000000..734acc37 --- /dev/null +++ b/workshops/full-workshops.yml @@ -0,0 +1,989 @@ +events: + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2024-09-10-workshop/ + start_date: "2024-09-10" + end_date: "2024-09-19" + organizers: + - Diana Iusan + - Enrico Glerean + - Samantha Wittke + - Richard Darst + instructors: + - Radovan Bast + - Richard Darst + - Hossein Firooz + - Diana Iusan + - Bjørn Lindi + - Thomas Pfau + - Dhanya Pushpadas + - Sabry Razick + - Teemu Ruokolainen + - Yu Tian + expert_helpers: + - Teemu Ruokolainen + - Elisa Pierfederici + - Bjørn Lindi + - Samantha Wittke + - Diana Iusan + num_participants: + FI: 125 + EE: 16 + DK: 11 + NO: 62 + ES: 39 + SE: 46 + NL: 6 + total: 356 + twitch_viewers: + smallest_viewers_max: 135 + largest_viewers_max: 481 + - name: Gothenburg + website: https://coderefinery.github.io/2024-08-27-gothenburg/ + start_date: "2024-08-27" + end_date: "2024-08-29" + organizers: + - Johan Hellsvik + - Björn Claremar + - Yonglei Wang + - Viktor Rehnberg + instructors: + - Björn Claremar + - Yonglei Wang + - Viktor Rehnberg + - Leon Boschman + num_participants: + SE: 9 + total: 9 + location: + lat: 57.70887 + lon: 11.97456 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2024-03-12-workshop/ + start_date: "2024-03-12" + end_date: "2024-03-21" + organizers: + - Radovan Bast + - Samantha Wittke + - Richard Darst + - Teemu Ruokolainen + - Enrico Glerean + instructors: + - Enrico Glerean + - Radovan Bast + - Samantha Wittke + - Gregor Decristoforo + - Richard Darst + - Matias Jääskeläinen + - Jarno Rantaharju + - Thomas Pfau + - Bjørn Lindi + expert_helpers: + - Johan Hellsvik + - Stephan Smuts + - Aurélie Vancraeyenest + num_participants: + FI: 111 + SE: 38 + NO: 21 + ES: 20 + DK: 14 + NL: 13 + FR: 10 + IT: 5 + total: 263 + twitch_viewers: + smallest_viewers_max: 39 + largest_viewers_max: 107 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2023-09-19-workshop/ + start_date: "2023-09-19" + end_date: "2023-09-28" + host: + - Radovan Bast + - Richard Darst + - Enrico Glerean + - Matias Jääskeläinen + instructors: + - Radovan Bast + - Richard Darst + - Enrico Glerean + - Johan Hellsvik + - Matias Jääskeläinen + - Thomas Pfau + - Dhanya Pushpadas + - Jarno Rantaharju + - Samantha Wittke + expert_helpers: + - Diana Iusan + - Enrico Glerean + - Teemu Ruokolainen + num_participants: + NO: 103 + FI: 100 + SE: 31 + NL: 19 + IN: 16 + FR: 12 + GE: 11 + IT: 9 + UK: 5 + US: 5 + PO: 5 + ES: 5 + total: 360 + twitch_viewers: + smallest_viewers_max: 54 + largest_viewers_max: 145 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2023-03-21-workshop/ + start_date: "2023-03-21" + end_date: "2023-03-30" + host: + - Radovan Bast + - Richard Darst + - Enrico Glerean + - Matias Jääskeläinen + - Dhanya Pushpadas + - Samantha Wittke + instructors: + - Radovan Bast + - Johan Hellsvik + - Diana Iusan + - Matias Jääskeläinen + - Bjørn Lindi + - Thomas Pfau + - Dhanya Pushpadas + - Teemu Ruokolainen + expert_helpers: + - Jarno Rantaharju + - Stephan Smuts + num_participants: + FI: 178 + SE: 87 + NO: 43 + ES: 24 + DK: 19 + NL: 58 + DE: 27 + ZA: 15 + IT: 9 + total: 493 + twitch_viewers: + smallest_viewers_max: 112 + largest_viewers_max: 216 + - name: Uppsala + website: https://coderefinery.github.io/2023-05-09-uppsala/ + start_date: "2023-05-09" + end_date: "2023-05-11" + instructors: + - Diana Iusan + - Thor Wikfeldt + - Johan Hellsvik + - Pavlin Mitev + - Björn Claremar + expert_helpers: + - Anastasiia Andriievska + - Qiang Li + num_participants: + SE: 15 + total: 15 + location: + lat: 59.8434075 + lon: 17.641331 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2022-09-20-workshop/ + start_date: "2022-09-20" + end_date: "2022-09-29" + host: + - Radovan Bast + - Matias Jääskeläinen + - Richard Darst + instructors: + - Sabry Razick + - Samantha Wittke + - Dhanya Pushpadas + - Thomas Pfau + - Radovan Bast + - Hande Celikkanat + - Johan Hellsvik + - Thor Wikfeldt + - Jarno Rantaharju + - Matteo Tomasini + - Richard Darst + expert_helpers: + - Diana Iusan + - Thor Wikfeldt + - Johan Hellsvik + - Stephan Smuts + - Juho Lehtonen + - Dhanya Pushpadas + helpers: + - Björn Claremar + - Philip Gjedde + - Juho Lehtonen + - Bjørn Lindi + - Giordano Lipari + - Dhanya Pushpadas + - Stephanie van de Sandt + - Meron Vermaas + - Aleksandra Wilczynska + - Ruslan Zhuravchak + - Kaveh Karimi + num_participants: + FI: 76 + SE: 52 + NO: 50 + ES: 12 + DK: 7 + NL: 34 + IN: 4 + IE: 3 + CH: 3 + UK: 3 + IT: 3 + FR: 2 + US: 2 + TT: 1 + SG: 1 + CN: 1 + TH: 1 + GR: 1 + IR: 1 + TR: 1 + BR: 1 + ID: 1 + DE: 1 + CA: 1 + total: 262 + twitch_viewers: + smallest_viewers_max: 97 + largest_viewers_max: 157 + zoom_participants: + min: 25 + max: 59 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2022-03-22-workshop/ + start_date: "2022-03-22" + end_date: "2022-03-31" + host: + - Radovan Bast + - Richard Darst + - Enrico Glerean + instructors: + - Radovan Bast + - Richard Darst + - Luca Ferranti + - Johan Hellsvik + - Diana Iusan + - Jarno Rantaharju + - Sabry Razick + - Thor Wikfeldt + - Samantha Wittke + expert_helpers: + - Enrico Glerean + - Bjørn Lindi + helpers: + - Niket Agrawal + - Inigo Aldazabal + - Heather Andrews + - Thomas Arildsen + - Lora Armstrong + - Susan Branchett + - Romain Caneill + - Abel Carreras + - Björn Claremar + - Juan Sebastian Diaz Boada + - Marco Foscato + - Manuel Garcia Alvarez + - Niharika Gauraha + - Agneta Ghose + - Toby Hodges + - Maurits Kok + - Bjørn Lindi + - Jose Carlos Llanusa + - Pedro Ojeda + - Dhanya Pushpadas + - Stephan Smuts + - Ingrid Strandberg + - Aleksandra Wilczynska + num_participants: + AT: 1 + BD: 1 + BR: 1 + DK: 14 + FI: 54 + FR: 1 + DE: 6 + HU: 1 + IN: 2 + IT: 2 + MM: 1 + NL: 55 + NG: 1 + NO: 87 + PK: 1 + ES: 16 + SE: 46 + CH: 1 + UK: 3 + US: 3 + total: 297 + twitch_viewers: + smallest_viewers_max: 144 + largest_viewers_max: 215 + - name: Full online workshop (6 half-days) + website: https://coderefinery.github.io/2021-05-10-workshop/ + start_date: "2021-05-10" + end_date: "2021-05-20" + host: + - Richard Darst + instructors: + - Radovan Bast + - Anne Fouilloux + - Johan Hellsvik + - Diana Iusan + - Juho Lehtonen + - Sabry Razick + - Thor Wikfeldt + - Samantha Wittke + expert_helpers: + - Richard Darst + - Max R. Eckardt + - Patric Holmvall + - Anni Järvenpää + - Stefan Negru + - Jarno Rantaharju + - Marijn van Vliet + helpers: + - Niket Agrawal + - Octavian Andrei + - Thomas Arildsen + - Flavio Calvo + - Ted Hsuan Yun Chen + - Luca Ferranti + - Marco Foscato + - Manuel Garcia Alvarez + - Luc Girod + - Shashank Shekhar Harivyasi + - Patric Holmvall + - Sunniva Indrehus + - Stig Rune Jensen + - Matúš Kalaš + - Alberto Lazzarotto + - Lesetja Lekoloane + - Pavlin Mitev + - Devaraju Narayanappa + - Fabricio Oliveira + - Massimo Pizzol + - Evgeny Posenitskiy + - Ankita Priya + - Annajiat Alim Rasel + - Aili Sarre + - Jannetta Steyn + - Ingrid Strandberg + - Naoe Tatara + - Will Usher + num_participants: + SE: 21 + NO: 43 + FI: 24 + DK: 12 + NL: 16 + BD: 1 + FR: 1 + IN: 1 + IT: 3 + SL: 1 + ZA: 3 + CH: 0 + UK: 2 + total: 128 + - name: Online + website: https://coderefinery.github.io/2020-11-17-online/ + start_date: "2020-11-17" + end_date: "2020-11-26" + host: + - Naoe Tatara + instructors: + - Radovan Bast + - Anne Fouilloux + - Matus Kalas + - Pavlin Mitev + - Sabry Razick + - Thor Wikfeldt + expert_helpers: + - Richard Darst + - Max R. Eckardt + - Juho Lehtonen + - Emiliano Molinaro + - Stefan Negru + - Samantha Wittke + helpers: + - Octavian Andrei + - Raphaela Heil + - Johan Hellsvik + - Patric Holmvall + - Diana Iusan + - Matthew Morris + - Athanasios Protopapas + - Annajiat Alim Rasel + - Anthony Scemama + - Ingrid Strandberg + num_participants: + NO: 26 + SE: 27 + FI: 3 + FR: 4 + PL: 2 + IN: 1 + DE: 4 + BE: 1 + BD: 1 + ES: 3 + CH: 1 + US: 2 + UK: 2 + total: 77 + - name: Online + website: https://coderefinery.github.io/2020-10-20-online/ + start_date: "2020-10-20" + end_date: "2020-10-29" + host: + - Richard Darst + - Naoe Tatara + - Radovan Bast + instructors: + - Radovan Bast + - Richard Darst + - Johan Hidding + - Jarno Rantaharju + - Sabry Razick + - Marijn van Vliet + - Jens Wehner + - Thor Wikfeldt + expert_helpers: + - Enrico Glerean + - Juho Lehtonen + - Samantha Wittke + helpers: + - Niket Agrawal + - Susan Branchett + - Simoneta Caño de Las Heras + - Amir Ebrahimi Fard + - Johan Hidding + - Jakob Sauer Jørgensen + - Maurits Kok + - Raul Ortiz Merino + - Ingrid Strandberg + - Evelien Van Dijk + - Jens Wehner + num_participants: + DK: 11 + FI: 22 + MA: 1 + NL: 43 + NO: 4 + SE: 19 + total: 100 + - name: Online (Mega-CodeRefinery) + website: https://coderefinery.github.io/2020-05-25-online/ + start_date: "2020-05-25" + end_date: "2020-06-04" + host: + - Naoe Tatara + instructors: + - Radovan Bast + - Anne Fouilloux + - Bjørn Lindi + - Thor Wikfeldt + - Stefan Negru + - Richard Darst + expert_helpers: + - Enrico Glerean + - Jarno Rantaharju + - Juho Lehtonen + - Sabry Razick + helpers: + - Daniel Holmberg + - Ebrahim Afyounian + - Erika Yashiro + - Francesco Tabaro + - Joakim Löfgren + - Kerstin Lenk + - Lauri Neuvonen + - Luis Amezcua + - Mikael Djurfeldt + - Mikko Heikkilä + - Pengfei Xu + - Preethy Nair + - Raphaela Heil + - Rohit Goswami + - Samantha Wittke + - Sebastian Schmidt + - Tomi Häkkinen + - Tuomas Rossi + - Ygor Morais Jaques + num_participants: + DK: 2 + FI: 75 + IS: 1 + NP: 1 + NO: 16 + SE: 5 + UK: 1 + US: 1 + total: 102 + - name: Trondheim + start_date: "2020-02-25" + end_date: "2020-02-27" + instructors: + - Anne Fouilloux + - Bjørn Lindi + - Nico Reissmann + helpers: + - Radek Lonka + num_participants: + NO: 26 + SE: 1 + PL: 1 + total: 28 + location: + lat: 63.41921 + lon: 10.402319 + - name: Espoo + start_date: "2019-12-10" + end_date: "2019-12-12" + instructors: + - Radovan Bast + - Richard Darst + - Enrico Glerean + - Juho Lehtonen + - João M. da Silva + - Jarno Rantaharju + helpers: + - Marijn Van Vliet + - Anni Järvenpää + - Shreyas Deshpande + num_participants: + FI: 30 + total: 30 + location: + lat: 60.18708 + lon: 24.82909 + - name: Lille + start_date: "2019-11-25" + end_date: "2019-12-05" + instructors: + - Radovan Bast + num_participants: + FR: 28 + total: 28 + location: + lat: 50.61141 + lon: 3.14053 + - name: Stockholm + start_date: "2019-11-19" + end_date: "2019-11-21" + instructors: + - Thor Wikfeldt + - Radovan Bast + - Anne Fouilloux + helpers: + - Dmytro Kryvokhyzha + - Carolina Robustini + - Ashwin Vishnu + num_participants: + SE: 28 + total: 28 + location: + lat: 59.35002 + lon: 18.02398 + - name: Trondheim + start_date: "2019-10-22" + end_date: "2019-10-24" + instructors: + - Thor Wikfeldt + - Radovan Bast + - Bjørn Lindi + helpers: + - Nico Reissmann + - Radek Lonka + num_participants: + NO: 20 + total: 20 + location: + lat: 63.41594 + lon: 10.40656 + - name: Aalborg + start_date: "2019-06-11" + end_date: "2019-06-13" + instructors: + - Max Roald Eckardt + - Radovan Bast + - Sabry Razick + helpers: + - Thomas Arildsen + - Vang Que Le + - Tobias Lindstrøm Jensen + - Emiliano Molinaro + - Lucy Whalley + num_participants: + DK: 18 + US: 1 + UK: 1 + total: 20 + location: + lat: 57.01398 + lon: 9.98891 + - name: Oslo + start_date: "2019-06-03" + end_date: "2019-06-05" + instructors: + - Radovan Bast + - Sabry Razick + - Anne Fouilloux + - Stefan Negru + helpers: + - Jean Iaquinta + num_participants: + NO: 18 + DK: 1 + SE: 1 + total: 20 + location: + lat: 59.94347 + lon: 10.718161 + - name: Helsinki + start_date: "2019-05-27" + end_date: "2019-05-29" + instructors: + - Richard Darst + - Juho Lehtonen + - João M. da Silva + - Stefan Negru + helpers: + - Manana Koberidze + - Enrico Glerean + num_participants: + FI: 26 + SE: 1 + total: 27 + location: + lat: 60.20444 + lon: 24.96171 + - name: Gothenburg + start_date: "2019-05-21" + end_date: "2019-05-23" + instructors: + - Max Roald Eckardt + - Anne Fouilloux + - Bjørn Lindi + - Thor Wikfeldt + helpers: + - Leif Wigge + - Tuomas Rossi + - Mikael Öhman + num_participants: + SE: 25 + total: 25 + location: + lat: 57.70887 + lon: 11.97456 + - name: Tartu + start_date: "2019-04-02" + end_date: "2019-04-04" + instructors: + - Bjørn Lindi + - João M. da Silva + - Radovan Bast + - Sabry Razick + helpers: + - Dmytro Fishman + - Ivan Kuzmin + - Mikhail Papkov + num_participants: + EE: 25 + DE: 1 + total: 26 + location: + lat: 58.37085 + lon: 26.71472 + - name: Stockholm + start_date: "2019-03-25" + end_date: "2019-03-27" + instructors: + - Radovan Bast + - Thor Wikfeldt + - Juho Lehtonen + helpers: + - Tor Kjellsson Lindblom + num_participants: + SE: 28 + DE: 2 + total: 30 + location: + lat: 59.34819 + lon: 18.07489 + - name: Espoo + start_date: "2018-12-11" + end_date: "2018-12-13" + instructors: + - Stefan Negru + - Juho Lehtonen + - Radovan Bast + - Richard Darst + helpers: + - João M. da Silva + - Pradeep Eranti + num_participants: + FI: 31 + DK: 1 + UK: 1 + total: 33 + location: + lat: 60.18708 + lon: 24.82909 + - name: Uppsala + start_date: "2018-12-03" + end_date: "2018-12-05" + instructors: + - Thor Wikfeldt + - Radovan Bast + - Max Schön + helpers: + - Hadrien Gourlé + num_participants: + SE: 30 + NO: 1 + total: 31 + location: + lat: 59.8434075 + lon: 17.641331 + - name: Kiruna + start_date: "2018-11-21" + end_date: "2018-11-23" + instructors: + - Thor Wikfeldt + - Max Roald Eckardt + - Sabry Razick + - Radovan Bast + num_participants: + SE: 36 + NO: 1 + CH: 1 + total: 38 + location: + lat: 67.85 + lon: 20.2166667 + - name: Reykjavik + start_date: "2018-08-21" + end_date: "2018-08-23" + instructors: + - Thor Wikfeldt + - Bjørn Lindi + - Radovan Bast + num_participants: + IS: 22 + SE: 3 + CH: 1 + total: 26 + location: + lat: 64.1396 + lon: -21.9519 + - name: Oslo + start_date: "2018-06-12" + end_date: "2018-06-14" + instructors: + - Sabry Razick + - Sri Harsha Vathsavayi + - Richard Darst + helpers: + - Anne Fouilloux + num_participants: + NO: 38 + DE: 1 + SE: 3 + total: 42 + location: + lat: 59.94347 + lon: 10.718161 + - name: Espoo + start_date: "2018-05-29" + end_date: "2018-05-31" + instructors: + - Jyry Suvilehto + - Sri Harsha Vathsavayi + - Richard Darst + num_participants: + FI: 48 + total: 48 + location: + lat: 60.18708 + lon: 24.82909 + - name: Lund + start_date: "2018-05-15" + end_date: "2018-05-17" + instructors: + - Radovan Bast + - Sabry Razick + - Thor Wikfeldt + num_participants: + SE: 30 + DK: 1 + total: 31 + location: + lat: 55.715043 + lon: 13.212401 + - name: Turku + start_date: "2018-03-20" + end_date: "2018-03-22" + instructors: + - Jyry Suvilehto + - Radovan Bast + - Sri Harsha Vathsavayi + helpers: + - Zubair Maalick + num_participants: + FI: 22 + SE: 1 + total: 23 + location: + lat: 60.4493 + lon: 22.2952 + - name: Trondheim + start_date: "2018-02-27" + end_date: "2018-03-01" + instructors: + - Bjørn Lindi + - Radovan Bast + - Thor Wikfeldt + num_participants: + NO: 20 + SE: 1 + DK: 1 + total: 22 + location: + lat: 63.4208 + lon: 10.3928 + - name: Espoo + start_date: "2017-12-14" + end_date: "2017-12-16" + instructors: + - Bjørn Lindi + - Jyry Suvilehto + - N. D. + - Radovan Bast + - Sri Harsha Vathsavayi + - Seija Sirkiä + helpers: + - Janne Blomqvist + - Richard Darst + - Mika Jalava + - Harshit Agrawal + - Vesa Vahermaa + num_participants: + FI: 40 + total: 40 + location: + lat: 60.18708 + lon: 24.82909 + - name: Linköping + start_date: "2017-11-07" + end_date: "2017-11-09" + instructors: + - Radovan Bast + - Thor Wikfeldt + - Sabry Razick + helpers: + - Peter Kjellström + num_participants: + NO: 1 + SE: 21 + total: 22 + location: + lat: 58.3978 + lon: 15.576 + - name: Aarhus + start_date: "2017-10-24" + end_date: "2017-10-26" + instructors: + - Bjørn Lindi + - Radovan Bast + - Thor Wikfeldt + - Sabry Razick + helpers: + - Dan Mønster + num_participants: + DK: 24 + SE: 3 + total: 27 + location: + lat: 56.1681 + lon: 10.203 + - name: Tromsø + start_date: "2017-06-19" + end_date: "2017-06-21" + instructors: + - Bjørn Lindi + - Radovan Bast + - Thor Wikfeldt + - Jyry Suvilehto + num_participants: + BE: 1 + SE: 1 + NO: 21 + total: 23 + location: + lat: 69.68137 + lon: 18.97228 + - name: Copenhagen + start_date: "2017-05-09" + end_date: "2017-05-11" + instructors: + - Sri Harsha Vathsavayi + - N. D. + - Radovan Bast + - Jyry Suvilehto + num_participants: + SE: 3 + NL: 1 + DK: 19 + total: 23 + location: + lat: 55.78626 + lon: 12.523 + - name: Stockholm + start_date: "2017-02-20" + end_date: "2017-02-22" + instructors: + - Sabry Razick + - N. D. + - Radovan Bast + - Thor Wikfeldt + - Bjørn Lindi + helpers: + - Cristian Cira + num_participants: + SE: 34 + total: 34 + location: + lat: 59.34819 + lon: 18.07489 + - name: Espoo + start_date: "2016-12-14" + end_date: "2016-12-16" + instructors: + - Jyry Suvilehto + - N. D. + - Pinja Koskinen + - Radovan Bast + - Thor Wikfeldt + helpers: + - Sri Harsha Vathsavayi + - Heikki Lehväslaiho + num_participants: + FI: 25 + total: 25 + location: + lat: 60.17833 + lon: 24.83303 diff --git a/workshops/heatmap-online.png b/workshops/heatmap-online.png new file mode 100644 index 00000000..1231fc07 Binary files /dev/null and b/workshops/heatmap-online.png differ diff --git a/workshops/heatmap_yesno.png b/workshops/heatmap_yesno.png new file mode 100644 index 00000000..2a142de2 Binary files /dev/null and b/workshops/heatmap_yesno.png differ diff --git a/workshops/impact/index.html b/workshops/impact/index.html new file mode 100644 index 00000000..cf734736 --- /dev/null +++ b/workshops/impact/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/workshops/index.html b/workshops/index.html new file mode 100644 index 00000000..5fab1c3d --- /dev/null +++ b/workshops/index.html @@ -0,0 +1,925 @@ + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Workshops and events

+ + +
+ +
+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/instructor-training.yml b/workshops/instructor-training.yml new file mode 100644 index 00000000..bdbfec9a --- /dev/null +++ b/workshops/instructor-training.yml @@ -0,0 +1,60 @@ +events: + - name: Online (with FocusCoE) + website: https://coderefinery.github.io/2020-11-02-instructor-training/ + start_date: "2020-11-02" + end_date: "2020-11-09" + instructors: + - Radovan Bast + - Richard Darst + - Anne Fouilloux + - Sabry Razick + helpers: + - Jarno Rantaharju + num_participants: + total: 14 + - name: Online (with TU Delft) + website: https://coderefinery.github.io/2020-06-24-instructor-training/ + start_date: "2020-06-24" + end_date: "2020-06-25" + instructors: + - Radovan Bast + - Richard Darst + - Anne Fouilloux + helpers: + - Thor Wikfeldt + - Paula Martinez Lavanchy + num_participants: + NO: 1 + FI: 1 + NL: 21 + total: 23 + - name: Stockholm + start_date: "2019-11-04" + end_date: "2019-11-05" + organizers: + - Thor Wikfeldt + - Anne Fouilloux + - Radovan Bast + instructors: + - Thor Wikfeldt + - Anne Fouilloux + - Radovan Bast + - Radovan Bast + - Richard Darst + helpers: + - Juho Lehtonen + - Sabry Razick + - Jarno Rantaharju + - João M. da Silva + - Max Roald Eckardt + - Naoe Tatara + - Emiliano Molinaro + - Bjørn Lindi + num_participants: + NO: 8 + DK: 2 + FI: 2 + UK: 1 + EE: 2 + SE: 15 + total: 30 diff --git a/workshops/other.yml b/workshops/other.yml new file mode 100644 index 00000000..c8856269 --- /dev/null +++ b/workshops/other.yml @@ -0,0 +1,469 @@ +events: + - name: 'CarpentryCon 2022: Online teaching strategies from CodeRefinery' + website: https://hackmd.io/@coderefinery/carpentrycon-2022-attendee + start_date: "2022-08-03" + end_date: "2022-08-03" + Organizer: + - Radovan Bast + - Richard Darst + instructors: + - Radovan Bast + - Richard Darst + - Luca Ferranti + - Samantha Wittke + num_participants: + total: 15 + - name: Community teaching mini-workshop + website: https://hackmd.io/@coderefinery/community-teaching-2022-summer + start_date: "2022-06-21" + end_date: "2022-06-21" + Organizer: + - Radovan Bast + - Richard Darst + instructors: + - Radovan Bast + - Richard Darst + - Diana Iusan + - Johan Hellsvik + helpers: [] + num_participants: + DK: 2 + ES: 1 + SE: 5 + NO: 7 + FI: 5 + LT: 1 + LV: 1 + total: 22 + - name: Git workshop with Compex Systems Modelling group at UiT + start_date: "2022-02-16" + end_date: "2022-02-23" + Organizer: + - Radovan Bast + instructors: + - Radovan Bast + helpers: [] + num_participants: + NO: 19 + total: 19 + - name: Python for Scientific Computing + website: https://scicomp.aalto.fi/training/scip/python-for-scicomp/ + start_date: "2021-10-25" + end_date: "2021-10-28" + Organizer: + - Richard Darst + - Enrico Glerean + instructors: + - Radovan Bast + - Richard Darst + - Enrico Glerean + - Johan Hellsvik + - Diana Iusan + - Pavlin Mitev + - Thomas Pfau + - Dhanya Pushpadas + - Jarno Rantaharju + - Sabry Razick + - Simo Tuomisto + - Marijn van Vliet + - Samantha Wittke + helpers: [] + - name: CodeRefinery workshop with focus on Git and GitLab for Metacenter + website: https://coderefinery.github.io/2021-03-25-online/ + start_date: "2021-03-25" + end_date: "2021-04-08" + host: + - Sabry Razick + - Radovan Bast + instructors: + - Sabry Razick + - Radovan Bast + helpers: [] + num_participants: + NO: 15 + total: 15 + - name: Online CodeRefinery Hackathon on Software Testing + website: https://coderefinery.github.io/2021-03-17-testing-hackathon/ + start_date: "2021-03-17" + end_date: "2021-03-24" + host: + - Naoe Tatara + - Thor Wikfeldt + mentors: + - Anne Fouilloux + - Diana Iusan + - Johan Hellsvik + - Mark Abraham + - Qiang Li + - Radovan Bast + - Richard Darst + - Roberto Di Remigio + - Samantha Wittke + - Thor Wikfeldt + helpers: + - Naoe Tatara + num_participants: + NO: 6 + FI: 4 + SE: 16 + DK: 3 + ZA: 4 + total: 33 + - name: Online CodeRefinery Workshop on Software Testing + website: https://coderefinery.github.io/2021-03-17-testing-hackathon/ + start_date: "2021-03-17" + end_date: "2021-03-17" + host: + - Naoe Tatara + - Thor Wikfeldt + instructors: + - Diana Iusan + - Johan Hellsvik + - Mark Abraham + - Thor Wikfeldt + helpers: + - Qiang Li + - Radovan Bast + - Roberto Di Remigio + - Samantha Wittke + - Naoe Tatara + num_participants: + NO: 14 + FI: 7 + SE: 31 + DK: 5 + IE: 1 + NL: 2 + UK: 1 + FR: 2 + TN: 1 + ZA: 5 + total: 69 + - name: Introduction to Shell, Computing resources for researchers, and HPC Kickstart (Aalto University and University of Oslo) (online) + website: https://coderefinery.github.io/2021-01-29-linux-online/ + start_date: "2021-01-29" + end_date: "2021-01-29" + instructors: + - Richard Darst + - Enrico Glerean + - Anne Fouilloux + - Sabry Razick + helpers: + - Marijn van Vliet + - Jarno Rantaharju + - Naoe Tatara + num_participants: + NO: 59 + FI: 71 + total: 130 + - name: Introduction to Conda for (Data) Scientists (online) + website: https://coderefinery.github.io/2021-01-08-coderefinery-online/ + start_date: "2021-01-08" + end_date: "2021-01-08" + instructors: + - Anne Fouilloux + - Samantha Wittke + helpers: + - Niket Agrawal + - Octavian Andrei + - Radovan Bast + - Emiliano Gelati + - Tomasz Kopec + - Emilia Lipponen + - Lex Nederbragt + - Hui Tang + - Sabry Razick + - Naoe Tatara + num_participants: + NO: 39 + FI: 5 + NL: 2 + SE: 1 + IN: 1 + total: 48 + - name: Collaborative version control with Git (online) + website: https://coderefinery.github.io/2020-12-10-online/ + start_date: "2020-12-10" + end_date: "2020-12-11" + instructors: + - Anne Fouilloux + - Radovan Bast + helpers: + - Sabry Razick + num_participants: + NO: 15 + total: 15 + - name: Version control (Karlstad/online) + website: https://wikfeldt.github.io/2020-09-22-karlstad/ + start_date: "2020-09-22" + end_date: "2020-09-23" + instructors: + - Raphaela Heil + - Thor Wikfeldt + - Pavlin Mitev + helpers: + - Diana Iusan + num_participants: + SE: 11 + CN: 1 + total: 12 + - name: Python for Scientific Computing (online) + website: https://scicomp.aalto.fi/training/scip/python-for-scicomp/ + start_date: "2020-09-14" + end_date: "2020-09-23" + host: + - Naoe Tatara + instructors: + - Anne Fouilloux + - Richard Darst + - Samantha Wittke + - Thor Wikfeldt + - Radovan Bast + num_participants: + FI: 41 + NO: 24 + SE: 3 + total: 68 + - name: GitHub without command line (Tampere/online) + start_date: "2020-08-13" + end_date: "2020-08-13" + instructors: + - Radovan Bast + - Richard Darst + helpers: + - Kerstin Lenk + - Narayan Puthanmadam Subramaniyam + num_participants: + FI: 16 + total: 16 + location: + lat: 61.49512 + lon: 23.77887 + - name: Workshop for those familiar with Git (online) + website: https://coderefinery.github.io/2020-05-18-online/ + start_date: "2020-05-18" + end_date: "2020-05-20" + host: + - Naoe Tatara + instructors: + - Radovan Bast + - Bjørn Lindi + - Sabry Razick + - Thor Wikfeldt + helpers: + - Richard Darst + - Max Roald Eckardt + - Juho Lehtonen + - Pavlin Mitev + num_participants: + SE: 20 + NO: 2 + FI: 1 + DE: 2 + unknown: 2 + total: 27 + - name: Collaborative Git (online) + website: https://coderefinery.github.io/2020-05-06-online/ + start_date: "2020-05-06" + end_date: "2020-05-06" + instructors: + - Anne Fouilloux + - Bjørn Lindi + - Thor Wikfeldt + - Stefan Negru + helpers: + - Radovan Bast + - Richard Darst + - Juho Lehtonen + - Sabry Razick + num_participants: + SE: 25 + NO: 5 + DK: 4 + FI: 3 + total: 37 + - name: GitHub without command line (online) + start_date: "2020-04-15" + end_date: "2020-04-22" + instructors: + - Radovan Bast + num_participants: + NO: 10 + total: 10 + - name: Introduction to Git (online) + website: https://coderefinery.github.io/2020-04-07-online/ + start_date: "2020-04-07" + end_date: "2020-04-08" + instructors: + - Anne Fouilloux + - Radovan Bast + - Thor Wikfeldt + - Richard Darst + helpers: + - Flavio Calvo + - João M. da Silva + - Pedro Ojeda May + - Pavlin Mitev + - Hasti Narimanzadeh + num_participants: + SE: 19 + FI: 1 + DE: 2 + total: 22 + - name: Best Software Practices for the Norwegian Earth System Model (Oslo/Bergen/Online) + start_date: "2020-02-05" + end_date: "2020-02-05" + instructors: + - Anne Fouilloux + num_participants: + NO: 30 + total: 30 + - name: Social coding and open software (Oslo) + website: https://www.ub.uio.no/english/courses-events/events/all-libraries/2020/research-bazaar/social-coding.html + start_date: "2020-01-09" + end_date: "2020-01-09" + instructors: + - Anne Fouilloux + num_participants: + NO: 21 + total: 21 + location: + lat: 59.91712 + lon: 10.73719 + - name: Hackathon (Stockholm) + start_date: "2019-11-06" + end_date: "2019-11-07" + organizers: + - Thor Wikfeldt + - Anne Fouilloux + - Radovan Bast + speakers: + - Rosa Lönneborg + - Richard Darst + - Anne Fouilloux + - Radovan Bast + num_participants: + NO: 8 + FI: 3 + DK: 1 + UK: 1 + EE: 1 + SE: 4 + total: 18 + location: + lat: 59.34781 + lon: 18.07257 + - name: Reproducibility workshop (Stockholm) + start_date: "2019-09-09" + end_date: "2019-09-12" + instructors: + - Thor Wikfeldt + - Will Usher + num_participants: + SE: 12 + total: 12 + location: + lat: 59.34847 + lon: 18.0729 + - name: Python for Dynamics and Evolution of Earth and Planets (Oslo) + website: https://annefou.github.io/2019-04-01-deep/ + start_date: "2019-04-01" + end_date: "2019-04-05" + instructors: + - Nils Charles Prieur + - Anne Fouilloux + num_participants: + NO: 12 + total: 12 + location: + lat: 59.94347 + lon: 10.718161 + - name: Mixed Arts with CodeRefinery & Software Carpentry (Copenhagen) + website: https://kln-courses.github.io/mixed-arts/ + start_date: "2019-03-05" + end_date: "2019-03-05" + instructors: + - Annika Rockenberger + - Max Roald Eckardt + num_participants: + DK: 40 + total: 40 + location: + lat: 55.66293 + lon: 12.59031 + - name: Git in practice (Oslo) + website: https://uio-carpentry.github.io/2019-02-27-git/ + start_date: "2019-02-27" + end_date: "2019-02-27" + instructors: + - Sabry Razick + - Anne Fouilloux + helpers: + - 'Annika Rockenberger ' + num_participants: + NO: 18 + total: 18 + location: + lat: 59.939637 + lon: 10.723291 + - name: Git workshop (Umeå) + start_date: "2017-10-16" + end_date: "2017-10-16" + instructors: + - Radovan Bast + - Jyry Suvilehto + - Thor Wikfeldt + num_participants: + SE: 21 + total: 21 + location: + lat: 63.8191 + lon: 20.31 + - name: 'Workshop: Interfacing Fortran, C, C++, and Python (Manchester)' + website: https://rse.ac.uk/conf2017/workshop-and-tutorial-abstracts/#mixed-martial-arts-with-coderefinery + start_date: "2017-09-08" + end_date: "2017-09-08" + instructors: + - Radovan Bast + num_participants: + total: 15 + location: + lat: 53.47724 + lon: -2.25475 + - name: 'Workshop: Mixed Martial Arts with CodeRefinery (Umeå)' + website: http://neic2017.nordforsk.org/workshops/coderefinery/ + start_date: "2017-05-29" + end_date: "2017-05-29" + instructors: + - Bjørn Lindi + - Radovan Bast + num_participants: + total: 15 + location: + lat: 63.8267 + lon: 20.2665 + - name: CodeRefinery get-together (Stockholm) + start_date: "2017-05-19" + end_date: "2017-05-19" + organizers: + - Radovan Bast + - Thor Wikfeldt + speakers: + - Mark Abraham + - Mikael Leetmaa + num_participants: + SE: 15 + total: 15 + location: + lat: 59.34819 + lon: 18.07489 + - name: CodeRefinery seminar (Oslo) + website: https://www.uio.no/english/services/it/research/events/coderefinery-2017-april.html + start_date: "2017-04-06" + end_date: "2017-04-06" + num_participants: + NO: 15 + total: 15 + location: + lat: 59.94347 + lon: 10.718161 diff --git a/workshops/past/index.html b/workshops/past/index.html new file mode 100644 index 00000000..a488cc06 --- /dev/null +++ b/workshops/past/index.html @@ -0,0 +1,3087 @@ + + + + Past workshops and events - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Past workshops and events + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ +

Past workshops and events

+

This page lists the standard core CodeRefinery +workshop as well as other teaching events by the +CodeRefinery team. Before March 2020, we focused on small/medium +in-person workshops at sites around the Nordics. After that, we +focused on online teaching, and by the time in-person restrictions +were over, the CodeRefinery teaching +style was so well developed that we +are continuing online with in-person workshops as requested.

+ + +
+
+

(locations "in the ocean" represent online events)

+
+ + + +
+
+

Standard CodeRefinery workshops

+ + + +
    + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Sep 10 + - + Sep 19, 2024 + + +   + (356 participants) + +
    +
  • + + + + + +
  • + + Gothenburg + +
    + +   + + + Aug 27 + - + Aug 29, 2024 + + +   + (9 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Mar 12 + - + Mar 21, 2024 + + +   + (263 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Sep 19 + - + Sep 28, 2023 + + +   + (360 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Mar 21 + - + Mar 30, 2023 + + +   + (493 participants) + +
    +
  • + + + + + +
  • + + Uppsala + +
    + +   + + + May 9 + - + May 11, 2023 + + +   + (15 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Sep 20 + - + Sep 29, 2022 + + +   + (262 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + Mar 22 + - + Mar 31, 2022 + + +   + (297 participants) + +
    +
  • + + + + + +
  • + + Full online workshop (6 half-days) + +
    + +   + + + May 10 + - + May 20, 2021 + + +   + (128 participants) + +
    +
  • + + + + + +
  • + + Online + +
    + +   + + + Nov 17 + - + Nov 26, 2020 + + +   + (77 participants) + +
    +
  • + + + + + +
  • + + Online + +
    + +   + + + Oct 20 + - + Oct 29, 2020 + + +   + (100 participants) + +
    +
  • + + + + + +
  • + + Online (Mega-CodeRefinery) + +
    + +   + + + May 25 + - + Jun 4, 2020 + + +   + (102 participants) + +
    +
  • + + + + + +
  • + + Trondheim + +
    + +   + + + Feb 25 + - + Feb 27, 2020 + + +   + (28 participants) + +
    +
  • + + + + + +
  • + + Espoo + +
    + +   + + + Dec 10 + - + Dec 12, 2019 + + +   + (30 participants) + +
    +
  • + + + + + +
  • + + Lille + +
    + +   + + + Nov 25 + - + Dec 5, 2019 + + +   + (28 participants) + +
    +
  • + + + + + +
  • + + Stockholm + +
    + +   + + + Nov 19 + - + Nov 21, 2019 + + +   + (28 participants) + +
    +
  • + + + + + +
  • + + Trondheim + +
    + +   + + + Oct 22 + - + Oct 24, 2019 + + +   + (20 participants) + +
    +
  • + + + + + +
  • + + Aalborg + +
    + +   + + + Jun 11 + - + Jun 13, 2019 + + +   + (20 participants) + +
    +
  • + + + + + +
  • + + Oslo + +
    + +   + + + Jun 3 + - + Jun 5, 2019 + + +   + (20 participants) + +
    +
  • + + + + + +
  • + + Helsinki + +
    + +   + + + May 27 + - + May 29, 2019 + + +   + (27 participants) + +
    +
  • + + + + + +
  • + + Gothenburg + +
    + +   + + + May 21 + - + May 23, 2019 + + +   + (25 participants) + +
    +
  • + + + + + +
  • + + Tartu + +
    + +   + + + Apr 2 + - + Apr 4, 2019 + + +   + (26 participants) + +
    +
  • + + + + + +
  • + + Stockholm + +
    + +   + + + Mar 25 + - + Mar 27, 2019 + + +   + (30 participants) + +
    +
  • + + + + + +
  • + + Espoo + +
    + +   + + + Dec 11 + - + Dec 13, 2018 + + +   + (33 participants) + +
    +
  • + + + + + +
  • + + Uppsala + +
    + +   + + + Dec 3 + - + Dec 5, 2018 + + +   + (31 participants) + +
    +
  • + + + + + +
  • + + Kiruna + +
    + +   + + + Nov 21 + - + Nov 23, 2018 + + +   + (38 participants) + +
    +
  • + + + + + +
  • + + Reykjavik + +
    + +   + + + Aug 21 + - + Aug 23, 2018 + + +   + (26 participants) + +
    +
  • + + + + + +
  • + + Oslo + +
    + +   + + + Jun 12 + - + Jun 14, 2018 + + +   + (42 participants) + +
    +
  • + + + + + +
  • + + Espoo + +
    + +   + + + May 29 + - + May 31, 2018 + + +   + (48 participants) + +
    +
  • + + + + + +
  • + + Lund + +
    + +   + + + May 15 + - + May 17, 2018 + + +   + (31 participants) + +
    +
  • + + + + + +
  • + + Turku + +
    + +   + + + Mar 20 + - + Mar 22, 2018 + + +   + (23 participants) + +
    +
  • + + + + + +
  • + + Trondheim + +
    + +   + + + Feb 27 + - + Mar 1, 2018 + + +   + (22 participants) + +
    +
  • + + + + + +
  • + + Espoo + +
    + +   + + + Dec 14 + - + Dec 16, 2017 + + +   + (40 participants) + +
    +
  • + + + + + +
  • + + Linköping + +
    + +   + + + Nov 7 + - + Nov 9, 2017 + + +   + (22 participants) + +
    +
  • + + + + + +
  • + + Aarhus + +
    + +   + + + Oct 24 + - + Oct 26, 2017 + + +   + (27 participants) + +
    +
  • + + + + + +
  • + + Tromsø + +
    + +   + + + Jun 19 + - + Jun 21, 2017 + + +   + (23 participants) + +
    +
  • + + + + + +
  • + + Copenhagen + +
    + +   + + + May 9 + - + May 11, 2017 + + +   + (23 participants) + +
    +
  • + + + + + +
  • + + Stockholm + +
    + +   + + + Feb 20 + - + Feb 22, 2017 + + +   + (34 participants) + +
    +
  • + + + + + +
  • + + Espoo + +
    + +   + + + Dec 14 + - + Dec 16, 2016 + + +   + (25 participants) + +
    +
  • + + +
+ + +

Open house events

+ +
+ +
+

Instructor training events

+ + + +
    + + + + +
  • + + Online (with FocusCoE) + +
    + +   + + + Nov 2 + - + Nov 9, 2020 + + +   + (14 participants) + +
    +
  • + + + + + +
  • + + Online (with TU Delft) + +
    + +   + + + Jun 24 + - + Jun 25, 2020 + + +   + (23 participants) + +
    +
  • + + + + + +
  • + + Stockholm + +
    + +   + + + Nov 4 + - + Nov 5, 2019 + + +   + (30 participants) + +
    +
  • + + +
+ + +

Shorter workshops and other events

+ + + + + +
+
+ +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/position-online.png b/workshops/position-online.png new file mode 100644 index 00000000..86e87a3c Binary files /dev/null and b/workshops/position-online.png differ diff --git a/workshops/request/index.html b/workshops/request/index.html new file mode 100644 index 00000000..61fc62cf --- /dev/null +++ b/workshops/request/index.html @@ -0,0 +1,913 @@ + + + + Request a workshop - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Request a workshop + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Request a workshop

+ + + +

Join an existing workshop

+

Requesting a workshop is so 2019, isn't it? At least for us it is, +since anyone can attend any workshop. As of 2022, most of our +workshops are online and anyone may join, no matter where you are. +This isn't just because of Covid-19, but we have found that our +teaching style provides such a +high-quality program that few people show up in-person when there is +that opportunity. Join as a partner and +you can provide in-person exercise sessions and support to your local +audience.

+

Run your own workshop

+

You are welcome to re-use our materials for your own workshops. +Please don't call it a "CodeRefinery" workshop, but you can say it +uses CodeRefinery materials. (e.g. call it "Software development for +researchers (CodeRefinery)"). The policy of our name usage may change +later. You can read more about reusing our +lessons - in short, please do so (you can reuse +them right where they are), and send us improvements to support reuse.

+

Local / custom workshops requests

+

If you would like to request a private workshop, please get in +touch. As of 2022, with our updated funding +situation, CodeRefinery is more of a decentralized organization and we +may not have dedicated staff to offer workshops, but we still like to +make that possible wherever we can. Thus, you would be expected to +help with the teaching and organization some.

+

During this transition period, it's best to join the CodeRefniery +chat and discuss there - things +may change fast. It's good to ask if you are interested, even if we +can't do it yet - this shows demand and helps with future funding!

+

Since CodeRefinery still has Nordic roots, that is our main audience. +Workshops have been requested by both organizations and individual +research groups. Price might be free (e.g. a staff member at a +national computing center can provide the workshop) or some other +CodeRefinery partner might be able to name a price. We have supported +workshops even outside of the Nordics.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/statistics/index.html b/workshops/statistics/index.html new file mode 100644 index 00000000..7c262c41 --- /dev/null +++ b/workshops/statistics/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/workshops/teaching-style/index.html b/workshops/teaching-style/index.html new file mode 100644 index 00000000..436247a9 --- /dev/null +++ b/workshops/teaching-style/index.html @@ -0,0 +1,958 @@ + + + + The CodeRefinery teaching style - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - The CodeRefinery teaching style + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

The CodeRefinery teaching style

+ + + +
+

I attended several "top" conferences/workshops/seminars as well as +videolectures this past year in their virtual implementations, and +this event is easily the best out of all of them when it comes down +to presentations and audience participation!

+

[Feedback, online Scientific Computing kickstart, June 2021]

+
+

In-person workshops are taught in the Carpentries style. Our lessons +would fit in a Carpentries workshop, and we welcome such collaboration +or even joining the Carpentries.

+

In March 2020, CodeRefinery moved online like many others. While at +first, we taught the same way as everyone else did, we were bold +enough to go farther and eventually found something special.

+

Co-teaching

+

Listening to one person is usually monotonous, even if they are an +above-average speaker. Speakers usually try to create engagement by +having the audience speak as well, but quite often the audience is too +quiet, or a few audience members dominate.

+

Instead, we do co-teaching: two instructors teach as a discussion +between them. For example, at certain times, one may assume the role +of the explainer and one the role of the one doing the demos. A +conversation is much more engaging than a lecture, and in addition, +this greatly reduces the preparation effort, since the team can fill +in any gaps together.

+

Parallel chat

+

Asking for questions by voice rarely gets many. Even when it does, a +few people often dominate. Using a standard chat in an online course +scrolls too fast and many questions get lost.

+

Parallel chat is basically "google doc" but for questions. +Questions and comments are always added to the bottom, and answers +come as needed. We have many helpers around to answer all the +questions, the point that learners sometimes complain about +information overload. Many others have tried to do something similar, +but our implementation seems to be the best.

+

Livestreaming

+

With the above developments, we don't actually need all the learners +in one "meeting". Instead, we can run the course as a livestream, and +then we can literally reach everyone who might want to attend. +Personal data for registering isn't even needed (but we do take +registrations for access to the parallel chat and other support).

+

Videos

+

Once the course is a livestream, it is trivial to release videos of +the course - there is no privacy risk, since there are no audience in +the livestream production room. These videos aren't just released, +but the streaming site provides immediate access to them, so that +learners can immediately review or catch up with things they missed. +This extra flexibility helps many more people make the most of the course.

+

Reverse hybrid

+

Just because a course is online doesn't mean that people can't +interact in-person: many do, by watching the course together in +their own space (where people can be more comfortable). Many +partner organizations run in-person breakout rooms where professional +support is provided. We call this reverse hybrid.

+

Teams

+

The best interaction is in small groups - this is the benefit of +in-person, isn't it? We support learners in forming these teams and +training team leaders for them, in addition to providing expert +helpers for additional support. These teams could meet in-person (see +"reverse hybrid" above), or online.

+

Open collaboration

+

At the scale we can reach above, we have a new level of openness. Not +only are the lesson materials open, but our very partnership in +putting on the courses is open. We often organize courses in +partnership with several organizations, with co-instructors and +helpers coming from all around. In addition to providing a higher +quality workshop for learners, this provides a more engaging and +education experience for the staff putting on the events.

+

Open collaboration allows us the resources to do all the things above.

+

Accessibility to more learning styles

+

Put together, we don't just reach more people, but we actually are +able to teach to many more learning styles. Whether you are a quiet +person and would rather ask questions anonymously (without taking time +from someone else), need to attend from your own spaces, need more +time to review after the teaching period, or more, we can do better +than most.

+

Read more

+

Our techniques and tools are as open as our teaching. Read more in +the community teaching +training or read technical +descriptions in our manuals.

+ + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/upcoming/index.html b/workshops/upcoming/index.html new file mode 100644 index 00000000..9e158c01 --- /dev/null +++ b/workshops/upcoming/index.html @@ -0,0 +1,904 @@ + + + + Upcoming and recent workshops and events - CodeRefinery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CodeRefinery - Upcoming and recent workshops and events + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ +
+
+ + +
+ + +

Upcoming and recent workshops and events

+ + + +

Upcoming CodeRefinery workshops

+ +

We don't want you to miss a workshop or event. The best +way to stay informed is to join our newsletter +You can also subscribe to our RSS feed.

+

Upcoming workshops from partner organizations

+

Partners are invited to send a pull +request +to list your workshop/event here.

+

Recent workshops and events

+ + + + +
+ +
+ +
+ +
+

Funding

+

+ CodeRefinery is a project within the + Nordic e-Infrastructure Collaboration (NeIC). + NeIC is an organisational unit under NordForsk. +

+
+ +
+

Privacy

+

+ Privacy policy +

+
+ +
+

Follow us

+ +
+ +
+

Contact

+

+ support@coderefinery.org +

+
+ +
+ + +
+ + + + + diff --git a/workshops/yes-no-questions-online.png b/workshops/yes-no-questions-online.png new file mode 100644 index 00000000..ec07e86b Binary files /dev/null and b/workshops/yes-no-questions-online.png differ