Compare commits
442 Commits
db6a3faa44
...
91fa59e397
| Author | SHA1 | Date | |
|---|---|---|---|
| 91fa59e397 | |||
| f3bfe89f27 | |||
| ee6f981006 | |||
| b040bebd1d | |||
| f69629d2da | |||
| 0668f0db74 | |||
| 5fcd57a061 | |||
| ad1544759f | |||
| e1c950a530 | |||
| f9632c37f8 | |||
| 1f0cb4ae76 | |||
| d49d078bed | |||
| e98fdb89ab | |||
| 6afe05b5fd | |||
| 7d5aebf882 | |||
| 94cbfd38a6 | |||
| 4da7780472 | |||
| a6dfc267fd | |||
| d6126501ba | |||
| ac0deb47b6 | |||
| f7d676de77 | |||
| cf1db201b2 | |||
| e6e4846529 | |||
| 084d556c56 | |||
| ff0fc18d0a | |||
| 19c7e32678 | |||
| 017c19e7d0 | |||
| a36eff8749 | |||
| df17b11458 | |||
| 0dc7b7eb3d | |||
| dff6eaf587 | |||
| 4b6b67b587 | |||
| 20e7d244d1 | |||
| c5d3b8e7f0 | |||
| 6bbfb0d124 | |||
| 46d03d5ca7 | |||
| e366e6ce87 | |||
| e415f70bbb | |||
| 200c727bbf | |||
| 7413021440 | |||
| 20b4805335 | |||
| f7dff9deab | |||
| f569933732 | |||
| ee895d2e4f | |||
| 5ee8623af2 | |||
| a0e4b209b0 | |||
| ce25867421 | |||
| f89bba35a6 | |||
| d591721a61 | |||
| 343b4f155e | |||
| 39a211a846 | |||
| 142985c505 | |||
| 3f3dc2d037 | |||
| 3269d763aa | |||
| f2d8ee8552 | |||
| 8d984a0672 | |||
| f3733418b2 | |||
| ce8b05b142 | |||
| 4a5787e0c6 | |||
| 6c11093033 | |||
| 750504744f | |||
| c26ec1b6f1 | |||
| 2ef32f773c | |||
| fc9fcd602a | |||
| 0e37ab5fe1 | |||
| a1b387e454 | |||
| 380abe9957 | |||
| 37c12783bb | |||
| 7379e84e79 | |||
| b802f88df9 | |||
| bd94c4ad00 | |||
| 570c6e175d | |||
| 96661dd0d4 | |||
| 28db7799ea | |||
| 508059c99e | |||
| b9f9cc7d7a | |||
| eae0c7cb59 | |||
| 2280635cd6 | |||
| 16ada09600 | |||
| 0d291d715c | |||
| 66001f76f7 | |||
| 1e3b85067d | |||
| 36ee1f3adc | |||
| 25e9c071b0 | |||
| 80cee2dbd0 | |||
| ee92934c74 | |||
| db0f3fed91 | |||
| adeaa0484d | |||
| 815810830e | |||
| 7a52e1907c | |||
| 22a2e1b9e8 | |||
| f29461ae32 | |||
| 208197f099 | |||
| 479ca1b671 | |||
| 40529fbdcb | |||
| 9b0d3fb21e | |||
| d8444131d8 | |||
| af540456a6 | |||
| 42d6734da8 | |||
| 071a8084a0 | |||
| 24a0c58592 | |||
| 810a6dfcec | |||
| 47ad89dee1 | |||
| 8af1b259f5 | |||
| 560003d4fd | |||
| 68ff45075c | |||
| fc68d16197 | |||
| f6ec1293f4 | |||
| 4feeff978c | |||
| 7b19292912 | |||
| 0627db0eb9 | |||
| ae2f6dde41 | |||
| 3bf70656dc | |||
| 1cf989d727 | |||
| 19f734e622 | |||
| d6e3d9626c | |||
| 9c32e42dcc | |||
| 61e6d3232b | |||
| d0fd8cde46 | |||
| 5223ea53f6 | |||
| 253426ce00 | |||
| df67b6cd26 | |||
| 766da21097 | |||
| 18461c0d59 | |||
| 028b151c78 | |||
| 7176b066bb | |||
| c3c3614f63 | |||
| e13288fc29 | |||
| e9e3704b67 | |||
| 7d3c7342ae | |||
| 8f80ed2cce | |||
| d00f996f59 | |||
| e40fd24f26 | |||
| 83efd6c876 | |||
| f0c4206ab8 | |||
| 8b43a6ffb6 | |||
| 2bca10b0e4 | |||
| eec3e27d66 | |||
| e51ef52721 | |||
| 9dc67d402f | |||
| 62ec4e014a | |||
| 4d03842f7c | |||
| 8fedc5518e | |||
| 43dc336638 | |||
| 2b08fcd21a | |||
| 557618d43f | |||
| e8ac6cf0f3 | |||
| f8fc391cae | |||
| 6c1afa3fd8 | |||
| 008584b465 | |||
| a22c862192 | |||
| cd0c070439 | |||
| 201ff64b25 | |||
| 9bee145e25 | |||
| 4528b7c2a6 | |||
| 1eac0fcad8 | |||
| dd15f9c943 | |||
| 4048b3327a | |||
| f4229e34f6 | |||
| 5208a3483b | |||
| 92eacfad20 | |||
| 80309d107b | |||
| d0f151595f | |||
| 93f8d3aa89 | |||
| d84645f3e1 | |||
| 55b71d6901 | |||
| 89c65ea578 | |||
| 129273e8d8 | |||
| fdac196c6c | |||
| 3f4b4fb810 | |||
| 2c7211ffa3 | |||
| 18f25307ab | |||
| 7c55d10ceb | |||
| 5c549faaa8 | |||
| 9fd35a9ce4 | |||
| 5487a93972 | |||
| fe16ea373f | |||
| 163434af09 | |||
| 71164400d4 | |||
| f887dacdea | |||
| 4f5c8dbbaf | |||
| 14b192b1d9 | |||
| 2b04812320 | |||
| 2f6f6ba703 | |||
| 371b0c7e76 | |||
| ae34eacf4a | |||
| dab6f08d89 | |||
| 8190523c30 | |||
| d335d69ba6 | |||
| cec49eb5fc | |||
| 22db38c98f | |||
| 0d4eebbb59 | |||
| 025f6a0c0c | |||
| abc74c5445 | |||
| 6942f09f69 | |||
| 56f6855af7 | |||
| 81c822e68e | |||
| 53e80b1f19 | |||
| 21feb01e7b | |||
| 9ea7b2b475 | |||
| fce4d89e1d | |||
| 6b282375f8 | |||
| 260986b9f2 | |||
| 15afbe94bd | |||
| efd35a9cd1 | |||
| 50ad1d637c | |||
| c299d53146 | |||
| 152b71e718 | |||
| 0911d5b92a | |||
| 5ddae068af | |||
| d17be714ec | |||
| 28ce15d74d | |||
| 504f9bb570 | |||
| f158cb63e8 | |||
| 8860f76cad | |||
| b86798cd69 | |||
| 7ed74931cf | |||
| 6e9d33b483 | |||
| 58abaefbc4 | |||
| 5ea7827a8a | |||
| b17e4a13f9 | |||
| 9c4e60c2c2 | |||
| e7376917bd | |||
| 130e191d37 | |||
| 349f69e30a | |||
| 59ab6405c5 | |||
| a0dab66aa5 | |||
| 525cad4117 | |||
| 24ee74d614 | |||
| 15b4b28d2c | |||
| b1ce302e4b | |||
| b8b85f55cd | |||
| 1189626a6f | |||
| dbd95dd7b8 | |||
| 81b680a7d2 | |||
| ba60e121df | |||
| 432e6c8521 | |||
| c8160122b3 | |||
| 3863fc25a5 | |||
| 2b26cd2f46 | |||
| 30f2079f0b | |||
| 366436b6d3 | |||
| 9f1cd02144 | |||
| 82ccae1315 | |||
| 1df80460d2 | |||
| 7f17fe8874 | |||
| 5880a6e5f6 | |||
| ecbb45d6ac | |||
| c564d945d4 | |||
| ed887b0412 | |||
| fe1d3fbb80 | |||
| 5234ca32fd | |||
| cfe0c0e6e6 | |||
| 7afe7344ac | |||
| bd83ca53ab | |||
| 0d9c99a24e | |||
| db98b1f698 | |||
| 84c4b6b81c | |||
| 19e195b894 | |||
| 54c2bd119f | |||
| e5d85c1b38 | |||
| f1486b84c1 | |||
| 472f4b0334 | |||
| 425dca3e00 | |||
| e4080cf931 | |||
| fc9285f89d | |||
| fbe238f5b6 | |||
| 9874da566d | |||
| ebc5c4d84f | |||
| 8634a9e133 | |||
| 0ce79ed79e | |||
| 5f492ee1d7 | |||
| 9071a4de8b | |||
| 3040a803b2 | |||
| 70a9e855cf | |||
| aa64e9ef24 | |||
| ba2b74fd5a | |||
| 1ae5d9e25e | |||
| ff98ba47c4 | |||
| 599b23ef52 | |||
| 8dbee06d1d | |||
| d522113cb9 | |||
| 7bfd786c01 | |||
| 5a5f4672cd | |||
| 2646ad4b70 | |||
| b120a7ca85 | |||
| 2a0254b684 | |||
| e3e6e7662d | |||
| 868f825e26 | |||
| f231dc81f1 | |||
| a758eef354 | |||
| 9c9c41fb57 | |||
| 1a1708f16f | |||
| efe1b7e399 | |||
| eb9876aff6 | |||
| 8d31c552f5 | |||
| 68f4d54dd1 | |||
| 2042d58b72 | |||
| 2c8c90e6e4 | |||
| 208dcb7dde | |||
| e2f82a6383 | |||
| d704816de9 | |||
| 74ec4eb22a | |||
| 0a5f9b55f5 | |||
| 900de39e2f | |||
| 1e466d07df | |||
| 13807c5e8f | |||
| d8d6d6d421 | |||
| a242ddd39c | |||
| a2c5fe1f5e | |||
| 2c52ef9ff0 | |||
| acb91695ac | |||
| 9d93760e6f | |||
| aad67b9d99 | |||
| e1d406023d | |||
| db6bb90af8 | |||
| 1266c8f04e | |||
| 2b7823788c | |||
| 86eacdd3e5 | |||
| 4fa074f893 | |||
| a260a1bc1b | |||
| 8912d2b9bc | |||
| b4015ded86 | |||
| 0f54d63a46 | |||
| 6c656182f1 | |||
| be4187de3c | |||
| 0b22a1b8a4 | |||
| f18f1937ae | |||
| 4b78ec9134 | |||
| 6c0c26b3aa | |||
| fb1744306d | |||
| 394c7ecd7b | |||
| 3276f54e86 | |||
| 4c806b8ae9 | |||
| 832866cbfa | |||
| 9fc393bb6a | |||
| d81d9d58e1 | |||
| d54dcc8d8f | |||
| a5fae4a289 | |||
| a355926cf0 | |||
| d7a4420205 | |||
| 0b55ce3d02 | |||
| 0ce574800e | |||
| a7e09e55df | |||
| 1622b3e7fc | |||
| 3424cac761 | |||
| f98af9aeef | |||
| 8c14b75e44 | |||
| e497e1b88b | |||
| 07411beb49 | |||
| e8bab9928d | |||
| 544d5a3d69 | |||
| 312f2cb368 | |||
| 45ac6e95e9 | |||
| e6bb6e735d | |||
| cfbfcdbe8c | |||
| c31bfd6b4d | |||
| d20fa359d9 | |||
| 9be15fdad2 | |||
| 13e365002c | |||
| a38072762f | |||
| adf1ff29a7 | |||
| 1ec8d7a625 | |||
| f78f4f5822 | |||
| 67a57cb3e5 | |||
| 85896f8546 | |||
| 5e728773c3 | |||
| 0a06cf564b | |||
| db26b2ae37 | |||
| f7d00dec25 | |||
| 2053ec82b7 | |||
| f2434a17c2 | |||
| 1f7045fcfe | |||
| 0c4a1efa27 | |||
| 530958496b | |||
| df378a2933 | |||
| 2a0fe5a137 | |||
| dfbeafa2b2 | |||
| 7d4281a5c1 | |||
| dfea0be2d9 | |||
| df91da8c34 | |||
| 30c21155af | |||
| a43016ebee | |||
| 801bb4ba3c | |||
| a9d740e95a | |||
| 08eaf312f2 | |||
| 0b57bbc6e3 | |||
| 6558a6ab77 | |||
| 0d196af473 | |||
| d35becb663 | |||
| 5421eab09a | |||
| 1c7de2f7c9 | |||
| c7692995f4 | |||
| 0af185afd8 | |||
| 470b3d2512 | |||
| 1bf6747b3a | |||
| 59bf51dfde | |||
| b72d9936a2 | |||
| 5ebb57deff | |||
| 5b82a72647 | |||
| a5c7205481 | |||
| fd1b467a60 | |||
| 882161b21e | |||
| 5e8ff50c98 | |||
| cdb0688ec1 | |||
| ebb5e94416 | |||
| 89049d0b1f | |||
| 6d16772d07 | |||
| e37f9e2b0f | |||
| 9767238c76 | |||
| a5a0fd9b6f | |||
| be69070f61 | |||
| 53f6dcec8d | |||
| 87c4521de3 | |||
| 461d6d2f34 | |||
| ef2ffa61c3 | |||
| c0b23ad450 | |||
| f12ba9f8b0 | |||
| a211e9ebee | |||
| 5dbbb27c43 | |||
| 69bb2128db | |||
| de7cae6208 | |||
| de4ac8cbd6 | |||
| e1dcad50d0 | |||
| 0120be66fb | |||
| 6cb079a44e | |||
| a5449067a7 | |||
| 1009736d81 | |||
| a94765e8ae | |||
| 9630b23ce2 | |||
| ed158ee87f | |||
| 480dd95d9b | |||
| f7b18098b1 | |||
| c580254dde | |||
| 7e6c395ff8 | |||
| 6978677cb5 | |||
| f5b4580dae | |||
| 035becd018 | |||
| a7fb69ab92 | |||
| 733eb93f23 | |||
| b60e821eaa | |||
| f43d549294 |
BIN
doc/bsc-ssf.pdf
46
doc/trim.sh
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Trims the jungle repository by moving the website to its own repository and
|
||||||
|
# removing it from jungle. It also removes big pdf files and kernel
|
||||||
|
# configurations so the jungle repository is small.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ -e oldjungle -o -e newjungle -o -e website ]; then
|
||||||
|
echo "remove oldjungle/, newjungle/ and website/ first"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clone the old jungle repo
|
||||||
|
git clone gitea@tent:rarias/jungle.git oldjungle
|
||||||
|
|
||||||
|
# First split the website into a new repository
|
||||||
|
mkdir website && git -C website init -b master
|
||||||
|
git-filter-repo \
|
||||||
|
--path web \
|
||||||
|
--subdirectory-filter web \
|
||||||
|
--source oldjungle \
|
||||||
|
--target website
|
||||||
|
|
||||||
|
# Then remove the website, pdf files and big kernel configs
|
||||||
|
mkdir newjungle && git -C newjungle init -b master
|
||||||
|
git-filter-repo \
|
||||||
|
--invert-paths \
|
||||||
|
--path web \
|
||||||
|
--path-glob 'doc*.pdf' \
|
||||||
|
--path-glob '**/kernel/configs/lockdep' \
|
||||||
|
--path-glob '**/kernel/configs/defconfig' \
|
||||||
|
--source oldjungle \
|
||||||
|
--target newjungle
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
du -sh oldjungle newjungle website
|
||||||
|
# 57M oldjungle
|
||||||
|
# 2,3M newjungle
|
||||||
|
# 6,4M website
|
||||||
|
|
||||||
|
du -sh --exclude=.git oldjungle newjungle website
|
||||||
|
# 30M oldjungle
|
||||||
|
# 700K newjungle
|
||||||
|
# 3,5M website
|
||||||
@ -156,7 +156,6 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
csiringo = {
|
csiringo = {
|
||||||
# Arbitrary UID but large so it doesn't collide with other users on ssfhead.
|
|
||||||
uid = 9653;
|
uid = 9653;
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
home = "/home/Computational/csiringo";
|
home = "/home/Computational/csiringo";
|
||||||
@ -168,6 +167,19 @@
|
|||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA65zvvG50iuFEMf+guRwZB65jlGXfGLF4HO+THFaed csiringo@bsc.es"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA65zvvG50iuFEMf+guRwZB65jlGXfGLF4HO+THFaed csiringo@bsc.es"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
acinca = {
|
||||||
|
uid = 9654;
|
||||||
|
isNormalUser = true;
|
||||||
|
home = "/home/Computational/acinca";
|
||||||
|
description = "Arnau Cinca";
|
||||||
|
group = "Computational";
|
||||||
|
hosts = [ "apex" "hut" "fox" "owl1" "owl2" ];
|
||||||
|
hashedPassword = "$6$S6PUeRpdzYlidxzI$szyvWejQ4hEN76yBYhp1diVO5ew1FFg.cz4lKiXt2Idy4XdpifwrFTCIzLTs5dvYlR62m7ekA5MrhcVxR5F/q/";
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFmMqKqPg4uocNOr3O41kLbZMOMJn3m2ZdN1JvTR96z3 bsccns@arnau-bsc"
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
groups = {
|
groups = {
|
||||||
|
|||||||
@ -2,10 +2,13 @@
|
|||||||
let
|
let
|
||||||
website = pkgs.stdenv.mkDerivation {
|
website = pkgs.stdenv.mkDerivation {
|
||||||
name = "jungle-web";
|
name = "jungle-web";
|
||||||
src = theFlake;
|
src = pkgs.fetchgit {
|
||||||
|
url = "https://jungle.bsc.es/git/rarias/jungle-website.git";
|
||||||
|
rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1";
|
||||||
|
hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4=";
|
||||||
|
};
|
||||||
buildInputs = [ pkgs.hugo ];
|
buildInputs = [ pkgs.hugo ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
cd web
|
|
||||||
rm -rf public/
|
rm -rf public/
|
||||||
hugo
|
hugo
|
||||||
'';
|
'';
|
||||||
|
|||||||
@ -12,6 +12,12 @@
|
|||||||
# https://github.com/NixOS/nixpkgs/commit/ae93ed0f0d4e7be0a286d1fca86446318c0c6ffb
|
# https://github.com/NixOS/nixpkgs/commit/ae93ed0f0d4e7be0a286d1fca86446318c0c6ffb
|
||||||
# https://bugs.schedmd.com/show_bug.cgi?id=2095#c24
|
# https://bugs.schedmd.com/show_bug.cgi?id=2095#c24
|
||||||
KillMode = lib.mkForce "control-group";
|
KillMode = lib.mkForce "control-group";
|
||||||
|
|
||||||
|
# If slurmd fails to contact the control server it will fail, causing the
|
||||||
|
# node to remain out of service until manually restarted. Always try to
|
||||||
|
# restart it.
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = "30s";
|
||||||
};
|
};
|
||||||
|
|
||||||
services.slurm.client.enable = true;
|
services.slurm.client.enable = true;
|
||||||
|
|||||||
@ -2,10 +2,13 @@
|
|||||||
let
|
let
|
||||||
website = pkgs.stdenv.mkDerivation {
|
website = pkgs.stdenv.mkDerivation {
|
||||||
name = "jungle-web";
|
name = "jungle-web";
|
||||||
src = theFlake;
|
src = pkgs.fetchgit {
|
||||||
|
url = "https://jungle.bsc.es/git/rarias/jungle-website.git";
|
||||||
|
rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1";
|
||||||
|
hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4=";
|
||||||
|
};
|
||||||
buildInputs = [ pkgs.hugo ];
|
buildInputs = [ pkgs.hugo ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
cd web
|
|
||||||
rm -rf public/
|
rm -rf public/
|
||||||
hugo
|
hugo
|
||||||
'';
|
'';
|
||||||
|
|||||||
1
web/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
./public
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "{{ replace .Name "-" " " | title }}"
|
|
||||||
date: {{ .Date }}
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
Welcome to the jungle, a set of machines with no imposed rules that are fully
|
|
||||||
controlled and maintained by their users.
|
|
||||||
|
|
||||||
The configuration of all the machines is written in a centralized [git
|
|
||||||
repository][config] using the Nix language for NixOS. Changes in the
|
|
||||||
configuration of the machines are introduced by merge requests and pass a review
|
|
||||||
step before being deployed.
|
|
||||||
|
|
||||||
[config]: https://pm.bsc.es/gitlab/rarias/jungle
|
|
||||||
|
|
||||||
The machines have access to the large list of packages available in
|
|
||||||
[Nixpkgs][nixpkgs] and a custom set of packages named [bscpkgs][bscpkgs],
|
|
||||||
specifically tailored to our needs for HPC machines. Users can install their own
|
|
||||||
packages and made them system-wide available by opening a merge request.
|
|
||||||
|
|
||||||
[nixpkgs]: https://github.com/NixOS/nixpkgs
|
|
||||||
[bscpkgs]: https://pm.bsc.es/gitlab/rarias/bscpkgs
|
|
||||||
|
|
||||||
We have put a lot of effort to guarantee very good reproducibility properties in
|
|
||||||
the configuration of the machines and the software they use.
|
|
||||||
|
|
||||||
To enter the jungle machines follow the [instructions](access) to submit a
|
|
||||||
request.
|
|
||||||
|
Before Width: | Height: | Size: 470 KiB |
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Enter the jungle"
|
|
||||||
description: "Request access to the machines"
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
To request access to the machines we will need some information:
|
|
||||||
|
|
||||||
1. Which machines you want access to ([hut](/hut), [fox](/fox), owl1, owl2, eudy, koro...)
|
|
||||||
1. Your user name (make sure it matches the one you use for the BSC intranet)
|
|
||||||
1. Your real name and surname (for identification purposes)
|
|
||||||
1. The salted hash of your login password, generated with `mkpasswd -m sha-512`
|
|
||||||
1. An SSH public key of type Ed25519 (can be generated with `ssh-keygen -t ed25519`)
|
|
||||||
|
|
||||||
Send an email to <jungle@bsc.es> with the details.
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Docs"
|
|
||||||
description: "Documentation for users of jungle machines"
|
|
||||||
date: 2023-09-15
|
|
||||||
---
|
|
||||||
|
|
||||||
If this is the first time you use any of the jungle machines with NixOS, follow
|
|
||||||
the [quick start guide](quickstart).
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,234 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Quick start"
|
|
||||||
date: 2023-09-15
|
|
||||||
---
|
|
||||||
|
|
||||||
This documentation will guide you on how to build custom packages of software
|
|
||||||
and use them in the jungle machines. It has been designed to reduce the friction
|
|
||||||
from users coming from module systems.
|
|
||||||
|
|
||||||
You should be able to access the jungle machines, otherwise [request
|
|
||||||
access](/access).
|
|
||||||
|
|
||||||
## Changes from other HPC machines
|
|
||||||
|
|
||||||
Users of other machines have been using the Lmod tool (module load ...) to add
|
|
||||||
or remove programs from their environment, as well as manually building their
|
|
||||||
own software for too many years.
|
|
||||||
|
|
||||||
While we cannot prevent users from continuing to use this tedious mechanism, we
|
|
||||||
have designed the jungle machines to be much easier to operate by using the nix
|
|
||||||
package manager.
|
|
||||||
|
|
||||||
### Freedom to install packages
|
|
||||||
|
|
||||||
When a user wanted to install a package, it was forced to either do it on its
|
|
||||||
own directory, or request a system administrator to install it in a shared
|
|
||||||
directory, so other users can also use that package.
|
|
||||||
|
|
||||||
This situation is gone, each user can install any package of software by
|
|
||||||
themselves, without requiring any other authorization. When two users request
|
|
||||||
the same package, the same copy will be provided.
|
|
||||||
|
|
||||||
A new package will be downloaded if it is available (someone already built it)
|
|
||||||
or will be built from source on demand.
|
|
||||||
|
|
||||||
### No changes over time
|
|
||||||
|
|
||||||
All users retain the same versions of the packages they request until they
|
|
||||||
decide to update them.
|
|
||||||
|
|
||||||
## Using nix to manage packages
|
|
||||||
|
|
||||||
In this chapter we show how to install packages and enter a development shell to
|
|
||||||
build new programs from source. The examples are done from the hut machine,
|
|
||||||
read [this page](/access) to request access.
|
|
||||||
|
|
||||||
### Installing binaries
|
|
||||||
|
|
||||||
To temporarily install new packages, use:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut% nix shell jungle#gcc jungle#cowsay jungle#ovni
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice that the packages are described as two parts divided by the `#` symbol.
|
|
||||||
The first part defines where to take the package from and the second part is
|
|
||||||
the name of the package. For now we will use `jungle#<package>`. You can find
|
|
||||||
many more packages here:
|
|
||||||
|
|
||||||
<https://search.nixos.org/packages>
|
|
||||||
|
|
||||||
You will now enter a new shell, where those requested package **binaries are
|
|
||||||
available in $PATH**:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut% cowsay hello world
|
|
||||||
_____________
|
|
||||||
< hello world >
|
|
||||||
-------------
|
|
||||||
\ ^__^
|
|
||||||
\ (oo)\_______
|
|
||||||
(__)\ )\/\
|
|
||||||
||----w |
|
|
||||||
|| ||
|
|
||||||
|
|
||||||
hut% ovniver
|
|
||||||
LD_LIBRARY_PATH not set
|
|
||||||
libovni: build v1.11.0 (a7103f8), dynamic v1.11.0 (a7103f8)
|
|
||||||
|
|
||||||
hut% gcc --version
|
|
||||||
gcc (GCC) 13.3.0
|
|
||||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Building programs
|
|
||||||
|
|
||||||
The above method only loads new binaries in the `$PATH`. If we try to build a
|
|
||||||
program that includes headers or links with a library, it will fail to find
|
|
||||||
them:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut$ cat test.c
|
|
||||||
#include <ovni.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ovni_version_check();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hut% gcc test.c -lovni -o test
|
|
||||||
test.c:1:10: fatal error: ovni.h: No such file or directory
|
|
||||||
1 | #include <ovni.h>
|
|
||||||
| ^~~~~~~~
|
|
||||||
compilation terminated.
|
|
||||||
```
|
|
||||||
|
|
||||||
We could manually add the full path to the ovni include directory with `-I` and
|
|
||||||
the libraries with `-L`, but there is a tool that already perform these steps
|
|
||||||
automatically for us, `nix develop`.
|
|
||||||
|
|
||||||
Let's go back to our original shell first, where those packages are not
|
|
||||||
available anymore:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% ps
|
|
||||||
PID TTY TIME CMD
|
|
||||||
2356260 pts/1 00:00:01 zsh
|
|
||||||
2457268 pts/1 00:00:00 zsh
|
|
||||||
2457297 pts/1 00:00:00 ps
|
|
||||||
hut% exit
|
|
||||||
hut% ovniver
|
|
||||||
ovniver: command not found
|
|
||||||
```
|
|
||||||
|
|
||||||
### Creating a flake.nix
|
|
||||||
|
|
||||||
To define which packages we want, we will write a small file that list them, a
|
|
||||||
flake.nix file.
|
|
||||||
|
|
||||||
First, we will create a new directory where we are going to be working:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% mkdir example
|
|
||||||
hut% cd exmple
|
|
||||||
```
|
|
||||||
|
|
||||||
Then place this flake.nix file:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
inputs.jungle.url = "jungle";
|
|
||||||
outputs = { self, jungle }:
|
|
||||||
let
|
|
||||||
pkgs = jungle.outputs.packages.x86_64-linux;
|
|
||||||
in {
|
|
||||||
devShells.x86_64-linux.default = pkgs.mkShell {
|
|
||||||
pname = "devshell";
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
ovni gcc cowsay # more packages here...
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Now enter the shell with:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% nix develop
|
|
||||||
warning: creating lock file '/home/Computational/rarias/example/flake.lock':
|
|
||||||
• Added input 'jungle':
|
|
||||||
'path:/nix/store/27srv8haj6vv4ywrbmw0a8vds561m8rq-source?lastModified=1739479441&narHash=sha256-Kgjs8SO1w9NbPBu8ghwzCxYJ9kvWpoQOT%2BXwPvA9DcU%3D&rev=76396c0d67ef0cf32377d5c1894bb695293bca9d' (2025-02-13)
|
|
||||||
• Added input 'jungle/agenix':
|
|
||||||
'github:ryantm/agenix/f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41?narHash=sha256-b%2Buqzj%2BWa6xgMS9aNbX4I%2BsXeb5biPDi39VgvSFqFvU%3D' (2024-08-10)
|
|
||||||
• Added input 'jungle/agenix/darwin':
|
|
||||||
'github:lnl7/nix-darwin/4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d?narHash=sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0%3D' (2023-11-24)
|
|
||||||
• Added input 'jungle/agenix/darwin/nixpkgs':
|
|
||||||
follows 'jungle/agenix/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/home-manager':
|
|
||||||
'github:nix-community/home-manager/3bfaacf46133c037bb356193bd2f1765d9dc82c1?narHash=sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE%3D' (2023-12-20)
|
|
||||||
• Added input 'jungle/agenix/home-manager/nixpkgs':
|
|
||||||
follows 'jungle/agenix/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/nixpkgs':
|
|
||||||
follows 'jungle/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/systems':
|
|
||||||
'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e?narHash=sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768%3D' (2023-04-09)
|
|
||||||
• Added input 'jungle/bscpkgs':
|
|
||||||
'git+https://git.sr.ht/~rodarima/bscpkgs?ref=refs/heads/master&rev=6782fc6c5b5a29e84a7f2c2d1064f4bcb1288c0f' (2024-11-29)
|
|
||||||
• Added input 'jungle/bscpkgs/nixpkgs':
|
|
||||||
follows 'jungle/nixpkgs'
|
|
||||||
• Added input 'jungle/nixpkgs':
|
|
||||||
'github:NixOS/nixpkgs/9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc?narHash=sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8%3D' (2025-01-14)
|
|
||||||
|
|
||||||
hut$
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice that long list of messages is Nix creating a new flake.lock file with the
|
|
||||||
current state of the packages. Next invocations will use the same packages as
|
|
||||||
described by the lock file.
|
|
||||||
|
|
||||||
### Building a program from nix develop
|
|
||||||
|
|
||||||
Now let's try again building our test program:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut$ cat test.c
|
|
||||||
#include <ovni.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ovni_version_check();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hut$ gcc test.c -o test -lovni
|
|
||||||
hut$ ldd test
|
|
||||||
linux-vdso.so.1 (0x00007ffff7fc4000)
|
|
||||||
libovni.so.1 => /nix/store/sqk972akjv0q8dchn8ccjln2llzyyfd0-ovni-1.11.0/lib/libovni.so.1 (0x00007ffff7fab000)
|
|
||||||
libc.so.6 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/libc.so.6 (0x00007ffff7db2000)
|
|
||||||
/nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/ld-linux-x86-64.so.2 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fc6000)
|
|
||||||
hut$ ./test
|
|
||||||
```
|
|
||||||
|
|
||||||
Now the ovni.h header and the libovni library are found and the program is
|
|
||||||
successfully built, linked and executed.
|
|
||||||
|
|
||||||
You can add more packages as needed in your flake.nix:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
ovni gcc cowsay # more packages here...
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
Make sure you exit the develop shell first, and then enter again with `nix
|
|
||||||
develop`.
|
|
||||||
|
|
||||||
## Remember
|
|
||||||
|
|
||||||
- `nix shell` places binaries in the `$PATH`.
|
|
||||||
- `nix develop` enters a development shell where both binaries and the libraries
|
|
||||||
and includes are available so you can build new programs.
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Eudy"
|
|
||||||
description: "Linux kernel experiments"
|
|
||||||
---
|
|
||||||
|
|
||||||
[](https://commons.wikimedia.org/w/index.php?curid=5817408)
|
|
||||||
|
|
||||||
The *eudy* machine is destined as a playground for Linux kernel experiments. The
|
|
||||||
name is a shorthand of the Eudyptula species of little penguins found the New
|
|
||||||
Zealand and Australia.
|
|
||||||
|
Before Width: | Height: | Size: 210 KiB |
@ -1,117 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Fox"
|
|
||||||
description: "AMD Genoa 9684X with 2 NVIDIA RTX4000 GPUs"
|
|
||||||
date: 2025-02-12
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Picture by [Joanne Redwood](https://web.archive.org/web/20191109175146/https://www.inaturalist.org/photos/6568074),
|
|
||||||
[CC0](http://creativecommons.org/publicdomain/zero/1.0/deed.en).
|
|
||||||
|
|
||||||
The *fox* machine is a big GPU server that is configured to run heavy workloads.
|
|
||||||
It has two fast AMD CPUs with large cache and 2 reasonable NVIDIA GPUs. Here are
|
|
||||||
the detailed specifications:
|
|
||||||
|
|
||||||
- 2x AMD GENOA X 9684X DP/UP 96C/192T 2.55G 1,150M 400W SP5 3D V-cach
|
|
||||||
- 24x 32GB DDR5-4800 ECC RDIMM (total 768 GiB of RAM)
|
|
||||||
- 1x 2.5" SSD SATA3 MICRON 5400 MAX 480GB
|
|
||||||
- 2x 2.5" KIOXIA CM7-R 1.92TB NVMe GEN5 PCIe 5x4
|
|
||||||
- 2x NVIDIA RTX4000 ADA Gen 20GB GDDR6 PCIe 4.0
|
|
||||||
|
|
||||||
## Access
|
|
||||||
|
|
||||||
To access the machine, request a SLURM session from [apex](/apex) using the `fox`
|
|
||||||
partition. If you need the machine for performance measurements, use an
|
|
||||||
exclusive reservation:
|
|
||||||
|
|
||||||
apex% salloc -p fox --exclusive
|
|
||||||
|
|
||||||
Otherwise, specify the CPUs that you need so other users can also use the node
|
|
||||||
at the same time:
|
|
||||||
|
|
||||||
apex% salloc -p fox -c 8
|
|
||||||
|
|
||||||
Then use srun to execute an interactive shell:
|
|
||||||
|
|
||||||
apex% srun --pty $SHELL
|
|
||||||
fox%
|
|
||||||
|
|
||||||
Make sure you get all CPUs you expect:
|
|
||||||
|
|
||||||
fox% grep Cpus_allowed_list /proc/self/status
|
|
||||||
Cpus_allowed_list: 0-191
|
|
||||||
|
|
||||||
Follow [these steps](/access) if you don't have access to apex or fox.
|
|
||||||
|
|
||||||
## CUDA
|
|
||||||
|
|
||||||
To use CUDA, you can use the following `flake.nix` placed in a new directory to
|
|
||||||
load all the required dependencies:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
inputs.jungle.url = "jungle";
|
|
||||||
|
|
||||||
outputs = { jungle, ... }: {
|
|
||||||
devShell.x86_64-linux = let
|
|
||||||
pkgs = jungle.nixosConfigurations.fox.pkgs;
|
|
||||||
in pkgs.mkShell {
|
|
||||||
name = "cuda-env-shell";
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
git gitRepo gnupg autoconf curl
|
|
||||||
procps gnumake util-linux m4 gperf unzip
|
|
||||||
|
|
||||||
# Cuda packages (more at https://search.nixos.org/packages)
|
|
||||||
cudatoolkit linuxPackages.nvidia_x11
|
|
||||||
cudaPackages.cuda_cudart.static
|
|
||||||
cudaPackages.libcusparse
|
|
||||||
|
|
||||||
libGLU libGL
|
|
||||||
xorg.libXi xorg.libXmu freeglut
|
|
||||||
xorg.libXext xorg.libX11 xorg.libXv xorg.libXrandr zlib
|
|
||||||
ncurses5 stdenv.cc binutils
|
|
||||||
];
|
|
||||||
shellHook = ''
|
|
||||||
export CUDA_PATH=${pkgs.cudatoolkit}
|
|
||||||
export LD_LIBRARY_PATH=/var/run/opengl-driver/lib
|
|
||||||
export SMS=50
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Then just run `nix develop` from the same directory:
|
|
||||||
|
|
||||||
% mkdir cuda
|
|
||||||
% cd cuda
|
|
||||||
% vim flake.nix
|
|
||||||
[...]
|
|
||||||
% nix develop
|
|
||||||
$ nvcc -V
|
|
||||||
nvcc: NVIDIA (R) Cuda compiler driver
|
|
||||||
Copyright (c) 2005-2024 NVIDIA Corporation
|
|
||||||
Built on Tue_Feb_27_16:19:38_PST_2024
|
|
||||||
Cuda compilation tools, release 12.4, V12.4.99
|
|
||||||
Build cuda_12.4.r12.4/compiler.33961263_0
|
|
||||||
|
|
||||||
## AMD uProf
|
|
||||||
|
|
||||||
The [AMD uProf](https://www.amd.com/en/developer/uprof.html) performance
|
|
||||||
analysis tool-suite is installed and ready to use.
|
|
||||||
|
|
||||||
See the [AMD uProf user guide](https://docs.amd.com/r/en-US/57368-uProf-user-guide)
|
|
||||||
([PDF backup for v5.1](https://jungle.bsc.es/pub/57368-uprof-user-guide.pdf))
|
|
||||||
for more details on how to use the tools. To use the GUI make sure that you
|
|
||||||
connect to fox using X11 forwarding.
|
|
||||||
|
|
||||||
## Filesystems
|
|
||||||
|
|
||||||
The machine has several file systems available.
|
|
||||||
|
|
||||||
- `/nfs/home`: The `/home` from apex via NFS, which is also shared with other
|
|
||||||
xeon machines. It has about 2 ms of latency, so not suitable for quick random
|
|
||||||
access.
|
|
||||||
- `/nvme{0,1}/$USER`: The two local NVME disks, very fast and large capacity.
|
|
||||||
- `/tmp`: tmpfs, fast but not backed by a disk. Will be erased on reboot.
|
|
||||||
|
Before Width: | Height: | Size: 126 KiB |
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Git"
|
|
||||||
description: "Gitea instance"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the Gitea service is not working.
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Grafana"
|
|
||||||
description: "Monitor metrics"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the Grafana service is not working.
|
|
||||||
@ -1,127 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Hut"
|
|
||||||
description: "Control node"
|
|
||||||
date: 2023-06-13T19:36:57+02:00
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
From the hut we monitor and control other nodes. It consist of one node only,
|
|
||||||
which is available at `hut` or `xeon07`. It runs the following services:
|
|
||||||
|
|
||||||
- Prometheus: to store the monitoring data.
|
|
||||||
- Grafana: to plot the data in the web browser.
|
|
||||||
- Slurmctld: to manage the SLURM nodes.
|
|
||||||
- Gitlab runner: to run CI jobs from Gitlab.
|
|
||||||
- Nix binary cache: to serve cached nix builds
|
|
||||||
|
|
||||||
This node is prone to interruptions from all the services it runs, so it is not
|
|
||||||
a good candidate for low noise executions.
|
|
||||||
|
|
||||||
# Binary cache
|
|
||||||
|
|
||||||
We provide a binary cache in `hut`, with the aim of avoiding unnecessary
|
|
||||||
recompilation of packages.
|
|
||||||
|
|
||||||
The cache should contain common packages from bscpkgs, but we don't provide
|
|
||||||
any guarantee that of what will be available in the cache, or for how long.
|
|
||||||
We recommend following the latest version of the `jungle` flake to avoid cache
|
|
||||||
misses.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### From NixOS
|
|
||||||
|
|
||||||
In NixOS, we can add the cache through the `nix.settings` option, which will
|
|
||||||
enable it for all builds in the system.
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{ ... }: {
|
|
||||||
nix.settings = {
|
|
||||||
extra-substituters = [ "https://jungle.bsc.es/cache" ];
|
|
||||||
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Interactively
|
|
||||||
|
|
||||||
The cache can also be specified in a per-command basis through the flags
|
|
||||||
`--substituters` and `--trusted-public-keys`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nix build --substituters "https://jungle.bsc.es/cache" --trusted-public-keys "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" <...>
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: you'll have to be a trusted user.
|
|
||||||
|
|
||||||
### Nix configuration file (non-nixos)
|
|
||||||
|
|
||||||
If using nix outside of NixOS, you'll have to update `/etc/nix/nix.conf`
|
|
||||||
|
|
||||||
```
|
|
||||||
# echo "extra-substituters = https://jungle.bsc.es/cache" >> /etc/nix/nix.conf
|
|
||||||
# echo "extra-trusted-public-keys = jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" >> /etc/nix/nix.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
### Hint in flakes
|
|
||||||
|
|
||||||
By adding the configuration below to a `flake.nix`, when someone uses the flake,
|
|
||||||
`nix` will interactively ask to trust and use the provided binary cache:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
nixConfig = {
|
|
||||||
extra-substituters = [
|
|
||||||
"https://jungle.bsc.es/cache"
|
|
||||||
];
|
|
||||||
extra-trusted-public-keys = [
|
|
||||||
"jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0="
|
|
||||||
];
|
|
||||||
};
|
|
||||||
outputs = { ... }: {
|
|
||||||
...
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Querying the cache
|
|
||||||
|
|
||||||
Check if the cache is available:
|
|
||||||
```sh
|
|
||||||
$ curl https://jungle.bsc.es/cache/nix-cache-info
|
|
||||||
StoreDir: /nix/store
|
|
||||||
WantMassQuery: 1
|
|
||||||
Priority: 30
|
|
||||||
```
|
|
||||||
|
|
||||||
Prevent nix from building locally:
|
|
||||||
```bash
|
|
||||||
nix build --max-jobs 0 <...>
|
|
||||||
```
|
|
||||||
|
|
||||||
Check if a package is in cache:
|
|
||||||
```bash
|
|
||||||
# Do a raw eval on the <package>.outPath (this should not build the package)
|
|
||||||
$ nix eval --raw jungle#openmp.outPath
|
|
||||||
/nix/store/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-openmp-2024.11
|
|
||||||
# Take the hash (everything from / to - in the basename) and curl <hash>.narinfo
|
|
||||||
# if it exists in the cache, it will return HTTP 200 and some information
|
|
||||||
# if not, it will return 404
|
|
||||||
$ curl https://jungle.bsc.es/cache/dwnn4dgm1m4184l4xbi0qfrprji9wjmi.narinfo
|
|
||||||
StorePath: /nix/store/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-openmp-2024.11
|
|
||||||
URL: nar/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-17imkdfqzmnb013d14dx234bx17bnvws8baf3ii1xra5qi2y1wiz.nar
|
|
||||||
Compression: none
|
|
||||||
NarHash: sha256:17imkdfqzmnb013d14dx234bx17bnvws8baf3ii1xra5qi2y1wiz
|
|
||||||
NarSize: 1519328
|
|
||||||
References: 4gk773fqcsv4fh2rfkhs9bgfih86fdq8-gcc-13.3.0-lib nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36
|
|
||||||
Deriver: vcn0x8hikc4mvxdkvrdxp61bwa5r7lr6-openmp-2024.11.drv
|
|
||||||
Sig: jungle.bsc.es:GDTOUEs1jl91wpLbb+gcKsAZjpKdARO9j5IQqb3micBeqzX2M/NDtKvgCS1YyiudOUdcjwa3j+hyzV2njokcCA==
|
|
||||||
# In oneline:
|
|
||||||
$ curl "https://jungle.bsc.es/cache/$(nix eval --raw jungle#<package>.outPath | cut -d '/' -f4 | cut -d '-' -f1).narinfo"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### References
|
|
||||||
|
|
||||||
- https://nix.dev/guides/recipes/add-binary-cache.html
|
|
||||||
- https://nixos.wiki/wiki/Binary_Cache
|
|
||||||
|
Before Width: | Height: | Size: 178 KiB |
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Lake"
|
|
||||||
description: "Data storage"
|
|
||||||
date: 2023-06-13T19:36:57+02:00
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Data storage
|
|
||||||
|
Before Width: | Height: | Size: 144 KiB |
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Lists"
|
|
||||||
description: "Mailing lists"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the public-inbox service is not working.
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Owl"
|
|
||||||
description: "Low system noise"
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Much like the silent flight of an owl at night, these nodes are configured to
|
|
||||||
minimize the system noise and let programs run undisturbed. The list of nodes is
|
|
||||||
`owl[1-2]` and are available for jobs with SLURM.
|
|
||||||
|
|
||||||
The contents of the nix store of the hut node is made available in the owl nodes
|
|
||||||
when a job is running. This allows jobs to access the same paths that are on hut
|
|
||||||
to load dependencies.
|
|
||||||
|
|
||||||
For now, only the hut node can be used to build new derivations so that they
|
|
||||||
appear in the compute nodes. This applies to the `nix build`, `nix develop` and
|
|
||||||
`nix shell` commands.
|
|
||||||
|
Before Width: | Height: | Size: 49 KiB |
@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Paste"
|
|
||||||
description: "Paste service"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2024-09-20
|
|
||||||
---
|
|
||||||
|
|
||||||
The tent machine provides a paste service using the program `p` (as in paste).
|
|
||||||
|
|
||||||
You can use it directly from the tent machine or remotely if you have [SSH
|
|
||||||
access](/access) to tent using the following alias:
|
|
||||||
|
|
||||||
```
|
|
||||||
alias p="ssh tent p"
|
|
||||||
```
|
|
||||||
|
|
||||||
You can add it to bashrc or zshrc for persistent installation.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
The `p` command reads from the standard input, uploads the content to a file
|
|
||||||
in the local filesystem and prints the URL to access it. It only accepts an
|
|
||||||
optional argument, which is the extension of the file that will be stored on
|
|
||||||
disk (without the dot). By default it uses the `txt` extension, so plain text
|
|
||||||
can be read in the browser directly.
|
|
||||||
|
|
||||||
```
|
|
||||||
p [extension]
|
|
||||||
```
|
|
||||||
|
|
||||||
To remove files, go to `/var/lib/p/$USER` and remove them manually.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
Share a text file, in this case the source of p itself:
|
|
||||||
|
|
||||||
```
|
|
||||||
tent% p < m/tent/p.nix
|
|
||||||
https://jungle.bsc.es/p/rarias/okbtG130.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
Paste the last dmesg lines directly from a pipe:
|
|
||||||
|
|
||||||
```
|
|
||||||
tent% dmesg | tail -5 | p
|
|
||||||
https://jungle.bsc.es/p/rarias/luX4STm9.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
Upload a PNG picture from a file:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% p png < mark-api-cpu.png
|
|
||||||
https://jungle.bsc.es/p/rarias/oSRAMVsE.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Take an screenshot and upload it as a PNG file:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% scrot -s - | p png
|
|
||||||
https://jungle.bsc.es/p/rarias/SOgK5EV0.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Upload a directory by creating a tar.gz file on the fly:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% tar c ovni | gzip | p tar.gz
|
|
||||||
https://jungle.bsc.es/p/rarias/tkwROcTR.tar.gz
|
|
||||||
```
|
|
||||||
@ -1,71 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Update 2023-09-12"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2023-09-12
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a summary of notable changes introduced in the jungle cluster in the
|
|
||||||
last months.
|
|
||||||
|
|
||||||
### New Ceph filesystem available
|
|
||||||
|
|
||||||
We have installed the latest [Ceph filesystem][1] (18.2.0) which stores three
|
|
||||||
redundant copies of the data so a failure in one disk doesn't cause data loss.
|
|
||||||
It is mounted in /ceph and available for use in the owl1, owl2 and hut
|
|
||||||
nodes. For now it provides 2.8 TiB of space and it is expected to
|
|
||||||
increase when the last storage node is installed.
|
|
||||||
|
|
||||||
[1]: https://en.wikipedia.org/wiki/Ceph_(software)
|
|
||||||
|
|
||||||
The throughput is limited by the 1 Gigabit Ethernet speed, but should be
|
|
||||||
reasonably fast for most workloads. Here is a test with dd which reaches the
|
|
||||||
network limit:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% dd if=/dev/urandom of=/ceph/rarias/urandom bs=1M count=1024
|
|
||||||
1024+0 records in
|
|
||||||
1024+0 records out
|
|
||||||
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 8,98544 s, 119 MB/s
|
|
||||||
```
|
|
||||||
|
|
||||||
### SLURM power save
|
|
||||||
|
|
||||||
The SLURM daemon has been configured to power down the nodes after one hour of
|
|
||||||
idling. When a new job is allocated to a node that is powered off, it is
|
|
||||||
automatically turned on and as soon as it becomes available it will execute the
|
|
||||||
job. Here is an example with two nodes that boot and execute a simple job that
|
|
||||||
shows the date.
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% date; srun -N 2 date
|
|
||||||
2023-09-12T17:36:09 CEST
|
|
||||||
2023-09-12T17:38:26 CEST
|
|
||||||
2023-09-12T17:38:18 CEST
|
|
||||||
```
|
|
||||||
|
|
||||||
You can expect a similar delay (around 2-3 min) while the nodes are starting.
|
|
||||||
Notice that while the nodes are kept on, the delay is not noticeable:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% date; srun -N 2 date
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
```
|
|
||||||
|
|
||||||
### Power and temperature monitoring
|
|
||||||
|
|
||||||
In the cluster, we monitor the temperature and the power draw of all nodes. This
|
|
||||||
allows us to understand which machines are not being used and turn them off to
|
|
||||||
save energy that otherwise would be wasted. Here is an example where some nodes
|
|
||||||
are powered off to save energy:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
We also configured the nodes to work at low CPU frequencies, so the temperature
|
|
||||||
is kept low to increase the lifespan of the node components. Towards these
|
|
||||||
goals, we have configured two alerts that trigger when the CPUs of a node
|
|
||||||
exceeds the limit temperature of 80 °C or when the power draw exceeds 350 W.
|
|
||||||
|
|
||||||
By keeping the power consumption and temperatures controlled, we can safely
|
|
||||||
incorporate more machines that will only be used on demand.
|
|
||||||
|
Before Width: | Height: | Size: 58 KiB |
@ -1,49 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Update 2025-09-26"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2025-09-26
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a summary of notable changes introduced in the last two years. We
|
|
||||||
continue to maintain all machines updated to the last NixOS release (currently
|
|
||||||
NixOS 25.05).
|
|
||||||
|
|
||||||
### New compute node: fox
|
|
||||||
|
|
||||||
We have a new [fox machine](/fox), with two AMD Genoa 9684X CPUs and two NVIDIA
|
|
||||||
RTX4000 GPUs. During the last months we have been doing some tests and it seems
|
|
||||||
that most of the components work well. We have configured CUDA to use the NVIDIA
|
|
||||||
GPUs, as well as AMD uProf to trace performance and energy counters from the
|
|
||||||
CPUs.
|
|
||||||
|
|
||||||
### Upgraded login node: apex
|
|
||||||
|
|
||||||
We have upgraded the operating system on the login node to NixOS, which now runs
|
|
||||||
Linux 6.15.6. During the upgrade, we have detected a problem with the storage
|
|
||||||
disks. The `/` and `/home` partitions sit on a
|
|
||||||
[RAID 5](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5),
|
|
||||||
transparently handled by a RAID hardware controller which starts its own
|
|
||||||
firmware before passing the control to the BIOS to continue the boot sequence. A
|
|
||||||
problem during the startup of the firmware prevented the node to even reach the
|
|
||||||
BIOS screen.
|
|
||||||
|
|
||||||
After a long debugging session, we detected that the flash memory that stores
|
|
||||||
the firmware of the hardware controller was likely to be the issue, since
|
|
||||||
[memory cells](https://en.wikipedia.org/wiki/Flash_memory#Principles_of_operation)
|
|
||||||
may lose charge over time and can end up corrupting the content. We flashed
|
|
||||||
the latest firmware so the memory cells are charged again with the new bits and
|
|
||||||
that fixed the problem. Hopefully we will be able to use it for some more years.
|
|
||||||
|
|
||||||
The SLURM server has been moved to apex which allows users to also submit jobs
|
|
||||||
to fox.
|
|
||||||
|
|
||||||
### Migrated machines to BSC building
|
|
||||||
|
|
||||||
The server room had a temperature issue that had been affecting our machines
|
|
||||||
since the end of February of 2025. As the summer approached, the temperature
|
|
||||||
exceeded the safe limits for our hardware, so we had to shutdown the cluster.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Since then, we have moved the cluster to BSC premises, where it now rests at a
|
|
||||||
stable temperature, so hopefully we won't have more unscheduled downtime.
|
|
||||||
|
Before Width: | Height: | Size: 97 KiB |
@ -1,40 +0,0 @@
|
|||||||
baseURL = 'https://jungle.bsc.es/'
|
|
||||||
languageCode = 'en-us'
|
|
||||||
title = 'The jungle'
|
|
||||||
theme = 'PaperMod'
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "doc"
|
|
||||||
name = "Docs"
|
|
||||||
url = "/doc/"
|
|
||||||
weight = 10
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "grafana"
|
|
||||||
name = "Grafana"
|
|
||||||
url = "/grafana/"
|
|
||||||
weight = 20
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Git"
|
|
||||||
name = "Git"
|
|
||||||
url = "/git/"
|
|
||||||
weight = 30
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Lists"
|
|
||||||
name = "Lists"
|
|
||||||
url = "/lists/"
|
|
||||||
weight = 40
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Paste"
|
|
||||||
name = "Paste"
|
|
||||||
url = "/paste/"
|
|
||||||
weight = 50
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Posts"
|
|
||||||
name = "Posts"
|
|
||||||
url = "/posts/"
|
|
||||||
weight = 60
|
|
||||||
|
Before Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 87 KiB |
@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: "[BUG]"
|
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
## READ BEFORE OPENING ISSUES
|
|
||||||
|
|
||||||
Please fill the template below
|
|
||||||
- **DO NOT** ask for instructions.
|
|
||||||
- Use Discussions section if you need help
|
|
||||||
- See project wiki https://github.com/adityatelange/hugo-PaperMod/wiki
|
|
||||||
- Read FAQs section https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs
|
|
||||||
- Search for previous issues/ pull requests
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
<!-- A clear and concise description of what the bug is. -->
|
|
||||||
|
|
||||||
- Device/Os: [e.g. Android 10]
|
|
||||||
- Type: [e.g. Desktop/Mobile]
|
|
||||||
- Browser and version [e.g. Chrome 86.0]:
|
|
||||||
- Hugo Version [ >=0.97.1 expected]:
|
|
||||||
- Theme Version [e.g. v4.0, master, or commit-id ]:
|
|
||||||
|
|
||||||
**Steps to reproduce the behavior:**
|
|
||||||
<!--
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Expected behavior**:
|
|
||||||
<!-- A clear and concise description of what you expected to happen. -->
|
|
||||||
|
|
||||||
**Repo/Source where this issue can be reproduced**:
|
|
||||||
<!-- Please link source code of website where the said issue can be reproduced -->
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
<!--Add any other context about the problem here. -->
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: PaperMod Discussions
|
|
||||||
url: https://github.com/adityatelange/hugo-PaperMod/discussions
|
|
||||||
about: Please ask and answer questions/doubts here, do not open an issue for questions.
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
name: New Blank Issue
|
|
||||||
about: Anything other than bug report
|
|
||||||
title: ""
|
|
||||||
labels: ""
|
|
||||||
assignees: ""
|
|
||||||
---
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
## READ BEFORE OPENING A PR
|
|
||||||
|
|
||||||
Thank you for contributing to hugo-PaperMod!
|
|
||||||
Please fill out the following questions to make it easier for us to review your
|
|
||||||
changes. You do not need to check all the boxes below.
|
|
||||||
|
|
||||||
**NOTE**: PaperMod does not have any external dependencies fetched from 3rd party
|
|
||||||
CDN servers. However we do have custom Head/Footer extender templates which you can use
|
|
||||||
to add those to your website.
|
|
||||||
https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#custom-head--footer
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
**What does this PR change? What problem does it solve?**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe the changes and their purpose here, as detailed as and if needed.
|
|
||||||
|
|
||||||
Please do not add 2 unrelated changes in a single PR as it is difficult to track/revert those in future.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
**Was the change discussed in an issue or in the Discussions before?**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Link issues and relevant Discussions posts here.
|
|
||||||
|
|
||||||
If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
|
|
||||||
is closed automatically when this PR is merged.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
## PR Checklist
|
|
||||||
|
|
||||||
- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-).
|
|
||||||
- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
|
|
||||||
- [ ] I have verified that the code works as described/as intended.
|
|
||||||
- [ ] This change adds a Social Icon which has a permissive license to use it.
|
|
||||||
- [ ] This change **does not** include any CDN resources/links.
|
|
||||||
- [ ] This change **does not** include any unrelated scripts such as bash and python scripts.
|
|
||||||
- [ ] This change updates the overridden internal templates from HUGO's repository.
|
|
||||||
17
web/themes/PaperMod/.github/stale.yml
vendored
@ -1,17 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 7
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 3
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- pinned
|
|
||||||
- keep
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: false
|
|
||||||
@ -1,80 +0,0 @@
|
|||||||
name: Deploy Hugo PaperMod Demo to Pages
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- "images/**"
|
|
||||||
- "LICENSE"
|
|
||||||
- "README.md"
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- exampleSite
|
|
||||||
workflow_dispatch:
|
|
||||||
# manual run
|
|
||||||
inputs:
|
|
||||||
hugoVersion:
|
|
||||||
description: "Hugo Version"
|
|
||||||
required: false
|
|
||||||
default: "0.97.1"
|
|
||||||
|
|
||||||
# Allow one concurrent deployment
|
|
||||||
concurrency:
|
|
||||||
group: "pages"
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
# Default to bash
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pages: write
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Build job
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
HUGO_VERSION: "0.97.1"
|
|
||||||
steps:
|
|
||||||
- name: Check version
|
|
||||||
if: ${{ github.event.inputs.hugoVersion }}
|
|
||||||
run: export HUGO_VERSION="${{ github.event.inputs.hugoVersion }}"
|
|
||||||
- name: Install Hugo CLI
|
|
||||||
run: |
|
|
||||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.deb \
|
|
||||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: exampleSite
|
|
||||||
- name: Setup Pages
|
|
||||||
id: pages
|
|
||||||
uses: actions/configure-pages@v1
|
|
||||||
- name: Get Theme
|
|
||||||
run: git submodule update --init --recursive
|
|
||||||
- name: Update theme to Latest commit
|
|
||||||
run: git submodule update --remote --merge
|
|
||||||
- name: Build with Hugo
|
|
||||||
run: |
|
|
||||||
hugo \
|
|
||||||
--buildDrafts --gc --verbose \
|
|
||||||
--baseURL ${{ steps.pages.outputs.base_url }}
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-pages-artifact@v1
|
|
||||||
with:
|
|
||||||
path: ./public
|
|
||||||
# Deployment job
|
|
||||||
deploy:
|
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
id: deployment
|
|
||||||
uses: actions/deploy-pages@v1
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
|
|
||||||
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.
|
|
||||||
@ -1,103 +0,0 @@
|
|||||||
<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
|
|
||||||
|
|
||||||
<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper).
|
|
||||||
> The goal of this project is to add more features and customization to the og theme.
|
|
||||||
|
|
||||||
**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki)
|
|
||||||
|
|
||||||
**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
|
|
||||||
|
|
||||||
[](https://themes.gohugo.io/themes/hugo-papermod/)
|
|
||||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.97.1)
|
|
||||||
[](https://discord.gg/ahpmTvhVmp)
|
|
||||||
[](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
|
|
||||||

|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Features/Mods 💥
|
|
||||||
|
|
||||||
- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
|
|
||||||
- 3 Modes:
|
|
||||||
- [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
|
|
||||||
- [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
|
|
||||||
- [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
|
|
||||||
- Table of Content Generation (newer implementation).
|
|
||||||
- Archive of posts.
|
|
||||||
- Social Icons (home-info and profile-mode)
|
|
||||||
- Social-Media Share buttons on posts.
|
|
||||||
- Menu location indicator.
|
|
||||||
- Multilingual support. (with language selector)
|
|
||||||
- Taxonomies
|
|
||||||
- Cover image for each post (with Responsive image support).
|
|
||||||
- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
|
|
||||||
- SEO Friendly.
|
|
||||||
- Multiple Author support.
|
|
||||||
- Search Page with Fuse.js
|
|
||||||
- Other Posts suggestion below a post
|
|
||||||
- Breadcrumb Navigation
|
|
||||||
- Code Block Copy buttons
|
|
||||||
- No webpack, nodejs and other dependencies are required to edit the theme.
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Install/Update 📥
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## FAQs / How To's Guide 🙋
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Social-Icons/Share-Icons 🖼️
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release Changelog 📃
|
|
||||||
|
|
||||||
Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Support 🫶
|
|
||||||
|
|
||||||
- Star 🌟 this repository.
|
|
||||||
- Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️
|
|
||||||
- You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Special Thanks 🌟
|
|
||||||
|
|
||||||
- [**Highlight.js**](https://github.com/highlightjs/highlight.js)
|
|
||||||
- [**Fuse.js**](https://github.com/krisk/fuse)
|
|
||||||
- [**Feather Icons**](https://github.com/feathericons/feather)
|
|
||||||
- [**Simple Icons**](https://github.com/simple-icons/simple-icons)
|
|
||||||
- **All Contributors and Supporters**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Stargazers over time 📈
|
|
||||||
|
|
||||||
<kbd>[](https://starchart.cc/adityatelange/hugo-PaperMod)</kbd>
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
.not-found {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 80%;
|
|
||||||
font-size: 160px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
.archive-posts {
|
|
||||||
width: 100%;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year {
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year:not(:last-of-type) {
|
|
||||||
border-bottom: 2px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month-header {
|
|
||||||
margin: 25px 0;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month:not(:last-of-type) {
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-entry {
|
|
||||||
position: relative;
|
|
||||||
padding: 5px;
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-entry-title {
|
|
||||||
margin: 5px 0;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-count,
|
|
||||||
.archive-meta {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
.footer,
|
|
||||||
.top-link {
|
|
||||||
font-size: 12px;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
|
||||||
margin: auto;
|
|
||||||
padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
|
|
||||||
text-align: center;
|
|
||||||
line-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span {
|
|
||||||
margin-inline-start: 1px;
|
|
||||||
margin-inline-end: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span:last-child {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a {
|
|
||||||
color: inherit;
|
|
||||||
border-bottom: 1px solid var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a:hover {
|
|
||||||
border-bottom: 1px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link {
|
|
||||||
visibility: hidden;
|
|
||||||
position: fixed;
|
|
||||||
bottom: 60px;
|
|
||||||
right: 30px;
|
|
||||||
z-index: 99;
|
|
||||||
background: var(--tertiary);
|
|
||||||
width: 42px;
|
|
||||||
height: 42px;
|
|
||||||
padding: 12px;
|
|
||||||
border-radius: 64px;
|
|
||||||
transition: visibility 0.5s, opacity 0.8s linear;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link,
|
|
||||||
.top-link svg {
|
|
||||||
filter: drop-shadow(0px 0px 0px var(--theme));
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a:hover,
|
|
||||||
.top-link:hover {
|
|
||||||
color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link:focus,
|
|
||||||
#theme-toggle:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
@ -1,93 +0,0 @@
|
|||||||
.nav {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
max-width: calc(var(--nav-width) + var(--gap) * 2);
|
|
||||||
margin-inline-start: auto;
|
|
||||||
margin-inline-end: auto;
|
|
||||||
line-height: var(--header-height);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo,
|
|
||||||
#menu {
|
|
||||||
display: flex;
|
|
||||||
margin: auto var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo a {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo a img, .logo a svg {
|
|
||||||
display: inline;
|
|
||||||
vertical-align: middle;
|
|
||||||
pointer-events: none;
|
|
||||||
transform: translate(0, -10%);
|
|
||||||
border-radius: 6px;
|
|
||||||
margin-inline-end: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
button#theme-toggle {
|
|
||||||
font-size: 26px;
|
|
||||||
margin: auto 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.dark #moon {
|
|
||||||
vertical-align: middle;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body:not(.dark) #sun {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
list-style: none;
|
|
||||||
word-break: keep-all;
|
|
||||||
overflow-x: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu li + li {
|
|
||||||
margin-inline-start: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu a {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu .active {
|
|
||||||
font-weight: 500;
|
|
||||||
border-bottom: 2px solid currentColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch li,
|
|
||||||
.lang-switch ul,
|
|
||||||
.logo-switches {
|
|
||||||
display: inline-flex;
|
|
||||||
margin: auto 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch a {
|
|
||||||
margin: auto 3px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-switches {
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
.main {
|
|
||||||
position: relative;
|
|
||||||
min-height: calc(100vh - var(--header-height) - var(--footer-height));
|
|
||||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
|
||||||
margin: auto;
|
|
||||||
padding: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-header h1 {
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination a {
|
|
||||||
color: var(--theme);
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 36px;
|
|
||||||
background: var(--primary);
|
|
||||||
border-radius: calc(36px / 2);
|
|
||||||
padding: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination .next {
|
|
||||||
margin-inline-start: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons {
|
|
||||||
padding: 12px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons a:not(:last-of-type) {
|
|
||||||
margin-inline-end: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons a svg {
|
|
||||||
height: 26px;
|
|
||||||
width: 26px;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.highlight,
|
|
||||||
pre {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-code {
|
|
||||||
display: none;
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
right: 4px;
|
|
||||||
color: rgba(255, 255, 255, 0.8);
|
|
||||||
background: rgba(78, 78, 78, 0.8);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 0 5px;
|
|
||||||
font-size: 14px;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.highlight:hover .copy-code,
|
|
||||||
pre:hover .copy-code {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
@ -1,104 +0,0 @@
|
|||||||
.first-entry {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
min-height: 320px;
|
|
||||||
margin: var(--gap) 0 calc(var(--gap) * 2) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-header {
|
|
||||||
overflow: hidden;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-header h1 {
|
|
||||||
font-size: 34px;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-content {
|
|
||||||
margin: 14px 0;
|
|
||||||
font-size: 16px;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-footer {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-info .entry-content {
|
|
||||||
-webkit-line-clamp: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-entry {
|
|
||||||
position: relative;
|
|
||||||
margin-bottom: var(--gap);
|
|
||||||
padding: var(--gap);
|
|
||||||
background: var(--entry);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
transition: transform 0.1s;
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-entry:active {
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-entry .entry-cover {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-header h2 {
|
|
||||||
font-size: 24px;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-content {
|
|
||||||
margin: 8px 0;
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.6;
|
|
||||||
overflow: hidden;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-footer {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-link {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover,
|
|
||||||
.entry-isdraft {
|
|
||||||
font-size: 14px;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover {
|
|
||||||
margin-bottom: var(--gap);
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover img {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
pointer-events: none;
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover a {
|
|
||||||
color: var(--secondary);
|
|
||||||
box-shadow: 0 1px 0 var(--primary);
|
|
||||||
}
|
|
||||||
@ -1,402 +0,0 @@
|
|||||||
.page-header,
|
|
||||||
.post-header {
|
|
||||||
margin: 24px auto var(--content-gap) auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-title {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-description {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-meta,
|
|
||||||
.breadcrumbs {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-meta .i18n_list li {
|
|
||||||
display: inline-flex;
|
|
||||||
list-style: none;
|
|
||||||
margin: auto 3px;
|
|
||||||
box-shadow: 0 1px 0 var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.breadcrumbs a {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content {
|
|
||||||
color: var(--content);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h3,
|
|
||||||
.post-content h4,
|
|
||||||
.post-content h5,
|
|
||||||
.post-content h6 {
|
|
||||||
margin: 24px 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h1 {
|
|
||||||
margin: 40px auto 32px;
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h2 {
|
|
||||||
margin: 32px auto 24px;
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h3 {
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h4 {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h5 {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h6 {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content a,
|
|
||||||
.toc a:hover {
|
|
||||||
box-shadow: 0 1px 0;
|
|
||||||
box-decoration-break: clone;
|
|
||||||
-webkit-box-decoration-break: clone;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content a code {
|
|
||||||
margin: auto 0;
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: 0 -1px 0 var(--primary) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content del {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dl,
|
|
||||||
.post-content ol,
|
|
||||||
.post-content p,
|
|
||||||
.post-content figure,
|
|
||||||
.post-content ul {
|
|
||||||
margin-bottom: var(--content-gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content ol,
|
|
||||||
.post-content ul {
|
|
||||||
padding-inline-start: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li p {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dl {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dt {
|
|
||||||
width: 25%;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dd {
|
|
||||||
width: 75%;
|
|
||||||
margin-inline-start: 0;
|
|
||||||
padding-inline-start: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dd ~ dd,
|
|
||||||
.post-content dt ~ dt {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table {
|
|
||||||
margin-bottom: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table th,
|
|
||||||
.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
|
|
||||||
min-width: 80px;
|
|
||||||
padding: 12px 8px;
|
|
||||||
line-height: 1.5;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table th {
|
|
||||||
font-size: 14px;
|
|
||||||
text-align: start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table:not(.highlighttable) td code:only-child {
|
|
||||||
margin: auto 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight table {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight:not(table) {
|
|
||||||
margin: 10px auto;
|
|
||||||
background: var(--hljs-bg) !important;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li > .highlight {
|
|
||||||
margin-inline-end: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content ul pre {
|
|
||||||
margin-inline-start: calc(var(--gap) * -2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight pre {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable {
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td:first-child {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td .linenodiv {
|
|
||||||
padding-inline-end: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td .highlight,
|
|
||||||
.post-content .highlighttable td .linenodiv pre {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content code {
|
|
||||||
margin: auto 4px;
|
|
||||||
padding: 4px 6px;
|
|
||||||
font-size: 0.78em;
|
|
||||||
line-height: 1.5;
|
|
||||||
background: var(--code-bg);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content pre code {
|
|
||||||
display: block;
|
|
||||||
margin: auto 0;
|
|
||||||
padding: 10px;
|
|
||||||
color: rgb(213, 213, 214);
|
|
||||||
background: var(--hljs-bg) !important;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
overflow-x: auto;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content blockquote {
|
|
||||||
margin: 20px 0;
|
|
||||||
padding: 0 14px;
|
|
||||||
border-inline-start: 3px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content hr {
|
|
||||||
margin: 30px 0;
|
|
||||||
height: 2px;
|
|
||||||
background: var(--tertiary);
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content iframe {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content img {
|
|
||||||
border-radius: 4px;
|
|
||||||
margin: 1rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content img[src*="#center"] {
|
|
||||||
margin: 1rem auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure.align-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure > figcaption {
|
|
||||||
color: var(--primary);
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 8px 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure > figcaption > p {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc {
|
|
||||||
margin: 0 2px 40px 2px;
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
background: var(--code-bg);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 0.4em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark .toc {
|
|
||||||
background: var(--entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc details summary {
|
|
||||||
cursor: zoom-in;
|
|
||||||
margin-inline-start: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc details[open] summary {
|
|
||||||
cursor: zoom-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc .details {
|
|
||||||
display: inline;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc .inner {
|
|
||||||
margin: 0 20px;
|
|
||||||
padding: 10px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc li ul {
|
|
||||||
margin-inline-start: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc summary:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-footer {
|
|
||||||
margin-top: 56px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags li {
|
|
||||||
display: inline-block;
|
|
||||||
margin-inline-end: 3px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a,
|
|
||||||
.share-buttons,
|
|
||||||
.paginav {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a {
|
|
||||||
display: block;
|
|
||||||
padding-inline-start: 14px;
|
|
||||||
padding-inline-end: 14px;
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 34px;
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a:hover,
|
|
||||||
.paginav a:hover {
|
|
||||||
background: var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons {
|
|
||||||
margin: 14px 0;
|
|
||||||
padding-inline-start: var(--radius);
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons a {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons a:not(:last-of-type) {
|
|
||||||
margin-inline-end: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1:hover .anchor,
|
|
||||||
h2:hover .anchor,
|
|
||||||
h3:hover .anchor,
|
|
||||||
h4:hover .anchor,
|
|
||||||
h5:hover .anchor,
|
|
||||||
h6:hover .anchor {
|
|
||||||
display: inline-flex;
|
|
||||||
color: var(--secondary);
|
|
||||||
margin-inline-start: 8px;
|
|
||||||
font-weight: 500;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav {
|
|
||||||
margin: 10px 0;
|
|
||||||
display: flex;
|
|
||||||
line-height: 30px;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav a {
|
|
||||||
padding-inline-start: 14px;
|
|
||||||
padding-inline-end: 14px;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .title {
|
|
||||||
letter-spacing: 1px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-size: small;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .prev,
|
|
||||||
.paginav .next {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav span:hover:not(.title) {
|
|
||||||
box-shadow: 0 1px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .next {
|
|
||||||
margin-inline-start: auto;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
[dir="rtl"] .paginav .next {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1>a>svg {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.in-text {
|
|
||||||
display: inline;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
.buttons,
|
|
||||||
.main .profile {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main .profile {
|
|
||||||
align-items: center;
|
|
||||||
min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile .profile_inner h1 {
|
|
||||||
padding: 12px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile img {
|
|
||||||
display: inline-table;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
max-width: 400px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
|
||||||
background: var(--tertiary);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
margin: 8px;
|
|
||||||
padding: 6px;
|
|
||||||
transition: transform 0.1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-inner {
|
|
||||||
padding: 0 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button:active {
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
#searchbox input {
|
|
||||||
padding: 4px 10px;
|
|
||||||
width: 100%;
|
|
||||||
color: var(--primary);
|
|
||||||
font-weight: bold;
|
|
||||||
border: 2px solid var(--tertiary);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchbox input:focus {
|
|
||||||
border-color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults li {
|
|
||||||
list-style: none;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 10px;
|
|
||||||
margin: 10px 0;
|
|
||||||
position: relative;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults {
|
|
||||||
margin: 10px 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults li:active {
|
|
||||||
transition: transform 0.1s;
|
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults a {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults .focus {
|
|
||||||
transform: scale(0.98);
|
|
||||||
border: 2px solid var(--tertiary);
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
.terms-tags li {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 10px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.terms-tags a {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 10px;
|
|
||||||
background: var(--tertiary);
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: transform 0.1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.terms-tags a:active {
|
|
||||||
background: var(--tertiary);
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
PaperMod v7
|
|
||||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
*/
|
|
||||||
@ -1,116 +0,0 @@
|
|||||||
*,
|
|
||||||
::after,
|
|
||||||
::before {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
-webkit-tap-highlight-color: transparent;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
|
||||||
button,
|
|
||||||
body,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 1.6;
|
|
||||||
word-break: break-word;
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
figcaption,
|
|
||||||
figure,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
main,
|
|
||||||
nav,
|
|
||||||
section,
|
|
||||||
table {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6,
|
|
||||||
p {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body,
|
|
||||||
figure,
|
|
||||||
ul {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
overflow-x: auto;
|
|
||||||
word-break: keep-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
input,
|
|
||||||
textarea {
|
|
||||||
padding: 0;
|
|
||||||
font: inherit;
|
|
||||||
background: 0 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
textarea {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
input[type=button],
|
|
||||||
input[type=submit] {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:-webkit-autofill,
|
|
||||||
textarea:-webkit-autofill {
|
|
||||||
box-shadow: 0 0 0 50px var(--theme) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
:root {
|
|
||||||
--gap: 24px;
|
|
||||||
--content-gap: 20px;
|
|
||||||
--nav-width: 1024px;
|
|
||||||
--main-width: 720px;
|
|
||||||
--header-height: 60px;
|
|
||||||
--footer-height: 60px;
|
|
||||||
--radius: 8px;
|
|
||||||
--theme: rgb(255, 255, 255);
|
|
||||||
--entry: rgb(255, 255, 255);
|
|
||||||
--primary: rgb(30, 30, 30);
|
|
||||||
--secondary: rgb(108, 108, 108);
|
|
||||||
--tertiary: rgb(214, 214, 214);
|
|
||||||
--content: rgb(31, 31, 31);
|
|
||||||
--hljs-bg: rgb(28, 29, 33);
|
|
||||||
--code-bg: rgb(245, 245, 245);
|
|
||||||
--border: rgb(238, 238, 238);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark {
|
|
||||||
--theme: rgb(29, 30, 32);
|
|
||||||
--entry: rgb(46, 46, 51);
|
|
||||||
--primary: rgb(218, 218, 219);
|
|
||||||
--secondary: rgb(155, 156, 157);
|
|
||||||
--tertiary: rgb(65, 66, 68);
|
|
||||||
--content: rgb(196, 196, 197);
|
|
||||||
--hljs-bg: rgb(46, 46, 51);
|
|
||||||
--code-bg: rgb(55, 56, 62);
|
|
||||||
--border: rgb(51, 51, 51);
|
|
||||||
}
|
|
||||||
|
|
||||||
.list {
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark.list {
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
@media screen and (max-width: 768px) {
|
|
||||||
/* theme-vars */
|
|
||||||
:root {
|
|
||||||
--gap: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* profile-mode */
|
|
||||||
.profile img {
|
|
||||||
transform: scale(0.85);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* post-entry */
|
|
||||||
.first-entry {
|
|
||||||
min-height: 260px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* archive */
|
|
||||||
.archive-month {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* footer */
|
|
||||||
.footer {
|
|
||||||
padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* footer */
|
|
||||||
@media screen and (max-width: 900px) {
|
|
||||||
.list .top-link {
|
|
||||||
transform: translateY(-5rem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion) {
|
|
||||||
/* terms; profile-mode; post-single; post-entry; post-entry; search; search */
|
|
||||||
.terms-tags a:active,
|
|
||||||
.button:active,
|
|
||||||
.post-entry:active,
|
|
||||||
.top-link,
|
|
||||||
#searchResults .focus,
|
|
||||||
#searchResults li:active {
|
|
||||||
transform: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
/*
|
|
||||||
This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
|
|
||||||
|
|
||||||
Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
|
|
||||||
*/
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
.hljs-comment,
|
|
||||||
.hljs-quote {
|
|
||||||
color: #b6b18b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-deletion,
|
|
||||||
.hljs-name,
|
|
||||||
.hljs-regexp,
|
|
||||||
.hljs-selector-class,
|
|
||||||
.hljs-selector-id,
|
|
||||||
.hljs-tag,
|
|
||||||
.hljs-template-variable,
|
|
||||||
.hljs-variable {
|
|
||||||
color: #eb3c54;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-built_in,
|
|
||||||
.hljs-builtin-name,
|
|
||||||
.hljs-link,
|
|
||||||
.hljs-literal,
|
|
||||||
.hljs-meta,
|
|
||||||
.hljs-number,
|
|
||||||
.hljs-params,
|
|
||||||
.hljs-type {
|
|
||||||
color: #e7ce56;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-attribute {
|
|
||||||
color: #ee7c2b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-addition,
|
|
||||||
.hljs-bullet,
|
|
||||||
.hljs-string,
|
|
||||||
.hljs-symbol {
|
|
||||||
color: #4fb4d7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-section,
|
|
||||||
.hljs-title {
|
|
||||||
color: #78bb65;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-keyword,
|
|
||||||
.hljs-selector-tag {
|
|
||||||
color: #b45ea4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs {
|
|
||||||
display: block;
|
|
||||||
overflow-x: auto;
|
|
||||||
background: #1c1d21;
|
|
||||||
color: #c0c5ce;
|
|
||||||
padding: .5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-emphasis {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-strong {
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
/* from reset */
|
|
||||||
::-webkit-scrollbar-track {
|
|
||||||
background: 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list:not(.dark)::-webkit-scrollbar-track {
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
background: var(--tertiary);
|
|
||||||
border: 5px solid var(--theme);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
|
||||||
border: 5px solid var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* from post-single */
|
|
||||||
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content :not(table) ::-webkit-scrollbar-thumb {
|
|
||||||
border: 2px solid var(--hljs-bg);
|
|
||||||
background: rgb(113, 113, 117);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgb(163, 163, 165);
|
|
||||||
}
|
|
||||||
|
|
||||||
.gist table::-webkit-scrollbar-thumb {
|
|
||||||
border: 2px solid rgb(255, 255, 255);
|
|
||||||
background: rgb(173, 173, 173);
|
|
||||||
}
|
|
||||||
|
|
||||||
.gist table::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgb(112, 112, 112);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table::-webkit-scrollbar-thumb {
|
|
||||||
border-width: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* from zmedia */
|
|
||||||
@media screen and (min-width: 768px) {
|
|
||||||
|
|
||||||
/* reset */
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 19px;
|
|
||||||
height: 11px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
import * as params from '@params';
|
|
||||||
|
|
||||||
let fuse; // holds our search engine
|
|
||||||
let resList = document.getElementById('searchResults');
|
|
||||||
let sInput = document.getElementById('searchInput');
|
|
||||||
let first, last, current_elem = null
|
|
||||||
let resultsAvailable = false;
|
|
||||||
|
|
||||||
// load our search index
|
|
||||||
window.onload = function () {
|
|
||||||
let xhr = new XMLHttpRequest();
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
if (xhr.status === 200) {
|
|
||||||
let data = JSON.parse(xhr.responseText);
|
|
||||||
if (data) {
|
|
||||||
// fuse.js options; check fuse.js website for details
|
|
||||||
let options = {
|
|
||||||
distance: 100,
|
|
||||||
threshold: 0.4,
|
|
||||||
ignoreLocation: true,
|
|
||||||
keys: [
|
|
||||||
'title',
|
|
||||||
'permalink',
|
|
||||||
'summary',
|
|
||||||
'content'
|
|
||||||
]
|
|
||||||
};
|
|
||||||
if (params.fuseOpts) {
|
|
||||||
options = {
|
|
||||||
isCaseSensitive: params.fuseOpts.iscasesensitive ?? false,
|
|
||||||
includeScore: params.fuseOpts.includescore ?? false,
|
|
||||||
includeMatches: params.fuseOpts.includematches ?? false,
|
|
||||||
minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1,
|
|
||||||
shouldSort: params.fuseOpts.shouldsort ?? true,
|
|
||||||
findAllMatches: params.fuseOpts.findallmatches ?? false,
|
|
||||||
keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'],
|
|
||||||
location: params.fuseOpts.location ?? 0,
|
|
||||||
threshold: params.fuseOpts.threshold ?? 0.4,
|
|
||||||
distance: params.fuseOpts.distance ?? 100,
|
|
||||||
ignoreLocation: params.fuseOpts.ignorelocation ?? true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fuse = new Fuse(data, options); // build the index from the json file
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log(xhr.responseText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.open('GET', "../index.json");
|
|
||||||
xhr.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
function activeToggle(ae) {
|
|
||||||
document.querySelectorAll('.focus').forEach(function (element) {
|
|
||||||
// rm focus class
|
|
||||||
element.classList.remove("focus")
|
|
||||||
});
|
|
||||||
if (ae) {
|
|
||||||
ae.focus()
|
|
||||||
document.activeElement = current_elem = ae;
|
|
||||||
ae.parentElement.classList.add("focus")
|
|
||||||
} else {
|
|
||||||
document.activeElement.parentElement.classList.add("focus")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reset() {
|
|
||||||
resultsAvailable = false;
|
|
||||||
resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
|
|
||||||
sInput.focus(); // shift focus to input box
|
|
||||||
}
|
|
||||||
|
|
||||||
// execute search as each character is typed
|
|
||||||
sInput.onkeyup = function (e) {
|
|
||||||
// run a search query (for "term") every time a letter is typed
|
|
||||||
// in the search box
|
|
||||||
if (fuse) {
|
|
||||||
const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
|
|
||||||
if (results.length !== 0) {
|
|
||||||
// build our html if result exists
|
|
||||||
let resultSet = ''; // our results bucket
|
|
||||||
|
|
||||||
for (let item in results) {
|
|
||||||
resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title} »</header>` +
|
|
||||||
`<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
|
|
||||||
}
|
|
||||||
|
|
||||||
resList.innerHTML = resultSet;
|
|
||||||
resultsAvailable = true;
|
|
||||||
first = resList.firstChild;
|
|
||||||
last = resList.lastChild;
|
|
||||||
} else {
|
|
||||||
resultsAvailable = false;
|
|
||||||
resList.innerHTML = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sInput.addEventListener('search', function (e) {
|
|
||||||
// clicked on x
|
|
||||||
if (!this.value) reset()
|
|
||||||
})
|
|
||||||
|
|
||||||
// kb bindings
|
|
||||||
document.onkeydown = function (e) {
|
|
||||||
let key = e.key;
|
|
||||||
let ae = document.activeElement;
|
|
||||||
|
|
||||||
let inbox = document.getElementById("searchbox").contains(ae)
|
|
||||||
|
|
||||||
if (ae === sInput) {
|
|
||||||
let elements = document.getElementsByClassName('focus');
|
|
||||||
while (elements.length > 0) {
|
|
||||||
elements[0].classList.remove('focus');
|
|
||||||
}
|
|
||||||
} else if (current_elem) ae = current_elem;
|
|
||||||
|
|
||||||
if (key === "Escape") {
|
|
||||||
reset()
|
|
||||||
} else if (!resultsAvailable || !inbox) {
|
|
||||||
return
|
|
||||||
} else if (key === "ArrowDown") {
|
|
||||||
e.preventDefault();
|
|
||||||
if (ae == sInput) {
|
|
||||||
// if the currently focused element is the search input, focus the <a> of first <li>
|
|
||||||
activeToggle(resList.firstChild.lastChild);
|
|
||||||
} else if (ae.parentElement != last) {
|
|
||||||
// if the currently focused element's parent is last, do nothing
|
|
||||||
// otherwise select the next search result
|
|
||||||
activeToggle(ae.parentElement.nextSibling.lastChild);
|
|
||||||
}
|
|
||||||
} else if (key === "ArrowUp") {
|
|
||||||
e.preventDefault();
|
|
||||||
if (ae.parentElement == first) {
|
|
||||||
// if the currently focused element is first item, go to input box
|
|
||||||
activeToggle(sInput);
|
|
||||||
} else if (ae != sInput) {
|
|
||||||
// if the currently focused element is input box, do nothing
|
|
||||||
// otherwise select the previous search result
|
|
||||||
activeToggle(ae.parentElement.previousSibling.lastChild);
|
|
||||||
}
|
|
||||||
} else if (key === "ArrowRight") {
|
|
||||||
ae.click(); // click on active link
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
web/themes/PaperMod/assets/js/highlight.min.js
vendored
@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
PaperMod v7
|
|
||||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
*/
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
module github.com/adityatelange/hugo-PaperMod
|
|
||||||
|
|
||||||
go 1.12
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "السابق"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "التالي"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "دقيقة واحدة"
|
|
||||||
two: "دقيقتان"
|
|
||||||
few: "بضع ثوان"
|
|
||||||
zero: "الآن"
|
|
||||||
other: "دقائق {{ .Count }}"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "فهرس المحتوى"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "ترجمات أخرى"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "الصفحة الرئيسية"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "تم النسخ!"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "نسخ الكود"
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Папярэдняя"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Наступная"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
zero: "0 хвілін"
|
|
||||||
one: "1 хвіліна"
|
|
||||||
few: "{{ .Count }} хвіліны"
|
|
||||||
many: "{{ .Count }} хвілін"
|
|
||||||
other: "{{ .Count }} хвілін"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
zero: "няма слоў"
|
|
||||||
one: "1 слова"
|
|
||||||
few: "{{ .Count }} слова"
|
|
||||||
many: "{{ .Count }} слоў"
|
|
||||||
other: "{{ .Count }} слова"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Змест"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Пераклады"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Галоўная"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Рэдагаваць"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "капіяваць"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "скапіявана!"
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Предишна страница"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Следваща страница"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 мин"
|
|
||||||
other: "{{ .Count }} мин"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Съдържание"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Преводи"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "পূর্ববর্তী"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "পরবর্তী"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "১ মিনিট"
|
|
||||||
other: "{{ .Count }} মিনিট"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "১ টি শব্দ"
|
|
||||||
other: "{{ .Count }} টি শব্দ"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "সূচিপত্র"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "অনুবাদসমূহ"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "হোম"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "সম্পাদনা করুন"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "কপি করুন"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "কপি হয়েছে!"
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Pàgina anterior"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Pàgina següent"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Taula de Continguts"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traduccions"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Inici"
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "پەڕەی پێشتر"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "پەڕەی دواتر"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 خولەک"
|
|
||||||
other: "{{ .Count }} خولەک"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "پێڕست"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "وەرگێڕانەکان"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "ماڵەوە"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "لەبەری بگرەوە"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "لەبەر گیرایەوە!"
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Forrige Side"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Næste Side"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Indholdsfortegnelse"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Oversættelser"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Start"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Rediger"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopier"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "kopieret!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Vorherige"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Nächste"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 Minute"
|
|
||||||
other: "{{ .Count }} Minuten"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "Wort"
|
|
||||||
other: "{{ .Count }} Wörter"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Inhaltsverzeichnis"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Übersetzungen"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Bearbeiten"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Kopieren"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Kopiert!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Προηγούμενο"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Επόμενο"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 λεπτό"
|
|
||||||
other: "{{ .Count }} λεπτά"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one: "λέξη"
|
|
||||||
other: "{{ .Count }} λέξεις"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Πίνακας Περιεχομένων"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Μεταφράσεις"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Αρχική"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Επεξεργασία"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "αντιγραφή"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "αντιγράφηκε!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Prev"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Next"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "word"
|
|
||||||
other: "{{ .Count }} words"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Table of Contents"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Translations"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Edit"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "copy"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "copied!"
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "antaŭa paĝo"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "sekva paĝo"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Enhavo"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "tradukoj"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "ĉefpaĝo"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopii"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "kopiite!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Anterior"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Siguiente"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "palabra"
|
|
||||||
other: "{{ .Count }} palabras"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Tabla de Contenidos"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traducciones"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Inicio"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Editar"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "copiar"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "¡copiado!"
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "صفحه قبلی"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "صفحه بعدی"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "۱ دقیقه"
|
|
||||||
other: "{{ .Count }} دقیقه"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "فهرست مطالب"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "ترجمه ها"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "خانه"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "ویرایش"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "کپی"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "کپی شد!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Précédent"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Suivant"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "mot"
|
|
||||||
other: "{{ .Count }} mots"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Table des matières"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traductions"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Accueil"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Modifier"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Copier"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Copié !"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "קודם"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "הבא"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "דקה אחת"
|
|
||||||
other: "דקות {{ .Count }}"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "word"
|
|
||||||
other: "מילים {{ .Count }} "
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "תוכן העניינים"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "תרגומים"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "בית"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "ערוך"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "העתק"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "!הועתק"
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "पिछला"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "अगला"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "एक मिनट"
|
|
||||||
other: "{{ .Count }} मिनट"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "सुधारें"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "विषय - सूची"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "अनुवाद"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Prethodna stranica"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Sljedeća stranica"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 minuta"
|
|
||||||
other: "{{ .Count }} minute"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "riječ"
|
|
||||||
other: "{{ .Count }} riječi"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Tablica Sadržaja"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Prijevodi"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Početna stranica"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Promjeni"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopiraj"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "kopirano!"
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Előző oldal"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Következő oldal"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 perc"
|
|
||||||
other: "{{ .Count }} perc"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Tartalomjegyzék"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Fordítások"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Sebelumnya"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Selanjutnya"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 menit"
|
|
||||||
other: "{{ .Count }} menit"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "kata"
|
|
||||||
other: "{{ .Count }} kata"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Daftar isi"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Terjemahan"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Beranda"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Sunting"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "salin"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "disalin!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Precedente"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Successivo"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 minuto"
|
|
||||||
other: "{{ .Count }} minuti"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "parola"
|
|
||||||
other: "{{ .Count }} parole"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Indice contenuti"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traduzioni"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Modifica"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "copia"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "copiato!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "前へ"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "次へ"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 分"
|
|
||||||
other: "{{ .Count }} 分"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one: "文字"
|
|
||||||
other: "{{ .Count }} 文字"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "目次"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "言語"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "ホーム"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "編集"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "コピー"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "コピーされました!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "이전 페이지"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "다음 페이지"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 분"
|
|
||||||
other: "{{ .Count }} 분"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "단어"
|
|
||||||
other: "{{ .Count }} 단어"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "목차"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "번역"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "홈"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "편집"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "복사"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "복사 완료!"
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Rûpela Paş"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Rûpela Pêş"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 xulek"
|
|
||||||
other: "{{ .Count }} xulek"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Pêrist"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Wergeran"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Xanî"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Jê bigire"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Hat jêgirtin!"
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Ѳмнѳх"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Дараах"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 МИН"
|
|
||||||
other: "{{ .Count }} МИН"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Агуулга"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Орчуулга"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Нүүр"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "хуулах"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "хуулсан!"
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Halaman Sebelumnya"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Halaman Seterusnya"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 minit"
|
|
||||||
other: "{{ .Count }} minit"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Isi Kandungan"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Terjemahan"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Sunting"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Salin"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Disalin!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Vorige"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Volgende"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "woord"
|
|
||||||
other: "{{ .Count }} woorden"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Inhoudsopgave"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Vertalingen"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Startpagina"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Bewerk"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopieer"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "gekopieerd!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Poprzednia"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Następna"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "słowo"
|
|
||||||
other: "{{ .Count }} słów"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Spis treści"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Tłumaczenia"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Strona Główna"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Edytuj"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Kopiuj"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Skopiowano!"
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Página Anterior"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Próxima Página"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 minuto"
|
|
||||||
other: "{{ .Count }} minutos"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "palavra"
|
|
||||||
other: "{{ .Count }} palavras"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Conteúdo"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traduções"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Início"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Editar"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "copiar"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "copiado!"
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Предыдущая"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Следующая"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
zero: "0 минут"
|
|
||||||
one: "1 минута"
|
|
||||||
few: "{{ .Count }} минуты"
|
|
||||||
many: "{{ .Count }} минут"
|
|
||||||
other: "{{ .Count }} минута"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
zero: "0 слов"
|
|
||||||
one: "1 слово"
|
|
||||||
few: "{{ .Count }} слова"
|
|
||||||
many: "{{ .Count }} слов"
|
|
||||||
other: "{{ .Count }} слово"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Оглавление"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Переводы"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Главная"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Редактировать"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "копировать"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "скопировано!"
|
|
||||||