Compare commits

...

8 Commits
hugo ... main

Author SHA1 Message Date
Wojciech Kwolek 9240589a25
change blog domain
continuous-integration/drone/push Build is passing Details
2024-06-16 19:40:15 +02:00
Wojciech Kwolek 5e02d347df
add blag link
continuous-integration/drone/push Build is passing Details
2024-06-15 20:32:13 +02:00
Wojciech Kwolek 68ea0f8914
meow
continuous-integration/drone Build is passing Details
2024-06-01 04:22:23 +02:00
Wojciech Kwolek a6e136f907
grammar
continuous-integration/drone/push Build is passing Details
2024-03-17 23:16:04 +01:00
Wojciech Kwolek d6e93f17f6
+dragoon
continuous-integration/drone/push Build is passing Details
2024-03-17 23:06:07 +01:00
Wojciech Kwolek b82287c50c
asie
continuous-integration/drone/push Build is passing Details
2024-03-17 22:56:37 +01:00
Wojciech Kwolek b19e477464
dark mode
continuous-integration/drone/push Build is passing Details
2024-03-17 22:54:37 +01:00
Wojciech Kwolek c0aef1cb38
new site
continuous-integration/drone/push Build is passing Details
2024-03-17 22:42:10 +01:00
34 changed files with 265 additions and 1043 deletions

View File

@ -3,10 +3,6 @@ type: docker
name: default
steps:
- name: build
image: klakegg/hugo
commands:
- hugo
- name: deploy
image: instrumentisto/rsync-ssh
commands:

1
.gitignore vendored
View File

@ -1,2 +1 @@
public/
.DS_Store

View File

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

View File

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

View File

@ -1,32 +0,0 @@
---
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

@ -1,23 +0,0 @@
---
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.

View File

