This commit is contained in:
Wojciech Kwolek 2021-09-12 18:48:01 +02:00
commit c54d42b259
25 changed files with 770 additions and 0 deletions

6
archetypes/default.md Normal file
View File

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

4
config.toml Normal file
View File

@ -0,0 +1,4 @@
baseURL = 'http://example.org/'
languageCode = 'en-us'
title = 'Wojciech Kwolek'
theme = "kwolek"

View File

@ -0,0 +1,32 @@
---
title: "A Duolingo helper to avoid skipping through corrections."
date: 2020-09-23T17:24:45+02:00
draft: false
---
I tend to go through [Duolingo](https://duolingo.com) lessons quite fast (if you do not know what Duolingo is, I recommend checking it out - it is quite a fun way to learn languages, and for free.)
This results in me usually typing in the sentences at my 80 WPM (well, the average is probaly less, but I'm trying to train it to be more consistent), then quickly smashing Enter twice to first submit the sentence, and then accept the "Correct!" message.
Sometimes, however, I make a mistake, and would like to read the correction before advancing further. Unfortunately, my monkey brain got trained to mash the Enter key twice to go as fast as possible to the next lessons. Aaand then I decided to fix that with my computer-y powers.
<!--more-->
## Solution
[A Tampermonkey script.](/content/duolingo-tampermonkey.js)
It is a simple userscript for Tampermonkey, which catches all the Enter keypresses, and works as follows:
* If you did the exercise correctly, the second enter gets you to the next one.
* If you made a mistake, the second Enter keypress is ignored, you can read the correction, and then press Enter again to advance.
## Installation
To install it you need to get the [Tampermonkey extension](https://www.tampermonkey.net), click on its icon, go to "Dashboard", then "Utilities", and you can paste the URL from below in the "Install from URL" field.
```
https://irth.pl/content/duolingo-tampermonkey.js
```
Enjoy!

View File

@ -0,0 +1,23 @@
---
title: "Reverse pomodoro."
date: 2021-01-09T17:32:00+02:00
draft: false
---
Hello 2021.
I am an university student. I don't think I like being one, and around two weeks before the christmas break my brain decided to literally stop all the productivity. Couldn't even get myself to check what I am supposed to be doing/learning.
This continued well into the christmas break, and only after the New Year's I came across a tweet that helped me break out of this productivity sinkhole loop, and I'd like to share it here because I'd be in much more trouble at uni if I didn't encounter this.
<!--more-->
{{< tweet 1344018455347953665 >}}
Go read her thread about this. It's just a few tweets, do so.
The basic idea, however, is that you do pomodoro, but in reverse - do 5 minutes of work and 25 minutes of fun (or even much more!).
The reasoning is, even 5 minutes is so so so much better than doing literally nothing. And the fun is actually fun, because you don't have hate yourself for being unproductive because it's part of the technique.
{{< tweet 1344018462973181956 >}}
Good luck. YMMV.

14
content/projects/Blag.md Normal file
View File

@ -0,0 +1,14 @@
---
title: "Blag"
date: 2021-09-12T18:02:10+02:00
draft: false
---
A static site (blog) generator written in Go, with optional Disqus and Google Analytics support.
<!--more-->
[View on Github](https://github.com/irth/blag)
![XKCD 148](https://imgs.xkcd.com/comics/mispronouncing.png)
[Source: XKCD](https://xkcd.com/148)

View File

@ -0,0 +1,13 @@
---
title: "DoneTh.at"
date: 2021-09-12T18:06:12+02:00
draft: false
projectName: donethat
---
[https://doneth.at](DoneTh.at) is a simple web app Flask that allows you to track your productivity more objectively, by keeping track of your accomplishments.
It allows the user to assign points based on task difficulty, keep a daily goal and view statistics.
<!--more-->
Git instance hosting the app is temporarily down.

View File

@ -0,0 +1,10 @@
---
title: "GopherNews"
date: 2021-09-12T17:59:35+02:00
draft: false
---
A proxy that allows you to browse Hacker News using your favourite Gopher client, written in Go.
<!--more-->
[View on Github](https://github.com/irth/gophernews)

View File

@ -0,0 +1,16 @@
---
title: "Together for Spotify"
date: 2021-09-12T18:04:46+02:00
draft: false
---
A web app that allows two Spotify users to log in and find the cross section of their music libraries. It is then stored as a playlist, to which they can listen together.
* Ruby on Rails 5
* Tailwind.css
* Vue.js
* Capistrano
<!--more-->
(Temporarily offline)
[View on Github](https://github.com/irth/together)

6
content/top/about-me.md Normal file
View File

@ -0,0 +1,6 @@
---
title: "About me"
date: 2021-09-12T17:12:35+02:00
draft: false
---
Hi! My&nbsp;name is Wojciech Kwolek, I&nbsp;am from Poland. I&nbsp;like coding, creating things, usually while listening to music. I&nbsp;sometimes roller-blade or ski.

View File

@ -0,0 +1,70 @@
---
title: "DoneTh.at: the why and the future."
date: 2020-09-22T17:15:30+02:00
draft: false
project: donethat
---
As some of you might know (because it is on my main website), I have recently built DoneTh.at:
[https://doneth.at](https://doneth.at)
The reasoning behind the project is that I noticed that I often feel like I waste my time a lot or am unproductive everyday. Even though that is true sometimes, usually it's just that I quickly forget what I accomplished during the day, and unless I have been working on something all day, I feel like I didn't do much.
<!--more-->
So, I made a simple website that allows me to track what I accomplished each day. Each accomplishement has a difficulty value assigned, which allows me to compare days, have daily goals and draw graphs.
Originally, it was supposed to be an app that takes your TODOs from CalDAV or other services and draws a Github style activity graph based on how many tasks you complete. However, this had a few issues:
* CalDAV is a PITA to work with.
* CalDAV doesn't support hand written TODOs, which I'll switch to once I get my reMarkable 2.
* You need to plan for each task ahead of time, no easy way to get points for something done without planning.
* Lot's of edge cases when syncing.
Eventually, I came up with a cool domain name (DoneTh.at) and at that moment I decided to ditch the CalDAV sync idea and implement DoneTh.at instead.
## Future plans
### Storing dates for the accomplishements and day-start-hour customisation
First, I need to refactor the code to use dates without time, because time has timezones and I do not want to handle this.
The only point where actual time will be handled is when creating an accomplishement and then I'd like it to be as simple as possible:
* Get the time in the user's configured timezone.
* Get just the date from that timestamp, without hours.
* Check what hour the user considers "start-of-day".
* If the time is before, set the day to the day before.
* Otherwise, set it to the day from the timestamp.
Once the timezone and start-of-day hour is considered, the resulting day is saved in the database and I don't have to worry about the user changing the timezone or the hour later, as it won't affect historical data.
This also solves a problem where I didn't know what timestamp to associate with accomplishements created from the edit view, for previous days. I do not want to ask the user for the exact time, as they might not know it, and I want the UX to be uncluttered.
Allowing customising the hour that is considered the beginning of a new day would be useful for me and I'm sure for many others who also often do stuff in the night and go to sleep at 3 or 4 AM. The credit for the idea goes to the authors/contributors of GTimeLog which I got the idea from.
[GTimeLog - a very nice open-source time tracker.](https://gtimelog.org)
### Quests
Quests are kind of like TODOs - they are accomplishements, with associated difficulty, which you haven't done yet. You can add quests when you know you need to do something, and then when you eventually do it, just mark it as done and it is saved as an accomplishement.
I plan of adding two types of quests - one-off and recurring. One-off quests are ordinary TODOs, recurring quests are for stuff like "Practice Dutch" which you need to do every day.
I need to figure out how to add it without sacrificing the simplicity DoneTh.at currently has.
### Daily goal
Allow to set a daily goal, and then the app would track your streak and show you how much you need to do to reach the goal.
### Activity graph
Github style activity graph, but based on how much of the daily goal you did.
(The daily target would be, I guess, around 50% color value, as ideally you would reach it every day, and having the graph clipped at that value would result in a kinda boring graph.)
### Categories and advanced input parsing
Categories based on #hashtags in the accomplishement text. I also want to support changing the difficulty by writting stuff like "+30" in the input field.
### API
For apps and stuff.
Currently DoneTh.at is 100% server-side rendered and works without JavaScript (it even mostly works with Lynx, except that it doesn't refresh after submitting forms, I'll need to fix that), and I think I want to keep it that way, but I'll see if I can extend it easily to support bearer token auth and JSON in requests and responses.

3
deploy.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
hugo && rsync -avz --delete public/ zlomek.irth.pl:/srv/http/homepage/

135
static/public-key.gpg Normal file
View File

@ -0,0 +1,135 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBF+QoB4BEAC9fvKTOWHKOJ6JHQMPtm2GcaEd4OY1NOe9uaH7/pt/9DDFNlDi
XQztV74lHZnOhbulT5oprtIWXGL5jNMAButYSP3CLFmjhGIB/h6Vykx9eKqXnaHx
EOh1xuoYqw86X0qwJ73eBDwtpfDi3lniBv5/P/d+fr02T1ybIdXYC59MUOXenvcN
KjZeaJqWlbQYbHZQs1XdQ36Osp7ssI+k4dTf/r3X0HIGx2199gaAup+giqtq/n9I
qgA/om7rfJ83PK5RXyjrntA2t6Z2fYGjNKhHBT2xUwcQ7zYGOXgMuU7LRfZi9fxN
de6P3AQKkfV8Gg1bFjo5FBjvupN0/0eL6HbGquUe6hyXrgbOz4qL0GR/JIBXkssu
/sOZHPeaPl5lkUz6aZd+ezraURrbG3LLMqro5nt9mWiD7zaf7Ky2tBkcQM+5kEDN
qBDZyAQxYZUoPC/kRG/sORkR8uIjhU7EcQE6+RPKuXCjBA6wYZ+KmS3HRC25CLVI
Wu2kByJ733mUT2vqUddWPvFMnKlRSmCpIkhTvVNBvePGcvlgyL9uHLoZsB9ewsXm
jyRdD1WTinJEwcXYwORC7ogDJ+ErYh5NsoNuapvOXvBHc59oglNrMM1zzg7k7YiA
Yf0nACA3NF2LA3M5uhKfxkGIK3kPuk/tAqkoYWtpzv9j3GO5eZeiHV+mOwARAQAB
tCxXb2pjaWVjaCBLd29sZWsgPHdvamNpZWNoLmt3b2xla0Bwd3IuZWR1LnBsPokC
TgQTAQgAOBYhBG3TE4D7x9t4jm78Qkyok7cjt+1bBQJfkKCjAhsDBQsJCAcCBhUK
CQgLAgQWAgMBAh4BAheAAAoJEEyok7cjt+1bAA8P/jvz8PWHBd2Ar0LR6c0+fTPc
RyCzFrxtg3hdgJqeSr3wHk1hzaDWImMzvP39eBXUwP8qWgg3dZWhHz7F4vBklOMN
0nH//e7MpxjIX/8SGRGXqJj7eejlE8vLL+YkY2cQVDrgAPoOpWRWUca0spCO3e+v
MCHb9NK0QwUKR8XRdSKIXEALBWEHh+VQv7hEimJF8pstkAQcilYtTQqttnJ8RULA
rLevRvbRyJwAcaYCwedzfXnr0kCa5LpT7o5/rB4RnOEKeNHAHjhBPNpYLO7INWSh
c28xH8FvS/EVrsZFVBvnJ1O7YcWmPjpDtUSAHhGWN75JB/3RgTMbO8Or4ioQyTid
fj/cvrHC8Kvtmfud2Bn9CgU5GyvEKwXdbmwfzAFFz+QLj8QTiaoe14faQeawf4In
KofvTey3/puXtdP6FSoJbiXv3X57XD4kWuQZnm5r8dVMxte622DebDvN4zMrYJ89
NvwAfJQAcLx8pL7NOFpvsRfNu1l6H/syLZZ4ZY6lNamHXxWWvQpi0zroBEMVyLaR
8IBTDsE+QY+orjchGUq0I493ccUVnEqeLh7ALFEbZXd2UHSbTXIJmOpIN/YLBvtj
Uo8l9QVC03p4oc23q3mTjm9n/HCwiZh+EpkLpHAfsL5WRUKj103ndyMEtiDEBb0G
cc4G+o0r8IhlTZ9VBfSptBxXb2pjaWVjaCBLd29sZWsgPG1lQGlydGgucGw+iQJO
BBMBCAA4FiEEbdMTgPvH23iObvxCTKiTtyO37VsFAl+QoB4CGwMFCwkIBwIGFQoJ
CAsCBBYCAwECHgECF4AACgkQTKiTtyO37Vs20Q//QUwK7kl0E+XzJ7v+EDu7+pTN
Rhu5gEaa/oDJXS7KNfxtRbRb22gOMirwn2gP1kmc7I3aF2ZZ4Uf3HEt3aYihWohr
kFD/ihS4/vy6fWbgJCkcyXik+FEkHuzmrmdnwwgQKQYGwfdnw6Y6I7ta/mA0d0nt
JYyEHow6KzoSSnNEWOOL2lj0gFI0xXOQFCmaAOg3SKjqtMMb43AqlyD7fkjGn5as
ZvmGv5eZk5neNA+XHJcEfAGyJcLTjW/Fj9jmIjy8IJgJDKAWpUSOD7zo0xcbziEW
LxmmcJLBpiz1dk412NF7eW00JeCs7KeYTKzdtCNEtF4MNRkV2H4B7b1BNn4N6W1V
Yg+s2auSKif/n/C7FZemvzPcTEXZzuN0qwtCb9+wdB/csPposUPJJZ5JDzPMina2
vtTrPC8i6Lmi8+LPqFIIcXXhXg/D38XwDiqIWqWAhHBtcR87b7EHrpACSBZGQNjM
dVrU6T8A2aawokvbmNCVEcPjB9UBagYl650T9ou1usQn/FzyucrQ+2X3ExYjNfax
04C4YB5ZNAzztpdWl8GlmHua07QBrCDBVkBRUOMc+2Fa90V8hMCKNgv5J+itueDa
yFCRt4eSMxXRE6Qc+7Cs3QmJY3HNQT4Swgrttr7gfA2rMLdw5GXU/TG3jELKhzWT
yPYiy292Gf20XrgJbeO0JVdvamNpZWNoIEt3b2xlayA8d29qY2llY2hAa3dvbGVr
Lnh5ej6JAk4EEwEIADgWIQRt0xOA+8fbeI5u/EJMqJO3I7ftWwUCX5CghAIbAwUL
CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBMqJO3I7ftW6YHEACY809RtdYfFqd/
Odl5Jw4ASNTeX47OI5f2fniiS1piDmJXAmcSe/EJepLAU5Q/wPFnxBDbk2FZoS+l
IzntqXlbOIUVEVqFzdt/v3nVbFy7Ughi/5hQjmQnYGiyJ+FnxHQcvypT4Py8iv+A
jqlLBegvzRCIZ5yvRlOal85qxrcVkeepiUzvuGO+3QS21i7QjprSVeg1VBjlTAA0
ruCInZoQrSWiNL+49sABl3BOthEmQ5KKF7qFr08cVt4i0jcWD09ADK0usnT4tfAW
KBF7tYfJhuDTWnVC597SWMYgt0T6Rb4+fG3OmJDbbNhDJGxMAwfjaq38vuXEMQsM
oKzv6qdgTxsek/Gd5R1hAYr8Tue9lxPax8/a377TPw4i5YpuwCuFtFNR4eAeQtBm
3JAnzI2rECuIFizPbYQ0Jy4jwNjEi0qbXckct0D0kaBqFFd4YuxZVezAGsnvE0vM
N1aBE2ehC+Ag0UbcFqi9v81KgkIzSPY9HfcO8j0/33JK4c167SgDM1xEO2nmlCPL
LhEss1dZoBsXV0amiClHeqB0JV3DB4WdqX+q8NYz/n/JWALjU3aIQGgV2a7P3lRI
xFBE8BPJMoiv5QVes2JwCU+u7iIQexMqjcWxdCS372wAZ6onVMKrbwVTiuSOlcfO
X6iLD2kOXwvrYiaP9QbK44ixan7KH7kCDQRfkKAeARAAzY51K57vM9FShCHtoKud
ZU3ce9+BG4wr4P7jgY1JKlQ4+71NLRZu/bdxhOu9YCxFYp2jqq5SiKIthzsw1HT2
zIMG/mfwZOw8gA/ushBklKCBziia3SC4D1RyekOdYg95EByzgkmBzqxPD5aKAcP/
7j69qBV9IFCU//AG8u6rVzFi3EIZ6XvBWfg1K1C5jB4F1IeZNKMVgthQ1IZYyGZf
IJxJGi2VVZXVO2+ACz/dM11LeuX+dq8sXfSJRFjev5HoA005/bq0hRY9Y2BI3F2+
nT8me1ij+ThLi3rO8ilTP4LZurIs3c8MQujCyVHNzjc0kXtSh0pXBJhMaV1j2kxW
18urhy7hlnl44K3Y2kQUaEvDnc6A5JlLl5xTXXWBy1AV3UopfgwHdYhuuvc22JjS
SWGqd04fZGLxO3IKndNEgwLZMjoR6yFu8QiyUT8R8J6ldqWGCv5mOhOFnm59yFVZ
P/SzwKh3K3xZ/KpB9iberXXQAMvmPI8qbNcjsO1IyZyRtCQmxJcopU+dglr9H/EY
jQcIzEdAVygT3pWq8oiWUXYsXmZwii0eybXFEjM3HLt6VOvaxg/Eu097l9KqcFWU
dYT5rSGsXMpwgyrxNmcUjaGmHKJnJYNE8S7CXUI7HSjwsKYQOaFMyZVGeAJC45+N
g9PymSW5L0FuO2y1Djj5F7EAEQEAAYkCNgQYAQgAIBYhBG3TE4D7x9t4jm78Qkyo
k7cjt+1bBQJfkKAeAhsMAAoJEEyok7cjt+1b7pQP/RTXGEGYkkxaThSMXTFRlWR6
3uA8i3gto6FLS7hvXmEPMa0jjwZcHu0DQBS4A/1p2iDkSjTOxUw6fXmui12+b41N
Q6JXou9LWYZKLSdq6wELYVfQ+lQKy8ha5C9uOF5LI2Obv/245+llRflCxFVvISlc
ekvN3+mvevrlZgbU815VBlcCVbGs0aqegR77Bl8JSuW7j5rL9Kwund0LTzhfmoRU
JykMDh8e9NrwrzP0GyqNB96zY8XONRjNbbMJlRF6HhcOyny+Jistfu4huhOggsj3
WHNnRf5JIKzfdioc8BTjUPbcqLpWOsyYisNuLncYjtPX4Jo77Myk1DLsfgoTTVd8
eKvXwUDFMYC3cLNUEX7Ci6cL16KlZ+1cYWF6iO6O2MEobxdvgSJR5pMIHk6XTWcl
C86v6cspjmCSixTzZKh4fzvWQRgYap9JvQvwFNMhs4peA+M9uJ88n+8erLM2tMHa
WP/nX8iArEpD0aMzdL2iDo3JsnfABDgqu5Ra//R3HJRQUs+nFwNGMj8rEi8aJjhN
DAcBN/C6xq2t88NH6zUbZ6utqm35Ch95eL6Eev1ZnJFP4SaX1Or+PcpdoT7VpA7w
/5doI+jN7roCy+EQJzkpHJ6VvlyNUbrTIAq0CzzW99oCRXQaO3xCqiEPyYhm8s9S
5Mra50YlO1nVubpEpFJcuQINBF+QtEwBEADMXrXQxrIpG1IYGMYsexfmXPD8wflA
tcEHIsX5x79OU5GnU+X1BpHcJpbvBRwfZb9CKgs2RiYgsOFnyqlX7uhsguYrm+IE
TwVGChF3V9U6H33pOPALaujzE2oJVnsU2wi6j90sBa/56oFMGfkJs6cAZ+Z38GpE
4YDD9JPN3A0iFH9ndtq/FFYgK0TI8/9GiEufgC35oR4HOHMrOwmd6RdK41LiQBmT
JwHeiG5hR0HpuvgISS7hoY3+6IAOstiNqmVFVEBzMyr9qwhRXIdFGKln79YPXWxU
V4N2XSelUJXO6MIAlyao7eTUFK6xIXRgZlbUynBaf9D6Ddp/Bw2ftfjNsWvN21kQ
8Dlw8AiHhay4YQbBxPq9NwH2m1AHJbduHRd0D0rZb+fz5Aa9YzBjrQjADZBiQemv
FD363e3HaRGO24iSaPvvhTTMXOZgPnmKBNqSAdU6cUtYY+MyUJeEaXeXVklVS9Qz
R1qisGMJK+Mzs0JQqSEcQ2/IDQTJciGGl8vEHxkivhA/lgbztUDPEdlO8s8wNAZM
pmfmIcevbQ6xRPhZhEkQNPKCtxzNKCqeLoK3nqfrHD/PBDJ7HPM5jIKJPR6yyYD3
FLDuccZuvteYRdK0I8Yktvlgz7Nt3biEKt4iuXzR2C6hklZdOfVqN2lssuFgmZjq
WW89UygTxgJ3CQARAQABiQI2BBgBCAAgFiEEbdMTgPvH23iObvxCTKiTtyO37VsF
Al+QtEwCGyAACgkQTKiTtyO37VsrXQ/9GddeEH+ek3KqN4xCSnCrB3Sm4IfxEskr
Fx6iokRcP80DTt/kCeNcg8e2bOlX8j8KS8oSJ8rqp3dwWGnhcrDr6bfiLL1ndCg6
IzVOtPhxF9yroTdpgAhDRV9Pov0pXUAt4gekBuL+puPY0b5K6tRDM0ofl5i04ohU
4XvxCRgil1Eg5I9espNRS614Vsa5GKfqcZ3knJ3gNp4mZAY8VP1RMka8++8SZ+sf
pSvuMN5se+UjC7cAgcezZxJVr5X2xw/QtsIb6XVx4lAyNSV8yz2aDGQhrdh6Jbna
fxRiwj3PNa9Zsjawzd2JkWhxBNJ4qx1tNuN9CvDEJfhD9xc3ZkpCxJJU2Jj+YgKQ
Xu9xV5mKm1hk/2ili3oIMX1LjKiul3MW00/q24PiRCDIhhHR4TxXnDgfwgZqP9xr
1OKADY/jxZOb8CtBS36Dmft850aIeqWURwendrX72HjtEtnYD/RCT+G+gKrs7NfI
AF/ZGUqH0QlwUCH8FH264uQnSvZ6MRxuWdnaPeWhB67d1v1pau+erTQK1nUZai+L
vi27kQp0fBe/1pbOZwFxogLwz1vCIh9E4wPvBHF/bzlmQwiPRjyIFLegSDiic5It
mV+SnW/dQPyKwCRAKGi5tDLSW1AHQ48QCKEnt6zubHCbWMZAxPMggYbC/pRM8np4
2yjZ3cZZzza5Ag0EX5C4kwEQALqsT2j2ZgzGXtWU7AA/ob9vd+Mo4uN4ZZQd54h9
IMKMorQQMvue0kxHGrkIGt2QwzWoH0XUNt2VNBWa+sB/498vIu0pQ3MlHGWr1hNa
5gYXHnyRVn4XFS0vj4cszbJe97fwChVsxgGyVIi3tTzKVtRy3wkROs30goiyCOql
pM7Sf7poSQAqF8vUy0JR4bI2UVE+AoJslmUeXuBf1EGe45mRSocIkKX7u0vmjmnL
0cTt2QkyjlJ/gmBdpCn4Wimu6ZCaL0iUr9FuXdZFwZ7tQCQwdpFj44nnUu8na77M
Adh9wIicmIoLdqzQJx3hZCMQAxdavIXSIyjvaVxQjiCdMd6N2HBQeBPqtWAJWUpv
myR538FFMKpB8iV8x1Esb9svJD/Obbby8VcLyIM9bQJ3KYMXhUlN/poSXcYfjdFZ
C69nWwZ0vu683DiKxXdcC3jh/PZVON/7eBLsz3UzY/mgf5SQQFxjLRNB7WqL8KmI
2Bk1+YWxHaAacV1S0yM/XEPSN/Ki82hduiJx9BGS72KVf8HKJck0RrUMJvFjrREj
3ka+TUO1q/ZlEaqKOJWYVMZNxhj41oG/xklGFhTtKN4HXvbOuB32zK+WgXhnIjAQ
7bVMLfrXLps42nK188W9XqcO8ssde/qh+NhRMtFCirkKJoZR5ygUt9ip6F0rUuR6
EU1pABEBAAGJBGwEGAEIACAWIQRt0xOA+8fbeI5u/EJMqJO3I7ftWwUCX5C4kwIb
AgJACRBMqJO3I7ftW8F0IAQZAQgAHRYhBGgVmxAnEHMY2v6wvwIEMpRRGzGcBQJf
kLiTAAoJEAIEMpRRGzGcLLUP/R1sVG99qbBC0EHEEauTS9dkAVSnAbYYE4WvpbrX
hpxIHd5LHdiyvNK/pGLuaiqxiJF5aacpnjQxv3s4bqwZFEtWxJ+jV3tWphIIyNac
otxjweNfdWGFspfeS38M99lAG0tvihRo+5ExRWG+9wXP+QKJh5fQVTBQX+L17u/J
vPPCMt54J/k7TJ3FCdO1RIUicSFCH+AGQxXKiCQIj/vi8C1e5KRUbV1K0iJZ9GRE
wWr9tI764X3kiHHi1YcNyIDSj8XhsqDVJPhtUbOLZIxg8HFrmul26SYgoer0rwQh
lFWFeSyRUIOvJgn1TDuQLYdvCUVX1g5u/C/znE7FWsx84nshrkXiIgrsfOlET4tM
PlI6i9lor6Sr9WzRg9Shpf0ZAb5tmoovsHzZx7FpbHcxY9CA3BvMOcSBAH6TtqrA
aO9QiyVa36RKnDd+OKnuhjc1ywpQl0EQfghPWTastFH7RWg/sN7WtB4NwCSahG/3
Z3nowX2bu08MFGouBKs55c5TfSRaa85fbZJlWiVZSrX+dMoR1j2ZSVXPXvjOYIS8
I3YzqnrSWJYuy+XN6QxA78BvYgyignexNuws4tjUwHIUnKHJ65ZPz00TKfbrtyOD
/M01VuygfxvE2fKrUFemdKjfZptmp1PiQTcQ8zfuKeYm2eFw95yd4cwKVIFx2BK+
QX/jodYP/26uGjsr4HCuyyDrfI7Jhk2tKLI7OkmrK0tOzm791aLqY9fEEEcCPMa9
aPyuwOO16Khdxc7G291Vgk6ScS+9MHGOOdA1a/42NT1VmXb5Z2wQExqsVoLckKx8
y18D3sd3M2B38ILlRaM8+vOSw8gFJ3LVVGx8HOy3nRzFwp25aPq+igHk7YQFBO/X
EMzSvsWC3M9+9NpIjEXAHvywozd4kTpdA+90ItLHPDIZ2A8vpYBvKI4Lu6xAMF9X
RQvGKekGQuJOtmVzCbi7SQ6DznZvY9PpOp/2wRn90F7YqZo8TLaJrX9LuiwuGbKy
KllMUFlobb52MpMMWhhzpkD6dCGW31CuORotCy9o0ixqUYP2BXRC3l48Cb7MPnOG
bV4mNdf1ryLQ8KD0QPw5DczQ9F3wrc/AGpWwgnDg4LJ/OVI7uzXeG+yw2zuaoIuP
bfjenJcmWmiKM4OqL5qossn7ohAYj5sa5eHcrPFZwyhIlHO2faFN2CJswdfNFRRE
ffvr+ErVE/LnBXOdhVCI3Mm6fGYYSL0bXvgQFVlX7iIh4meJVAx9kIkDAXuJmvt5
75UdjZIJ4B6bSBNgYAZOZo5Nj9JgGSnnUooesJNEnthyNt0LKVHEqJsXBJAg6moi
lPKQvidrI1kU9GxAK9gMiw/eJGBt/RBM6e6uPpa/hZl+IlZ7McTG
=uHZs
-----END PGP PUBLIC KEY BLOCK-----

20
themes/kwolek/LICENSE Normal file
View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2021 YOUR_NAME_HERE
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,2 @@
+++
+++

View File

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
{{- partial "head.html" . -}}
<body>
{{- partial "header.html" . -}}
<div id="content">
{{- block "main" . }}{{- end }}
</div>
{{- partial "footer.html" . -}}
</body>
</html>

View File

@ -0,0 +1,12 @@
{{ define "main" }}
<h2 class="listTitle">{{ .Title }}</h2>
{{ range .Paginator.Pages }}
<h3 class="listItem"><a href="{{ .Permalink }}">{{ .Title }}</a></h3>
<div class="content">{{ .Summary }}</div>
<div>
<a href="{{ .Permalink }}">See more...</a>
</div>
{{ end }}
{{ template "_internal/pagination.html" . }}
{{ end }}

View File

@ -0,0 +1,29 @@
{{ define "main" }}
<h2 class="postTitle">{{ .Title }}</h2>
<div class="content">
{{ .Content | safeHTML }}
</div>
{{ if not (eq .Section "projects") }}
<div class="meta">
{{ .Date }}
</div>
{{ end }}
{{ if (isset .Params "projectname") }}
<ul class="projectUpdateList postList">
<h4>Updates:</h4>
{{ range (first 10 (where .Site.RegularPages "Params.project" .Params.projectName)) }}
<li>
<div class="timestamp">
{{ time.Format "2006-01-02" .Date }}
</div>
<div class="link">
<a href="{{ .Permalink }}">
{{ .LinkTitle }}
</a>
</div>
</li>
{{ end }}
</ul>
{{ end }}
{{ end }}

View File

@ -0,0 +1,67 @@
{{ define "main" }}
<section id="about_me">
{{ if (where .Site.RegularPages "Section" "top") }}
{{ range where .Site.RegularPages "Section" "top" }}
<h2>{{ .Title }}</h2>
<div class="content">
{{ .Content }}
</div>
{{ end }}
{{ end }}
</section>
<div id="homepage">
<section id="recent_posts">
<h2><a href="/posts">Recent posts</a></h2>
<ul class="postList">
{{ range (first 10 (where .Site.RegularPages "Section" "posts")) }}
<li>
<div class="timestamp">
{{ time.Format "2006-01-02" .Date }}
</div>
<div class="link">
<a href="{{ .Permalink }}">
{{ .LinkTitle }}
</a>
</div>
</li>
{{ end }}
</ul>
<div class="seeAll"><a href="/posts">See all...</a></div>
</section>
{{ if (where .Site.RegularPages "Section" "updates") }}
<section id="project_updates">
<h2><a href="/updates">Project updates</a></h2>
<ul class="postList">
{{ range (first 10 (where .Site.RegularPages "Section" "updates")) }}
<li>
<div class="timestamp">
{{ time.Format "2006-01-02" .Date }}
</div>
<div class="link">
<a href="{{ .Permalink }}">
{{ .LinkTitle }}
</a>
</div>
</li>
{{ end }}
</ul>
<div class="seeAll"><a href="/updates">See all...</a></div>
</section>
{{ end }}
</div>
{{ if (where .Site.RegularPages "Section" "projects") }}
<section id="projects">
<h2><a href="/projects">Projects</a></h2>
{{ range where .Site.RegularPages "Section" "projects" }}
<div class="project">
<h3><a href="{{ .Permalink }}">{{ .Title }}</a></h3>
<div class="content">
{{ .Summary }}
</div>
<p><a href="{{ .Permalink }}">See more...</a></p>
</div>
{{ end }}
</section>
{{ end }}
{{ end }}

View File

@ -0,0 +1,9 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/css/style.css">
{{ $title := print .Site.Title " | " .Title }}
{{ if .IsHome }}{{ $title = .Site.Title }}{{ end }}
<title>{{ $title }}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
</head>

View File

@ -0,0 +1,9 @@
<header>
<h1><a href="{{ .Site.BaseURL }}">{{ .Site.Title }}</a></h1>
<div class="icons">
<a href="https://github.com/irth"><i class="bi-github"></i></a>
<a href="mailto:wojciech@kwolek.io"><i class="bi-envelope-fill"></i></a>
<a href="https://twitter.com/irth7"><i class="bi-twitter"></i></a>
<a href="https://kwolek.io/public-key.gpg"><i class="bi-key-fill"></i></a>
</div>
</header>

View File

@ -0,0 +1,37 @@
// ==UserScript==
// @name Duolingo mistake helper
// @description Requires an additional enter click to move to the next exercise when you have made a mistake.
//
// @run-at document-start
// @include https://www.duolingo.com/*
// @grant none
// ==/UserScript==
var checking = 0;
function advance() {
document.querySelector("button[data-test=player-next]").click()
}
(window.opera ? document.body : document).addEventListener('keydown', function(e) {
if (e.keyCode == 13) {
e.cancelBubble = true;
e.stopImmediatePropagation();
e.preventDefault();
if(checking === 0) {
checking = 1;
advance()
} else if(checking === 1) {
var correct = document.querySelector("[data-test*=blame-incorrect]") == null
if(correct) advance();
else {
checking = 2;
}
} else if(checking === 2) {
checking = 0;
advance()
}
}
return false;
}, !window.opera);

View File

@ -0,0 +1,221 @@
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@200;400;500&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@200;500&display=swap');
body {
max-width: 768px;
margin: 0 auto;
padding-left: 1em;
padding-right: 2em;
color: #fdf6ff;
background-color: #27273c;
margin-bottom: 5em;
font-family: 'Montserrat', sans-serif;
}
header {
text-align: center;
margin-top: 5em;
}
h2 > a, h3 > a, h4 > a, h5 > a,
h2,h3,h4,h5 {
color: #bcadff;
font-weight: 500;
border-bottom: solid 2px #343850;
padding-bottom: .2em;
}
header a {
color: #fdf6ff;
}
header .icons a:hover {
opacity: 0.7;
}
header > h1 {
font-size: 4em;
font-weight: 200;
margin-bottom: 1.7rem;
}
header > .icons > a {
margin: 0 .5em;
font-size: 1.2em;
}
#content {
margin-top: 3em;
}
#homepage {
display: flex;
align-content: stretch;
}
#recent_posts, #project_updates {
flex-basis: 0px;
flex-grow: 1;
}
a {
text-decoration: none;
color: #00e3ff;
}
a:hover {
text-decoration: underline;
}
ul li {
margin-bottom: 0.4em;
}
h2 {
margin-bottom: 0.4em;;
margin-top: 1.0em;
font-size: 1.7em;
}
h3 {
margin-bottom: 0.5em;
}
h4 {
margin-bottom: 0.5em;
}
ul.postList {
list-style: none;
padding-left: 0em;
}
p {
margin-top: 0.2em;
margin-bottom: 1em;
text-align: justify;
}
.meta {
font-size: .8em;
opacity: 0.7;
}
#recent_posts {
margin-right: 1em;
}
#project_updates {
margin-left: 1em;
}
@media (max-width: 768px) {
#homepage {
display: block;
}
#recent_posts {
margin-right: 0;
}
#project_updates {
margin-left: 0;
}
}
ul.pagination {
border-left: none;
border-top: solid 2px #343850;
padding-top: 0.5em;
font-size: 1.2em;
margin: 0 auto;
max-width: 20em;
margin-top: 3em;
display: flex;
justify-content: center;
opacity: 0.8;
}
ul.pagination li {
margin: 0 .5em;
}
ul.pagination .active {
font-weight: bold;
}
ul.pagination a {
color: #fdf6ff;
}
ul.pagination .active a {
color: #bcadff;
}
ul.pagination .disabled a {
color: #343850;
cursor: default;
}
ul.pagination .disabled a:hover {
text-decoration: none;
}
h2.listTitle {
text-align: center;
font-size: 2.5em;
margin-bottom: 1em;
border-bottom: none;
}
h3.listItem {
font-size: 1.5em;
}
h2.postTitle {
font-size: 2em;
margin-bottom: .7em;
}
ul.projectUpdateList {
margin-top: 2em;
}
.twitter-tweet {
padding-top: 0.2em;
padding-bottom: 0.6em;
padding-left: 0.5em;
}
.postList li {
display: flex;
}
.postList .timestamp {
flex-shrink: 0;
margin-right: .5em;
font-size: 0.9em;
}
pre,
.postList .timestamp {
font-family: 'Source Code Pro', monospace;
font-weight: 200;
}
pre {
font-size: 1.2em;
}
.seeAll {
text-align: right;
padding-right: .5em;
}
.project {
margin-bottom: 1em;
}
.project h3 {
font-size: 1.2em;
}

21
themes/kwolek/theme.toml Normal file
View File

@ -0,0 +1,21 @@
# theme.toml template for a Hugo theme
# See https://github.com/gohugoio/hugoThemes#themetoml for an example
name = "Kwolek"
license = "MIT"
licenselink = "https://github.com/yourname/yourtheme/blob/master/LICENSE"
description = ""
homepage = "http://example.com/"
tags = []
features = []
min_version = "0.41.0"
[author]
name = ""
homepage = ""
# If porting an existing theme
[original]
name = ""
homepage = ""
repo = ""