607 private links
Skåpets yttermått: djup 40 cm, bredd 60 cm, höjd 60 cm. Tillgängligt djup från rack är 31 cm.
Med borst-tillsats i den övre sladd-luckan. Med 4 st externa väggfästen.
Liten kosmetisk skada på framsidan av dörren. Nyckeln till dörrlåset saknas (kolven är i upplåst läge och dörren håller sig stängd av sig själv).
Pris enl. överenskommelse, upphämtas i Ulleråker eller överlämnas enligt överenskommelse.

Här samlas den viktigaste information om de aktörer, resurser och styrdokument som är centrala för en svensk övergång till ett öppet vetenskapssystem. Portalens mål är att vara en levande webbplats som kortfattat introducerar nyckelaktörerna inom omställningen i Sverige och internationellt, och presenterar viktiga resurser. Den kommer att uppdateras och utvecklas för att spegla hur övergången fortskrider.
- https://openscience.se/vad-ar-oppen-vetenskap
- https://openscience.se/nationella-riktlinjer-for-oppen-vetenskap
- https://openscience.se/samordning-och-aktorer
- https://openscience.se/resurser
Sedan 2024 har Sverige nationella riktlinjer för öppen vetenskap. De utgör ett stöd och en vägledning för de aktörer som har ett övergripande ansvar i omställningen till öppen vetenskap.
Den 16-17 maj 2023 arrangerade Sverige konferensen "Open Science – From Policy to Practice" i anslutning till det svenska ordförandeskapet i EU. Presentationerna är inspelade och hittas på Youtube:
- https://youtu.be/NEUoBeGYYGU?t=174 - opening session "Open Science Policies in Europe – development and monitoring of national policies"
- https://youtu.be/NEUoBeGYYGU?t=2420 - "Council Conclusions and Scholarly publishing"
- https://www.youtube.com/watch?v=NU4thASddlA - Session 2, Day 1 "Aligning research assessment with Open Science"
- https://www.youtube.com/watch?v=d6zk5F2whOM - Session 3, Day 1 "EOSC – advancing Open Science to the next level"
- https://www.youtube.com/watch?v=eeGRbfZGJSU - Session 4, Day 1 "Citizen science in policy and practice"
- https://www.youtube.com/watch?v=rNQL2SHiXq4 - Session 1, Day 2 "Science for Policy making"
- https://www.youtube.com/watch?v=QuLfJNauTmA - Session 2, Day 2 "Science and society – Science communication and engagement as enablers for Open Science"
- https://www.youtube.com/watch?v=QP2M4-9RJAg - Session 3, Day 2 "Accessibility to and involvement in science" (including Closing address)
Världens bibliotek är ett digitalt bibliotek. Här finns ljudböcker och e-böcker på andra språk än svenska. Du läser och lyssnar på webbsidan. Skapa en användarprofil med din mejladress för att komma igång.
Världens bibliotek är en del av det offentliga bibliotekssystemet i Sverige och Norge. Kungliga biblioteket driver Världens bibliotek i samverkan med norska Nasjonalbiblioteket. Myndigheten för tillgängliga medier ansvarar för den tekniska driften.
Vill du veta mer om tjänsten eller har du idéer kring utvecklingen? Hör gärna av dig på adressen info@varldensbibliotek.se.
- https://www.kb.se/for-bibliotekssektorn/nytt-fran-kb/nyheter-for-bibliotekssektorn/2019-04-26-varldens-bibliotek---fri-onlinetjanst-for-mangsprakiga-bocker.html
- https://www.kb.se/for-bibliotekssektorn/nytt-fran-kb/nyheter-for-bibliotekssektorn/2025-09-01-kb-tar-over-driften-av-tjansten-varldens-bibliotek.html
I intend to sublet my studio apartment in Ulleråker, Uppsala, situated close to both Uppsala University campuses and SLU Ultuna campus from the end of January 2026 for 6 months with possible extension because I will take a new job in a different city (assuming the landlord UAF grants the required permit, which I expect).
The flat is on the ground floor, 35 m², with kitchen amenities (fridge, freezer, stovetop with oven, no dishwasher), a bathroom with shower, a small room suited for clothes/storage, and a common room with high ceiling and a tall north-facing window.
Depending on what we agree I'd be happy to rent it furnished or unfurnished.
Rent includes central heating but excludes electricity and broadband.
If you'd like to know more, get in touch with me at sublet@solarchemist.se or Signal (link on my Contact page)!
- https://osc-international.com - International Network of Open Science & Scholarship Communities
- https://opensciencesweden.org - website shows no activities since last year. No RSS feed. No Masto account (only Twitter, email address and a contact form). They also have a forum https://onscienceandacademia.org/c/organisations/osc-sweden/59, but no activity there since 2023.
- https://open-science-community-uppsala.github.io/open_science_community_uppsala - Open Science Community Uppsala. Email list, Linkedin, Twitter, and Facebook. The mailing list can be followed via RSS, which should give you all future events.
- https://osc-ksa.com - Open Science Community in Saudi Arabia. Twitter, Linkedin, and Github. No Masto, and no RSS feed.
- https://help.osf.io/article/677-explore-open-science-communities - a large spreadsheet with all kinds of stuff.
Loopia has served me well for years. But they raise their prices at a cadence that is obscenely high. Alternatives?
- https://www.gandi.net - even more expensive than Loopia for
.sedomains. - https://porkbun.com - doesn't sell
.sedomains apparently. - https://zone.ee - based in Estonia. Practically the same prices as Loopia.
- https://se.godaddy.com/domains - even more expensive than Loopia for
.sedomains. - https://www.one.com - the first registrar I used, maybe good for beginners but nothing else.
- https://hostup.se/doman - baserad i Sverige.
- https://www.simply.com - 199 SEK per year for
.sedomains. - https://www.strato.se - baserad i Tyskland. 90 SEK/år för
.sevid första åsyn låter ju lovande. What? Only 5 subdomains? They're trying to limit the number of subdomains I can create? What's this nonsense. Enshittification everywhere. - https://www.hostinger.com - another one full of dark patterns. Very unclear pricing info.
I recently reworked my LaTeX template underlying my CV to be compliant with PDF/A-3U, and now I keep noticing chatter about PDF/A compliance or PDF accessibility in my feeds. It's true what they say: once you learn something, you start noticing it :-)
Let's collect notes here.
Accessibility of STEM documents
- https://tex.social/accessibility-of-stem-documents-talk-at-pdf-days-2025-in-berlin - blog post
- https://pdfa.org/the-winning-technical-poster-at-pdf-days-europe-2025 - all posters from the PDF Days Europe 2025 conference (many of them are about accessibility), very interesting!
- https://pdfa.org/presentation/tagged-and-accessible-pdf-with-latex-revisited - session at the same conference on "tagged and accessible PDF with LaTeX" with references to several works by the core LaTeX developers.
TinyTinyRSS has been my primary way of following and reading feeds for over a decade.
The original developer retired the project om 2025-11-01, but one the main contributors created a fork to pick up the mantle. Via https://fosstodon.org/@wallabag/115329272917315994 and https://pierce.xyz/@eric/115330726572632285.
TinyTinyRSS server
- https://github.com/tt-rss/tt-rss (main project since Nov 2025)
- https://github.com/HenryQW/Awesome-TTRSS - as far as I can tell this is an unofficial Dockerfile and Docker compose for TTRSS. I have not checked whether it still points to the retired repos or to the new fork.
Plugins
- https://github.com/joshp23/ttrss-to-wallabag-v2 - last commit 2021-03-14, repo archived on 2025-05-19
- https://github.com/Nikkiiw/ttrss-to-wallabag-v2-fix - last commit 2022-04-18, fork from joshp23's repo
- https://github.com/GregThib/ttrss-shaarli
- https://github.com/tt-rss/tt-rss-plugin-googlereaderkeys
- https://github.com/resticDOG/tt-rss-plugin-ntfy - huh, cool.
- https://github.com/lotrfan/ttrss_import_export_all - import/export all articles. But last commit 12 years ago, so I wouldn't expect it to work.
- https://github.com/cas--/tt-rss-plugin-hide_unread_count - another 12-years old repo.
Android
- https://github.com/tt-rss/tt-rss-android - does not have any releases yet, so we cannot use Obtainium to install it on Android.
- https://github.com/fbarthelery/geekttrss - an alternative TTRSS reader app. Also on F-Droid.
iOS
- https://apps.apple.com/us/app/tiny-reader-rss/id689519762 - I know nothing about it.
Other clients
- https://github.com/martinrotter/rssguard - runs on Windows, Linux, BSD, OS/2, and macOS.
- https://github.com/aooiuu/vscode-ttrss - crazy, TTRSS in VSCode. I don't even know what to say.
What others say about TinyTinyRSS
- https://www.extrema.is/blog/2021/11/10/rss-part-10-tiny-tiny-rss - this is part of a whole series of posts about different RSS readers.
- https://old.reddit.com/r/selfhosted/comments/kar97w/selfhosted_rss_with_entire_articles
A simpler alternative to Nextcloud and ownCloud, built with TypeScript and Deno.
First I hear of it. Seems to be developed primarily by a single developer.
I have not tested it.
- https://news.ycombinator.com/item?id=39726172
- https://en.cozy.io - this is another project: Cozy (or Twake as it appears to be called) is clearly not FOSS.
This turned out to be very simple.
In addition to Signal on my phone, and the Signal Desktop app on my computer, I can now have Molly on my tablet. Not crucial for receiving messages, but very useful for sharing links/messages while browsing on the tablet.
- Add Molly's repo to F-Droid (url: https://molly.im/fdroid/foss/fdroid/repo).
- Install Molly.
- Select "Link existing device" in Molly and then use Signal's Link Device function from the phone.
This tablet lacks any Google services, and in the absence of a dedicated MollySocket (which I have not bothered to setup, maybe if I decide to use Molly instead of the Signal client on my phone) the app uses WebSocket which is power-consuming but that does not bother me on the tablet.
- Enable Wireless debugging in Developer options.
- Click on Pair device with pairing code.
- On the computer,
adb pairfollowed by the IP address and port number as shown on the device, for exampleadb pair 192.168.1.322:49014. This will immediate challenge you to provide the six-digit pairing code shown on the device. - Now invoke
scrcpy --tcpip=192.168.1.322:49014(or you could just as well use its serial number as shown byadb devicesinstead,scrcpy -s adb-HJBF6XUO-jtwWkn._adb-tls-connect._tcp
Thanks to rofi launcher and its great rofi-code addition I can quickly open a list of VSCodium's recent workspaces and launch one.
The down-side is that the list of workspaces can get stale over time, including no longer existing workspaces or intra-workspace directories opened once by mistake, etc.
Here's how I usually go about to clean up the list of saved workspaces.
The first hurdle is to descend into each subdirectory inside ~/.config/VSCodium/User/workspaceStorage/ (usually named with a long non-descript hex string) and extract the path of the workspace or folder from its workspace.json:
user@host:~
$ cd ~/.config/VSCodium/User/workspaceStorage && vsws_dirname=$(find . -type f -name "workspace.json" -exec dirname {} \;) && \
vsws_content=$(find . -type f -name "workspace.json" -exec awk 'NR==2{print}' {} \;) && \
paste <( printf "%s" "$vsws_dirname" ) <( printf "%s" "$vsws_content" )
There is some repetition, but it's the best I could manage. Was not able to figure out how to get the output of dirname and awk into two columns on the same row using a single find statement.
shell can pipe concatenated commands, could that help simplify our syntax above? https://michal.sapka.pl/2025/shell-piping-concatenated-commands
This gets the path (limited to only the dirname to save space) and the second row of its workspace.json file on the same row.
Example output:
./16fb4bf8cd57e227024b6ded7c39bdb6 "workspace": "file:///chepec/thesis"
./efa86aa09236afc7bd72a99fc93b10e5 "folder": "file:///projects/ansible/roles/dev/remote"
./4bb9a895f505160553890e3f73739cb1 "folder": "file:///backup/luxor/ansible/playbooks/luxor"
./9084209236dc2c220c3759a756343ac4 "folder": "file:///projects/ansible"
We can grep to filter the output to only contain the Codium workspaces/folder that we want to prune, and then delete those folders in one go:
$ cd ~/.config/VSCodium/User/workspaceStorage && \
vsws_dirname=$(find . -type f -name "workspace.json" -exec dirname {} \;) && \
vsws_content=$(find . -type f -name "workspace.json" -exec awk 'NR==2{print}' {} \;) && \
paste <( printf "%s" "$vsws_dirname" ) <( printf "%s" "$vsws_content" ) | \
grep "projects/ansible" | awk '{print $1}' | xargs rm -r --
Verbose, but works nicely.
Authored by Matthias Bannert, published 2024-09-16.
The online version of this book is free to read and licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
- https://github.com/rse-book/rse-book.github.io - Markdown source code and issues
Number of commits in a git repo can be used as a quick-and-dirty estimation of amount of development time spent in a repo. For variations on this theme, see my previous linkpost.
Here's the bash one-liner I wrote and a few lines of its output:
taha@luxor:~
$ THISPATH="/media/bay/taha/projects/ansible/pub/roles"; find "$THISPATH" -maxdepth 2 -iname ".git" -type d -exec bash -c \
"git -C {} rev-list --count --all | tr '\n' '\t'; echo -e ' ${BGreen}${On_Black}{}${Color_Off}' | \
sed 's+/.git++' | sed 's+$THISPATH/++'" \; | sort -n --reverse -
91 dotfiles
42 R
39 lxd-server
36 python3
36 i3wm
Explainer
- We will look for git repos inside the
/media/bay/taha/projects/ansible/pub/rolesdirectory, and since this path needs to be referenced twice more in the command we can DRY by defining a local var$THISPATH. - some roles may contain git submodules, so to avoid including them here we limit depth to only include the top-level
.gitdirectory (which is 2 levels down from the search path). - get the number of commits (across all branches and authors) for each repo.
trreplaces the trailing newline (introduced by output fromgit -C ...) with a tab so that number and repo name (which we print next) show on the same line.echo -e ' {}'the name of the current repo. I added some colouring for flourish.- to save on repitition in the output replace full path returned by
findby stripping the trailing.gitpart as well as the dirname part. Note that this is just my cosmetic preference. - sort by numeric value
-nand list in--reverseorder. Note the trailing dash which references the output from before the pipe.
Links
include_tasks files that in turn contain import_tasks cause cryptic errors
It appears to be good practice to avoid using import_tasks in a file if the file itself was included with include_tasks.
Because if you don't, expect to get cryptic error messages like:
# ERROR! Unexpected Exception, this is probably a bug: expected str, bytes or os.PathLike object, not NoneTypeI got an instance up and running (obligatory Ansible role https://codeberg.org/ansible/audiobookshelf) and added my audiobooks library to it. Looks very nice :-)
My initial impression is that the audiobooks UX is much better than that of Jellyfin. I will definitely be moving that library to Audiobookshelf.
Podcasts can only be added and episodes downloaded for users with admin privileges, which is a known short-coming with several open issues:
- https://github.com/advplyr/audiobookshelf/issues/1258
- https://github.com/advplyr/audiobookshelf/issues/507
- https://github.com/advplyr/audiobookshelf-app/issues/225
- https://github.com/advplyr/audiobookshelf/issues/4124 - duplicate of 1258
- https://github.com/advplyr/audiobookshelf/pull/3933 - PR submitted by mistake (Copilot)
But the UX in the web client is straight-forward as soon as you figure out how to switch between your "libraries" (most commonly "podcasts" and "audiobooks") using the not-so-prominent button just left of the search bar.
Audiobookshelf supports OPML import, and handled my OPML file with almost 150 feeds without choking.
In summary, I am happy to have it up and running and expect it to be my primary venue for audiobook and podcast listening.
- https://www.audiobookshelf.org - links to the project's own Android and iOS app
- https://plappa.me - another iOS app that works with Audiobookshelf or Jellyfin
- https://arstechnica.com/gadgets/2025/03/i-threw-away-audibles-app-and-now-i-self-host-my-audiobooks - good intro by Ars
- https://getrssfeed.com - extract RSS feed from Apple, Spotify, Deezer, Soundcloud links
- https://www.labnol.org/podcast - give it an Apple Podcast URL and it returns the RSS feed (web form)
- https://fetchrss.com/generator/init - self-blocked behind captcha
Soundcloud
Is the podcast you want to listen to hosted on Soundcloud? First of all, double-check that the podcast is not also hosted somewhere else (more often than not that is the case, and then you can simply avoid Soundcloud).
Soundcloud makes it really hard to discover the podcast's RSS feed. It is not shown anywhere on the page, nor in the HTML source.
Based on a feed URL we already possess and that channel's Soundcloud landing page, we can manually construct the hidden RSS feed endpoint for any Soundcloud "podcast":
- Open the HTML source of the Soundcloud "podcast", for example https://soundcloud.com/user-268302561.
- In the HTML source, find the
user IDproperty, which looks likesoundcloud://users:819898639(I suggest grep forsoundcloud://users). - Copy the numeric part, and construct a URL like this: https://feeds.soundcloud.com/users/soundcloud:users:819898639/sounds.rss.
- Take a moment to reflect on the awfulness of siloed web services and do your best to avoid encouraging them in future.
But I don't understand how to replace Mozilla Locations Services in MicroG with this. I suppose the microg project needs to make that decision, or perhaps I should update microg on the phone (not really possible without re-flashing the whole thing, I assume).
I have a Quarto project of manuscript type with notebooks that generate tables and figures. And I would like to include specific tables from any notebook in the main manuscript index.qmd.
In tackling this question I was constrained by the following factor:
- never
{{< include ... >}}a notebook into the main manuscript, because I found no way to do that without polluting the main manuscript with the entire contents of said notebook. This was unacceptable to me since the whole point of separating analysis into separate files was to keep the main manuscript "clean" and easy to work with for some co-authors who might not need or want to see all the plumbing.
A figure from a notebook is easily included in the main manuscript with {{< embed /notebooks/notebook.qmd#fig-id >}} which renders the plot, its caption and (assuming you defined a label) also numbers it and makes it cross-referable. Unfortunately no such mechanism is offered for tables (I assume because tables are not stand-alone image files that can easily be embedded).
Here is the hack of a solution that I arrived at after wrestling with this today. As far as I know I have not seen this particular approach mentioned anywhere else before.
In the notebook
Create a Markdown table using knitr::kable and save the output (i.e., the rendered Markdown table) to a file on disk, for example:
sas.fityk.params %>%
select(temperature, diameter, starts_with("fit.")) %>%
knitr::kable(col.names = c("$d/\\unit{\\nm}$", "$T_\\text{a}/\\unit{\\degreeCelsius}$",
"SSR", "WSSR", "DoF", "WSSR/DoF", "$R^2$"), digits = c(0, 1, 1, 2, 1, 1, 1, 6),
align = c("l", "l", "l", "l", "l", "l", "l", "l")) %T>%
print() %>%
saveRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
Note that print is necessary if you want to also render the table in the notebook's output.
And since the Markdown will be handled by pandoc we can also use LaTeX math. But another effect of this being Markdown is that the Quarto -> MathJax pipeline is never involved, so more complex LaTeX cannot be used. I wonder if there's a way to force Quarto to handle a particular chunk even if it would normally just be passed on to pandoc...?
In the main manuscript
```{r}
#| results: asis
this.cap <- paste("Goodness of fit parameters for the anti-Stokes/Stokes spectra.")
this.lbl <- "{#tbl-sas-fitinfo}"
cat(c(
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds")),
paste(paste0("\n", ":"), this.cap, this.lbl, "\n")),
sep = "\n")
```
This re-produces the same table as in the notebook, and with a numbered table caption that can be cross-referenced. This works in rendered HTML output and even works in PDF (by some magic). I don't care too much about DOCX right now, so that's success!
Avenues that did not work
My first idea was to simply print the Markdown table in a chunk with a tbl-cap:
```{r}
#| results: asis
#| tbl-cap: Goodness of fit parameters for the anti-Stokes/Stokes spectra.
# label: tbl-sas-fitinfo
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
```
but this simply results in a Quarto error (apparently triggered by the presence of label):
Error running filter /usr/lib/rstudio-server/bin/quarto/share/filters/main.lua:
Block, list of Blocks, or compatible element expected, got table
That prompted me to try printing the caption line manually, but that too fails, surprisingly:
```{r}
#| results: asis
this.cap <- paste("Goodness of fit parameters for the anti-Stokes/Stokes spectra.")
this.lbl <- "{#tbl-sas-fitinfo}"
cat(paste(paste0("\n", ":"), this.cap, this.lbl, "\n"))
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
```
Turns out that in the intermediate Markdown file created by Quarto, every line in the chunk is printed inside its own fenced block, and thus the caption line becomes syntactically separate from the table itself.
The solution (as shown above) is to print the caption line and the table itself in a single command.
Links
- https://github.com/quarto-dev/quarto-cli/discussions/2052 - How to gracefully mix Markdown and latex tables?
- https://github.com/quarto-dev/quarto-cli/discussions/11067 - How to include pre-rendered tables?
- https://forum.posit.co/t/tables-numbering-in-quarto/196413 - tables numbering in quarto
- https://github.com/quarto-dev/quarto-cli/discussions/9334 - debugging advice for main.lua errors
- https://stackoverflow.com/questions/74097579/make-figure-text-bold-in-quarto-figure-captions - Make "Figure" text bold in quarto figure captions
- https://scholar.social/@solarchemist/114678486113073128
sessionInfo
$ quarto check # slightly cleaned-up output
Quarto 1.5.57
[✓] Checking versions of quarto binary dependencies...
Pandoc version 3.2.0: OK
Dart Sass version 1.70.0: OK
Deno version 1.41.0: OK
Typst version 0.11.0: OK
[✓] Checking versions of quarto dependencies......OK
[✓] Checking Quarto installation......OK
Version: 1.5.57
Path: /usr/lib/rstudio-server/bin/quarto/bin
[✓] Checking tools....................OK
TinyTeX: (not installed)
Chromium: (not installed)
[✓] Checking LaTeX....................OK
Using: Installation From Path
Path: /usr/local/texlive/2023/bin/x86_64-linux
Version: 2023
[✓] Checking basic markdown render....OK
[✓] Checking Python 3 installation....OK
Version: 3.10.12
Path: /usr/bin/python3
Jupyter: (None)
[✓] Checking R installation...........OK
Version: 4.5.0
Path: /opt/R/4.5.0/lib/R
knitr: 1.50
rmarkdown: 2.29
[✓] Checking Knitr engine render......OK