@ -1,94 +0,0 @@
---
title: "2022: new year new me or something"
date: 2022-01-03T19:12:42+01:00
draft: false
---
Soooo we are starting a new year. I usually don't do new year resolutions but I
am at a point in my life where I actually have to do something with my life or
it is going to be bad.
So, December ended with some intense emotional turmoil, I had to cut off the
connection which I had with a friend who is very dear to me (after like, 5 years
of basically being non-stop in each other's lives.)
I think using this year to improve myself or something might be what I need
right now to avoid just giving up in the fight with my depression.
So, without any further ado...
## Stuff I want to do/achieve in 2022.
### Weight loss.
I am currently around 110kg @ 183cm. I don't look too bad, but I would like to
at least get into the two digits category.
I ordered a 2200 kcal box diet for two weeks (starting tomorrow), to see if I
like it (I actually don't like a lot of food and I'm hoping that I can widen my
horizons by doing this, while also eating healthily).
I am way too lazy/depressed to cook for myself right now, so this is a stop-gap
solution until I get better.
I would also like to get back to playing Ring Fit Adventure on my Switch, to get
some movement without having to go anywhere.
* **Minimal goal:** get under 100kg (so, around 0.5kg per week)
* **Unrealistic goal:** get to 85kg, but that will probably take a bit longer
*if I want do it in a healthy manner.
### Keeping my room clean.
This is simple, but I always have trouble with it. I am writing this post during
a break from tidying up my room. Once I get it clean I want to focus on not
making a mess.
The way I intend to do it is:
1. Try to clean up after myself immediately.
2. Designate a 10 minute cleaning time every day.
3. Designate a 30 minute cleaning time every week.
### Streaming/content creation.
I have taken up streaming recently, and it seems fun but this year I want to
actually make it a real thing. I want to make some nice layouts for Twitch,
create a schedule, stream Animal Crossing and then cut the recordings up for
YouTube, so I can use their discovery algorithms to maybe find some people who
will watch me.
I also want to start planning my streams, and actively finding some stuff to
talk about during these streams, so that there's some value in there besides the
gameplay (which, admittedly, is not my strong side.)
I wanna play Animal Crossing, BOTW and maybe Minecraft. I think I'll set up a
schedule that'll look something like: Mondays 7PM - Animal Crossing, Sundays 7PM - Zelda, etc.
I've heard consistency is key.
I also want to make new social media for this, so that I can start it all fresh.
* **Minimal goal:** get the Twitch affiliate status and stream regularly for two
months.
* **Ideal goal:** stream consistently the whole year :)
### Reading/listening to books.
When I was a child I used to read books at an incredible pace (haven't we all?) but then I kinda stopped. I wanna get back to that. I subscribed to an audiobook app. We'll see about that. This might also give me something to chat about during streams.
* **Minimal goal:** 1 book per month.
* **Ideal goal:** 2 books per month? Idk I want to make these goals reachable.
### Trying new things.
I am really bad at coming out of my comfort zone. So I want to try some new things this year.
* **Minimal goal:** 1 new thing per two months.
* **Ideal goal:** 1 new thing monthly.
## Holding myself accountable.
This of course won't work if I don't hold myself accountable, so I plan on making a summary post each week, and a larger one each month. Let's see how it goes.
So, to finish, I wish you all an... acceptable 2022. Bye!

View File

@ -1,7 +0,0 @@
---
title: "2022: new year's resolutions: big update"
date: 2022-11-28T15:06:42+01:00
draft: false
---
i got diagnosed with adhd lmao

View File

@ -1,102 +0,0 @@
---
title: "Using Docker buildx for native multiarch builds."
date: 2022-12-24T05:07:00+02:00
draft: false
---
## TL;DR
I wanted to build multiarch images using multiple machines with different architectures instead of QEMU.
```bash
# add some amd64 machine that has docker
docker context create bob --docker "host=ssh://bob@10.0.0.2"
# create a buildx builder with your local machine added to it
docker buildx create \
--name multiarch --node arm64 \
--platform linux/arm64/v8 \
default
# add the amd64 machine to it
docker buildx create --append \
--name multiarch --node amd64 \
--platform linux/amd64,linux/amd64/v2,linux/386\
bob
# build & push your image
docker buildx build \
--builder multiarch \
--platform linux/amd64,linux/arm64/v8 \
--push --tag username/imagename .
# the amd64 image will be build natively on the amd64 machine,
# the arm64 machine will be build natively on the arm64 machine
```
## Actual post
I wanted to build a multiarch image for `linux/arm64/v8` and `linux/amd64`, however the `x86` builds were really slow when running through QEMU on my _Apple Silicon_ laptop. Turns out, you can tell Docker to use another machine (which happens to be `x86_64`), to build the `linux/amd64` images, and use the local Docker Desktop instance for the ARM stuff.
Here's how:
1. Set up Docker on a machine (or many machines) that supports the architecture(s) you want to build for. Make sure you can SSH into it without using passwords (use SSH keys, and maybe ssh-agent if keys don't work on their own).
Also, the user you're SSH-ing into needs to be able to access Docker.
2. Create a _Docker context_ for the remote machine.
```bash
docker context create <context_name> --docker "host=ssh://<USER>@<HOST>:<PORT>"
```
`<USER>@` can be omitted - your local username will be used. `:<PORT>` can also be omitted if it's `22`.
Let's say we have an `amd64` host on ip `10.0.0.2`, and we want to call it bob (the builder).
```bash
docker context create bob --docker "host=ssh://bob@10.0.0.2"
```
3. Create a buildx builder for your local computer.
In this case, my local machine supports `linux/arm64/v8` natively, but it also can build `amd64` images through QEMU, so I explicitly set `--platform` to just `linux/arm64/v8`. I might also add `linux/arm/v7` for images meant to run on something like a Raspberry Pi here, because even though it will still run via QEMU, I don't have anything better to build for `armv7` anyway. (it's comma separated)
```bash
docker buildx create \
--name multiarch --node arm64 \
--platform linux/arm64/v8 \
default
```
`multiarch` will be the name of our builder, `--node` is the name for the node we're adding to the builder (it doesn't have to contain the architecture, it can be anything, only the `--platform` value is taken into consideration by Docker).
`default` is the name of the default context, which usually is your local machine. If not, replace it with whatever you use.
4. Now, the fun part - add additional nodes for other architectures! In our example, we want to add `bob` which can build `linux/amd64` images natively.
```bash
docker buildx create --append \
--name multiarch --node amd64 bob
```
Notice the `--append` - it tells Docker to add the node to an existing builder.
I've omitted `--platform` here, because in my case, `bob` only supports x86 anyways, so I don't have to limit it artificially. This was different for the local node, as Docker Desktop on MacOS comes with cross-platform build support preconfigured.
5. Set the builder as default (optional, you can use `--builder multiarch` for `docker buildx build` to set the builder manually)
```bash
docker buildx use multiarch
```
6. Finally, you can build your images:
```bash
docker buildx build \
--platform linux/amd64,linux/arm64/v8 \
--push --tag username/imagename .
```
Unfortunately, it's not yet possible to load multiarch images into your local Docker daemon, which means you're gonna have to tag and `--push` to the Docker registry.
You can still use `--load` instead of `--push` (to load into your local daemon) if you only specify a single `--platform`. Idk, might be useful for testing or something.
Enjoy.

