605 private links
I would like to have a PDF viewer that lets me click a button (or press a key) to move backwards in the PDF file's git history. In effect, git checkout <commit> file.pdf
but automatically moving back in the commit history on each keypress.
Combined with something like the overview mode of pdfpc, that could make for a very efficient way to glance through the history of a PDF file, such as a thesis or a beamer presentation.
So far I have not found any PDF viewer software with something akin to that.
Maybe I should just open the PDF in VSCodium and use the built-in git support? Would that provide something similar?
Lemmy
- https://browse.feddit.de (search communities across all instances, seems to work better than the search built-in to Lemmy instances)
- https://join-lemmy.org/instances
- https://lemmyverse.net
Lemmy communities (think subreddits) are given in this format: !communityName@instanceName
.
Since Lemmy is on the Fediverse, you can follow Lemmy communities (think subreddits) from Mastodon, just replace the !
by @
, and you should find the account name.
Lemmy Android apps:
- https://join-lemmy.org/apps
- Jerboa, Android app made by Lemmy's developers [I could not figure out how to switch to another instance without logging in first]
- lemmur is listed on F-Droid, but on its Github page the app clearly states that it's no longer maintained.
- https://piefed.social/post/531611
- https://old.reddit.com/r/RedditAlternatives/comments/14tc520/a_curated_list_of_lemmy_apps
I det här avsnittet samtalar Sofie Helgesson med Till Koglin, lektor och forskare vid Lunds tekniska högskola. Han är kulturgeografen som undervisar ingenjörsstudenter med ett fokus på rättvise- och maktaspekter, om cyklisten i ett trafiksystem som är fyllt av normer och hierarkier.
Direktlänk till mp3 (26 min)
Good video. RSS is the way to go.
Yes, please.
Renewable Capacity Statistics 2023 released by the International Renewable Energy Agency (IRENA) confirms upward trend of renewables against declining new fossil fuel capacity.
Video från Uppsala universitets youtube-kanal.
A pilot-scale demonstrator producing hydrogen gas (H2) using concentrated photovoltaics is currently making the rounds in the technical press. Exciting!
- https://www.chemistryworld.com/news/solar-hydrogen-production-scaled-up-in-real-world-test/4017291.article
- https://engineeringcommunity.nature.com/posts/harnessing-the-power-of-the-sun-to-produce-hydrogen-oxygen-and-heat
- https://hackaday.com/2023/04/27/making-hydrogen-with-solar-energy-with-oxygen-and-heat-a-bonus/
The paper from the Haussener lab was published April 10, 2023: Holmes-Gentle, I., Tembhurne, S., Suter, C. et al. Kilowatt-scale solar hydrogen production system using a concentrated integrated photoelectrochemical device. Nat Energy (2023).
Video by "Not Just Bikes", 2023-04-25.
A private collection of movie posters of Egyptian movies.
Learn the skills required to sysadmin a remote Linux server from the commandline.
Course restarts every first Monday of the month
The World Water Map can help us understand where and why water gaps arise, how climate change might aggravate them—and even how they might be managed.
Delightful and detailed interactive article explaining the physics of a bicycle.
Via Andy Baio.
A beginner's guide to creating your own little corner of the internet.
I don't know who is behind it, but I can get behind most of what it says.
Learn how to create unit tests for scientific papers in Python using PyTest.
H. | G. | Fajr | Shuruk | Dhohr | Asr | Magrib | Isha |
---|---|---|---|---|---|---|---|
1 | 23 | 03:17 | 05:37 | 12:01 | 15:11 | 18:16 | 20:16 |
2 | 24 | 03:13 | 05:34 | 12:01 | 15:12 | 18:18 | 20:19 |
3 | 25 | 03:09 | 05:31 | 12:01 | 15:14 | 18:21 | 20:23 |
4 | 26 | 04:05 | 06:28 | 13:00 | 16:15 | 19:23 | 21:26 |
5 | 27 | 04:01 | 06:25 | 13:00 | 16:17 | 19:25 | 21:29 |
6 | 28 | 03:57 | 06:22 | 13:00 | 16:18 | 19:28 | 21:32 |
7 | 29 | 03:53 | 06:19 | 12:59 | 16:19 | 19:30 | 21:35 |
8 | 30 | 03:48 | 06:16 | 12:59 | 16:21 | 19:33 | 21:39 |
9 | 31 | 03:44 | 06:13 | 12:59 | 16:22 | 19:35 | 21:42 |
10 | 1 | 03:41 | 06:10 | 12:59 | 16:24 | 19:37 | 21:43 |
11 | 2 | 03:41 | 06:07 | 12:58 | 16:25 | 19:40 | 21:44 |
12 | 3 | 03:40 | 06:04 | 12:58 | 16:26 | 19:42 | 21:45 |
13 | 4 | 03:39 | 06:01 | 12:58 | 16:28 | 19:45 | 21:46 |
14 | 5 | 03:38 | 05:58 | 12:57 | 16:29 | 19:47 | 21:47 |
15 | 6 | 03:37 | 05:55 | 12:57 | 16:30 | 19:50 | 21:47 |
16 | 7 | 03:36 | 05:52 | 12:57 | 16:32 | 19:52 | 21:48 |
17 | 8 | 03:35 | 05:49 | 12:57 | 16:33 | 19:54 | 21:49 |
18 | 9 | 03:34 | 05:46 | 12:56 | 16:34 | 19:57 | 21:50 |
19 | 10 | 03:33 | 05:43 | 12:56 | 16:36 | 19:59 | 21:51 |
20 | 11 | 03:32 | 05:40 | 12:56 | 16:37 | 20:02 | 21:52 |
21 | 12 | 03:31 | 05:37 | 12:55 | 16:38 | 20:04 | 21:53 |
22 | 13 | 03:31 | 05:34 | 12:55 | 16:39 | 20:07 | 21:54 |
23 | 14 | 03:30 | 05:31 | 12:55 | 16:41 | 20:09 | 21:55 |
24 | 15 | 03:29 | 05:28 | 12:55 | 16:42 | 20:11 | 21:56 |
25 | 16 | 03:28 | 05:25 | 12:54 | 16:43 | 20:14 | 21:57 |
26 | 17 | 03:27 | 05:22 | 12:54 | 16:44 | 20:16 | 21:57 |
27 | 18 | 03:26 | 05:19 | 12:54 | 16:46 | 20:19 | 21:58 |
28 | 19 | 03:25 | 05:16 | 12:54 | 16:47 | 20:21 | 21:59 |
29 | 20 | 03:24 | 05:13 | 12:54 | 16:48 | 20:24 | 22:00 |
H., day of Ramadan (ninth month in the Hijri calendar); G., day of March/April in the Gregorian calendar; Fajr prayer time and start of fast (astronomical twilight); Shuruk is sunrise (Sun at altitude 0°); Dhohr prayer time (noon); Asr prayer time; Magrib prayer time and break fast (sunset, 0°); Isha prayer time.
- https://www.islamiskaforbundet.se/pressmeddelande-fran-sveriges-imamrad-angaende-ramadan-2023/
- https://uppsalamoske.se/pdf/Bontider_2023_kallender.pdf
- https://www.islamiskaforbundet.se/bonetider/
- https://www.islamiskaforbundet.se/bonetiders-kalla/
- https://www.timeanddate.com/sun/sweden/uppsala
- https://www.timeanddate.com/astronomy/civil-twilight.html
- https://www.timeanddate.com/astronomy/refraction.html
H. | G. | Fajr | Shuruk | Dhohr | Asr | Magrib | Isha |
---|---|---|---|---|---|---|---|
1 | 23 | 03:18 | 05:35 | 12:00 | 15:10 | 18:14 | 20:12 |
2 | 24 | 03:15 | 05:33 | 11:59 | 15:11 | 18:16 | 20:15 |
3 | 25 | 03:11 | 05:30 | 11:59 | 15:13 | 18:19 | 20:18 |
4 | 26 | 04:07 | 06:27 | 12:59 | 16:14 | 19:21 | 21:21 |
5 | 27 | 04:03 | 06:24 | 12:58 | 16:16 | 19:23 | 21:24 |
6 | 28 | 03:59 | 06:21 | 12:58 | 16:17 | 19:26 | 21:27 |
7 | 29 | 03:55 | 06:18 | 12:58 | 16:18 | 19:28 | 21:31 |
8 | 30 | 03:51 | 06:15 | 12:58 | 16:20 | 19:30 | 21:34 |
9 | 31 | 03:47 | 06:12 | 12:57 | 16:21 | 19:33 | 21:37 |
10 | 1 | 03:42 | 06:09 | 12:57 | 16:23 | 19:35 | 21:40 |
11 | 2 | 03:38 | 06:06 | 12:57 | 16:24 | 19:37 | 21:44 |
12 | 3 | 03:34 | 06:03 | 12:56 | 16:25 | 19:40 | 21:46 |
13 | 4 | 03:33 | 06:00 | 12:56 | 16:27 | 19:42 | 21:47 |
14 | 5 | 03:33 | 05:57 | 12:56 | 16:28 | 19:45 | 21:48 |
15 | 6 | 03:32 | 05:54 | 12:55 | 16:29 | 19:47 | 21:49 |
16 | 7 | 03:31 | 05:51 | 12:55 | 16:30 | 19:49 | 21:50 |
17 | 8 | 03:30 | 05:48 | 12:55 | 16:32 | 19:52 | 21:51 |
18 | 9 | 03:29 | 05:45 | 12:55 | 16:33 | 19:54 | 21:52 |
19 | 10 | 03:28 | 05:42 | 12:54 | 16:34 | 19:56 | 21:53 |
20 | 11 | 03:27 | 05:39 | 12:54 | 16:35 | 19:59 | 21:53 |
21 | 12 | 03:26 | 05:37 | 12:54 | 16:37 | 20:01 | 21:54 |
22 | 13 | 03:25 | 05:34 | 12:54 | 16:38 | 20:04 | 21:55 |
23 | 14 | 03:24 | 05:31 | 12:53 | 16:39 | 20:06 | 21:56 |
24 | 15 | 03:23 | 05:28 | 12:53 | 16:40 | 20:08 | 21:57 |
25 | 16 | 03:22 | 05:25 | 12:53 | 16:42 | 20:11 | 21:58 |
26 | 17 | 03:21 | 05:22 | 12:53 | 16:43 | 20:13 | 21:59 |
27 | 18 | 03:20 | 05:19 | 12:52 | 16:44 | 20:15 | 22:00 |
28 | 19 | 03:19 | 05:16 | 12:52 | 16:45 | 20:18 | 22:01 |
29 | 20 | 03:18 | 05:14 | 12:52 | 16:46 | 20:20 | 22:02 |
H., day of Ramadan (ninth month in the Hijri calendar); G., day of March/April in the Gregorian calendar, Fajr prayer time and start of fast (astronomical twilight), Shuruk is sunrise (Sun at altitude 0°) , Dhohr prayer time (noon), Asr prayer time, Magrib prayer time and break fast (sunset, 0°), Isha prayer time.
What an interesting idea. A Python script that given an existing system creates an Ansible playbook that will duplicate it.
Fin och informativ visualisering av Per Axbom.
Have you also been in the situation where you need to write up your latest Raman spectra of ZnO?
And just exasperated at the thought of typing up all those mode assignments using LaTeX math notation (because honestly, it looks good).
I created this macro, \nonresmode{E2h}[E2l][long][diff]
, to make it easier to write.
Now all I have to do is write, for example, \nonresmode{A1LO}
, and LaTeX does all the work and produces a nicely typeset label.
Here is some example LaTeX source:
Non-resonant Raman with green laser excitation (\qty{532}{\nm}).
All the observed Raman modes could be assigned to either a fundamental mode
(\nonresmode{E2l}[][long], \nonresmode{A1TO}, \nonresmode{E1TO}, \nonresmode{E2h}[][long],
\nonresmode{E1LO}, \nonresmode{A1LO}), an overtone (\nonresmode{2E2l}[][long], \nonresmode{2E1LO},
\nonresmode{2A1LO}), a sum mode (\nonresmode{E2h}[E2l][long], \nonresmode{E2h}[2E2l][long],
\nonresmode{2E2h}[E2l][long], $2(\nonresmode{E2h}[E2l][long])$) or
a difference mode (\nonresmode{E2h}[E2l][long][diff]).
and the resulting output:
And here is the macro definitions (to avoid repeating the main "correspondence table" between the short-codes and the typeset text,
I opted to define multiple functions. I also made use of the beautiful macro by egreg that defines a case-like environment:
% defines a case environment
% code taken from a TeX.SE answer by egreg
% https://tex.stackexchange.com/a/451094/10824
% fantastic piece of code, works beautifully, for an arbitrary number of cases
\ExplSyntaxOn
\NewExpandableDocumentCommand{\stringcase}{mO{}m}{%
\str_case_e:nnF { #1 } { #3 } { #2 }
}
\ExplSyntaxOff
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesShort}{m}{%
\stringcase{#1}[\textbf{??}]{%
% note, \text{} inside math environment will obey font settings from
% surrounding environment (e.g., bold) but \mathrm{} will not which
% makes it better for this purpose
% {shortcode}{LaTeX typeset text}
{E2l}{\ensuremath{E_{2\mathrm{l}}}}%
{A1TO}{\ensuremath{A_{1(\mathrm{TO})}}}%
{E1TO}{\ensuremath{E_{1(\mathrm{TO})}}}%
{E2h}{\ensuremath{E_{2\mathrm{h}}}}%
{E1LO}{\ensuremath{E_{1(\mathrm{LO})}}}%
{A1LO}{\ensuremath{A_{1(\mathrm{LO})}}}%
{2E2l}{\ensuremath{2E_{2\mathrm{l}}}}%
{2E2h}{\ensuremath{2E_{2\mathrm{h}}}}%
{2E1LO}{\ensuremath{2E_{1(\mathrm{LO})}}}%
{2A1LO}{\ensuremath{2A_{1(\mathrm{LO})}}}%
}%
}
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesLong}{m}{%
\stringcase{#1}[\textbf{??}]{%
{E2l}{\ensuremath{E_{2\mathrm{(low)}}}}%
{A1TO}{\ensuremath{A_{1(\mathrm{TO})}}}%
{E1TO}{\ensuremath{E_{1(\mathrm{TO})}}}%
{E2h}{\ensuremath{E_{2\mathrm{(high)}}}}%
{E1LO}{\ensuremath{E_{1(\mathrm{LO})}}}%
{A1LO}{\ensuremath{A_{1(\mathrm{LO})}}}%
{2E2l}{\ensuremath{2E_{2\mathrm{(low)}}}}%
{2E2h}{\ensuremath{2E_{2\mathrm{(high)}}}}%
{2E1LO}{\ensuremath{2E_{1(\mathrm{LO})}}}%
{2A1LO}{\ensuremath{2A_{1(\mathrm{LO})}}}%
}%
}
% not meant to be exposed to user
\NewDocumentCommand{\NonResonantModesLogic}{m O{short}}{%
\IfNoValueTF{#2}{%
% arg #2 (optional) not given, proceed as "short"
\NonResonantModesShort{#1}%
}{%
% arg #2 (optional) was given, check if it is "long"
\ifthenelse{\equal{#2}{long}}{%
% "long" was given
\NonResonantModesLong{#1}%
}{%
% arg was given, but is not equal to "long"
% check if it is "short"
\ifthenelse{\equal{#2}{short}}{%
\NonResonantModesShort{#1}%
}{%
% arg was neither "long" nor "short", something else
\NonResonantModesShort{}%
}%
}%
}%
}
% Non-resonant Raman modes of ZnO
% \nonresmode{E2h}[E2l][long][diff]
% Use \nonresmode like this:
% \nonresmode{E2l} => E2l
% \nonresmode{E2l}[][long] => E2low
% \nonresmode{} => ??
% \nonresmode => ERROR
% \nonresmode{E2l}[E2h] => E2l+E2h
% \nonresmode{E2l}[E2h][][diff] => E2l-E2h
% \nonresmode{E2l}[E2h][long] => E2low + E2high
% only specify optional arguments if necessary, i.e.,
% please don't do \nonresmode{E2l}[][][], but please do \nonresmode{E2l}
% remember, optional arg "o" will supply the special -NoValue- marker if not given
% the arg O{sum} is an optional arg with the default value "sum"
\NewDocumentCommand{\nonresmode}{m o O{short} O{sum}}{%
\IfNoValueTF{#2}{%
% no arg #2 was given, which means we are typesetting a single mode
% if no arg #2 was given, then we can disregard #4
\IfNoValueTF{#3}{%
% this way, if #3 was not given, we avoid passing the special -NoValue- marker
\NonResonantModesLogic{#1}%
}{%
% if #3 was given, pass it on, unless it was empty
\ifthenelse{\isempty{#3}}{%
\NonResonantModesLogic{#1}%
}{%
\NonResonantModesLogic{#1}[#3]%
}%
}%
}{%
% If optional arg #2 was given and is empty, perform the same code as if -NoValue-
\ifthenelse{\isempty{#2}}{%
\IfNoValueTF{#3}{%
% this way, if #3 was not given, we avoid passing the special -NoValue- marker
\NonResonantModesLogic{#1}%
}{%
% if #3 was given, pass it on, unless it was empty
\ifthenelse{\isempty{#3}}{%
\NonResonantModesLogic{#1}%
}{%
\NonResonantModesLogic{#1}[#3]%
}%
}%
}{%
% if #2 is not -NoValue- nor empty, then just assume that it is one of the mode shortcodes
% (we don't try to check that it is in fact part of that set)
% But first, determine if we are writing "sum" or "diff" modes
% (note that we assume that #4 has a value, since it is the last arg we never expect it%
% to be given explicitly empty)
\ifthenelse{\equal{#4}{diff}}{%
% Since #4 has a default, we can simplify this if-else to only check for "diff"
% and we can then assume that the else-clause matches "sum"
% But note that arg #3 may have been given explicity empty, [], thus overriding the default
% so we must check for that
\ifthenelse{\isempty{#3}}{%
% Note, to get consistent spacing around the +/- sign whether the
% call to \nonresmode{} is surrounded by math mode or not, it is
% good to surround everything in ensuremath{} here
% Also, for "short" mode, I want to kill the space surrounding the +/- sign
% (to keep it compact, which is probably what the user wants in "short" mode)
\ensuremath{\NonResonantModesLogic{#1}{-}\NonResonantModesLogic{#2}}%
}{%
\ifthenelse{\equal{#3}{long}}{%
\ensuremath{\NonResonantModesLogic{#1}[#3]-\NonResonantModesLogic{#2}[#3]}%
}{%
\ensuremath{\NonResonantModesLogic{#1}{-}\NonResonantModesLogic{#2}}%
}%
}%
}{%
\ifthenelse{\isempty{#3}}{%
\ensuremath{\NonResonantModesLogic{#1}{+}\NonResonantModesLogic{#2}}%
}{%
\ifthenelse{\equal{#3}{long}}{%
\ensuremath{\NonResonantModesLogic{#1}[#3]+\NonResonantModesLogic{#2}[#3]}%
}{%
\ensuremath{\NonResonantModesLogic{#1}{+}\NonResonantModesLogic{#2}}%
}%
}%
}%
}%
}%
}