diff options
Diffstat (limited to 'src/content')
105 files changed, 2667 insertions, 670 deletions
diff --git a/src/content/de/blog/index.adoc b/src/content/de/blog/index.adoc new file mode 100644 index 0000000..ec9c676 --- /dev/null +++ b/src/content/de/blog/index.adoc @@ -0,0 +1,5 @@ += Blog + + + +// Generated from po4a(1). diff --git a/src/content/de/blog/kategorien.adoc b/src/content/de/blog/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/blog/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/folien/index.adoc b/src/content/de/folien/index.adoc new file mode 100644 index 0000000..62433a7 --- /dev/null +++ b/src/content/de/folien/index.adoc @@ -0,0 +1,7 @@ += Folien + +Foliensätze als PDF gesetzt: kein Browser nötig, um sie zu lesen, und kein JavaScript-Präsentationsframework im Schlepptau. + + + +// Generated from po4a(1). diff --git a/src/content/de/folien/kategorien.adoc b/src/content/de/folien/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/folien/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/hhg/index.adoc b/src/content/de/hhg/index.adoc new file mode 100644 index 0000000..8ecde39 --- /dev/null +++ b/src/content/de/hhg/index.adoc @@ -0,0 +1,11 @@ += Heute Habe ich Gelernt + +:anna-e-so: https://til.flourishing.stream/ + +**H**eute **H**abe ich **G**elernt (aus dem Englischen, _**T**oday **I** **L**earned_): kleine Einträge nützlichen Wissens. + +Schamlose Kopie von {anna-e-so}[Anna e só]. + + + +// Generated from po4a(1). diff --git a/src/content/de/hhg/kategorien.adoc b/src/content/de/hhg/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/hhg/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/index.adoc b/src/content/de/index.adoc new file mode 100644 index 0000000..c586951 --- /dev/null +++ b/src/content/de/index.adoc @@ -0,0 +1,7 @@ += Startseite + +Das Neueste aus jeder Sammlung steht unten. + + + +// Generated from po4a(1). diff --git a/src/content/de/musik.adoc b/src/content/de/musik.adoc new file mode 100644 index 0000000..f2881a3 --- /dev/null +++ b/src/content/de/musik.adoc @@ -0,0 +1,36 @@ += Musik +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Von mir gestochene Notenblätter, jeweils mit einer synthetisierten Wiedergabe. Die LilyPond-Quellen liegen im Repository; die PDFs werden daraus gebaut. + +== Notenblätter + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ + + + +// Generated from po4a(1). diff --git a/src/content/de/pastebin/index.adoc b/src/content/de/pastebin/index.adoc new file mode 100644 index 0000000..59cb93e --- /dev/null +++ b/src/content/de/pastebin/index.adoc @@ -0,0 +1,5 @@ += Pastebins + + + +// Generated from po4a(1). diff --git a/src/content/de/pastebin/kategorien.adoc b/src/content/de/pastebin/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/pastebin/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/podcast/index.adoc b/src/content/de/podcast/index.adoc new file mode 100644 index 0000000..6e84602 --- /dev/null +++ b/src/content/de/podcast/index.adoc @@ -0,0 +1,5 @@ += Podcast + + + +// Generated from po4a(1). diff --git a/src/content/de/podcast/kategorien.adoc b/src/content/de/podcast/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/podcast/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/screencast/index.adoc b/src/content/de/screencast/index.adoc new file mode 100644 index 0000000..930c244 --- /dev/null +++ b/src/content/de/screencast/index.adoc @@ -0,0 +1,5 @@ += Screencasts + + + +// Generated from po4a(1). diff --git a/src/content/de/screencast/kategorien.adoc b/src/content/de/screencast/kategorien.adoc new file mode 100644 index 0000000..55c86a1 --- /dev/null +++ b/src/content/de/screencast/kategorien.adoc @@ -0,0 +1,6 @@ += Artikel nach Kategorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/de/ueber.adoc b/src/content/de/ueber.adoc new file mode 100644 index 0000000..1c08270 --- /dev/null +++ b/src/content/de/ueber.adoc @@ -0,0 +1,26 @@ += Über + +:mailto: mailto:~euandreh/public-inbox@lists.sr.ht +:archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html + +Hallo, ich bin EuAndreh -- André Miranda Moreira. Ich schreibe Software und gelegentlich Musik. Meine Kontaktdaten stehen im Fußbereich dieser Seite, oder schreib an meinen {mailto}[öffentlichen Posteingang] ({archive}[Archiv]). + +Dies ist meine persönliche Website, auf der ich Artikel schreibe, Software veröffentliche und verwandte Arbeiten zeige. + +I write about robust software: the kind that still works after the network drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a link:{stateless}[stateless NixOS workstation] and have written bridges like link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and Swift first-class citizens inside Nix builds. I care about durable data, which is why I keep returning to local-first software, persistent data structures, and link:{database}[the database I wish existed]: embedded, immutable, and syncable. And I care about tools that don't need a company behind them, so I reach for Git, email and plain text before I reach for a service -- far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection (link:{fallible}[fallible]), link:{flags}[feature flags], and link:{interviewing}[how we interview engineers] -- because robustness is a team habit before it is a technology. + + + +// Generated from po4a(1). diff --git a/src/content/en/about.adoc b/src/content/en/about.adoc index 14d5e22..5e8b699 100644 --- a/src/content/en/about.adoc +++ b/src/content/en/about.adoc @@ -2,10 +2,36 @@ :mailto: mailto:~euandreh/public-inbox@lists.sr.ht :archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html -Hi, I'm EuAndreh. I write software and, occasionally, music. You can find my +Hi, I'm EuAndreh -- André Miranda Moreira. I write software and, occasionally, music. You can find my contact information in the footer of this page, or mail my {mailto}[public inbox] ({archive}[archive]). This is my personal website where I write articles, publish software and more related work. + +I write about robust software: the kind that still works after the network +drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a +link:{stateless}[stateless NixOS workstation] and have written bridges like +link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and +Swift first-class citizens inside Nix builds. I care about durable data, which +is why I keep returning to local-first software, persistent data structures, +and link:{database}[the database I wish existed]: embedded, immutable, and +syncable. And I care about tools that don't need a company behind them, so I +reach for Git, email and plain text before I reach for a service -- +far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection +(link:{fallible}[fallible]), link:{flags}[feature flags], and +link:{interviewing}[how we interview engineers] -- because robustness is a +team habit before it is a technology. diff --git a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc index 76bd8e6..7c1e837 100644 --- a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc +++ b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc @@ -115,7 +115,8 @@ https://lernajs.io/[Lerna]footnote:lerna-package-lock[ was harder than I expected. ]: -```bash +[source,sh] +---- cd /tmp/ git clone https://github.com/lerna/lerna.git cd lerna/ @@ -127,7 +128,7 @@ npm ci merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa npm ci # test if it also works with an existing node_modules/ folder merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa -``` +---- Good job `npm ci` :) diff --git a/src/content/en/blog/2020/11/14/local-first-review.adoc b/src/content/en/blog/2020/11/14/local-first-review.adoc index 2036069..4effc43 100644 --- a/src/content/en/blog/2020/11/14/local-first-review.adoc +++ b/src/content/en/blog/2020/11/14/local-first-review.adoc @@ -1,4 +1,4 @@ -= Local-First Software: article review += Local-First Software: You Own Your Data, in spite of the Cloud - article review :categories: presentation article-review :empty: diff --git a/src/content/en/index.adoc b/src/content/en/index.adoc index 275f7c4..2510fef 100644 --- a/src/content/en/index.adoc +++ b/src/content/en/index.adoc @@ -1 +1,3 @@ -= index += Home + +The newest of each collection is below. diff --git a/src/content/en/music.adoc b/src/content/en/music.adoc new file mode 100644 index 0000000..6828baa --- /dev/null +++ b/src/content/en/music.adoc @@ -0,0 +1,33 @@ += Music +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Scores I have engraved, with a synthesised rendering of each. The +LilyPond sources are in the repository; the PDFs are built from them. + +== Scores + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ diff --git a/src/content/en/pastebin/2021/06/22/curl-wget.adoc b/src/content/en/pastebin/2021/06/22/curl-wget.adoc index 97f55c7..02a9744 100644 --- a/src/content/en/pastebin/2021/06/22/curl-wget.adoc +++ b/src/content/en/pastebin/2021/06/22/curl-wget.adoc @@ -1,4 +1,4 @@ -= "cloc: curl and wget" += cloc: curl and wget `curl`: diff --git a/src/content/en/screencast/2021/02/07/autoqemu.adoc b/src/content/en/screencast/2021/02/07/autoqemu.adoc index b20b092..15bac9a 100644 --- a/src/content/en/screencast/2021/02/07/autoqemu.adoc +++ b/src/content/en/screencast/2021/02/07/autoqemu.adoc @@ -10,7 +10,6 @@ :script: https://www.man7.org/linux/man-pages/man1/script.1.html :klaatu: https://gnuworldorder.info/ -video: true After reading begriffs "{begriffs-tips}[Tips for stable and portable software]", the "Begriffs Buildfarm?" section caught my attention, as this is something I diff --git a/src/content/en/slide/2020/10/19/feature-flags.adoc b/src/content/en/slide/2020/10/19/feature-flags.adoc index 553cf4c..360c00f 100644 --- a/src/content/en/slide/2020/10/19/feature-flags.adoc +++ b/src/content/en/slide/2020/10/19/feature-flags.adoc @@ -1,230 +1,8 @@ ---- -# Rollout, feature flag, experiment, operational toggle += Rollout, feature flag, experiment, operational toggle +:categories: presentation +:deck: feature-flags.pdf -@Different use cases for backend, frontend and mobile +Different use cases for backend, frontend and mobile, and why the +four things people call "feature flags" are not the same thing. ---- -. -. -. -# "Feature flags" tend to come up when talking about continuous deployment - ---- -. -. -. -. -@CI: continuous integration -. -@CD: continuous delivery -. -@CD: continuous deployment - ---- -## Types -. -. -. -1. rollout -2. feature flag -3. experiment -4. operational toggle - -% {favicon.svg} ---- -## Rollout - -# For *rolling out* a new version of software - -Short-lived using percentages - -% FIXME: links -- a new deployment of kubernetes -- new APK released to the Play Store - ---- -## Feature flag - -# For turning a feature *on* or *off* - -Medium-lived using allow list, A/B test, percentage, app version, etc. - -- :new-chargeback-flow -- :new-debit-card-activation-screen - ---- -## Experiment - -# For analysing behaviour - -Medium-lived using allow list and A/B test - -- :debit-withdrawal-test - ---- -## Operational toggle - -# For disabling features in #crash-like situations - -Long-lived using percentage - -- :bank-barcode-payment -- :savings-bank-barcode-query-provider - ---- -. -. -@We know know about the types -# But they have different relevance for backend, frontend and mobile - ---- -## backend -. -. -1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp -2. feature flag: ~common-rollout~ common-xp and datasets -3. experiment: common-xp -4. operational toggle: ~common-rollout~ common-xp - ---- -## frontend -. -. -1. rollout: CDN and page refreshes -2. feature flag: percentages and maybe IPs (no :customer/id on the website) -3. experiment: via dynamic backend control -4. operational toggle: via dynamic backend control - ---- -## backend -. -. -1. rollout: app stores -2. feature flag: via dynamic backend control -3. experiment: via dynamic backend control -4. operational toggle: via dynamic backend control - ---- -. -. -@Key differentiator is -# how much *control* we have over the environment - ---- -## backend -# full control -% FIXME: emoji -% 🎉 - ---- -## frontend -# partial control -We choose when to make a new version available - ---- -## mobile -# very limited control -- app stores can restrict updates (worse for iOS) -- customers still have to download new versions - ---- -# Costs -- more complex code -- compatibility with old app versions -- nesting is exponential - ---- -# Benefits -- dynamicity - ---- -## weighting costs × benefits -# The less control we have, the more we value dynamicity - ---- -## weighting costs × benefits -. -. -. -- backend: sometimes worth the cost -- frontend: almost always worth the cost -- mobile: *always* worth the cost - ---- -. -. -. -# Best practices - ---- -# dynamic content > feature flag -Always true for mobile, almost always for frontend - ---- -# Use :include-list for named groups -Always true for backend, frontend and mobile - - {:rules - #{{:types :include-list - :content {:filename "debit-team-members.txt"}}}} - ---- -# Always use :app-version -Only for mobile - - {:rules - #{{:types :app-version - :content {:min-version #{{:platform :android - :code 1000000} - {:platform :ios - :code 2000000}}}}}} - ---- -# Extend ~common-rollout~ common-xp if required - -That's how :include-list, :app-version, etc. were born - ---- -# Beware of many nested feature flags -True for backend, frontend and mobile - ---- -# Don't delete app-facing feature flags -True for mobile - ---- -. -. -. -# Include a feature flag on the whiteboarding phase - ---- -. -. -. -# Include deleting/retiring the feature flag at the end - ---- -# Avoid renaming a feature flag -Use :app-version with :min-version instead - ---- -. -. -. -# And most importantly... - ---- -# *Always* rely on a feature flag on the app -Never do a hotfix, avoid expedited releases at all costs - ---- -## References -. -% FIXME: links -1. "Feature Toggles (aka Feature Flags)", by Pete Hodgson -2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet -3. Accelerate, by N. Forsgren, J. Humble and G. Kim -4. these slides: euandre.org/slide/ -5. prose version of this presentation -6. view source +link:{deck}[Read the deck (PDF)]. diff --git a/src/content/en/slide/2020/10/19/feature-flags.eslaides b/src/content/en/slide/2020/10/19/feature-flags.eslaides new file mode 100644 index 0000000..553cf4c --- /dev/null +++ b/src/content/en/slide/2020/10/19/feature-flags.eslaides @@ -0,0 +1,230 @@ +--- +# Rollout, feature flag, experiment, operational toggle + +@Different use cases for backend, frontend and mobile + +--- +. +. +. +# "Feature flags" tend to come up when talking about continuous deployment + +--- +. +. +. +. +@CI: continuous integration +. +@CD: continuous delivery +. +@CD: continuous deployment + +--- +## Types +. +. +. +1. rollout +2. feature flag +3. experiment +4. operational toggle + +% {favicon.svg} +--- +## Rollout + +# For *rolling out* a new version of software + +Short-lived using percentages + +% FIXME: links +- a new deployment of kubernetes +- new APK released to the Play Store + +--- +## Feature flag + +# For turning a feature *on* or *off* + +Medium-lived using allow list, A/B test, percentage, app version, etc. + +- :new-chargeback-flow +- :new-debit-card-activation-screen + +--- +## Experiment + +# For analysing behaviour + +Medium-lived using allow list and A/B test + +- :debit-withdrawal-test + +--- +## Operational toggle + +# For disabling features in #crash-like situations + +Long-lived using percentage + +- :bank-barcode-payment +- :savings-bank-barcode-query-provider + +--- +. +. +@We know know about the types +# But they have different relevance for backend, frontend and mobile + +--- +## backend +. +. +1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp +2. feature flag: ~common-rollout~ common-xp and datasets +3. experiment: common-xp +4. operational toggle: ~common-rollout~ common-xp + +--- +## frontend +. +. +1. rollout: CDN and page refreshes +2. feature flag: percentages and maybe IPs (no :customer/id on the website) +3. experiment: via dynamic backend control +4. operational toggle: via dynamic backend control + +--- +## backend +. +. +1. rollout: app stores +2. feature flag: via dynamic backend control +3. experiment: via dynamic backend control +4. operational toggle: via dynamic backend control + +--- +. +. +@Key differentiator is +# how much *control* we have over the environment + +--- +## backend +# full control +% FIXME: emoji +% 🎉 + +--- +## frontend +# partial control +We choose when to make a new version available + +--- +## mobile +# very limited control +- app stores can restrict updates (worse for iOS) +- customers still have to download new versions + +--- +# Costs +- more complex code +- compatibility with old app versions +- nesting is exponential + +--- +# Benefits +- dynamicity + +--- +## weighting costs × benefits +# The less control we have, the more we value dynamicity + +--- +## weighting costs × benefits +. +. +. +- backend: sometimes worth the cost +- frontend: almost always worth the cost +- mobile: *always* worth the cost + +--- +. +. +. +# Best practices + +--- +# dynamic content > feature flag +Always true for mobile, almost always for frontend + +--- +# Use :include-list for named groups +Always true for backend, frontend and mobile + + {:rules + #{{:types :include-list + :content {:filename "debit-team-members.txt"}}}} + +--- +# Always use :app-version +Only for mobile + + {:rules + #{{:types :app-version + :content {:min-version #{{:platform :android + :code 1000000} + {:platform :ios + :code 2000000}}}}}} + +--- +# Extend ~common-rollout~ common-xp if required + +That's how :include-list, :app-version, etc. were born + +--- +# Beware of many nested feature flags +True for backend, frontend and mobile + +--- +# Don't delete app-facing feature flags +True for mobile + +--- +. +. +. +# Include a feature flag on the whiteboarding phase + +--- +. +. +. +# Include deleting/retiring the feature flag at the end + +--- +# Avoid renaming a feature flag +Use :app-version with :min-version instead + +--- +. +. +. +# And most importantly... + +--- +# *Always* rely on a feature flag on the app +Never do a hotfix, avoid expedited releases at all costs + +--- +## References +. +% FIXME: links +1. "Feature Toggles (aka Feature Flags)", by Pete Hodgson +2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet +3. Accelerate, by N. Forsgren, J. Humble and G. Kim +4. these slides: euandre.org/slide/ +5. prose version of this presentation +6. view source diff --git a/src/content/en/slide/2020/11/14/local-first-hype.adoc b/src/content/en/slide/2020/11/14/local-first-hype.adoc index fd83115..6083dca 100644 --- a/src/content/en/slide/2020/11/14/local-first-hype.adoc +++ b/src/content/en/slide/2020/11/14/local-first-hype.adoc @@ -1,204 +1,8 @@ -# On "local-first" += On "local-first": beyond the CRDT silver bullet +:categories: presentation +:deck: local-first-hype.pdf -@Beyond the CRDT silver bullet +What local-first software asks of a system, and why conflict-free +replicated data types answer only part of it. ---- -## Part 1 -# Exposition - ---- -## Target -... -- documents -- files -- personal data repositories -.. -Not: banking services, e-commerce, social networking, ride-sharing, etc. - ---- -... -# 7 ideals for local-first software - ---- -... -# 1 - no spinners: your work at your fingertips - ---- -... -# 2 - your work is not trapped on one device - ---- -... -# 3 - the network is optional - ---- -... -# 4 - seamless collaboration with your colleagues - ---- -... -# 5 - the long now - ---- -... -# 6 - security and privacy by default - ---- -... -# 7 - you retain ultimate ownership and control - ---- -## Towards a better future -.... -@ CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology - ---- -## Use case -. - # in node A and node B - s = "Hello, World" - - # in node A - s = "Hello, Alice" - - # in node B - s = "Hello, Bob" - -How to reconcile those? -- Hello, ABloibce -- Hello, AliceBob -- Hello, BobAlice -- Hello, Alice -\... - ---- -# Existing CRDTs differ -- performance -- storage -- compression -- metadata overhead - ---- -... -# Hint towards the "automerge" CRDT - ---- -...... -@@show comparison table, page 9 - ---- -## Part 2 -# Critique - ---- -## Software license -... -@@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source." - ---- -## Example 1 - intentional restriction -. - #!/bin/sh - TODAY="$(date +%s)" - LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)" - if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then - echo 'License expired!' - exit 1 - fi - echo $((2 + 2)) -. - # today - $ ./useful-adder.sh - 4 - - # tomorrow - $ ./useful-adder.sh - License expired! ---- -## Example 2 - unintentional restriction -. - # today - $ useful-program - # ... useful output ... - - # tomorrow, with more data - $ useful-program - ERROR: Panic! Stack overflow! - ---- -.. -# local-first *requires* free software - -Otherwise "The Long Now" (ideal nº5) is lost - ---- -## Denial of existing solutions -.. -@@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub." -. -Solution: either GitHub+CRDTs or git send-email - ---- -## Plain-text formats -. -@@"Git is highly optimized for code and similar line-based text file" -. -It even pulls software to the plain text directtion, e.g.: -- delivery-templates -- common-core.protocols.config -. -Why not exploit that more? - ---- -## Ditching of web applications -.. -@@"The architecture of web apps remains fundamentally server-centric -. -% FIXME: links -Disagree. Contrast PouchDB with Android Instant Apps - ---- -## Costs are underrated -. -- storage -- backups -- maintenance -. -Example: blog vs vlog - ---- -## Real-time collaboration a bit overrated -. -It is only possible on the presence of reliable, medium-quality network connection -.. -@@"X also works when inside an elevator, subway or plane!" - ---- -## On CRDTs and developer experience -. -@@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for? -. -@YES. -. -% FIXME: link -See "A Note on Distributed Computing" - ---- -## Conclusion -. -Why this is a "paper I love": it took offline-first and ran with it. -. -But a pinch of CRDT won't make the world local-first. -. -The tricky part is the end of the sentence: "in spite of the Cloud". - ---- -## References -. -% FIXME: links -1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan -2. The Morning Paper article -3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall -4. these slides: euandre.org/slide/ -5. prose version of this presentation -6. view source +link:{deck}[Read the deck (PDF)]. diff --git a/src/content/en/slide/2020/11/14/local-first-hype.eslaides b/src/content/en/slide/2020/11/14/local-first-hype.eslaides new file mode 100644 index 0000000..fd83115 --- /dev/null +++ b/src/content/en/slide/2020/11/14/local-first-hype.eslaides @@ -0,0 +1,204 @@ +# On "local-first" + +@Beyond the CRDT silver bullet + +--- +## Part 1 +# Exposition + +--- +## Target +... +- documents +- files +- personal data repositories +.. +Not: banking services, e-commerce, social networking, ride-sharing, etc. + +--- +... +# 7 ideals for local-first software + +--- +... +# 1 - no spinners: your work at your fingertips + +--- +... +# 2 - your work is not trapped on one device + +--- +... +# 3 - the network is optional + +--- +... +# 4 - seamless collaboration with your colleagues + +--- +... +# 5 - the long now + +--- +... +# 6 - security and privacy by default + +--- +... +# 7 - you retain ultimate ownership and control + +--- +## Towards a better future +.... +@ CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology + +--- +## Use case +. + # in node A and node B + s = "Hello, World" + + # in node A + s = "Hello, Alice" + + # in node B + s = "Hello, Bob" + +How to reconcile those? +- Hello, ABloibce +- Hello, AliceBob +- Hello, BobAlice +- Hello, Alice +\... + +--- +# Existing CRDTs differ +- performance +- storage +- compression +- metadata overhead + +--- +... +# Hint towards the "automerge" CRDT + +--- +...... +@@show comparison table, page 9 + +--- +## Part 2 +# Critique + +--- +## Software license +... +@@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source." + +--- +## Example 1 - intentional restriction +. + #!/bin/sh + TODAY="$(date +%s)" + LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)" + if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then + echo 'License expired!' + exit 1 + fi + echo $((2 + 2)) +. + # today + $ ./useful-adder.sh + 4 + + # tomorrow + $ ./useful-adder.sh + License expired! +--- +## Example 2 - unintentional restriction +. + # today + $ useful-program + # ... useful output ... + + # tomorrow, with more data + $ useful-program + ERROR: Panic! Stack overflow! + +--- +.. +# local-first *requires* free software + +Otherwise "The Long Now" (ideal nº5) is lost + +--- +## Denial of existing solutions +.. +@@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub." +. +Solution: either GitHub+CRDTs or git send-email + +--- +## Plain-text formats +. +@@"Git is highly optimized for code and similar line-based text file" +. +It even pulls software to the plain text directtion, e.g.: +- delivery-templates +- common-core.protocols.config +. +Why not exploit that more? + +--- +## Ditching of web applications +.. +@@"The architecture of web apps remains fundamentally server-centric +. +% FIXME: links +Disagree. Contrast PouchDB with Android Instant Apps + +--- +## Costs are underrated +. +- storage +- backups +- maintenance +. +Example: blog vs vlog + +--- +## Real-time collaboration a bit overrated +. +It is only possible on the presence of reliable, medium-quality network connection +.. +@@"X also works when inside an elevator, subway or plane!" + +--- +## On CRDTs and developer experience +. +@@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for? +. +@YES. +. +% FIXME: link +See "A Note on Distributed Computing" + +--- +## Conclusion +. +Why this is a "paper I love": it took offline-first and ran with it. +. +But a pinch of CRDT won't make the world local-first. +. +The tricky part is the end of the sentence: "in spite of the Cloud". + +--- +## References +. +% FIXME: links +1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan +2. The Morning Paper article +3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall +4. these slides: euandre.org/slide/ +5. prose version of this presentation +6. view source diff --git a/src/content/en/slide/categories.adoc b/src/content/en/slide/categories.adoc new file mode 100644 index 0000000..feb64ff --- /dev/null +++ b/src/content/en/slide/categories.adoc @@ -0,0 +1,2 @@ += Articles by category +:type: categories diff --git a/src/content/en/slide/index.adoc b/src/content/en/slide/index.adoc new file mode 100644 index 0000000..4e5b53d --- /dev/null +++ b/src/content/en/slide/index.adoc @@ -0,0 +1,4 @@ += Slides + +Slide decks, rendered to PDF: no browser needed to read them, and no +JavaScript presentation framework to carry along. diff --git a/src/content/eo/blog/index.adoc b/src/content/eo/blog/index.adoc new file mode 100644 index 0000000..eae4bf9 --- /dev/null +++ b/src/content/eo/blog/index.adoc @@ -0,0 +1,5 @@ += Blogo + + + +// Generated from po4a(1). diff --git a/src/content/eo/blog/kategorioj.adoc b/src/content/eo/blog/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/blog/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/eo/hml/index.adoc b/src/content/eo/hml/index.adoc new file mode 100644 index 0000000..27af611 --- /dev/null +++ b/src/content/eo/hml/index.adoc @@ -0,0 +1,11 @@ += Hodiaŭ Mi Lernis + +:anna-e-so: https://til.flourishing.stream/ + +**H**odiaŭ **M**i **L**ernis (du angla, _**T**oday **I** **L**earned_): malgrandaj afiŝoj de utilaj scioj. + +Senhonta kopio de {anna-e-so}[Anna e só]. + + + +// Generated from po4a(1). diff --git a/src/content/eo/hml/kategorioj.adoc b/src/content/eo/hml/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/hml/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/eo/index.adoc b/src/content/eo/index.adoc new file mode 100644 index 0000000..60b761e --- /dev/null +++ b/src/content/eo/index.adoc @@ -0,0 +1,7 @@ += Hejmo + +La plej novaj el ĉiu kolekto estas sube. + + + +// Generated from po4a(1). diff --git a/src/content/eo/lumbildoj/index.adoc b/src/content/eo/lumbildoj/index.adoc new file mode 100644 index 0000000..7945c5f --- /dev/null +++ b/src/content/eo/lumbildoj/index.adoc @@ -0,0 +1,7 @@ += Lumbildoj + +Prezentaĵoj bildigitaj al PDF: neniu retumilo necesas por legi ilin, kaj neniu JavaScript-prezenta kadro por kunporti. + + + +// Generated from po4a(1). diff --git a/src/content/eo/lumbildoj/kategorioj.adoc b/src/content/eo/lumbildoj/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/lumbildoj/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/eo/muziko.adoc b/src/content/eo/muziko.adoc new file mode 100644 index 0000000..0e83314 --- /dev/null +++ b/src/content/eo/muziko.adoc @@ -0,0 +1,36 @@ += Muziko +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Partituroj kiujn mi gravuris, ĉiu kun sintezita plenumo. La LilyPond-fontoj estas en la deponejo; la PDF-oj estas generitaj el ili. + +== Partituroj + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ + + + +// Generated from po4a(1). diff --git a/src/content/eo/pastebin/index.adoc b/src/content/eo/pastebin/index.adoc new file mode 100644 index 0000000..59cb93e --- /dev/null +++ b/src/content/eo/pastebin/index.adoc @@ -0,0 +1,5 @@ += Pastebins + + + +// Generated from po4a(1). diff --git a/src/content/eo/pastebin/kategorioj.adoc b/src/content/eo/pastebin/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/pastebin/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/eo/podkasto/index.adoc b/src/content/eo/podkasto/index.adoc new file mode 100644 index 0000000..4450e5d --- /dev/null +++ b/src/content/eo/podkasto/index.adoc @@ -0,0 +1,5 @@ += Podkasto + + + +// Generated from po4a(1). diff --git a/src/content/eo/podkasto/kategorioj.adoc b/src/content/eo/podkasto/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/podkasto/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/eo/pri.adoc b/src/content/eo/pri.adoc new file mode 100644 index 0000000..1da9565 --- /dev/null +++ b/src/content/eo/pri.adoc @@ -0,0 +1,26 @@ += Pri + +:mailto: mailto:~euandreh/public-inbox@lists.sr.ht +:archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html + +Saluton, mi estas EuAndreh -- André Miranda Moreira. Mi verkas programojn kaj foje muzikojn. Vi povas trovi la kielo por kontakti min ĉe la fino de ĉi tiu paĝo, aŭ vi ankaŭ povas sendi mesaĝon al mia {mailto}[publika leterkesto] ({archive}[arkivo]). + +Ĉi tiu estas mia persona retejo, kie mi verkas artikolojn, publikas programojn kaj aliajn rilatajn laborojn. + +I write about robust software: the kind that still works after the network drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a link:{stateless}[stateless NixOS workstation] and have written bridges like link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and Swift first-class citizens inside Nix builds. I care about durable data, which is why I keep returning to local-first software, persistent data structures, and link:{database}[the database I wish existed]: embedded, immutable, and syncable. And I care about tools that don't need a company behind them, so I reach for Git, email and plain text before I reach for a service -- far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection (link:{fallible}[fallible]), link:{flags}[feature flags], and link:{interviewing}[how we interview engineers] -- because robustness is a team habit before it is a technology. + + + +// Generated from po4a(1). diff --git a/src/content/eo/screencast/index.adoc b/src/content/eo/screencast/index.adoc new file mode 100644 index 0000000..930c244 --- /dev/null +++ b/src/content/eo/screencast/index.adoc @@ -0,0 +1,5 @@ += Screencasts + + + +// Generated from po4a(1). diff --git a/src/content/eo/screencast/kategorioj.adoc b/src/content/eo/screencast/kategorioj.adoc new file mode 100644 index 0000000..a67c911 --- /dev/null +++ b/src/content/eo/screencast/kategorioj.adoc @@ -0,0 +1,6 @@ += Artikoloj laŭ kategorio +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/acerca.adoc b/src/content/es/acerca.adoc new file mode 100644 index 0000000..685decd --- /dev/null +++ b/src/content/es/acerca.adoc @@ -0,0 +1,26 @@ += Acerca + +:mailto: mailto:~euandreh/public-inbox@lists.sr.ht +:archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html + +Hola, soy EuAndreh -- André Miranda Moreira. Escribo software y, ocasionalmente, música. Puedes encontrar mis datos de contacto al pie de esta página, o escribir a mi {mailto}[buzón público] ({archive}[archivo]). + +Este es mi sitio personal, donde escribo artículos, publico software y otros trabajos relacionados. + +I write about robust software: the kind that still works after the network drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a link:{stateless}[stateless NixOS workstation] and have written bridges like link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and Swift first-class citizens inside Nix builds. I care about durable data, which is why I keep returning to local-first software, persistent data structures, and link:{database}[the database I wish existed]: embedded, immutable, and syncable. And I care about tools that don't need a company behind them, so I reach for Git, email and plain text before I reach for a service -- far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection (link:{fallible}[fallible]), link:{flags}[feature flags], and link:{interviewing}[how we interview engineers] -- because robustness is a team habit before it is a technology. + + + +// Generated from po4a(1). diff --git a/src/content/es/blog/categorias.adoc b/src/content/es/blog/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/blog/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/blog/index.adoc b/src/content/es/blog/index.adoc new file mode 100644 index 0000000..ec9c676 --- /dev/null +++ b/src/content/es/blog/index.adoc @@ -0,0 +1,5 @@ += Blog + + + +// Generated from po4a(1). diff --git a/src/content/es/diapositivas/categorias.adoc b/src/content/es/diapositivas/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/diapositivas/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/diapositivas/index.adoc b/src/content/es/diapositivas/index.adoc new file mode 100644 index 0000000..4870b35 --- /dev/null +++ b/src/content/es/diapositivas/index.adoc @@ -0,0 +1,7 @@ += Diapositivas + +Presentaciones renderizadas en PDF: no hace falta un navegador para leerlas, ni un marco de presentación en JavaScript que arrastrar. + + + +// Generated from po4a(1). diff --git a/src/content/es/haa/categorias.adoc b/src/content/es/haa/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/haa/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/haa/index.adoc b/src/content/es/haa/index.adoc new file mode 100644 index 0000000..0613ea0 --- /dev/null +++ b/src/content/es/haa/index.adoc @@ -0,0 +1,11 @@ += Hoy Aprendí Algo + +:anna-e-so: https://til.flourishing.stream/ + +**H**oy **A**prendí **A**lgo (del inglés, _**T**oday **I** **L**earned_): pequeñas entradas de conocimiento útil. + +Copia descarada de {anna-e-so}[Anna e só]. + + + +// Generated from po4a(1). diff --git a/src/content/es/index.adoc b/src/content/es/index.adoc new file mode 100644 index 0000000..ee20c82 --- /dev/null +++ b/src/content/es/index.adoc @@ -0,0 +1,7 @@ += Inicio + +Lo más reciente de cada colección está abajo. + + + +// Generated from po4a(1). diff --git a/src/content/es/musica.adoc b/src/content/es/musica.adoc new file mode 100644 index 0000000..91e5759 --- /dev/null +++ b/src/content/es/musica.adoc @@ -0,0 +1,36 @@ += Música +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Partituras que he grabado, cada una con una interpretación sintetizada. Las fuentes de LilyPond están en el repositorio; los PDF se generan a partir de ellas. + +== Partituras + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ + + + +// Generated from po4a(1). diff --git a/src/content/es/pastebin/categorias.adoc b/src/content/es/pastebin/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/pastebin/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/pastebin/index.adoc b/src/content/es/pastebin/index.adoc new file mode 100644 index 0000000..59cb93e --- /dev/null +++ b/src/content/es/pastebin/index.adoc @@ -0,0 +1,5 @@ += Pastebins + + + +// Generated from po4a(1). diff --git a/src/content/es/podcast/categorias.adoc b/src/content/es/podcast/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/podcast/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/podcast/index.adoc b/src/content/es/podcast/index.adoc new file mode 100644 index 0000000..6e84602 --- /dev/null +++ b/src/content/es/podcast/index.adoc @@ -0,0 +1,5 @@ += Podcast + + + +// Generated from po4a(1). diff --git a/src/content/es/screencast/categorias.adoc b/src/content/es/screencast/categorias.adoc new file mode 100644 index 0000000..bdff794 --- /dev/null +++ b/src/content/es/screencast/categorias.adoc @@ -0,0 +1,6 @@ += Artículos por categoría +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/es/screencast/index.adoc b/src/content/es/screencast/index.adoc new file mode 100644 index 0000000..930c244 --- /dev/null +++ b/src/content/es/screencast/index.adoc @@ -0,0 +1,5 @@ += Screencasts + + + +// Generated from po4a(1). diff --git a/src/content/favicon.ico b/src/content/favicon.ico Binary files differindex 8f2130a..19a4c9a 100644 --- a/src/content/favicon.ico +++ b/src/content/favicon.ico diff --git a/src/content/favicon.png b/src/content/favicon.png Binary files differindex 136d8cb..b74fc41 100644 --- a/src/content/favicon.png +++ b/src/content/favicon.png diff --git a/src/content/fr/a-propos.adoc b/src/content/fr/a-propos.adoc new file mode 100644 index 0000000..6e53be0 --- /dev/null +++ b/src/content/fr/a-propos.adoc @@ -0,0 +1,26 @@ += À propos + +:mailto: mailto:~euandreh/public-inbox@lists.sr.ht +:archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html + +Salut, je suis EuAndreh -- André Miranda Moreira. J'écris logiciel et parfois musique. Vous pouvez rencontrer de donnés pour me contacter au bas cette de page, ou vous pouvez également envoyer une message dans ma {mailto}[boîte de réception publique] ({archive}[archive]). + +Ceci est mon site personnel où j'écris des articles, publie des logicielles et d'autres travaux connexes. + +I write about robust software: the kind that still works after the network drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a link:{stateless}[stateless NixOS workstation] and have written bridges like link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and Swift first-class citizens inside Nix builds. I care about durable data, which is why I keep returning to local-first software, persistent data structures, and link:{database}[the database I wish existed]: embedded, immutable, and syncable. And I care about tools that don't need a company behind them, so I reach for Git, email and plain text before I reach for a service -- far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection (link:{fallible}[fallible]), link:{flags}[feature flags], and link:{interviewing}[how we interview engineers] -- because robustness is a team habit before it is a technology. + + + +// Generated from po4a(1). diff --git a/src/content/fr/aja/categories.adoc b/src/content/fr/aja/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/aja/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/aja/index.adoc b/src/content/fr/aja/index.adoc new file mode 100644 index 0000000..383e990 --- /dev/null +++ b/src/content/fr/aja/index.adoc @@ -0,0 +1,11 @@ += Aujourd'hui J'ai Appris + +:anna-e-so: https://til.flourishing.stream/ + +**A**ujourd'hui **J**'ai **A**ppris (de l'anglais, _**T**oday **I** **L**earned_): petites postes de connaissances utiles. + +Copie éhontée de {anna-e-so}[Anna e só]. + + + +// Generated from po4a(1). diff --git a/src/content/fr/blog/categories.adoc b/src/content/fr/blog/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/blog/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/blog/index.adoc b/src/content/fr/blog/index.adoc new file mode 100644 index 0000000..4883948 --- /dev/null +++ b/src/content/fr/blog/index.adoc @@ -0,0 +1,5 @@ += Blogue + + + +// Generated from po4a(1). diff --git a/src/content/fr/diapositives/categories.adoc b/src/content/fr/diapositives/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/diapositives/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/diapositives/index.adoc b/src/content/fr/diapositives/index.adoc new file mode 100644 index 0000000..3888992 --- /dev/null +++ b/src/content/fr/diapositives/index.adoc @@ -0,0 +1,7 @@ += Diapositives + +Présentations rendues en PDF: aucun navigateur n'est nécessaire pour les lire, et aucun cadriciel de présentation en JavaScript à traîner. + + + +// Generated from po4a(1). diff --git a/src/content/fr/index.adoc b/src/content/fr/index.adoc new file mode 100644 index 0000000..a243683 --- /dev/null +++ b/src/content/fr/index.adoc @@ -0,0 +1,7 @@ += Accueil + +Les plus récents de chaque collection sont ci-dessous. + + + +// Generated from po4a(1). diff --git a/src/content/fr/musique.adoc b/src/content/fr/musique.adoc new file mode 100644 index 0000000..27b8f17 --- /dev/null +++ b/src/content/fr/musique.adoc @@ -0,0 +1,36 @@ += Musique +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Partitions que j'ai gravées, chacune avec un rendu synthétisé. Les sources LilyPond sont dans le dépôt; les PDF en sont générés. + +== Partitions + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ + + + +// Generated from po4a(1). diff --git a/src/content/fr/pastebin/categories.adoc b/src/content/fr/pastebin/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/pastebin/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/pastebin/index.adoc b/src/content/fr/pastebin/index.adoc new file mode 100644 index 0000000..59cb93e --- /dev/null +++ b/src/content/fr/pastebin/index.adoc @@ -0,0 +1,5 @@ += Pastebins + + + +// Generated from po4a(1). diff --git a/src/content/fr/podcast/categories.adoc b/src/content/fr/podcast/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/podcast/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/podcast/index.adoc b/src/content/fr/podcast/index.adoc new file mode 100644 index 0000000..6e84602 --- /dev/null +++ b/src/content/fr/podcast/index.adoc @@ -0,0 +1,5 @@ += Podcast + + + +// Generated from po4a(1). diff --git a/src/content/fr/screencast/categories.adoc b/src/content/fr/screencast/categories.adoc new file mode 100644 index 0000000..0035d46 --- /dev/null +++ b/src/content/fr/screencast/categories.adoc @@ -0,0 +1,6 @@ += Articles par catégorie +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/fr/screencast/index.adoc b/src/content/fr/screencast/index.adoc new file mode 100644 index 0000000..930c244 --- /dev/null +++ b/src/content/fr/screencast/index.adoc @@ -0,0 +1,5 @@ += Screencasts + + + +// Generated from po4a(1). diff --git a/src/content/img/favicon.svg b/src/content/img/favicon.svg index ce566b2..fbec3fc 100644 --- a/src/content/img/favicon.svg +++ b/src/content/img/favicon.svg @@ -1,62 +1,84 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> - <path d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> - <path d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> - <path d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> - <path d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> - <path d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> - <path d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> - <path d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> - <path d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> - <path d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> - <path d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> - <path d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> - <path d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> - <path d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> - <path d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> - <path d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> - <path d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> - <path d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> - <path d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> - <path d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> - <path d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> - <path d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> - <path d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> - <path d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> - <path d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> - <path d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> - <path d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> - <path d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> - <path d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> - <path d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> - <path d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> - <path d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> - <path d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> - <path d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> - <path d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> - <path d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> - <path d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> - <path d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> - <path d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> - <path d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> - <path d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> - <path d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> - <path d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> - <path d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> - <path d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> - <path d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> - <path d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> - <path d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> - <path d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> - <path d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> - <path d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> - <path d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> - <path d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> - <path d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> - <path d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> - <path d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> - <path d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> - <path d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> - <path d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> - <path d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> + <path fill="#1F6F5B" d="M 0 0 L 1 0 L 1 1 L 0 1 L 0 0 Z" /> + <path fill="#1F6F5B" d="M 0 15 L 1 15 L 1 16 L 0 16 L 0 15 Z" /> + <path fill="#1F6F5B" d="M 15 0 L 16 0 L 16 1 L 15 1 L 15 0 Z" /> + <path fill="#1F6F5B" d="M 1 0 L 2 0 L 2 1 L 1 1 L 1 0 Z" /> + <path fill="#1F6F5B" d="M 1 15 L 2 15 L 2 16 L 1 16 L 1 15 Z" /> + <path fill="#1F6F5B" d="M 0 1 L 1 1 L 1 2 L 0 2 L 0 1 Z" /> + <path fill="#1F6F5B" d="M 15 1 L 16 1 L 16 2 L 15 2 L 15 1 Z" /> + <path fill="#1F6F5B" d="M 2 0 L 3 0 L 3 1 L 2 1 L 2 0 Z" /> + <path fill="#1F6F5B" d="M 2 15 L 3 15 L 3 16 L 2 16 L 2 15 Z" /> + <path fill="#1F6F5B" d="M 0 2 L 1 2 L 1 3 L 0 3 L 0 2 Z" /> + <path fill="#1F6F5B" d="M 15 2 L 16 2 L 16 3 L 15 3 L 15 2 Z" /> + <path fill="#1F6F5B" d="M 3 0 L 4 0 L 4 1 L 3 1 L 3 0 Z" /> + <path fill="#1F6F5B" d="M 3 15 L 4 15 L 4 16 L 3 16 L 3 15 Z" /> + <path fill="#1F6F5B" d="M 0 3 L 1 3 L 1 4 L 0 4 L 0 3 Z" /> + <path fill="#1F6F5B" d="M 15 3 L 16 3 L 16 4 L 15 4 L 15 3 Z" /> + <path fill="#1F6F5B" d="M 4 0 L 5 0 L 5 1 L 4 1 L 4 0 Z" /> + <path fill="#1F6F5B" d="M 4 15 L 5 15 L 5 16 L 4 16 L 4 15 Z" /> + <path fill="#1F6F5B" d="M 0 4 L 1 4 L 1 5 L 0 5 L 0 4 Z" /> + <path fill="#1F6F5B" d="M 15 4 L 16 4 L 16 5 L 15 5 L 15 4 Z" /> + <path fill="#1F6F5B" d="M 5 0 L 6 0 L 6 1 L 5 1 L 5 0 Z" /> + <path fill="#1F6F5B" d="M 5 15 L 6 15 L 6 16 L 5 16 L 5 15 Z" /> + <path fill="#1F6F5B" d="M 0 5 L 1 5 L 1 6 L 0 6 L 0 5 Z" /> + <path fill="#1F6F5B" d="M 15 5 L 16 5 L 16 6 L 15 6 L 15 5 Z" /> + <path fill="#1F6F5B" d="M 6 0 L 7 0 L 7 1 L 6 1 L 6 0 Z" /> + <path fill="#1F6F5B" d="M 6 15 L 7 15 L 7 16 L 6 16 L 6 15 Z" /> + <path fill="#1F6F5B" d="M 0 6 L 1 6 L 1 7 L 0 7 L 0 6 Z" /> + <path fill="#1F6F5B" d="M 15 6 L 16 6 L 16 7 L 15 7 L 15 6 Z" /> + <path fill="#1F6F5B" d="M 7 0 L 8 0 L 8 1 L 7 1 L 7 0 Z" /> + <path fill="#1F6F5B" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> + <path fill="#1F6F5B" d="M 0 7 L 1 7 L 1 8 L 0 8 L 0 7 Z" /> + <path fill="#1F6F5B" d="M 15 7 L 16 7 L 16 8 L 15 8 L 15 7 Z" /> + <path fill="#1F6F5B" d="M 8 0 L 9 0 L 9 1 L 8 1 L 8 0 Z" /> + <path fill="#1F6F5B" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> + <path fill="#1F6F5B" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path fill="#1F6F5B" d="M 15 8 L 16 8 L 16 9 L 15 9 L 15 8 Z" /> + <path fill="#1F6F5B" d="M 9 0 L 10 0 L 10 1 L 9 1 L 9 0 Z" /> + <path fill="#1F6F5B" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> + <path fill="#1F6F5B" d="M 0 9 L 1 9 L 1 10 L 0 10 L 0 9 Z" /> + <path fill="#1F6F5B" d="M 15 9 L 16 9 L 16 10 L 15 10 L 15 9 Z" /> + <path fill="#1F6F5B" d="M 10 0 L 11 0 L 11 1 L 10 1 L 10 0 Z" /> + <path fill="#1F6F5B" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> + <path fill="#1F6F5B" d="M 0 10 L 1 10 L 1 11 L 0 11 L 0 10 Z" /> + <path fill="#1F6F5B" d="M 15 10 L 16 10 L 16 11 L 15 11 L 15 10 Z" /> + <path fill="#1F6F5B" d="M 11 0 L 12 0 L 12 1 L 11 1 L 11 0 Z" /> + <path fill="#1F6F5B" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> + <path fill="#1F6F5B" d="M 0 11 L 1 11 L 1 12 L 0 12 L 0 11 Z" /> + <path fill="#1F6F5B" d="M 15 11 L 16 11 L 16 12 L 15 12 L 15 11 Z" /> + <path fill="#1F6F5B" d="M 12 0 L 13 0 L 13 1 L 12 1 L 12 0 Z" /> + <path fill="#1F6F5B" d="M 12 15 L 13 15 L 13 16 L 12 16 L 12 15 Z" /> + <path fill="#1F6F5B" d="M 0 12 L 1 12 L 1 13 L 0 13 L 0 12 Z" /> + <path fill="#1F6F5B" d="M 15 12 L 16 12 L 16 13 L 15 13 L 15 12 Z" /> + <path fill="#1F6F5B" d="M 13 0 L 14 0 L 14 1 L 13 1 L 13 0 Z" /> + <path fill="#1F6F5B" d="M 13 15 L 14 15 L 14 16 L 13 16 L 13 15 Z" /> + <path fill="#1F6F5B" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path fill="#1F6F5B" d="M 15 13 L 16 13 L 16 14 L 15 14 L 15 13 Z" /> + <path fill="#1F6F5B" d="M 14 0 L 15 0 L 15 1 L 14 1 L 14 0 Z" /> + <path fill="#1F6F5B" d="M 14 15 L 15 15 L 15 16 L 14 16 L 14 15 Z" /> + <path fill="#1F6F5B" d="M 0 14 L 1 14 L 1 15 L 0 15 L 0 14 Z" /> + <path fill="#1F6F5B" d="M 15 14 L 16 14 L 16 15 L 15 15 L 15 14 Z" /> + <path fill="#1F6F5B" d="M 15 15 L 16 15 L 16 16 L 15 16 L 15 15 Z" /> + <path fill="#1F6F5B" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path fill="#1F6F5B" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path fill="#1F6F5B" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path fill="#1F6F5B" d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" /> + <path fill="#1F6F5B" d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" /> + <path fill="#1F6F5B" d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" /> + <path fill="#1F6F5B" d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" /> + <path fill="#1F6F5B" d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" /> + <path fill="#1F6F5B" d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" /> + <path fill="#1F6F5B" d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" /> + <path fill="#1F6F5B" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" /> + <path fill="#1F6F5B" d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" /> + <path fill="#1F6F5B" d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" /> + <path fill="#1F6F5B" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="#1F6F5B" d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" /> + <path fill="#1F6F5B" d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" /> + <path fill="#1F6F5B" d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" /> + <path fill="#1F6F5B" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path fill="#1F6F5B" d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" /> + <path fill="#1F6F5B" d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" /> + <path fill="#1F6F5B" d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" /> </svg> diff --git a/src/content/img/logo/dark.svg b/src/content/img/logo/dark.svg index 96e0f87..87b705b 100644 --- a/src/content/img/logo/dark.svg +++ b/src/content/img/logo/dark.svg @@ -1,62 +1,84 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> - <path fill="white" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> - <path fill="white" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> - <path fill="white" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> - <path fill="white" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> - <path fill="white" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> - <path fill="white" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> - <path fill="white" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> - <path fill="white" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> - <path fill="white" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> - <path fill="white" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> - <path fill="white" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> - <path fill="white" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> - <path fill="white" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> - <path fill="white" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> - <path fill="white" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> - <path fill="white" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> - <path fill="white" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> - <path fill="white" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> - <path fill="white" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> + <path fill="white" d="M 0 0 L 1 0 L 1 1 L 0 1 L 0 0 Z" /> + <path fill="white" d="M 0 15 L 1 15 L 1 16 L 0 16 L 0 15 Z" /> + <path fill="white" d="M 15 0 L 16 0 L 16 1 L 15 1 L 15 0 Z" /> + <path fill="white" d="M 1 0 L 2 0 L 2 1 L 1 1 L 1 0 Z" /> + <path fill="white" d="M 1 15 L 2 15 L 2 16 L 1 16 L 1 15 Z" /> + <path fill="white" d="M 0 1 L 1 1 L 1 2 L 0 2 L 0 1 Z" /> + <path fill="white" d="M 15 1 L 16 1 L 16 2 L 15 2 L 15 1 Z" /> + <path fill="white" d="M 2 0 L 3 0 L 3 1 L 2 1 L 2 0 Z" /> + <path fill="white" d="M 2 15 L 3 15 L 3 16 L 2 16 L 2 15 Z" /> + <path fill="white" d="M 0 2 L 1 2 L 1 3 L 0 3 L 0 2 Z" /> + <path fill="white" d="M 15 2 L 16 2 L 16 3 L 15 3 L 15 2 Z" /> + <path fill="white" d="M 3 0 L 4 0 L 4 1 L 3 1 L 3 0 Z" /> + <path fill="white" d="M 3 15 L 4 15 L 4 16 L 3 16 L 3 15 Z" /> + <path fill="white" d="M 0 3 L 1 3 L 1 4 L 0 4 L 0 3 Z" /> + <path fill="white" d="M 15 3 L 16 3 L 16 4 L 15 4 L 15 3 Z" /> + <path fill="white" d="M 4 0 L 5 0 L 5 1 L 4 1 L 4 0 Z" /> + <path fill="white" d="M 4 15 L 5 15 L 5 16 L 4 16 L 4 15 Z" /> + <path fill="white" d="M 0 4 L 1 4 L 1 5 L 0 5 L 0 4 Z" /> + <path fill="white" d="M 15 4 L 16 4 L 16 5 L 15 5 L 15 4 Z" /> + <path fill="white" d="M 5 0 L 6 0 L 6 1 L 5 1 L 5 0 Z" /> + <path fill="white" d="M 5 15 L 6 15 L 6 16 L 5 16 L 5 15 Z" /> + <path fill="white" d="M 0 5 L 1 5 L 1 6 L 0 6 L 0 5 Z" /> + <path fill="white" d="M 15 5 L 16 5 L 16 6 L 15 6 L 15 5 Z" /> + <path fill="white" d="M 6 0 L 7 0 L 7 1 L 6 1 L 6 0 Z" /> + <path fill="white" d="M 6 15 L 7 15 L 7 16 L 6 16 L 6 15 Z" /> + <path fill="white" d="M 0 6 L 1 6 L 1 7 L 0 7 L 0 6 Z" /> + <path fill="white" d="M 15 6 L 16 6 L 16 7 L 15 7 L 15 6 Z" /> + <path fill="white" d="M 7 0 L 8 0 L 8 1 L 7 1 L 7 0 Z" /> <path fill="white" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> - <path fill="white" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> - <path fill="white" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> - <path fill="white" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> - <path fill="white" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> - <path fill="white" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> + <path fill="white" d="M 0 7 L 1 7 L 1 8 L 0 8 L 0 7 Z" /> + <path fill="white" d="M 15 7 L 16 7 L 16 8 L 15 8 L 15 7 Z" /> + <path fill="white" d="M 8 0 L 9 0 L 9 1 L 8 1 L 8 0 Z" /> <path fill="white" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> - <path fill="white" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> - <path fill="white" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> - <path fill="white" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="white" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path fill="white" d="M 15 8 L 16 8 L 16 9 L 15 9 L 15 8 Z" /> + <path fill="white" d="M 9 0 L 10 0 L 10 1 L 9 1 L 9 0 Z" /> <path fill="white" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> - <path fill="white" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> - <path fill="white" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> - <path fill="white" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> - <path fill="white" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> - <path fill="white" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> - <path fill="white" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> - <path fill="white" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="white" d="M 0 9 L 1 9 L 1 10 L 0 10 L 0 9 Z" /> + <path fill="white" d="M 15 9 L 16 9 L 16 10 L 15 10 L 15 9 Z" /> + <path fill="white" d="M 10 0 L 11 0 L 11 1 L 10 1 L 10 0 Z" /> <path fill="white" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> - <path fill="white" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> - <path fill="white" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> - <path fill="white" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> + <path fill="white" d="M 0 10 L 1 10 L 1 11 L 0 11 L 0 10 Z" /> + <path fill="white" d="M 15 10 L 16 10 L 16 11 L 15 11 L 15 10 Z" /> + <path fill="white" d="M 11 0 L 12 0 L 12 1 L 11 1 L 11 0 Z" /> <path fill="white" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> - <path fill="white" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> - <path fill="white" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> - <path fill="white" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> - <path fill="white" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> - <path fill="white" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> - <path fill="white" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> - <path fill="white" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> - <path fill="white" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> - <path fill="white" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> - <path fill="white" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> - <path fill="white" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> - <path fill="white" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> - <path fill="white" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> - <path fill="white" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> - <path fill="white" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> - <path fill="white" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> - <path fill="white" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> + <path fill="white" d="M 0 11 L 1 11 L 1 12 L 0 12 L 0 11 Z" /> + <path fill="white" d="M 15 11 L 16 11 L 16 12 L 15 12 L 15 11 Z" /> + <path fill="white" d="M 12 0 L 13 0 L 13 1 L 12 1 L 12 0 Z" /> + <path fill="white" d="M 12 15 L 13 15 L 13 16 L 12 16 L 12 15 Z" /> + <path fill="white" d="M 0 12 L 1 12 L 1 13 L 0 13 L 0 12 Z" /> + <path fill="white" d="M 15 12 L 16 12 L 16 13 L 15 13 L 15 12 Z" /> + <path fill="white" d="M 13 0 L 14 0 L 14 1 L 13 1 L 13 0 Z" /> + <path fill="white" d="M 13 15 L 14 15 L 14 16 L 13 16 L 13 15 Z" /> + <path fill="white" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path fill="white" d="M 15 13 L 16 13 L 16 14 L 15 14 L 15 13 Z" /> + <path fill="white" d="M 14 0 L 15 0 L 15 1 L 14 1 L 14 0 Z" /> + <path fill="white" d="M 14 15 L 15 15 L 15 16 L 14 16 L 14 15 Z" /> + <path fill="white" d="M 0 14 L 1 14 L 1 15 L 0 15 L 0 14 Z" /> + <path fill="white" d="M 15 14 L 16 14 L 16 15 L 15 15 L 15 14 Z" /> + <path fill="white" d="M 15 15 L 16 15 L 16 16 L 15 16 L 15 15 Z" /> + <path fill="#5CC2A2" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path fill="#5CC2A2" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path fill="#5CC2A2" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path fill="#5CC2A2" d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" /> + <path fill="#5CC2A2" d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" /> + <path fill="#5CC2A2" d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" /> + <path fill="#5CC2A2" d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" /> + <path fill="#5CC2A2" d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" /> + <path fill="#5CC2A2" d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" /> + <path fill="#5CC2A2" d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" /> + <path fill="#5CC2A2" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" /> + <path fill="#5CC2A2" d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" /> + <path fill="#5CC2A2" d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" /> + <path fill="#5CC2A2" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="#5CC2A2" d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" /> + <path fill="#5CC2A2" d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" /> + <path fill="#5CC2A2" d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" /> + <path fill="#5CC2A2" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path fill="#5CC2A2" d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" /> + <path fill="#5CC2A2" d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" /> + <path fill="#5CC2A2" d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" /> </svg> diff --git a/src/content/img/logo/light.svg b/src/content/img/logo/light.svg index ab6000b..b6dd72a 100644 --- a/src/content/img/logo/light.svg +++ b/src/content/img/logo/light.svg @@ -1,62 +1,84 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> - <path fill="black" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> - <path fill="black" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> - <path fill="black" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> - <path fill="black" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> - <path fill="black" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> - <path fill="black" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> - <path fill="black" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> - <path fill="black" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> - <path fill="black" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> - <path fill="black" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> - <path fill="black" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> - <path fill="black" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> - <path fill="black" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> - <path fill="black" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> - <path fill="black" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> - <path fill="black" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> - <path fill="black" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> - <path fill="black" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> - <path fill="black" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> + <path fill="black" d="M 0 0 L 1 0 L 1 1 L 0 1 L 0 0 Z" /> + <path fill="black" d="M 0 15 L 1 15 L 1 16 L 0 16 L 0 15 Z" /> + <path fill="black" d="M 15 0 L 16 0 L 16 1 L 15 1 L 15 0 Z" /> + <path fill="black" d="M 1 0 L 2 0 L 2 1 L 1 1 L 1 0 Z" /> + <path fill="black" d="M 1 15 L 2 15 L 2 16 L 1 16 L 1 15 Z" /> + <path fill="black" d="M 0 1 L 1 1 L 1 2 L 0 2 L 0 1 Z" /> + <path fill="black" d="M 15 1 L 16 1 L 16 2 L 15 2 L 15 1 Z" /> + <path fill="black" d="M 2 0 L 3 0 L 3 1 L 2 1 L 2 0 Z" /> + <path fill="black" d="M 2 15 L 3 15 L 3 16 L 2 16 L 2 15 Z" /> + <path fill="black" d="M 0 2 L 1 2 L 1 3 L 0 3 L 0 2 Z" /> + <path fill="black" d="M 15 2 L 16 2 L 16 3 L 15 3 L 15 2 Z" /> + <path fill="black" d="M 3 0 L 4 0 L 4 1 L 3 1 L 3 0 Z" /> + <path fill="black" d="M 3 15 L 4 15 L 4 16 L 3 16 L 3 15 Z" /> + <path fill="black" d="M 0 3 L 1 3 L 1 4 L 0 4 L 0 3 Z" /> + <path fill="black" d="M 15 3 L 16 3 L 16 4 L 15 4 L 15 3 Z" /> + <path fill="black" d="M 4 0 L 5 0 L 5 1 L 4 1 L 4 0 Z" /> + <path fill="black" d="M 4 15 L 5 15 L 5 16 L 4 16 L 4 15 Z" /> + <path fill="black" d="M 0 4 L 1 4 L 1 5 L 0 5 L 0 4 Z" /> + <path fill="black" d="M 15 4 L 16 4 L 16 5 L 15 5 L 15 4 Z" /> + <path fill="black" d="M 5 0 L 6 0 L 6 1 L 5 1 L 5 0 Z" /> + <path fill="black" d="M 5 15 L 6 15 L 6 16 L 5 16 L 5 15 Z" /> + <path fill="black" d="M 0 5 L 1 5 L 1 6 L 0 6 L 0 5 Z" /> + <path fill="black" d="M 15 5 L 16 5 L 16 6 L 15 6 L 15 5 Z" /> + <path fill="black" d="M 6 0 L 7 0 L 7 1 L 6 1 L 6 0 Z" /> + <path fill="black" d="M 6 15 L 7 15 L 7 16 L 6 16 L 6 15 Z" /> + <path fill="black" d="M 0 6 L 1 6 L 1 7 L 0 7 L 0 6 Z" /> + <path fill="black" d="M 15 6 L 16 6 L 16 7 L 15 7 L 15 6 Z" /> + <path fill="black" d="M 7 0 L 8 0 L 8 1 L 7 1 L 7 0 Z" /> <path fill="black" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> - <path fill="black" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> - <path fill="black" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> - <path fill="black" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> - <path fill="black" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> - <path fill="black" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> + <path fill="black" d="M 0 7 L 1 7 L 1 8 L 0 8 L 0 7 Z" /> + <path fill="black" d="M 15 7 L 16 7 L 16 8 L 15 8 L 15 7 Z" /> + <path fill="black" d="M 8 0 L 9 0 L 9 1 L 8 1 L 8 0 Z" /> <path fill="black" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> - <path fill="black" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> - <path fill="black" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> - <path fill="black" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="black" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path fill="black" d="M 15 8 L 16 8 L 16 9 L 15 9 L 15 8 Z" /> + <path fill="black" d="M 9 0 L 10 0 L 10 1 L 9 1 L 9 0 Z" /> <path fill="black" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> - <path fill="black" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> - <path fill="black" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> - <path fill="black" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> - <path fill="black" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> - <path fill="black" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> - <path fill="black" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> - <path fill="black" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="black" d="M 0 9 L 1 9 L 1 10 L 0 10 L 0 9 Z" /> + <path fill="black" d="M 15 9 L 16 9 L 16 10 L 15 10 L 15 9 Z" /> + <path fill="black" d="M 10 0 L 11 0 L 11 1 L 10 1 L 10 0 Z" /> <path fill="black" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> - <path fill="black" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> - <path fill="black" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> - <path fill="black" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> + <path fill="black" d="M 0 10 L 1 10 L 1 11 L 0 11 L 0 10 Z" /> + <path fill="black" d="M 15 10 L 16 10 L 16 11 L 15 11 L 15 10 Z" /> + <path fill="black" d="M 11 0 L 12 0 L 12 1 L 11 1 L 11 0 Z" /> <path fill="black" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> - <path fill="black" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> - <path fill="black" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> - <path fill="black" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> - <path fill="black" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> - <path fill="black" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> - <path fill="black" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> - <path fill="black" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> - <path fill="black" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> - <path fill="black" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> - <path fill="black" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> - <path fill="black" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> - <path fill="black" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> - <path fill="black" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> - <path fill="black" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> - <path fill="black" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> - <path fill="black" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> - <path fill="black" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> + <path fill="black" d="M 0 11 L 1 11 L 1 12 L 0 12 L 0 11 Z" /> + <path fill="black" d="M 15 11 L 16 11 L 16 12 L 15 12 L 15 11 Z" /> + <path fill="black" d="M 12 0 L 13 0 L 13 1 L 12 1 L 12 0 Z" /> + <path fill="black" d="M 12 15 L 13 15 L 13 16 L 12 16 L 12 15 Z" /> + <path fill="black" d="M 0 12 L 1 12 L 1 13 L 0 13 L 0 12 Z" /> + <path fill="black" d="M 15 12 L 16 12 L 16 13 L 15 13 L 15 12 Z" /> + <path fill="black" d="M 13 0 L 14 0 L 14 1 L 13 1 L 13 0 Z" /> + <path fill="black" d="M 13 15 L 14 15 L 14 16 L 13 16 L 13 15 Z" /> + <path fill="black" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path fill="black" d="M 15 13 L 16 13 L 16 14 L 15 14 L 15 13 Z" /> + <path fill="black" d="M 14 0 L 15 0 L 15 1 L 14 1 L 14 0 Z" /> + <path fill="black" d="M 14 15 L 15 15 L 15 16 L 14 16 L 14 15 Z" /> + <path fill="black" d="M 0 14 L 1 14 L 1 15 L 0 15 L 0 14 Z" /> + <path fill="black" d="M 15 14 L 16 14 L 16 15 L 15 15 L 15 14 Z" /> + <path fill="black" d="M 15 15 L 16 15 L 16 16 L 15 16 L 15 15 Z" /> + <path fill="#1F6F5B" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path fill="#1F6F5B" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path fill="#1F6F5B" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path fill="#1F6F5B" d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" /> + <path fill="#1F6F5B" d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" /> + <path fill="#1F6F5B" d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" /> + <path fill="#1F6F5B" d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" /> + <path fill="#1F6F5B" d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" /> + <path fill="#1F6F5B" d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" /> + <path fill="#1F6F5B" d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" /> + <path fill="#1F6F5B" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" /> + <path fill="#1F6F5B" d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" /> + <path fill="#1F6F5B" d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" /> + <path fill="#1F6F5B" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="#1F6F5B" d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" /> + <path fill="#1F6F5B" d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" /> + <path fill="#1F6F5B" d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" /> + <path fill="#1F6F5B" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path fill="#1F6F5B" d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" /> + <path fill="#1F6F5B" d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" /> + <path fill="#1F6F5B" d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" /> </svg> diff --git a/src/content/img/thumb/dark.svg b/src/content/img/thumb/dark.svg new file mode 100644 index 0000000..fe512a7 --- /dev/null +++ b/src/content/img/thumb/dark.svg @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> + <path fill="#5CC2A2" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path fill="#5CC2A2" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path fill="#5CC2A2" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> + <path fill="#5CC2A2" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> + <path fill="#5CC2A2" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> + <path fill="#5CC2A2" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> + <path fill="#5CC2A2" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path fill="#5CC2A2" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> + <path fill="#5CC2A2" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path fill="#5CC2A2" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> + <path fill="#5CC2A2" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> + <path fill="#5CC2A2" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> + <path fill="#5CC2A2" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path fill="#5CC2A2" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> + <path fill="#5CC2A2" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> + <path fill="#5CC2A2" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> + <path fill="#5CC2A2" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> + <path fill="#5CC2A2" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> + <path fill="#5CC2A2" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> + <path fill="#5CC2A2" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> + <path fill="#5CC2A2" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> + <path fill="#5CC2A2" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> + <path fill="#5CC2A2" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> + <path fill="#5CC2A2" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> + <path fill="#5CC2A2" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> + <path fill="#5CC2A2" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> + <path fill="#5CC2A2" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> + <path fill="#5CC2A2" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> + <path fill="#5CC2A2" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="#5CC2A2" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> + <path fill="#5CC2A2" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> + <path fill="#5CC2A2" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> + <path fill="#5CC2A2" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> + <path fill="#5CC2A2" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> + <path fill="#5CC2A2" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> + <path fill="#5CC2A2" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> + <path fill="#5CC2A2" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="#5CC2A2" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> + <path fill="#5CC2A2" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path fill="#5CC2A2" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> + <path fill="#5CC2A2" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> + <path fill="#5CC2A2" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> + <path fill="#5CC2A2" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> + <path fill="#5CC2A2" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> + <path fill="#5CC2A2" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> + <path fill="#5CC2A2" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> + <path fill="#5CC2A2" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> + <path fill="#5CC2A2" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> + <path fill="#5CC2A2" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> + <path fill="#5CC2A2" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> + <path fill="#5CC2A2" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> + <path fill="#5CC2A2" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> + <path fill="#5CC2A2" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> + <path fill="#5CC2A2" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> + <path fill="#5CC2A2" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> + <path fill="#5CC2A2" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> + <path fill="#5CC2A2" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> + <path fill="#5CC2A2" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> + <path fill="#5CC2A2" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> +</svg> diff --git a/src/content/img/thumb/light.svg b/src/content/img/thumb/light.svg new file mode 100644 index 0000000..2561eea --- /dev/null +++ b/src/content/img/thumb/light.svg @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> + <path fill="#1F6F5B" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" /> + <path fill="#1F6F5B" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" /> + <path fill="#1F6F5B" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" /> + <path fill="#1F6F5B" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" /> + <path fill="#1F6F5B" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" /> + <path fill="#1F6F5B" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" /> + <path fill="#1F6F5B" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" /> + <path fill="#1F6F5B" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" /> + <path fill="#1F6F5B" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" /> + <path fill="#1F6F5B" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" /> + <path fill="#1F6F5B" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" /> + <path fill="#1F6F5B" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" /> + <path fill="#1F6F5B" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" /> + <path fill="#1F6F5B" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" /> + <path fill="#1F6F5B" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> + <path fill="#1F6F5B" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> + <path fill="#1F6F5B" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" /> + <path fill="#1F6F5B" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" /> + <path fill="#1F6F5B" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" /> + <path fill="#1F6F5B" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" /> + <path fill="#1F6F5B" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" /> + <path fill="#1F6F5B" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" /> + <path fill="#1F6F5B" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" /> + <path fill="#1F6F5B" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" /> + <path fill="#1F6F5B" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" /> + <path fill="#1F6F5B" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" /> + <path fill="#1F6F5B" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" /> + <path fill="#1F6F5B" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" /> + <path fill="#1F6F5B" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="#1F6F5B" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" /> + <path fill="#1F6F5B" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" /> + <path fill="#1F6F5B" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" /> + <path fill="#1F6F5B" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" /> + <path fill="#1F6F5B" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" /> + <path fill="#1F6F5B" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" /> + <path fill="#1F6F5B" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> + <path fill="#1F6F5B" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" /> + <path fill="#1F6F5B" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" /> + <path fill="#1F6F5B" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" /> + <path fill="#1F6F5B" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" /> + <path fill="#1F6F5B" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" /> + <path fill="#1F6F5B" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" /> + <path fill="#1F6F5B" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" /> + <path fill="#1F6F5B" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" /> + <path fill="#1F6F5B" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" /> + <path fill="#1F6F5B" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" /> + <path fill="#1F6F5B" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" /> + <path fill="#1F6F5B" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" /> + <path fill="#1F6F5B" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" /> + <path fill="#1F6F5B" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" /> + <path fill="#1F6F5B" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" /> + <path fill="#1F6F5B" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" /> + <path fill="#1F6F5B" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" /> + <path fill="#1F6F5B" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> + <path fill="#1F6F5B" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" /> + <path fill="#1F6F5B" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" /> + <path fill="#1F6F5B" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" /> + <path fill="#1F6F5B" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" /> + <path fill="#1F6F5B" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" /> +</svg> diff --git a/src/content/img/wordmark/dark.svg b/src/content/img/wordmark/dark.svg new file mode 100644 index 0000000..27ea302 --- /dev/null +++ b/src/content/img/wordmark/dark.svg @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 9" width="46" height="9"> + <path fill="#5CC2A2" d="M 2 3 L 3 3 L 3 4 L 2 4 L 2 3 Z" /> + <path fill="#5CC2A2" d="M 3 3 L 4 3 L 4 4 L 3 4 L 3 3 Z" /> + <path fill="#5CC2A2" d="M 1 4 L 2 4 L 2 5 L 1 5 L 1 4 Z" /> + <path fill="#5CC2A2" d="M 4 4 L 5 4 L 5 5 L 4 5 L 4 4 Z" /> + <path fill="#5CC2A2" d="M 1 5 L 2 5 L 2 6 L 1 6 L 1 5 Z" /> + <path fill="#5CC2A2" d="M 2 5 L 3 5 L 3 6 L 2 6 L 2 5 Z" /> + <path fill="#5CC2A2" d="M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 Z" /> + <path fill="#5CC2A2" d="M 1 6 L 2 6 L 2 7 L 1 7 L 1 6 Z" /> + <path fill="#5CC2A2" d="M 2 7 L 3 7 L 3 8 L 2 8 L 2 7 Z" /> + <path fill="#5CC2A2" d="M 3 7 L 4 7 L 4 8 L 3 8 L 3 7 Z" /> + <path fill="#5CC2A2" d="M 6 3 L 7 3 L 7 4 L 6 4 L 6 3 Z" /> + <path fill="#5CC2A2" d="M 9 3 L 10 3 L 10 4 L 9 4 L 9 3 Z" /> + <path fill="#5CC2A2" d="M 6 4 L 7 4 L 7 5 L 6 5 L 6 4 Z" /> + <path fill="#5CC2A2" d="M 9 4 L 10 4 L 10 5 L 9 5 L 9 4 Z" /> + <path fill="#5CC2A2" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> + <path fill="#5CC2A2" d="M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 Z" /> + <path fill="#5CC2A2" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> + <path fill="#5CC2A2" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="#5CC2A2" d="M 7 7 L 8 7 L 8 8 L 7 8 L 7 7 Z" /> + <path fill="#5CC2A2" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" /> + <path fill="#5CC2A2" d="M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 Z" /> + <path fill="white" d="M 12 3 L 13 3 L 13 4 L 12 4 L 12 3 Z" /> + <path fill="white" d="M 13 3 L 14 3 L 14 4 L 13 4 L 13 3 Z" /> + <path fill="white" d="M 14 4 L 15 4 L 15 5 L 14 5 L 14 4 Z" /> + <path fill="white" d="M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 Z" /> + <path fill="white" d="M 13 5 L 14 5 L 14 6 L 13 6 L 13 5 Z" /> + <path fill="white" d="M 14 5 L 15 5 L 15 6 L 14 6 L 14 5 Z" /> + <path fill="white" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> + <path fill="white" d="M 14 6 L 15 6 L 15 7 L 14 7 L 14 6 Z" /> + <path fill="white" d="M 12 7 L 13 7 L 13 8 L 12 8 L 12 7 Z" /> + <path fill="white" d="M 13 7 L 14 7 L 14 8 L 13 8 L 13 7 Z" /> + <path fill="white" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> + <path fill="white" d="M 16 3 L 17 3 L 17 4 L 16 4 L 16 3 Z" /> + <path fill="white" d="M 17 3 L 18 3 L 18 4 L 17 4 L 17 3 Z" /> + <path fill="white" d="M 18 3 L 19 3 L 19 4 L 18 4 L 18 3 Z" /> + <path fill="white" d="M 16 4 L 17 4 L 17 5 L 16 5 L 16 4 Z" /> + <path fill="white" d="M 19 4 L 20 4 L 20 5 L 19 5 L 19 4 Z" /> + <path fill="white" d="M 16 5 L 17 5 L 17 6 L 16 6 L 16 5 Z" /> + <path fill="white" d="M 19 5 L 20 5 L 20 6 L 19 6 L 19 5 Z" /> + <path fill="white" d="M 16 6 L 17 6 L 17 7 L 16 7 L 16 6 Z" /> + <path fill="white" d="M 19 6 L 20 6 L 20 7 L 19 7 L 19 6 Z" /> + <path fill="white" d="M 16 7 L 17 7 L 17 8 L 16 8 L 16 7 Z" /> + <path fill="white" d="M 19 7 L 20 7 L 20 8 L 19 8 L 19 7 Z" /> + <path fill="white" d="M 24 1 L 25 1 L 25 2 L 24 2 L 24 1 Z" /> + <path fill="white" d="M 24 2 L 25 2 L 25 3 L 24 3 L 24 2 Z" /> + <path fill="white" d="M 22 3 L 23 3 L 23 4 L 22 4 L 22 3 Z" /> + <path fill="white" d="M 23 3 L 24 3 L 24 4 L 23 4 L 23 3 Z" /> + <path fill="white" d="M 24 3 L 25 3 L 25 4 L 24 4 L 24 3 Z" /> + <path fill="white" d="M 21 4 L 22 4 L 22 5 L 21 5 L 21 4 Z" /> + <path fill="white" d="M 24 4 L 25 4 L 25 5 L 24 5 L 24 4 Z" /> + <path fill="white" d="M 21 5 L 22 5 L 22 6 L 21 6 L 21 5 Z" /> + <path fill="white" d="M 24 5 L 25 5 L 25 6 L 24 6 L 24 5 Z" /> + <path fill="white" d="M 21 6 L 22 6 L 22 7 L 21 7 L 21 6 Z" /> + <path fill="white" d="M 24 6 L 25 6 L 25 7 L 24 7 L 24 6 Z" /> + <path fill="white" d="M 22 7 L 23 7 L 23 8 L 22 8 L 22 7 Z" /> + <path fill="white" d="M 23 7 L 24 7 L 24 8 L 23 8 L 23 7 Z" /> + <path fill="white" d="M 24 7 L 25 7 L 25 8 L 24 8 L 24 7 Z" /> + <path fill="white" d="M 26 3 L 27 3 L 27 4 L 26 4 L 26 3 Z" /> + <path fill="white" d="M 28 3 L 29 3 L 29 4 L 28 4 L 28 3 Z" /> + <path fill="white" d="M 29 3 L 30 3 L 30 4 L 29 4 L 29 3 Z" /> + <path fill="white" d="M 26 4 L 27 4 L 27 5 L 26 5 L 26 4 Z" /> + <path fill="white" d="M 27 4 L 28 4 L 28 5 L 27 5 L 27 4 Z" /> + <path fill="white" d="M 26 5 L 27 5 L 27 6 L 26 6 L 26 5 Z" /> + <path fill="white" d="M 26 6 L 27 6 L 27 7 L 26 7 L 26 6 Z" /> + <path fill="white" d="M 26 7 L 27 7 L 27 8 L 26 8 L 26 7 Z" /> + <path fill="white" d="M 32 3 L 33 3 L 33 4 L 32 4 L 32 3 Z" /> + <path fill="white" d="M 33 3 L 34 3 L 34 4 L 33 4 L 33 3 Z" /> + <path fill="white" d="M 31 4 L 32 4 L 32 5 L 31 5 L 31 4 Z" /> + <path fill="white" d="M 34 4 L 35 4 L 35 5 L 34 5 L 34 4 Z" /> + <path fill="white" d="M 31 5 L 32 5 L 32 6 L 31 6 L 31 5 Z" /> + <path fill="white" d="M 32 5 L 33 5 L 33 6 L 32 6 L 32 5 Z" /> + <path fill="white" d="M 33 5 L 34 5 L 34 6 L 33 6 L 33 5 Z" /> + <path fill="white" d="M 31 6 L 32 6 L 32 7 L 31 7 L 31 6 Z" /> + <path fill="white" d="M 32 7 L 33 7 L 33 8 L 32 8 L 32 7 Z" /> + <path fill="white" d="M 33 7 L 34 7 L 34 8 L 33 8 L 33 7 Z" /> + <path fill="white" d="M 36 1 L 37 1 L 37 2 L 36 2 L 36 1 Z" /> + <path fill="white" d="M 36 2 L 37 2 L 37 3 L 36 3 L 36 2 Z" /> + <path fill="white" d="M 36 3 L 37 3 L 37 4 L 36 4 L 36 3 Z" /> + <path fill="white" d="M 37 3 L 38 3 L 38 4 L 37 4 L 37 3 Z" /> + <path fill="white" d="M 38 3 L 39 3 L 39 4 L 38 4 L 38 3 Z" /> + <path fill="white" d="M 36 4 L 37 4 L 37 5 L 36 5 L 36 4 Z" /> + <path fill="white" d="M 39 4 L 40 4 L 40 5 L 39 5 L 39 4 Z" /> + <path fill="white" d="M 36 5 L 37 5 L 37 6 L 36 6 L 36 5 Z" /> + <path fill="white" d="M 39 5 L 40 5 L 40 6 L 39 6 L 39 5 Z" /> + <path fill="white" d="M 36 6 L 37 6 L 37 7 L 36 7 L 36 6 Z" /> + <path fill="white" d="M 39 6 L 40 6 L 40 7 L 39 7 L 39 6 Z" /> + <path fill="white" d="M 36 7 L 37 7 L 37 8 L 36 8 L 36 7 Z" /> + <path fill="white" d="M 39 7 L 40 7 L 40 8 L 39 8 L 39 7 Z" /> + <path fill="white" d="M 42 7 L 43 7 L 43 8 L 42 8 L 42 7 Z" /> + <path fill="white" d="M 43 7 L 44 7 L 44 8 L 43 8 L 43 7 Z" /> + <path fill="white" d="M 44 7 L 45 7 L 45 8 L 44 8 L 44 7 Z" /> +</svg> diff --git a/src/content/img/wordmark/light.svg b/src/content/img/wordmark/light.svg new file mode 100644 index 0000000..e4d2b10 --- /dev/null +++ b/src/content/img/wordmark/light.svg @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 9" width="46" height="9"> + <path fill="#1F6F5B" d="M 2 3 L 3 3 L 3 4 L 2 4 L 2 3 Z" /> + <path fill="#1F6F5B" d="M 3 3 L 4 3 L 4 4 L 3 4 L 3 3 Z" /> + <path fill="#1F6F5B" d="M 1 4 L 2 4 L 2 5 L 1 5 L 1 4 Z" /> + <path fill="#1F6F5B" d="M 4 4 L 5 4 L 5 5 L 4 5 L 4 4 Z" /> + <path fill="#1F6F5B" d="M 1 5 L 2 5 L 2 6 L 1 6 L 1 5 Z" /> + <path fill="#1F6F5B" d="M 2 5 L 3 5 L 3 6 L 2 6 L 2 5 Z" /> + <path fill="#1F6F5B" d="M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 Z" /> + <path fill="#1F6F5B" d="M 1 6 L 2 6 L 2 7 L 1 7 L 1 6 Z" /> + <path fill="#1F6F5B" d="M 2 7 L 3 7 L 3 8 L 2 8 L 2 7 Z" /> + <path fill="#1F6F5B" d="M 3 7 L 4 7 L 4 8 L 3 8 L 3 7 Z" /> + <path fill="#1F6F5B" d="M 6 3 L 7 3 L 7 4 L 6 4 L 6 3 Z" /> + <path fill="#1F6F5B" d="M 9 3 L 10 3 L 10 4 L 9 4 L 9 3 Z" /> + <path fill="#1F6F5B" d="M 6 4 L 7 4 L 7 5 L 6 5 L 6 4 Z" /> + <path fill="#1F6F5B" d="M 9 4 L 10 4 L 10 5 L 9 5 L 9 4 Z" /> + <path fill="#1F6F5B" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" /> + <path fill="#1F6F5B" d="M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 Z" /> + <path fill="#1F6F5B" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" /> + <path fill="#1F6F5B" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" /> + <path fill="#1F6F5B" d="M 7 7 L 8 7 L 8 8 L 7 8 L 7 7 Z" /> + <path fill="#1F6F5B" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" /> + <path fill="#1F6F5B" d="M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 Z" /> + <path fill="black" d="M 12 3 L 13 3 L 13 4 L 12 4 L 12 3 Z" /> + <path fill="black" d="M 13 3 L 14 3 L 14 4 L 13 4 L 13 3 Z" /> + <path fill="black" d="M 14 4 L 15 4 L 15 5 L 14 5 L 14 4 Z" /> + <path fill="black" d="M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 Z" /> + <path fill="black" d="M 13 5 L 14 5 L 14 6 L 13 6 L 13 5 Z" /> + <path fill="black" d="M 14 5 L 15 5 L 15 6 L 14 6 L 14 5 Z" /> + <path fill="black" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" /> + <path fill="black" d="M 14 6 L 15 6 L 15 7 L 14 7 L 14 6 Z" /> + <path fill="black" d="M 12 7 L 13 7 L 13 8 L 12 8 L 12 7 Z" /> + <path fill="black" d="M 13 7 L 14 7 L 14 8 L 13 8 L 13 7 Z" /> + <path fill="black" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" /> + <path fill="black" d="M 16 3 L 17 3 L 17 4 L 16 4 L 16 3 Z" /> + <path fill="black" d="M 17 3 L 18 3 L 18 4 L 17 4 L 17 3 Z" /> + <path fill="black" d="M 18 3 L 19 3 L 19 4 L 18 4 L 18 3 Z" /> + <path fill="black" d="M 16 4 L 17 4 L 17 5 L 16 5 L 16 4 Z" /> + <path fill="black" d="M 19 4 L 20 4 L 20 5 L 19 5 L 19 4 Z" /> + <path fill="black" d="M 16 5 L 17 5 L 17 6 L 16 6 L 16 5 Z" /> + <path fill="black" d="M 19 5 L 20 5 L 20 6 L 19 6 L 19 5 Z" /> + <path fill="black" d="M 16 6 L 17 6 L 17 7 L 16 7 L 16 6 Z" /> + <path fill="black" d="M 19 6 L 20 6 L 20 7 L 19 7 L 19 6 Z" /> + <path fill="black" d="M 16 7 L 17 7 L 17 8 L 16 8 L 16 7 Z" /> + <path fill="black" d="M 19 7 L 20 7 L 20 8 L 19 8 L 19 7 Z" /> + <path fill="black" d="M 24 1 L 25 1 L 25 2 L 24 2 L 24 1 Z" /> + <path fill="black" d="M 24 2 L 25 2 L 25 3 L 24 3 L 24 2 Z" /> + <path fill="black" d="M 22 3 L 23 3 L 23 4 L 22 4 L 22 3 Z" /> + <path fill="black" d="M 23 3 L 24 3 L 24 4 L 23 4 L 23 3 Z" /> + <path fill="black" d="M 24 3 L 25 3 L 25 4 L 24 4 L 24 3 Z" /> + <path fill="black" d="M 21 4 L 22 4 L 22 5 L 21 5 L 21 4 Z" /> + <path fill="black" d="M 24 4 L 25 4 L 25 5 L 24 5 L 24 4 Z" /> + <path fill="black" d="M 21 5 L 22 5 L 22 6 L 21 6 L 21 5 Z" /> + <path fill="black" d="M 24 5 L 25 5 L 25 6 L 24 6 L 24 5 Z" /> + <path fill="black" d="M 21 6 L 22 6 L 22 7 L 21 7 L 21 6 Z" /> + <path fill="black" d="M 24 6 L 25 6 L 25 7 L 24 7 L 24 6 Z" /> + <path fill="black" d="M 22 7 L 23 7 L 23 8 L 22 8 L 22 7 Z" /> + <path fill="black" d="M 23 7 L 24 7 L 24 8 L 23 8 L 23 7 Z" /> + <path fill="black" d="M 24 7 L 25 7 L 25 8 L 24 8 L 24 7 Z" /> + <path fill="black" d="M 26 3 L 27 3 L 27 4 L 26 4 L 26 3 Z" /> + <path fill="black" d="M 28 3 L 29 3 L 29 4 L 28 4 L 28 3 Z" /> + <path fill="black" d="M 29 3 L 30 3 L 30 4 L 29 4 L 29 3 Z" /> + <path fill="black" d="M 26 4 L 27 4 L 27 5 L 26 5 L 26 4 Z" /> + <path fill="black" d="M 27 4 L 28 4 L 28 5 L 27 5 L 27 4 Z" /> + <path fill="black" d="M 26 5 L 27 5 L 27 6 L 26 6 L 26 5 Z" /> + <path fill="black" d="M 26 6 L 27 6 L 27 7 L 26 7 L 26 6 Z" /> + <path fill="black" d="M 26 7 L 27 7 L 27 8 L 26 8 L 26 7 Z" /> + <path fill="black" d="M 32 3 L 33 3 L 33 4 L 32 4 L 32 3 Z" /> + <path fill="black" d="M 33 3 L 34 3 L 34 4 L 33 4 L 33 3 Z" /> + <path fill="black" d="M 31 4 L 32 4 L 32 5 L 31 5 L 31 4 Z" /> + <path fill="black" d="M 34 4 L 35 4 L 35 5 L 34 5 L 34 4 Z" /> + <path fill="black" d="M 31 5 L 32 5 L 32 6 L 31 6 L 31 5 Z" /> + <path fill="black" d="M 32 5 L 33 5 L 33 6 L 32 6 L 32 5 Z" /> + <path fill="black" d="M 33 5 L 34 5 L 34 6 L 33 6 L 33 5 Z" /> + <path fill="black" d="M 31 6 L 32 6 L 32 7 L 31 7 L 31 6 Z" /> + <path fill="black" d="M 32 7 L 33 7 L 33 8 L 32 8 L 32 7 Z" /> + <path fill="black" d="M 33 7 L 34 7 L 34 8 L 33 8 L 33 7 Z" /> + <path fill="black" d="M 36 1 L 37 1 L 37 2 L 36 2 L 36 1 Z" /> + <path fill="black" d="M 36 2 L 37 2 L 37 3 L 36 3 L 36 2 Z" /> + <path fill="black" d="M 36 3 L 37 3 L 37 4 L 36 4 L 36 3 Z" /> + <path fill="black" d="M 37 3 L 38 3 L 38 4 L 37 4 L 37 3 Z" /> + <path fill="black" d="M 38 3 L 39 3 L 39 4 L 38 4 L 38 3 Z" /> + <path fill="black" d="M 36 4 L 37 4 L 37 5 L 36 5 L 36 4 Z" /> + <path fill="black" d="M 39 4 L 40 4 L 40 5 L 39 5 L 39 4 Z" /> + <path fill="black" d="M 36 5 L 37 5 L 37 6 L 36 6 L 36 5 Z" /> + <path fill="black" d="M 39 5 L 40 5 L 40 6 L 39 6 L 39 5 Z" /> + <path fill="black" d="M 36 6 L 37 6 L 37 7 L 36 7 L 36 6 Z" /> + <path fill="black" d="M 39 6 L 40 6 L 40 7 L 39 7 L 39 6 Z" /> + <path fill="black" d="M 36 7 L 37 7 L 37 8 L 36 8 L 36 7 Z" /> + <path fill="black" d="M 39 7 L 40 7 L 40 8 L 39 8 L 39 7 Z" /> + <path fill="black" d="M 42 7 L 43 7 L 43 8 L 42 8 L 42 7 Z" /> + <path fill="black" d="M 43 7 L 44 7 L 44 8 L 43 8 L 43 7 Z" /> + <path fill="black" d="M 44 7 L 45 7 L 45 8 L 44 8 L 44 7 Z" /> +</svg> diff --git a/src/content/music/choro-da-saudade.ly b/src/content/music/choro-da-saudade.ly new file mode 100644 index 0000000..2f6e686 --- /dev/null +++ b/src/content/music/choro-da-saudade.ly @@ -0,0 +1,233 @@ +\version "2.20.0" +\pointAndClickOff +#(ly:set-option 'embed-source-code #t) + +\include "common.ly.include" +\include "guitar.ly.include" + +\header { + title = "Choro da Saudade" + composer = "Agustín Barrios" + copyright = \copyright + tagline = \tagline +} + +globals = { + \clef "treble_8" + \key g \minor + \time 2/4 + \set fingeringOrientations = #'(left) + \tempo Largo 4 = 50 +} + +upper = \relative c { + \globals + + \repeat volta 2 { + <g-0>16 <d'-0> <bes'-2 ees-4> d, <bes'-2 d-3> d, d, d' | + <a-1> <d-0> <c'-4 ees-3> d, <c'-4 d-2> d, d, d' | + } + + <g,-0>8. <d'-0>16 <bes'-2>\tenuto( <a-1>) a <g-0> | + \repeat volta 2 { + \mark \markup { \musicglyph #"scripts.segno" } + \repeat unfold 2 { + <ees'-2>4 <cis-1>16( <d-2>) <fis-1> <a-4> | + \pestanaSpan "III" <bes-4>8.\startTextSpan <g-1>16 <d-1> <bes-1> <g-3>( <d-0>)\stopTextSpan | + \pestanaSpan "V" <c-1>\startTextSpan <d'-2> <fis-3>( <g-4>) <a-1> <bes-2> <c-4> a\stopTextSpan | + } + \alternative { + { + <d-4>4\fermata <c-4>16( <bes-2>) <a-1> <g\2-4> | + <bes-2>4 <a-1>16( <bes-2>) <c-4> a | + \pestanaSpan "I" <g-4>4\startTextSpan <f-1>16 <ees-4> <d-3> <c-1>\stopTextSpan | + \pestanaSpan "III" <f-4>(\startTextSpan <d-1>) <bes-1> <g-1> <f-1>( <d-0>) <bes-1> <g-9>\stopTextSpan | + <fis-2>8.\fermata <d'-0>16 <bes'-2>\tenuto( <a-1>) a <g-0> | + } + + { + <d''-4>4 \pestanaSpan "VII" <b-1>16\startTextSpan <g-2> <f-4> <d-1>\stopTextSpan | + \pestanaSpan "V" <c-1>\startTextSpan <g-1> <ees-4> <c-1> <a-3>( <bes-4>) <c-1> <ees-4>\stopTextSpan | + \pestanaSpan "III" <d-0>\startTextSpan <bes'-1> <d g-1>8 \appoggiatura { <d-1>16 <f-4> } <ees-2>16 <d-1> <c-3> <bes-1>\stopTextSpan | + <a,-1>( <cis-4>) <e-1> <g-0> <d-0> <fis-3> <a-1> <d-2> \mark \markup { \musicglyph #"scripts.coda" } | + } + } + } + \alternative { + { <g,-0> <d-0> g d bes'\tenuto( a) a g | } + { <g-0> <bes-2 d-3>8 <bes d>16 <bes d> <bes ees-4>8 <bes d>16 | } + } + + % part B + r <c-4 d-2>8 <c d>16 r <bes-1 d-2>8 <bes d> 16 | + r <a-1 d-2>8 <a d>16 <a d> <a cis-1>8 <a d>16 | + r <b-0 g'-4>8 <b g'>16 r <c-1 g'-4>8 <c g'>16 | + + \pestanaSpan "III" r\startTextSpan <d-1 g-1>8 <d g>16 <d g> <f-4 g-1>8 <e-3 g-1>16 | + r <ees-2 g-1>8 <ees g>16 r <ees g>8 <ees g>16\stopTextSpan | + \pestanaSpan "II" r\startTextSpan <c-4 ees-3 fis-1>8 <c ees fis>16 <c ees fis> <c ees g-2>8\stopTextSpan \pestanaSpan "III" <bes-1 d-1 bes'-4>16\startTextSpan | + r <c-3 d-1 a'-4>8 <c d a'>16 r <c-3 dis-2 a'-4>8 <c dis a'>16\stopTextSpan | + + r <g-2 cis-3 bes'-4>8 <g cis bes'>16 r <g cis bes'>8 <g cis bes'>16 | + r <d'-2 g-3 bes-1>8 <d g bes>16 <d g bes> <d g c-4>8 <d g bes>16 | + r <cis-3 g'-4 a-2>8 <cis g' a>16 r <cis g' a>8 <cis g' a>16 | + \pestanaSpan "V" r\startTextSpan <c-1 fis-3 a-1>8 <c fis a>16 <c fis a> <c fis bes-2>8 <c fis a>16\stopTextSpan | + + r <b-3 f'-4 g-2>8 <b f' g>16 r <b f' g>8 <b f' g>16 | + \pestanaSpan "III" r\startTextSpan <bes-1 e-3 g-1>8 <bes e g>16 <bes e g> <bes e a-4>8 <bes e g>16\stopTextSpan | + \pestanaSpan "I" r\startTextSpan <a-2 c-1 f-1>8 <a c f>16\stopTextSpan r <f'-1 bes-2 f'-4>8 <f bes f'>16 | + r <d-1 gis-4>8 <d gis>16 r <cis-2 g'-3 e'-4>8 <cis g' e'>16 | + + \pestanaSpan "V" r\startTextSpan <c-1 fis-3 a-1>8 <c fis a>16\stopTextSpan r <b-0 f'-3 d'-4>8 <b f' d'>16 | + \pestanaSpan "V" r\startTextSpan <g-1 ees'-3 c'-4>8 <g ees' c'>16 <g ees' c'> <g ees' b'-2>8 <g ees' c'>16\stopTextSpan | + \pestanaSpan "III" r\startTextSpan <bes-1 d-1 bes'-4>8 <bes d bes'>16 <bes d bes'> <bes d a'-3>8 <bes d g-1>16\stopTextSpan | + r <g-2 cis-3 bes'-4>8 <g cis bes'>16 \pestanaSpan "III" r\startTextSpan <c-3 d-1 a'-4>8 <c d a'>16 | + + <bes-1 d-1 g-1>8.\stopTextSpan <d,-0>16 <bes'-2>\tenuto( <a-1>) a <g-0> | + + \bar "||" + <g-0>8. <d'-1\3>16\mordent <b-3\4> d <g-2> <b-1> + \key g \major + \repeat volta 2 { + <g,,-0>16 <d'''-4> <b,-0 e-2> g, <gis-1\6> <d'''-4> <b,-0 f'-3> gis, | + <a-1\6> <d''-4> <c,-3 fis-1> \corda "5" <d,-1>\startTextSpan <e-3>\stopTextSpan <g-0> <b-4\4> <d-1> | + <g,,-0> <g''-1> <bes,-2 d-1> g, <g'-4\4> <fis'-1> <bes,-2 cis-1> g | + + <fis-3> <e'-0> <a,-1 d-2> e' <fis-2\3> <a-1> <c-4> <d-1> | + <ais,,-1> <e'''-4> <cis,-2 g'-3> ais, \pestanaSpan "VII" <b-3>\startTextSpan <d''-4> <d,-1 fis-1> b,\stopTextSpan | + <cis-1> <cis''-4> <ais,-2 e'-3> cis, <d-1> <b''-1> <b,-3 d-1> d, | + <e-1> <d''-2> <b,-0 cis-3> e,, <fis-3> <fis''-1> <e,-1 ais-2> fis' | + + \rall <b,,-3>\startTextSpan <fis'-4> <d'-2> <cis-1> <c-4>\fermata <d-2>\fermata <fis-1>\fermata <a-4>\fermata\glissando | + \once \override NoteColumn.glissando-skip = ##t <g,,-0>16\stopTextSpan <d'''-4> <b,-0 e-2> g, <gis-1\6> <d'''-4> <b,-0 f'-3> gis, | + <a-1\6> <d''-4> <c,-3 fis-1> <c'-2>\mordent <a-4\2> <fis-1> <d-1\3> <c-4\4> | + <b-1> <f'-2 e'-4>8 <f e'>16 <g,,-0> <f''-1 b-2 g'-4>8 <f b e-3>16 | + + <a,-3>16 <c-1 e-1 c'-4>8. r4 | + \pestanaSpan "VII" <a,-1\6>16\startTextSpan <c''-3> <e,-4 g-2> a,,\stopTextSpan \pestanaSpan "VI" <cis-1\5>\startTextSpan <ais''-1> <cis,-1 g'-4> cis,\stopTextSpan | + <d-0> <b''-1>8 <d,-1 g-2>16 r4 | + <e,,-1>16 <g'-4 b-3 cis-1>8 <g b cis>16 <d,-0> <c''-1 fis-3 b-4>8 <c fis a-1>16 | + } + \alternative { + { <b-2 d-1 g-1>8. <d-1\3>16\mordent <b-3\4> <d-1> <g-2> <b-1> | } + { <b,-2 d-1 g-1>\tenuto <bes-2 d-3>8 <bes d>16 <bes d> <bes ees-4>8 <bes d>16 | } + } + + \bar "||" + + <g-0>4 <b'-2 d-3 g-4> + + \bar "|." +} + +lower = \relative c' { + \globals + \set stringNumberOrientations = #'(down) + + \repeat volta 2 { + g,4. d8 | + a'4. d,8 | + } + + g8. r16 r4 | + \repeat volta 2 { + r16 <a-1> <g'-3> <c-4> d,,4 | + <g-0>8 <bes'-1 d-1> r4 | + <c,-1>2 | + + r16 <bes-2\6> <d'-1> <g-3> r4 | + r16 <d,,-0> <d'-0> <c'-1> r4 | + r16 <ees,,-1> <ees'-1> <a-2> r4 | + d,,2 | + + fis8. r16 r4 | + r16 <a-1> <g'-3> <c-4> d,,4 | + <g-0>8 <bes'-1 d-1> r4 | + <c,-1>2 | + + r16 <b-2\6> <f''-3> <g-1> r4 | + r2 | + d,4 d, | + r d | + } + \alternative { + { <g-0> r | } + { <g-0>4. d8 | } + } + + % part B + <a'-1>4 <g-0> | + <fis-3>4. <d-0>8 | + <g-0>4 <a-2>\glissando | + <b-2>4. <g-0>8 | + + <c-3>4 <bes-1> | + <a-1>4. <g-0>8 | + <fis-2>4\glissando <f-1>\glissando | + <e-1>\glissando <ees-1> | + + <d-0>4. d8 | + \slashedGrace cis'\glissando <e-1\5>4\glissando <ees-1> | + <d-0>4. d8 | + <d-1\5>4 <des-1> | + + <c-2>4. <bes-1>8 | + <ees-1>4 <d-0> | + <e-3\5> <a,-1\6> | + <d,-0> <g-0> | + + <c-1>4. c8 | + <d-0>4. d8 | + <e,-1>4 <fis-2> | + <g-0>8. r16 r4 | + + \bar "||" + + \repeat volta 2 { + <g-0>4 b' | + g,8. g16 gis8. gis16 | + a8. d16 e4 | + g,8. g16 g'8. g16 | + + fis8 a fis'4 | + ais,,8. ais16 b8. b16 | + cis8. cis16 d8. d16 | + e8. <e,-1>32( <eis-2>) fis8 e' | + + b4 <d, fis'-3> | + g8. g16 gis8. gis16 | + a4 r | + b' g, | + + \corda "4" a'8.\startTextSpan <gis-2>16 <b-3> <a-1>8\stopTextSpan \once \set stringNumberOrientations = #'(up) <e-3\5>16 | + a,8. a16 cis8. cis16 | + d4 \corda "5" <cis-1>16\startTextSpan <e-4> <d-2>\mordent <b-3>\stopTextSpan | + e,4 d | + } + \alternative { + { <g-0> b' | } + { <g,-0>4. <d-0>8 | } + } + + \bar "||" + + <g-0>4 <g-0 d'-0> + + \bar "|." +} + +staff = \new Staff << + \upper + \\ + \lower +>> + +\score { + \staff + \layout { } +} + +\score { + \unfoldRepeats \staff + \midi { } +} diff --git a/src/content/music/choro-da-saudade.ogg b/src/content/music/choro-da-saudade.ogg Binary files differnew file mode 100644 index 0000000..c6a89cf --- /dev/null +++ b/src/content/music/choro-da-saudade.ogg diff --git a/src/content/music/common.ly.include b/src/content/music/common.ly.include new file mode 100644 index 0000000..b6ba93a --- /dev/null +++ b/src/content/music/common.ly.include @@ -0,0 +1,15 @@ +copyright = \markup { + \with-url #"https://creativecommons.org/licenses/by-sa/4.0/" \line { + CC BY-SA 4.0 + } +} +tagline = \markup { + \with-url #"https://euandre.org/music.html" \line { + euandre.org/music.html + } +} + +rall = { + \override TextSpanner.bound-details.left.text = "rall." + \override TextSpanner.bound-details.right.text = "a tempo" +} diff --git a/src/content/music/dengoso.ly b/src/content/music/dengoso.ly new file mode 100644 index 0000000..b5a3fae --- /dev/null +++ b/src/content/music/dengoso.ly @@ -0,0 +1,310 @@ +\version "2.20.0" +\pointAndClickOff +#(ly:set-option 'embed-source-code #t) + +\include "common.ly.include" +\include "guitar.ly.include" + +\header { + title = "Dengoso" + composer = "João Pernambuco" + copyright = \copyright + tagline = \tagline +} + +globals = { + \clef "treble_8" + \key d \major + \time 2/4 + \set fingeringOrientations = #'(left) + \tempo Andante 4 = 100 +} + +upper = \relative c { + \globals + + r16 <d-0>8 <e-1>16 <fis-3> <e-1>8 <d-0>16 | + \corda "4" <a'-3>8.\startTextSpan a16 <g-1>8. g16 | + <fis-3>8. fis16 <f-2>8. <e-1>16\stopTextSpan | + r2 | + + r16 d8 e16 fis e8 d16 | + \corda "4" a'8.\startTextSpan a16 g8. g16 | + fis8. fis16 f8. e16\stopTextSpan | + r2 | + + <d'-2>8 \pestanaSpan "II" <fis,-3 a-1>\startTextSpan fis' d16\stopTextSpan <e-0>~ | + e2 | + d8 \pestanaSpan "II" <fis, a>\startTextSpan fis' d16\stopTextSpan e~ | + e2 | + + \repeat volta 2 { + \pestanaSpan "V" a16\startTextSpan <a,-3 d-4>8 <a d>16 r16 <g'-4>8 <fis-3>16 | + a16 <g,-1 cis-2>8 <g cis>16 r16 <cis-2> <fis-4> <cis-2>\stopTextSpan | + <a-1 e'-0>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + <b-0>16 <cis,-3 g'-4>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + <d'-2>16 <fis,-3 a-1>8 <fis a>16 <fis'-4>8 <a,-3 c-2> | + <e'-0>16 <a,-2 cis-3>8 <a cis>16 r16 <g-0> <cis-3> <e-0> | + <d gis d'>16 <d gis d'>8 <d gis d'>16 <d gis cis>8 <d gis b> | + <e'-4>16 <cis,-2 g'-3>8 <cis g'>16 <cis g' b\2>8 <cis-2 g'-3 a-1> | + + \pestanaSpan "V" a'16\startTextSpan <a, d>8 <a d>16 r16 <g'>8 <fis>16 | + a16 <g, cis>8 <g cis>16 r16 <cis> <fis> <cis>\stopTextSpan | + <a e'>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + <b>16 <cis, g'>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + d'16 <fis, a>8 <fis a>16 dis'8 <fis, a> | + <e'-0>8 <b-3 d-2>16 <ais-2 cis-1> <g b e> <d'-2>( <b-0>) <g-0> | + <fis-3> <d'-2> <a-1> <fis-3> <e-1> <cis'-2> <g-0> <e-1> + } + \alternative { + { d, \pestanaSpan "II" a''\startTextSpan d fis g fis g gis\stopTextSpan | } + { r4 \pestanaSingle "VII" <d fis d'> | } + } + + \repeat volta 2 { + \key d \minor + + <a-3>16 a <d-4 f-2> a a a <d f> a | + <g-3> g <bes-1 e-4> g g g <bes e> g | + <f-3> f <a-2 d-4> f f f <a d> f | + r <g-0 cis-2> <g cis> e' r <bes-3>( <a-2>) <g-0> | + + <fis-4> <c-3> <dis-1>( <fis-4>) <a-2> <fis-4> c' a | + <d-4> <bes-3>( <g-0>) <d-0> <g-0> <d-0> <bes'-3>( <g-0>) | + <gis-1> <d-0> <b'-9> <gis-1> <d'-4>( <b-0>) <f'-4\2>( <d-1>) | + <bes'-2>( <a-1>) <g-4> <f-2> <e-1> <d-3> <cis-2> <bes-4\4> | + + <a-3> a <d-4 f-2> a a a <d f> a | + <g-3> g <bes-1 e-4> g g g <bes e> g | + \pestanaSpan "III" f,\startTextSpan f <bes' d> f, f f <bes' d> f,\stopTextSpan | + \pestanaSpan "II" r\startTextSpan <a' cis> <a cis>( e')~ e4\stopTextSpan + + \pestanaSpan "III" <bes-1>16(\startTextSpan <c-4>) <d-1> <e-4> <f-4>\stopTextSpan <g-1> <a-3> <bes-4> | + <bes-4>( <a-3>) <gis-2> <a-3> <d-4>( <bes-1>) <g-3> <e-0> | + <f-1> <d-4> <a-2> <f-3> <e-1> <cis'-2> <g-0> <e-1> + } + \alternative { + { r <g-0> <gis-1> <a-2> r <bes-3> <a-2> <g-0> | } + { r4 \pestanaSingle "X" <f' a d> | } + } + + \key d \major + \pestanaSpan "V" a16\startTextSpan <a, d>8 <a d>16 r16 g'8 fis16 | + a16 <g, cis>8 <g cis>16 r16 cis fis cis\stopTextSpan | + <a e'>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + b16 <cis, g'>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + d'16 <fis, a>8 <fis a>16 fis'8 <a, c> | + e'16 <a, cis>8 <a cis>16 r16 g cis e | + <d gis d'>16 <d gis d'>8 <d gis d'>16 <d gis cis>8 <d gis b> | + e'16 <cis, g'>8 <cis g'>16 <cis g' b\2>8 <cis g' a> | + + \pestanaSpan "V" a'16\startTextSpan <a, d>8 <a d>16 r16 g'8 fis16 | + a16 <g, cis>8 <g cis>16 r16 cis fis cis\stopTextSpan | + <a e'>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + b16 <cis, g'>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + d'16 <fis, a>8 <fis a>16 dis'8 <fis, a> | + e'8 <b d>16 <ais cis> <g b e> d'( b) g | + fis d' a fis e cis' g e + r4 \pestanaSingle "VII" <d' fis d'> | + \bar "||" + + \key d \minor + <f-2>16 <a,-3 d-4>8 <a d>16 f'8 <a, d> | + <e'-4>16 <g,-3 bes-1>8 <g bes>16 <d'-4>8 <f,-3 a-2> | + <cis'-4>16 <e,-3 g-0>8 <e g>16 <f'-1>8 <g, cis> | + <e'-0>16 <g,-0 cis-4>8 <g cis>16 <d'-4>8 <f,-3 a-2> | + + <f'-2>16 <a,-3 d-4>8 <a d>16 f'8 <a, d> | + \pestanaSpan "V" <e'-1>16\startTextSpan <a,-3 c-1>8 <a c>16 a,8 <a' c> | + <a-3>16 <c-1> <a'-4> c,\stopTextSpan <aes-3> <b-1> <b'-4> b, | + \pestanaSpan "V" <a-3>\startTextSpan <c-1> <a'-1> c, a c a' c,\stopTextSpan | + + <f-2> <a,-3 d-4>8 <a d>16 f'8 <a, d> | + f'16 <a, d>8 <a d>16 <e'-1>8 <a,-3 cis-2> | + \pestanaSpan "III" <g'-1>16\startTextSpan <bes,-1 e-3>8 <bes e>16 g'8 <bes, e> | + g'16 <bes, e>8 <bes e>16\stopTextSpan \pestanaSpan "V" <a'-1>8\startTextSpan <c,-1 fis-3>\stopTextSpan | + + \pestanaSpan "V" <bes'-2>16\startTextSpan <d,-3 g-4>8 <d g>16 <d g> <a'-1>8 <g-4>16 | + <f-2> <a,-3 d-4>8 <a d>16 <a d> <e'-0>8 <d-4>16 | + <c-2>^"[#]" + <a-3>8 a16 a <f'-2>8 <e-1>16 | + <d-4> <a-3>8 a16 a a8 a16\stopTextSpan | + + \key d \major + \pestanaSpan "V" a'16\startTextSpan <a, d>8 <a d>16 r16 g'8 fis16 | + a16 <g, cis>8 <g cis>16 r16 cis fis cis\stopTextSpan | + <a e'>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + b16 <cis, g'>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + d'16 <fis, a>8 <fis a>16 fis'8 <a, c> | + e'16 <a, cis>8 <a cis>16 r16 g cis e | + <d gis d'>16 <d gis d'>8 <d gis d'>16 <d gis cis>8 <d gis b> | + e'16 <cis, g'>8 <cis g'>16 <cis g' b\2>8 <cis g' a> | + + \pestanaSpan "V" a'16\startTextSpan <a, d>8 <a d>16 r16 g'8 fis16 | + a16 <g, cis>8 <g cis>16 r16 cis fis cis\stopTextSpan | + <a e'>16 <a d>8 \pestanaSingle "II" <a cis>16 <a b>8 a | + b16 <cis, g'>8 <cis g'>16 \pestanaSpan "II" cis'8\startTextSpan <g a>\stopTextSpan | + + d'16 <fis, a>8 <fis a>16 dis'8 <fis, a> | + e'8 <b d>16 <ais cis> <g b e> d'( b) g | + fis d' a fis e cis' g e + r4 \pestanaSingle "VII" <d' fis d'> | + \bar "|." +} + +lower = \relative c { + \globals + \set stringNumberOrientations = #'(down) + + r2_\markup { \circle 6 = D } | + r8 a r a | + r8 a r a | + r16 <a-0>8 <b-1>16 <cis-3> <b-1>8 <a-0>16 | + + d16 r8. r4 + r8 a r a | + r8 a r a | + r16 a8 b16 cis b8 a16 | + + d,4. a''16 a,~ | + a a8 b16 cis b8 a16 + d,4. a''16 a,~ | + a a8 b16 cis b8 a16 | + + \repeat volta 2 { + d,4 dis' | + <e-3> g, | + <fis'-3>16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, dis | + <e-1> <ais-1> | + e' e | + a, r4 | + + d, <dis'-2> | + e g, | + fis'16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, fis | + <e-4>8 r8 r4 | + fis'8. fis16 e8. e16 | + } + \alternative { + { d,2 | } + { d8 a' d4 | } + } + + \repeat volta 2 { + \key d \minor + + a'16\4 a8 a16 a a8 a16 | + g\4 g8 g16 g g8 g16 | + f f8 f16 f f8 f16 | + e4 a, | + + r2 | + d8. r16 r4 | + r2 | + a2 | + + a'16 a8 a16 a a8 a16 | + g g8 g16 g g8 g16 | + f, f8 f16 f f8 f16 | + e4 r16 <e-1>( <f-2>) <fis-3> | + + g4 r4 | + d g' | + d8. f16 e8. e16 | + } + \alternative { + { d4 r | } + { d8 a d4 | } + } + + \key d \major + d,4 dis' | + <e> g, | + <fis'>16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, dis | + <e> <ais> | + e' e | + a, r4 | + + d, <dis'> | + e g, | + fis'16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, fis | + <e>8 r8 r4 | + fis'8. fis16 e8. e16 | + d,8 a' d4 | + + \key d \minor + d,4 d | + a' a | + a a | + a d, | + + d d | + a' a | + a' aes | + a a | + + d,, d | + d a' | + a a | + a d | + + <g-1> r | + d, r | + a'2 | + d, | + + \key d \major + d4 dis' | + e g, | + fis'16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, dis | + e ais | + e' e | + a, r4 | + + d, dis' | + e g, | + fis'16 fis8 fis16 fis8 fis | + e,4 cis' | + + d, fis | + e8 r8 r4 | + fis'8. fis16 e8. e16 | + d,8 a' d4 | + \bar "|." +} + +staff = \new Staff << + \upper + \\ + \lower +>> + +\score { + \staff + \layout { } +} + +\score { + \unfoldRepeats \staff + \midi { } +} diff --git a/src/content/music/dengoso.ogg b/src/content/music/dengoso.ogg Binary files differnew file mode 100644 index 0000000..8041487 --- /dev/null +++ b/src/content/music/dengoso.ogg diff --git a/src/content/music/guitar.ly.include b/src/content/music/guitar.ly.include new file mode 100644 index 0000000..5081dd9 --- /dev/null +++ b/src/content/music/guitar.ly.include @@ -0,0 +1,33 @@ + +pestanaPrivate = \markup { + \fontsize #-2 + \combine + \serif C + \translate #'(0.6 . -0.4) \draw-line #'(0 . 2.0) +} + +pestanaSingle = + #(define-music-function (fret-number music) (string? ly:music?) + #{ + $music ^\markup { \pestanaPrivate \fontsize #-2 $fret-number } + #}) + +pestanaSpan = + #(define-music-function (fret-number) (string?) + #{ + \once \override TextSpanner.font-shape = #'upright + \once \override TextSpanner.style = #'solid + \once \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER + \once \override TextSpanner.bound-details.right.text = \markup { \draw-line #'(0 . -.5) } + \once \override TextSpanner.bound-details.left.text = \markup { \pestanaPrivate \fontsize #-2 $fret-number } + #}) + +corda = + #(define-music-function (string-number) (string?) + #{ + \once \override TextSpanner.style = #'solid + \once \override TextSpanner.font-size = #-5 + \once \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER + \once \override TextSpanner.bound-details.right.text = \markup { \draw-line #'( 0 . -.5) } + \once \override TextSpanner.bound-details.left.text = \markup { \circle \number $string-number } + #}) diff --git a/src/content/music/marcha-dos-marinheiros.ly b/src/content/music/marcha-dos-marinheiros.ly new file mode 100644 index 0000000..48cc1c6 --- /dev/null +++ b/src/content/music/marcha-dos-marinheiros.ly @@ -0,0 +1,78 @@ +\version "2.20.0" +\pointAndClickOff +#(ly:set-option 'embed-source-code #t) + +\include "common.ly.include" +\include "guitar.ly.include" + +\header { + title = "Marcha dos Marinheiros" + composer = "Canhoto" + copyright = \copyright + tagline = \tagline +} + +globals = { + \clef "treble_8" + \key a \minor + \time 2/4 + \set fingeringOrientations = #'(left) + \tempo Adagio 4 = 70 +} + +upper = \relative c { + \globals +} + +lower = \relative c { + \globals + \set stringNumberOrientations = #'(down) + + d4~ d16 <b-2> <c-3> <d-0> | + <e-2>4~ e16 <a,-0> <b-2> <c-3> | + d4~ d16 <gis,-4> <a-0> <b-2> | + <c-4>4 a8 e | + + d'4~ d16 <b-2> <c-3> <d-0> | + <e-2>4~ e16 e <d-0> <c-4> | + <e-2>8 <d-0> <c-4> <b-2> | + a4~ a16 e' ees d | + + \repeat volta 2 { + \mark \markup { \musicglyph #"scripts.segno" } + <c-4>4 <b-2>8 <e,-0> | + <a-0>4~ a16 <a'-2> <aes-1> <g-0> | + <f-3>4 <e-1>8 <a,-0> || + <d-0>4~ d16 d e f | + + d'8 c b a | + } + \alternative { + { + gis4~ gis16 d e f | + e8 d c b | + a4~ a16 e' ees d | + } + { + c'8 b a f | + e d c b | + a2 | + } + } +} + +staff = \new Staff << + \upper + \\ + \lower +>> + +\score { + \staff + \layout { } +} + +\score { + \unfoldRepeats \staff + \midi { } +} diff --git a/src/content/music/marcha-dos-marinheiros.ogg b/src/content/music/marcha-dos-marinheiros.ogg Binary files differnew file mode 100644 index 0000000..c07dabe --- /dev/null +++ b/src/content/music/marcha-dos-marinheiros.ogg diff --git a/src/content/pt/blog/categorias.adoc b/src/content/pt/blog/categorias.adoc new file mode 100644 index 0000000..19e7cb7 --- /dev/null +++ b/src/content/pt/blog/categorias.adoc @@ -0,0 +1,6 @@ += Artigos por categoria +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/pt/blog/index.adoc b/src/content/pt/blog/index.adoc new file mode 100644 index 0000000..ec9c676 --- /dev/null +++ b/src/content/pt/blog/index.adoc @@ -0,0 +1,5 @@ += Blog + + + +// Generated from po4a(1). diff --git a/src/content/pt/eslaides/categorias.adoc b/src/content/pt/eslaides/categorias.adoc new file mode 100644 index 0000000..19e7cb7 --- /dev/null +++ b/src/content/pt/eslaides/categorias.adoc @@ -0,0 +1,6 @@ += Artigos por categoria +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/pt/eslaides/index.adoc b/src/content/pt/eslaides/index.adoc new file mode 100644 index 0000000..4e22115 --- /dev/null +++ b/src/content/pt/eslaides/index.adoc @@ -0,0 +1,7 @@ += Eslaides + +Apresentações renderizadas em PDF: nenhum navegador é necessário para lê-las, e nenhum framework de apresentação em JavaScript para carregar junto. + + + +// Generated from po4a(1). diff --git a/src/content/pt/index.adoc b/src/content/pt/index.adoc new file mode 100644 index 0000000..e11d16b --- /dev/null +++ b/src/content/pt/index.adoc @@ -0,0 +1,7 @@ += Início + +O mais recente de cada coleção está abaixo. + + + +// Generated from po4a(1). diff --git a/src/content/pt/musica.adoc b/src/content/pt/musica.adoc new file mode 100644 index 0000000..5ebffeb --- /dev/null +++ b/src/content/pt/musica.adoc @@ -0,0 +1,36 @@ += Música +:dengoso: ../music/dengoso +:marcha: ../music/marcha-dos-marinheiros +:choro: ../music/choro-da-saudade + +Partituras que eu gravei, cada uma com uma execução sintetizada. Os fontes em LilyPond estão no repositório; os PDFs são gerados a partir deles. + +== Partituras + +João Pernambuco, link:{dengoso}.pdf[Dengoso] + +++++ +<audio controls> + <source src="../music/dengoso.ogg" type="audio/ogg" /> +</audio> +++++ + +Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros] + +++++ +<audio controls> + <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" /> +</audio> +++++ + +Agustín Barrios, link:{choro}.pdf[Choro da Saudade] + +++++ +<audio controls> + <source src="../music/choro-da-saudade.ogg" type="audio/ogg" /> +</audio> +++++ + + + +// Generated from po4a(1). diff --git a/src/content/pt/pastebin/categorias.adoc b/src/content/pt/pastebin/categorias.adoc new file mode 100644 index 0000000..19e7cb7 --- /dev/null +++ b/src/content/pt/pastebin/categorias.adoc @@ -0,0 +1,6 @@ += Artigos por categoria +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/pt/pastebin/index.adoc b/src/content/pt/pastebin/index.adoc new file mode 100644 index 0000000..59cb93e --- /dev/null +++ b/src/content/pt/pastebin/index.adoc @@ -0,0 +1,5 @@ += Pastebins + + + +// Generated from po4a(1). diff --git a/src/content/pt/podcast/categorias.adoc b/src/content/pt/podcast/categorias.adoc new file mode 100644 index 0000000..19e7cb7 --- /dev/null +++ b/src/content/pt/podcast/categorias.adoc @@ -0,0 +1,6 @@ += Artigos por categoria +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/pt/podcast/index.adoc b/src/content/pt/podcast/index.adoc new file mode 100644 index 0000000..6e84602 --- /dev/null +++ b/src/content/pt/podcast/index.adoc @@ -0,0 +1,5 @@ += Podcast + + + +// Generated from po4a(1). diff --git a/src/content/pt/screencast/categorias.adoc b/src/content/pt/screencast/categorias.adoc new file mode 100644 index 0000000..19e7cb7 --- /dev/null +++ b/src/content/pt/screencast/categorias.adoc @@ -0,0 +1,6 @@ += Artigos por categoria +:type: categories + + + +// Generated from po4a(1). diff --git a/src/content/pt/screencast/index.adoc b/src/content/pt/screencast/index.adoc new file mode 100644 index 0000000..930c244 --- /dev/null +++ b/src/content/pt/screencast/index.adoc @@ -0,0 +1,5 @@ += Screencasts + + + +// Generated from po4a(1). diff --git a/src/content/pt/sobre.adoc b/src/content/pt/sobre.adoc index 2d7ad20..61ed4ea 100644 --- a/src/content/pt/sobre.adoc +++ b/src/content/pt/sobre.adoc @@ -2,10 +2,24 @@ :mailto: mailto:~euandreh/public-inbox@lists.sr.ht :archive: https://lists.sr.ht/~euandreh/public-inbox +:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html +:swift2nix: ../en/blog/2020/10/05/swift2nix.html +:database: ../en/blog/2020/08/31/database-i-wish-i-had.html +:fallible: ../en/blog/2021/02/17/fallible.html +:flags: ../en/blog/2020/10/19/feature-flags.html +:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html +:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html +:bugtracker: ../en/blog/2020/11/07/diy-bugs.html -Oi, eu sou EuAndreh. Eu escrevo software e, ocasionalmente, música. Você encontra meu dados para entrar em contato no rodapé desta página, ou pode mandar também uma mensagem para minha {mailto}[caixa de entrada pública] ({archive}[arquivo]). +Oi, eu sou EuAndreh -- André Miranda Moreira. Eu escrevo software e ocasionalmente música. Você encontra dados para me contatar no rodapé desta página, ou pode mandar também uma mensagem para minha {mailto}[caixa de entrada pública] ({archive}[arquivo]). -Esse é o meu site pessoal onde eu escrevo artigos, publico software e outros trabalhos relacionados. +Esse é o meu site pessoal onde eu escrevo artigos, público software e outros trabalhos relacionados. + +I write about robust software: the kind that still works after the network drops, after the vendor leaves, and after you stop paying attention. + +That shows up in a few places. I care about reproducible systems, so I run a link:{stateless}[stateless NixOS workstation] and have written bridges like link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and Swift first-class citizens inside Nix builds. I care about durable data, which is why I keep returning to local-first software, persistent data structures, and link:{database}[the database I wish existed]: embedded, immutable, and syncable. And I care about tools that don't need a company behind them, so I reach for Git, email and plain text before I reach for a service -- far enough that link:{bugtracker}[my bug tracker is a directory]. + +I also think about how teams ship -- fault injection (link:{fallible}[fallible]), link:{flags}[feature flags], and link:{interviewing}[how we interview engineers] -- because robustness is a team habit before it is a technology. diff --git a/src/content/public.asc.txt b/src/content/public.asc.txt index d548547..2519d0f 100644 --- a/src/content/public.asc.txt +++ b/src/content/public.asc.txt @@ -11,45 +11,45 @@ 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 @@ -95,5 +95,5 @@ T0PAbuproAk2TXn8NDzsFJP6ERM+3c1ARNiwZ8wCjiNChxX5cEh4ciNltkQ54ZF/ rN/8i+o7WAE9xdIdVHZg0H+WPWa/lOs5yfsSXES3Y7wxOR8chW038/y82TECk7LP +dZyFKJ26VSvqPHxMqmji/UJjOB+K5xaaCflnzsKzsaEf5fRCIrCp6ldIXh0/x0s pqsEJPXPOb40oBnNzLOSv9X++wKq+oXWEX8OSqhr -=bNun +=mG9H -----END PGP PUBLIC KEY BLOCK----- diff --git a/src/content/style.css b/src/content/style.css index dbd7967..6fad5bf 100644 --- a/src/content/style.css +++ b/src/content/style.css @@ -1,41 +1,90 @@ :root { - --color-fg: black; - --color-bg: white; - --color-2nd-fg: #555555; - --color-2nd-bg: #f5f5f5; - --color-pre-border: hsla(0, 100%, 0%, 30%); + --color-fg: #171D1A; + --color-bg: #F3F5F3; + --color-2nd-fg: #4A5651; + --color-2nd-bg: #E9EDEA; + --color-3rd-fg: #6F7B76; + --color-line: #CBD3CE; + --color-line-soft: #DDE3DF; + --color-accent: #1F6F5B; + --color-accent-soft: #D8E9E2; + --color-ochre: #9A6B1F; + --color-code-bg: #E6EBE8; + --color-pre-border: #CBD3CE; --link-url: url(img/link/light.svg); + /* The generic families and nothing else: a named face is a + dependency that is either installed or silently is not, and + the ones worth naming here are Windows and macOS fonts that + are absent on the systems this site is built for. The reader + has already chosen these three; the hierarchy is in which of + them is used where, not in which face answers. */ + --font-body: sans-serif; + --font-display: serif; + --font-mono: monospace; + color: var(--color-fg); background-color: var(--color-bg); } @media (prefers-color-scheme: dark) { :root { - --color-fg: white; - --color-bg: black; - --color-2nd-fg: #aaaaaa; - --color-2nd-bg: #222222; - --color-pre-border: hsla(50, 100%, 70%, 10%); + --color-fg: #E4EAE7; + --color-bg: #121716; + --color-2nd-fg: #A7B3AE; + --color-2nd-bg: #19201E; + --color-3rd-fg: #7E8A85; + --color-line: #2C3733; + --color-line-soft: #222B28; + --color-accent: #5CC2A2; + --color-accent-soft: #1B3A31; + --color-ochre: #D9A85A; + --color-code-bg: #1C2522; + --color-pre-border: #2C3733; --link-url: url(img/link/dark.svg); } +} - a { - color: hsl(211, 100%, 60%); - &:visited { - color: hsl(242, 100%, 80%); - } - } +a { + color: var(--color-accent); +} + +a:visited { + color: var(--color-accent); } + /* General declarations */ body { margin: 0px auto; padding: 1%; - max-width: 750px; + max-width: 68ch; + font-family: var(--font-body); + font-size: 17px; + line-height: 1.6; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-display); + font-weight: 500; + line-height: 1.2; + text-wrap: balance; +} + +h1 { font-size: 39px; } +h2 { font-size: 31px; } +h3 { font-size: 25px; } +h4, h5, h6 { font-size: 20px; } + +code, pre, .mono { + font-family: var(--font-mono); +} + +code { + background-color: var(--color-code-bg); } .icon { @@ -52,28 +101,106 @@ header { padding: 12px 0px 12px 0px; } -nav .nav-row { +/* The home link is the logo. It shares the row with the rest of + the navigation rather than sitting on a line above it, so the + nav and its list are both rows and everything centres on the + same line. */ +nav, nav ol { display: flex; flex-direction: row; - justify-content: space-between; flex-wrap: wrap; + align-items: center; } +nav ol { + list-style: none; + margin: 0px; + padding: 0px; +} + + nav a { font-size: 18px; margin: 12px; text-decoration: none; } -nav ul, nav li { - display: inline; +/* Twice the logo's own 16-unit grid, so every square it is drawn + from lands on whole pixels. */ +nav a img { + width: 32px; + height: 32px; +} + +/* The languages are a second tier of navigation, not more of the + first: smaller, and away to the end of the row. The one being + read is not a link, so it is dimmed to say so. */ +nav ol.languages { + margin-left: auto; } -nav ul li a { +nav ol.languages a, nav ol.languages li { + font-family: var(--font-mono); font-size: 14px; margin: 6px; } +/* The language being read is the one worth seeing, so it is the + only one at full strength. Whether one of the others has been + followed before says nothing about where it goes, so visited + and unvisited look alike. */ +nav ol.languages li { + color: var(--color-fg); +} + +nav ol.languages a, +nav ol.languages a:visited { + color: var(--color-2nd-fg); +} + +nav ol.languages a:hover { + color: var(--color-fg); +} + + +/* A collection's name on the front page heads the list under it + rather than inviting a click, so it is set as a heading and only + says it is a link when pointed at. */ +h2.collection a { + color: var(--color-fg); + text-decoration: none; +} + +h2.collection a:hover { + text-decoration: underline; +} + + +/* What the site says about itself, under the navigation on every + page --- the header's counterpart to the licence line at the + foot of it. */ +#tagline { + margin: 0px 12px 6px 12px; + font-size: 14px; + color: var(--color-2nd-fg); +} + + +/* A published recording */ + +#media video, #media audio { + width: 100%; + max-width: 100%; +} + +/* Both ways down are filenames, which want the same face as any + other filename does. */ +#media-links { + font-family: var(--font-mono); + font-size: 14px; + color: var(--color-2nd-fg); +} + /* Article bodies */ @@ -138,7 +265,7 @@ pre.lineno { border: 1px solid; border-color: var(--color-pre-border); border-radius: 10px; - background-color: var(--color-2nd-bg); + background-color: var(--color-code-bg); } pre { @@ -192,7 +319,7 @@ div.header-anchor:hover img { .plaintext { margin: auto auto 0 auto; text-align: right; - font-family: monospace; + font-family: var(--font-mono); } a.anchor { @@ -212,3 +339,57 @@ h2:hover a.anchor { .line-through { text-decoration: line-through; } + + +/* Messages from the mailing list, rendered on the page they + answer. They take the secondary background so a thread reads as + something quoted onto the page rather than as more of the page, + which is the one thing the archive's own rendering makes obvious + at a glance. */ +#comments .message { + background-color: var(--color-2nd-bg); + border: 1px solid; + border-color: var(--color-pre-border); + border-radius: 10px; + padding: 0.5rem 1rem; + margin-bottom: 1rem; +} + +/* A reply sits under what it answers. The depth is capped because + a long exchange nests further than a narrow screen has room for, + and past a few levels the indentation stops telling you anything + the order does not. */ +#comments .message[data-depth="1"] { margin-left: 1rem; } +#comments .message[data-depth="2"] { margin-left: 2rem; } +#comments .message[data-depth="3"] { margin-left: 3rem; } +#comments .message[data-depth="4"] { margin-left: 4rem; } +#comments .message:not([data-depth="0"]):not([data-depth="1"]):not([data-depth="2"]):not([data-depth="3"]):not([data-depth="4"]) { + margin-left: 5rem; +} + +#comments .message-header { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0 1rem; + font-size: 0.9em; +} + +#comments .from { + font-weight: bold; +} + +#comments .date, #comments .reply { + color: var(--color-2nd-fg); +} + +#comments .message-body { + background-color: transparent; + border: none; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +@media (max-width: 40rem) { + #comments .message[data-depth] { margin-left: 0; } +} |