View File

@ -1,18 +0,0 @@
---
title: "Life update: 4 day workweek."
date: 2021-10-10T13:07:27+02:00
draft: false
---
This is just a short update post, but starting this month (October) I have switched to a 4 day * 8 hours workweek,
so now I work from Tuesdays to Fridays, which means I can relax on the weekend and then do something useful for myself on Monday.
Alternatively, I have an additional day for being sad, or something.
Hopefully, this means that I'll get back into my open source projects.
I've also already used this time to set up a CI for myself. Now I have some nice Ansible roles that set up [Gitea](https://gitea.io) and [Drone CI](https://www.drone.io), and this blog is now auto-published on each commit :)
[![Build Status](https://drone.kwolek.io/api/badges/wojciech/website/status.svg?ref=refs/heads/main)](https://drone.kwolek.io/wojciech/website)
I recommend this four-day workweek to everyone who can do this.

View File

@ -1,14 +0,0 @@
---
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

@ -1,13 +0,0 @@
---
title: "DoneTh.at"
date: 2021-09-12T18:06:12+02:00
draft: false
projectName: donethat
---
[DoneTh.at](https://DoneTh.at) is a simple web app written in 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

@ -1,10 +0,0 @@
---
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

@ -1,16 +0,0 @@
---
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)

View File

@ -1,6 +0,0 @@
---
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. Enjoy!

View File

@ -1,70 +0,0 @@
---
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.

View File

@ -1,25 +0,0 @@
---
title: "Small update to DoneTh.at."
date: 2021-12-04T15:06:35+01:00
draft: false
project: donethat
---
I've finally started working on [DoneTh.at](https://doneth.at) again!
As part of my therapy I'm trying to write down the good stuff that's happening in my life, and a part of that is actually doing productive stuff. This reminded me that DoneTh.at existed, and is a perfect tool for that. So, with the newfound motivation, I've deployed two small updates and I'm working on something bigger.
### Bugfix: you can now set midnight as the start of day.
I've implemented a feature in DoneTh.at, where you can set when a day "begins". So - if you set it to 2 AM, tasks you've submitted before 2 AM on a Tuesday get added to Monday. Due to incorrectly set validation, it was not possible to make this setting 0 - midnight. That's fixed now.
### Graph now shows average.
The 7-day graph now shows a line representing the 7-day average. I might change it to not include the current day until it's finished, so that you can use it to motivate yourself to match the previous days.
## API!
I am working on creating an API for integrating DoneTh.at with other services!
I am hoping to then make plugins for various productivity tools for managing tasks, with stuff like Duolingo, etc.
A Telegram bot is also in plans :)

View File

@ -11,12 +11,6 @@ SSH_ARGS="-o StrictHostKeyChecking=no"
SSH_ARGS="$SSH_ARGS -l $SSH_USER"
}
compile() {
if [[ $JUST_DEPLOY != "yes" ]]; then
hugo
fi
}
compile && rsync -e "ssh $SSH_ARGS" -avz --delete public/ zlomek.irth.pl:/srv/http/homepage/
rsync -e "ssh $SSH_ARGS" -avz --delete public/ zlomek.irth.pl:/srv/http/homepage/
[[ -n "$SSH_KEY_FILE" ]] && rm "$SSH_KEY_FILE"

134
public/index.html Normal file
View File

@ -0,0 +1,134 @@
<!DOCTYPE html>
<title>irth's wobsite</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/style.css">
<h1>irth's wobsite</h1>
<p>I'm Wojtek (<i>he/him</i>), usually ~irth on the internet.</p>
<p>
I like to make stuff (<i>funny&gt;useful</i>, but I'd like my projects to be
both, ideally).
</p>
<p>
I've been tinkering with computers ever since I was a kid, and I love seeing an idea come to life.
</p>
<p>
I test this website with Links btw.
</p>
<p><b>And who are you?</b></p>
I am: <br>
<input type="radio" name="viewer" id="viewer-friend" value="friend">
<label for="viewer-friend">a friend</label><br>
<input type="radio" name="viewer" id="viewer-cat" value="cat">
<label for="viewer-cat">a cat</label><br>
<input type="radio" name="viewer" id="viewer-recruiter" value="recruiter">
<label for="viewer-recruiter">a recruiter</label><br>
<input type="radio" name="viewer" id="viewer-australian" value="australian">
<label for="viewer-australian">Australian</label><br>
<input type="radio" name="viewer" id="viewer-curious" value="curious" checked>
<label for="viewer-curious">just curious</label>.<br>
<p id="nocss">
(This picker requires CSS to work, unfortunately.)
</p>
<div id="for-cats"></div>
<div id="switcharoo">
<div id="links">
<h3>A bunch of links</h3>
<ul class="no-a-visited">
<li><a href="https://blog.irth.pl">My blag</a></li>
<li><a href="https://github.com/irth">Github</a> (@irth)</li>
<li><a href="https://hackrc.dev/@irth">Fedi</a> (@irth@hackrc.dev)</li>
<li><a href="https://twitter.com/irth7">Twitter</a> (@irth7)</li>
<li><a href="mailto:wojciech@kwolek.io">Email</a> (wojciech@kwolek.io)</li>
</ul>
</div>
<div id="current-projects">
<h3>Current projects</h3>
<ul class="no-a-visited">
<li>
<a href="https://github.com/irth/opencanvas-go">OpenCanvas</a>
- a HTML renderer for
<a href="https://obsidian.md">Obsidian</a>'s <a href="https://jsoncanvas.org">JSON Canvas</a>
files.<br>
Very much work in progress.
</li>
</ul>
</div>
<div id="past-projects">
<h3>Past projects</h3>
<ul class="no-a-visited">
<li><a href="https://doneth.at">DoneTh.at</a> a Flask app for tracking your productivity by giving you
points for doing stuff. (<a href="https://github.com/irth/doneth.at">repo</a>)</li>
<li><a href="https://github.com/irth/blag">Blag</a> a static site generator written in Go.</li>
<li><a href="https://github.com/irth/gophernews">GopherNews</a> a proxy that allows you to browse
Hacker
News using your favourite Gopher client, written in Go.</li>
<li><a href="https://github.com/irth/together">Together for Spotify</a> a web app that allows two Spotify
users to log in and find the cross section of their music libraries.</li>
</ul>
</div>
<div id="shitposts">
<h3>Shitposts</h3>
<ul class="no-a-visited">
<li><a href="https://catsp.in">catsp.in</a></li>
<li><a href="https://worldrecord.irth.pl">worldrecord.irth.pl</a></li>
<li><a href="https://karaoke.pi-wo.pl">karaoke.pi-wo.pl</a></li>
<li><a href="https://ovmfer.pi-wo.pl">ovmfer.pi-wo.pl</a> &middot; <a href="https://gist.github.com/irth/e588c081003d9655af277a63cb64dd5a">gist describing what happens there</a></li>
</ul>
</div>
<div id="friends">
<h3>Friends</h3>
<ul class="no-a-visited">
<li id="onlyfriends"><b>you!</b></li>
<li><a href="https://krafal.eu">BluRaf</a></li>
<li><a href="https://asie.pl">cbrzeszczot</a></li>
<li><a href="https://dragonic.eu">Dragoon Aethis</a></li>
<li><a href="https://grzesiekkkkk.eu">grzesiekkkkk</a></li>
<li><a href="https://tarnowski.io">Juliusz</a></li>
<li><a href="https://millie.systems">milliectl</a></li>
<li><a href="https://naruciakk.eu">Robert von Oliva</a> (naruciakk)</li>
<li><a href="https://sdomi.pl">sdomi</a></li>
<li><a href="https://hardcoded.info">Szymon</a></li>
<li><a href="https://tadeustad.psifactor.pl">TadeusTaD</a></li>
</ul>
</div>
<div id="experience">
<h3>Work experience</h3>
<p>I have almost 5 years of commercial experience in IT (DevOps, Software Engineering).</p>
<p>Some of the stuff I used at work:</p>
<ul>
<li><b>Golang</b>, <b>Python</b>, <b>Rust</b>, <b>Bash</b></li>
<li>HTML/CSS/JS, Vue/React</li>
<li><b>Docker</b></li>
<li><b>Git/GitLab</b>, <b>GitLab CI</b>/Jenkins</li>
<li>
Cloud stuff (AWS):
<ul>
<li>Lambda, API Gateway, EventBridge</li>
<li>S3, CloudFront</li>
<li>DynamoDB</li>
<li>Security Hub, Config, Inspector</li>
<li>IAM, Cognito</li>
</ul>
</li>
</ul>
<p>And more. Usually I can figure out the missing parts as I go.</p>
<p>
Feel free to
<a
href="mailto:wojciech@kwolek.io?subject=hi%20can%20u%20work%20for%20me%20pls&body=Hiiii%20:3%0A%0Ado%20u%20want%20to%20work%20for%20me%3F%0A%0Asalary%20range:%20%0Acontract%20type:%0Ajob%20description:%0A">hire
me.</a>
</p>
</div>
</div>

129
public/style.css Normal file
View File

@ -0,0 +1,129 @@
html {
-webkit-text-size-adjust: 100%;
padding-bottom: 4em;
font-size: 18px;
}
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
max-width: 40em;
padding: 0 2%;
margin: auto;
}
.text-input {
width: 96%;
display: block;
padding: 0.5em 1%;
margin-bottom: 1.5em;
font-size: 1em;
}
fieldset {
margin-bottom: 1.5em;
}
textarea {
height: 10em;
}
dt {
font-weight: bold;
}
.important {
color: red;
}
.footer {
text-align: right;
}
.centered {
text-align: center;
}
.nope {
display: none;
}
a {
color: blue;
}
a:visited {
color: purple;
}
.no-a-visited a:visited,
.cleanlinks a:visited {
color: blue;
}
h3 {
margin-top: 1.7em;
margin-bottom: 0.3em;
}
h3 + ul {
margin-top: 0;
padding-top: 0;
}
#viewer-cat:checked ~ #for-cats::after {
display: block;
margin-top: 1em;
content: "meow nya mrrp :3 pspsps";
}
#viewer-friend:not(:checked) ~ #switcharoo #onlyfriends {
display: none;
}
#viewer-recruiter:checked ~ #switcharoo {
display: flex;
flex-direction: column;
}
#viewer-recruiter:checked ~ #switcharoo > div {
order: 9999;
}
#viewer-recruiter:checked ~ #switcharoo > #links {
order: 0;
}
#viewer-recruiter:checked ~ #switcharoo > #experience {
order: 1;
}
#viewer-recruiter:checked ~ #switcharoo > #current-projects {
order: 2;
}
#viewer-recruiter:checked ~ #switcharoo > #past-projects {
order: 3;
}
#viewer-australian:checked ~ #switcharoo {
transform: rotate(180deg);
}
#nocss {
display: none;
}
@media (prefers-color-scheme: dark) {
body {
background-color: #121212;
color: #f0f0f0;
}
a {
color: cyan;
}
a:visited {
color: pink;
}
.no-a-visited a:visited,
.cleanlinks a:visited {
color: cyan;
}
}

View File

@ -1,135 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=uHZs
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,20 +0,0 @@
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

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

View File

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

View File

@ -1,12 +0,0 @@
{{ 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

@ -1,29 +0,0 @@
{{ 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

@ -1,67 +0,0 @@
{{ 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

@ -1,10 +0,0 @@
<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="alternate" type="application/rss+xml" href="https://kwolek.io/posts/index.xml">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
</head>

View File

@ -1,9 +0,0 @@
<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://hackrc.dev/@irth"><i class="bi-mastodon"></i></a>
<a href="https://kwolek.io/public-key.gpg"><i class="bi-key-fill"></i></a>
</div>
</header>

View File

@ -1,37 +0,0 @@
// ==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

@ -1,237 +0,0 @@
@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;
}
h2 {
line-height: 1.2;
}
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;
line-height: 1.4em;
}
#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;
}
.postList .timestamp {
font-family: 'Source Code Pro', monospace;
font-weight: 200;
}
.highlight {
overflow-x: auto;
background-color: #272822;
margin-bottom: 1em;
}
pre {
box-sizing: bounding-box;
line-height: 1.2;
font-size: 1.2em;
margin: 1em;
}
.seeAll {
text-align: right;
padding-right: .5em;
}
.project {
margin-bottom: 1em;
}
.project h3 {
font-size: 1.2em;
}
ol > li {
margin-bottom: 2em;
}

View File

@ -1,21 +0,0 @@
# 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 = ""