Compare commits

..

13 commits

330 changed files with 24439 additions and 1812 deletions

View file

@ -4,20 +4,6 @@ on: push
env:
DEV_SHELL_NAME: CI
jobs:
Check config:
runs-on: flakes-action
steps:
- uses: actions/checkout@v3
name: Checkout
- name: Metadata
run: |
nix flake metadata
- name: Statix
run: |
nix develop -c statix check
- name: Flake check
run: |
nix flake check
Publish:
runs-on: flakes-action
steps:
@ -34,4 +20,22 @@ jobs:
EOF
chmod 400 ~/.ssh/id_ed25519
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILqDeXcIQwLXxuueu9KTC6y6NPUUzDRdF4Q5NUk+nFwt upload@blog" > ~/.ssh/id_ed25519.pub
nix develop -c rsync -avz -e 'ssh -o StrictHostKeyChecking=accept-new' public/ blog@blog.cyplo.net:/var/www/blog/
nix develop -c rsync -avz -e 'ssh -o StrictHostKeyChecking=accept-new' public/ blog@blog.cyplo.net:/var/www/blog/
- name: Check html
run: |
nix develop -c htmltest
Check config:
runs-on: flakes-action
steps:
- uses: actions/checkout@v3
name: Checkout
- name: Metadata
run: |
nix flake metadata
- name: Statix
run: |
nix develop -c statix check
- name: Flake check
run: |
nix flake check

5
.gitignore vendored
View file

@ -1,7 +1,8 @@
.direnv/
public/
tmp/
resources/_gen/
node_modules/
/assets/jsconfig.json
assets/jsconfig.json
hugo_stats.json
/.hugo_build.lock
.hugo_build.lock

4
.htmltest.yml Normal file
View file

@ -0,0 +1,4 @@
DirectoryPath: public/
IgnoreDirectoryMissingTrailingSlash: true
IgnoreEmptyHref: true
RedirectLimit: 32

6
archetypes/default.md Normal file
View file

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

View file

@ -2,17 +2,7 @@ baseurl = "https://blog.cyplo.dev/"
languageCode = "en-gb"
theme = 'github.com/canstand/compost'
[build]
_merge = 'deep'
[markup]
_merge = 'deep'
[minify]
_merge = 'deep'
theme = "beautifulhugo"
paginate = 7
pygmentsUseClasses=true
@ -24,23 +14,16 @@ title = "Adventurous Computing"
series = "series"
tags = "tags"
[params.homepage]
showRecent = true
[params.article]
showBreadcrumbs = true
showEdit = true
editURL = "https://git.cyplo.dev/cyplo/blog/src/branch/main/content"
editAppendPath = true
[[params.bigimg]]
src = "images/header.jpg"
position = "center top"
[params]
homeTitle = "Adventurous Computing by Cyryl Płotnicki"
keywords = "programming, testing, tdd, rust, golang"
logo = "images/avatar.jpg"
showRelatedPosts = true
rss = true
selfHosted = true
colorScheme = "auto"
[[menu.main]]
identifier = "about"
@ -82,8 +65,4 @@ weight = 6
name = "Cyryl Płotnicki"
website = "https://blog.cyplo.dev/"
email = "blog@cyplo.dev"
github = "cyplo"
gitlab = "cyplo"
twitter = "cyplo"
linkedin = "cyplo"
mastodon = "peninsula.industries/@cyplo"

View file

@ -8,11 +8,6 @@ My name is Cyryl and I hope you're having a great day !
## Interesting random tidbits about me
I am [running](https://blog.cyplo.net/posts/2018/05/pair-with-me-on-rust.html) remote pairing sessions, helping people with Rust.
My recent focus is [adding fuzzer](https://twitter.com/cyplo/status/1094606119421521922) infrastructure to their projects.
I started a [blog post series](https://blog.cyplo.net/series/rust-testing-tricks/) on testing in [Rust](https://blog.cyplo.net/categories/rust.html) where I share the tricks I've learned.
I was in both leadership and individual contributor roles, I have respect for all sides involved in the process.
I like testing, I taught various aspects of TDD in an apprenticeship course.
@ -30,7 +25,7 @@ As all of the above is on the bleeding edge - I find, report and fix bugs throug
Helping client teams grow - working within software teams and teaching technical concepts as well as improving the process.
Running workshops (e.g. Legacy Code Retreat, advanced git, **TDD**).
Running **Rust** pairing sessions and intro to Rust workshops.
// Running **Rust** pairing sessions and intro to Rust workshops.
Facilitating open-space conferences.
Teaching at the apprenticeship programme.
@ -85,7 +80,7 @@ The links provided are for the slide decks.
- Mastering Git
- Legacy Code Retreat - running a full-day workshop on test-driving changes in legacy code.
- A secret to secure software (ssshhh it's TDD)
- ["Conferences you did not know existed and now you know you just need to go to"](https://blog.cyplo.net/posts/2016/03/13/conferences.html)
- ["Conferences you did not know existed and now you know you just need to go to"](/posts/2016/03/13/conferences/)
- "Languages are communities" - impromptu talk about how communities are the most important thing when choosing your programming language.
- ["Tor and what it's good for"](https://github.com/cyplo/talks/tree/master/tor_for_beginners)
- ["Erlang for the .Net people"](https://github.com/erlang-wroclaw/erlang_tech_night) - introduction to Erlang with some live coding by me and my friend Fabian

View file

@ -3,8 +3,8 @@ title: "Projects"
date: 2022-10-30
---
- [legdur](https://sr.ht/~cyplo/legdur/) - legdur is a simple CLI program to compute hashes of large sets of files in large directory structures and compare them with a previous snapshot. Think having your photo collection you acquired over time and worrying about bitrot.
- [genpass](https://sr.ht/~cyplo/genpass/) - A simple yet robust commandline random password generator written in Rust. Has an extensive generative test suite, including tests against a Rust port of Dropbox's password strength tester zxcvbn.
- [netlify deployer](https://pypi.org/project/netlify-deployer/) - A Python CLI tool to deploy a website to Netlify using their incremental API client. Not the best code but works like a charm. This blog [uses](https://git.sr.ht/~cyplo/blog/tree/master/item/.build.yml#L21) it.
- [my dotfiles](https://sr.ht/~cyplo/dotfiles/) - all of the settings for all of my machines, automated using Nix
- [bakare](https://sr.ht/~cyplo/bakare/) - work in progress on writing a modern backup solution in Rust
- [legdur](https://git.cyplo.dev/cyplo/legdur) - legdur is a simple CLI program to compute hashes of large sets of files in large directory structures and compare them with a previous snapshot. Think having your photo collection you acquired over time and worrying about bitrot.
- [genpass](https://git.cyplo.dev/cyplo/genpass) - A simple yet robust commandline random password generator written in Rust. Has an extensive generative test suite, including tests against a Rust port of Dropbox's password strength tester zxcvbn.
- [netlify deployer](https://pypi.org/project/netlify-deployer/) - A Python CLI tool to deploy a website to Netlify using their incremental API client. Not the best code but works like a charm.
- [my dotfiles](https://git.cyplo.dev/cyplo/dotfiles) - all of the settings for all of my machines, automated using Nix
- [bakare](https://git.cyplo.dev/cyplo/bakare) - work in progress on writing a modern backup solution in Rust

View file

@ -5,8 +5,10 @@ tags: [dotnet, ai, google, mono]
category: artificial intelligence
---
> Update 2023: things fall off the face of the internet after a while; removed dead links
It seems that being so much into other programming things I missed the
[Google AI Contest](http://ai-contest.com/) announcement. It's
[Google AI Contest]() announcement. It's
supercool that they sponsor such challenges but also it's really uncool
[so like warm ?] that apparently I won't have time to participate.

View file

@ -7,11 +7,11 @@ category: games
I have always been fascinated by works of Adrian Chmielarz, from the
times of Metropolis Software on. Naturally then, I am following really
closely on the development of
[Bulletstorm](http://www.bulletstorm.com/). Damn, I even hoped to
[Bulletstorm](https://www.bulletstorm.com/). Damn, I even hoped to
talk to The Guy or Mieszko Zielinski at the
[gameaiconf](http://gameaiconf.com/>) in Paris, but
[Alex](http://aigamedev.com/) told me that "whoa,
[PCF](http://www.peoplecanfly.com/) are so busy with the new IP that
[gameaiconf]() in Paris, but
[Alex]() told me that "whoa,
[PCF](https://www.peoplecanfly.com/) are so busy with the new IP that
they didn't have time to come this year, next year they'll be here,
hopefully".
@ -23,7 +23,7 @@ that they take this game everywhere with them. To dinner, breakfast,
party. That's the way I do like to work.
Now back on track, an interview which triggered this urge to flush my
thoughts here. [Interview with Tanya Jessen](http://techland.com/2010/10/14/origins-tanya-jessen-lead-producer-on-bulletstorm/),
thoughts here. [Interview with Tanya Jessen](https://techland.com/2010/10/14/origins-tanya-jessen-lead-producer-on-bulletstorm/),
producer at Epic.
People make games so other people can have fun. How selfless.

View file

@ -11,7 +11,7 @@ these days. The question remains where to put them.
Previously I had my site published within one of the polish hosting
companies for free, as my friend was involved in its operations. Thanks
[Kajetan](http://www.kajetanwandowicz.com/) for 5 years of support !
[Kajetan]() for 5 years of support !
And maybe it'd stay that way if not of that desire of mine to tinker and
have control of every aspect of the technology power. Some platform with
ability to boot the system I want up would be appreciated.
@ -40,7 +40,7 @@ their 'live' tech support line just to hear that it was really bad of me
to change the resolv.conf and I just shouldn't do that. In the meanwhile
their DNSes went back so I in fact did revert the resolv.conf after all.
It's [OpenVZ](http://wiki.openvz.org/Main_Page>)-based hosting, so
It's [OpenVZ](https://wiki.openvz.org/Main_Page)-based hosting, so
policy of "no-no's" is pretty much embedded in the very system. No
kernel reinstallation. No swap space. No system clock write access. No
clicking too fast in the administration panel. Back to google then my search for VPS

View file

@ -5,9 +5,11 @@ tags: [server, tilaa, ubuntu, virtualization, vps]
category: server
---
> Update 2023: the landscape has changed considerably over the last 13 years, a lot of the companies mentioned in this post have died, I've removed dead links
After some not so pleasurable experiences with the previous VPS hosting
provider I started my search for some other one. This time not only
google was involved but also [aardvark](http://vark.com/) and some of
google was involved but also [aardvark]() and some of
the "top XX best hosting providers" sites. Two results kept showing up.
[server4you](http://www.server4you.com/) and
[tilaa](https://www.tilaa.nl/). Which one to choose then ? I wanted
@ -30,7 +32,7 @@ are some things I like or don't about its services.
- friendly, responsive staff
- 2x RAM amount of swap space - seems great compared to no swap on other VPSes
- [KVM](http://www.linux-kvm.org/page/Main_Page)- and [qemu](http://en.wikipedia.org/wiki/QEMU)-based, you get full control of your system
- good overall system responsiveness - I experienced occasional lags when using [OpenVZ](http://wiki.openvz.org/Main_Page) virtualization before, there's no such thing here
- good overall system responsiveness - I experienced occasional lags when using [OpenVZ](https://wiki.openvz.org/Main_Page) virtualization before, there's no such thing here
- they work fast - the day the new Ubuntu 10.10 was released, they had the VPS image ready !
- their motto "We try to be good open source citizens" just convinces me
- the only disadvantage is the price, it's 8.95 euro net montly, it's also easy to miss that info on the site

View file

@ -5,6 +5,8 @@ tags: [macosx, virtualbox]
categories: [freedom, mac, server]
---
> Updated 2023: sadly nawcom is no more, I've removed dead links
It all started with my work assignment of installing MacOSX Server 10.6
on the XServe rack. Briefly speaking, after debugging some hardware problem
with the CPU temperature meter, I managed to install the base OSX server
@ -26,8 +28,8 @@ and launch was single-core. Both 32 and 64bit guests seem to be working
fine. But what's the point of having many cores there if only one can be
used per a VM ? Some time after that I found brilliant blog pair by
[prasys](http://prasys.info/) and
[nawcom](http://blog.nawcom.com/). It seems that the latter one
produces what's called [ModCD](http://blog.nawcom.com/?p=446) which
[nawcom](). It seems that the latter one
produces what's called [ModCD]() which
allows booting with the processor checks disabled. Recipe for amd64:
- create new MacOSX vm in VirtualBox

View file

@ -16,3 +16,4 @@ Two speakers per can !
Photos taken after replacing the cable and before pots rejuvenation.
Enjoy :)
{{< gallery dir="/galleries/disassembling-pioneer-se-50" />}}

View file

@ -11,7 +11,7 @@ aliases:
Ever cried over damaged disk holding your bitcoin wallet ? Ever
formatted storage holding a perfectly valid and the only copy of your
wallet.dat ? Yes, me too. Well, there's
[Photorec](http://www.cgsecurity.org/wiki/PhotoRec), an opensource file
[Photorec](https://en.wikipedia.org/wiki/PhotoRec), an opensource file
recovery software. It just skips the partition and filesystem info and
scans for plain file signatures on the disk. Unfortunately it does not
recognize Bitcoin's Wallet as a file format. Bitcoin wiki
@ -33,7 +33,7 @@ detection magic. Let's see whether it works on the wallet.
```
Uhoh. Do not abandon hope for not all is lost ! Photorec [provides a
way](http://www.cgsecurity.org/wiki/Add_your_own_extension_to_PhotoRec)
way
for you to add custom signatures. The only missing ingredient appears to
be the knowledge possed by the `file` command. Just check your linux installation for
`file`'s detection signatures. On my system these are to be found

View file

@ -5,15 +5,15 @@ tags: [BCM43224, crunchbang, dell, linux]
category: linux
---
Update:
**Please note that I no longer host this kernel as it is very old and also Crunchbang is no more.**
> Update 2023: crunchbang is no longer a thing, replaced by [bunsenlabs](https://www.bunsenlabs.org/)
> Please note that I no longer host this kernel as it is very old and also Crunchbang is no more.**
Some time ago I got my hands on [CrunchBang Linux](http://crunchbanglinux.org/) distro, which is great. The only thing there that could be better is that my Broadcom BCM43224 WiFi card is not working. But I'm used to it, as many
Some time ago I got my hands on [CrunchBang Linux](https://en.wikipedia.org/wiki/CrunchBang_Linux) distro, which is great. The only thing there that could be better is that my Broadcom BCM43224 WiFi card is not working. But I'm used to it, as many
Linux distros do not provide it. As I happen to
know from my Fedora experiences that it is resolved in kernel version
3.4 . Also as that kernel tends to be generally faster on my machine, I
decided to compile just this one. Here you are. [Vanilla 3.4.4](http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.4.4.tar.bz2)
kernel, [compiled](http://crunchbanglinux.org/forums/topic/18060/how-to-compile-the-kernel-from-source/)
kernel, [compiled]()
for Intel Atom and with BCM43224 support. This is a 64bit kernel.
Download [crunchbanglinux-kernel-3.4.4-intel\_atom.tar.bz2]
and:

View file

@ -5,3 +5,4 @@ tags: [CCC]
category: freedom
---
{{< gallery dir="galleries/29c3" />}}

View file

@ -6,7 +6,7 @@ category: talks
---
I recently gave a two hours presentation on Erlang 101 along with
[Fabian](http://fabiankrol.com/). Because of the generous support
Fabian. Because of the generous support
from Infusion I was able to speak at Institute of Computer Science at
University of Wroclaw. The event was a blast, and that is an opinion of
the people other than me also ;) Thanks for everyone who was there and

View file

@ -8,12 +8,16 @@ category: hardware
It was December, 3D printing fever struck me. Here is the first day of
me building ReprapPro Mendel printer.
{{< gallery dir="galleries/assembling-reprap/1" />}}
Second day of building. Fun fact: you can see the daylight come and go ;)
{{< gallery dir="galleries/assembling-reprap/2" />}}
Next few days - Featuring hotbed and plastic extruder !
{{< gallery dir="galleries/assembling-reprap/3" />}}
Yet another few days - Hot header installation, lots of wiring, tests and... it's alive !
{{< gallery dir="galleries/assembling-reprap/4" />}}

View file

@ -20,7 +20,7 @@ Disk /dev/sde: 500.1 GB, 500107862016 bytes
```
First one is an SSD drive, I used it for OS
installation.  I went for [Crunchbang](http://crunchbang.org/) as I
installation.  I went for [Crunchbang](https://www.bunsenlabs.org/) as I
was already familiar with it, however now I'm thinking of just getting
newest Debian there, as it's finally released. Nothing fancy about the
OS, a regular install really.

View file

@ -22,7 +22,7 @@ calibration for you. Game on you say ? Indeed.
- 4x USB
- HDMI
- typing on its keyboard, just clicks with me
- survived [OHM2013](https://ohm2013.org/site/) camp - not scared of
- survived [OHM2013](https://ohm2013.org/) camp - not scared of
humidity and hot air
## What I do not like so much:

View file

@ -5,13 +5,17 @@ tags: [cygwin, dotfiles, linux, mac, vim]
category: open source
---
> Update from 10 years into the future ! It's 2023 and the repo is still going strong, using lots of Nix and friends tho and also hosted elsewhere - edited the URLs.
> All my dofiles live [here](https://git.cyplo.dev/cyplo/dotfiles/) now. Removed the links from the article below as they don't work anymore.
Hi ! Just letting you know that I've been working for some time on
structuring my dotfiles and finally published them to
[github](https://github.com/cyplo/dotfiles). These contain e.g. my
[vimrc](https://github.com/cyplo/dotfiles/blob/master/.vimrc) and
[font](https://github.com/cyplo/dotfiles/tree/master/.local/share/fonts)
[configs](https://github.com/cyplo/dotfiles/tree/master/.config/fontconfig/conf.d).
I've [patched](https://github.com/cyplo/vim-colors-solarized)
structuring my dotfiles and finally ~~published them to
[github]().~~ (No github anymore, selfhosting!)
These contain e.g. my
[vimrc]() and
[font]()
[configs]().
I've [patched]()
the famous [solarized](http://ethanschoonover.com/solarized) theme
for vim to allow better
[gitgutter](https://github.com/airblade/vim-gitgutter) symbols

View file

@ -14,3 +14,4 @@ talks along with general anti-buffer-overflow techniques. [Tor folks talking abo
a day. Here are some photos, with no Congress people, except for me, in
them, as the tradition goes.
{{< gallery dir="galleries/30c3" />}}

View file

@ -3,7 +3,7 @@ title: Sunpowered server setup
date: 2014-02-16 21:13:46
tags: [hardware, raspberry pi, sunpowered]
bigimg: [{ src: "/galleries/sunpowered/IMG_0942.jpg" }]
series: [sunpowered]
series: sunpowered
---
Remember my [NAS](/tags/nas) ? It
@ -87,3 +87,4 @@ Future improvements:
system power usage at least
- more safety fuses and bypass diodes
{{< gallery dir="galleries/sunpowered" />}}

View file

@ -4,8 +4,10 @@ date: 2014-03-17 10:08:21
tags: [pocorgtfo]
---
> Update 2023: I no longer host PoCorGTFO here, it's very much available elsewhere on the internet and I couldn't afford the costs for this server sadly.
Hey to all you curious folks the new issue of PoC or GTFO is well,
out ! The best minds in infosec on exploits and more. Lots of hardcore
programming knowledge to obtain. For your convenience, as its not that
easy to get this on the webs, Ive took a liberty of uploading them
[here](/pages/files)
[here]()

View file

@ -1,14 +1,14 @@
---
title: Adding voltage and current measurements to the sunpowered Pi
date: 2014-04-21 14:39:13
tags: [hardware, raspberry pi]
tags: [hardware, raspberry pi, sunpowered]
bigimg:
[
{
src: "/images/adding-voltage-current-measurements-sunpowered-pi/voltages.png",
},
]
series: [sunpowered]
series: sunpowered
---
Remember my [sunpowered Pi](/posts/2014/02/16/sunpowered-server-setup/)
@ -65,3 +65,4 @@ realm of hobby projects:
- clean up python stuff, add more unit tests there
- write next post on the above ;)
{{< gallery dir="galleries/adding-voltage-current-measurements-sunpowered-pi/" />}}

View file

@ -11,3 +11,4 @@ did to allow filament spools to be mounted securely to a wall. It turns
out that if you cut off the bent part the rod it fits perfectly into the
spool's handle hole.
{{< gallery dir="galleries/filament-spool-wall" />}}

View file

@ -11,3 +11,4 @@ flipped on its back, motherboard attached to the back of what once was a
lid. The whole thing is flying on standard monitor desk mount, using
custom vesa-to-acrylic mounting system ;)
{{< gallery dir="galleries/standing-desk" />}}

View file

@ -2,7 +2,7 @@
title: Tools - PCB holder
date: 2015-03-28 18:33:53
tags: [hardware, electronics]
series: [tools]
series: tools
---
I thought it would be cool to share with you the tools I find
@ -12,3 +12,4 @@ hand'-type of holders. The grip is very firm but won't scratch the
surface nor short anything because the jaws are made from a soft
plastic. And the whole thing **ROTATES** !
{{< gallery dir="galleries/tools-pcb-holder" />}}

View file

@ -2,7 +2,7 @@
title: CNC router arrives
date: 2015-04-26 13:17:05
tags: [hardware, cnc]
series: [cnc]
series: cnc
---
After 2 months of waiting - my CNC router arrives. 8 weeks lead time
@ -32,3 +32,4 @@ of relying of the accurate timing of the PC. TODOs:
- get a vacuum attachment for the spindle
- move to LinuxCNC
{{< gallery dir="galleries/cnc-router-arrives" />}}

View file

@ -2,9 +2,12 @@
title: Update on the sunpowered server
date: 2015-05-02 14:54:05
tags: [observability]
series: [sunpowered]
series: sunpowered
---
> Update 2023: I no longer hosts those dashboards anymore and the server no longer runs in the form described.
> You could argue I still run sunpowered servers, as my new house has solar PV ;)
Some, rather long, time ago I've added a [custom python](/posts/2014/04/21/adding-voltage-current-measurements-sunpowered-pi/)
data acquisition and graphing to my sunpowered RaspberryPi installation
on the balcony. Since then I've upgraded it to Raspi2 and ported the
@ -23,7 +26,7 @@ compile the software there. I've [changed the original python scripts slightly](
to upload the data to influxdb instead of graphing directly via
matplotlib. Then configured grafana to display some cool graphs and that
was pretty much it - you can see the result at
[data.cyplo.net](http://data.cyplo.net/dashboard/db/sunpowered).
[data.cyplo.net]().
Right now I'm testing 2 different sizes of solar panels and
batteries, hooked at the same time. The ADC is connected as it was
@ -31,3 +34,4 @@ before though, so a TODO is to add more measurements, to see how the
individual  panels' output change during the data and how does it affect
each of the batteries.
{{< gallery dir="galleries/sunpowered-data" />}}

View file

@ -1,8 +1,8 @@
---
title: My CNC machining workflow
date: 2015-05-28 19:01:33
tags: []
series: [cnc]
tags: [cnc]
series: cnc
---
Hello ! Today we'll talk about driving CNC machines, toolpaths and

View file

@ -2,7 +2,7 @@
title: Tools - precision gauge holder
date: 2015-10-17 13:46:36
tags: [cnc, tools]
series: [tools]
series: tools
---
This is the second part in the [series](/series/tools) on the tools I use. Tools that are
@ -16,3 +16,4 @@ frame of your router using the power of magnets ! Sample item on Amazon
Despite being attached to the frame by its back instead of the bottom it
still holds beautifully.
{{< gallery dir="galleries/tools-indicator-holder" />}}

View file

@ -13,3 +13,4 @@ components because of that. The whole project is hosted
[here](https://github.com/cyplo/sunpowered/tree/master/electronics) - it's
open hardware so please do take a look.
{{< gallery dir="galleries/productive-new-years-eve" />}}

View file

@ -7,7 +7,7 @@ tags: [social, conferences]
# Go to conferences. It's good for you.
Ever wondered why to go to conferences ? Is it worth it, especially if
you [do not feel confident](http://sarah.thesharps.us/2016/02/02/first-timers-guide-to-foss-conferences/)
you [do not feel confident](https://sage.thesharps.us/2016/02/02/first-timers-guide-to-foss-conferences/)
that the conference is on something that would be in an immediate realm
of your day-to-day interests ? Just go ! You might end up learning
something and meeting new people. And new people mean more variables to
@ -20,7 +20,7 @@ having another misfit ? Here you go.
Now imagine something niche within the industry. To me, AI comes to
mind. Mages in robes in their towers, sending out autonomous robot
armies against each other. Right ? There's a conference for that ! At
[nucl.ai](http://nucl.ai/), in July, in Vienna, you can meet AI
[nucl.ai](), in July, in Vienna, you can meet AI
professionals from academia and industry alike, most of them coming from
game development background. The atmosphere is very newcomer-friendly,
the only requirement is that you're interested in AI, not necessarily

View file

@ -9,3 +9,4 @@ You might learn something.
Level 2 - push for things to be easily fixable.
It's good for you. It's good for the planet.
{{< gallery dir="galleries/dont-throw-away-fix" />}}

View file

@ -127,6 +127,6 @@ Start the debugging session by pressing `F5` again - this should result in the b
## Questions ?
Any questions ? Ask on [https://users.rust-lang.org/](https://users.rust-lang.org/) and ping me the link to the post on [Twitter](https://twitter.com/cyplo) or email it to me at [blog@cyplo.net](mailto:blog@cyplo.net). This way the answer will be visible to everyone in the community.
Any questions ? Ask on [https://users.rust-lang.org/](https://users.rust-lang.org/) and ping me the link via email to me at [blog@cyplo.net](mailto:blog@cyplo.net). This way the answer will be visible to everyone in the community.
Keep on Rusting !

View file

@ -15,7 +15,7 @@ We can work on any of the following:
- Any project of yours !
- Contribute back to a larger open source project (I am a contributor to e.g. [cargo](https://github.com/rust-lang/cargo/), [rustc](https://github.com/rust-lang/rust/) and [rustup](https://github.com/rust-lang-nursery/rustup.rs/))
- A project of mine - e.g. [genpass](https://github.com/cyplo/genpass)
- A project of mine - e.g. [genpass](https://lib.rs/crates/genpass)
Ping me an [email](mailto:rust@cyplo.dev) to schedule a session - can be a remote one or in person somewhere in London.

View file

@ -2,7 +2,7 @@
title: Rust - controlling side effects from the test.
date: 2018-07-30 00:00:00
tags: [rust, testing, tdd]
series: [rust-testing-tricks]
series: rust-testing-tricks
---
# Rust: controlling side effects from the test.

View file

@ -2,7 +2,7 @@
title: Testing tricks in Rust
date: 2018-09-25 00:00:00
tags: [rust, tdd, testing]
series: [rust-testing-tricks]
series: rust-testing-tricks
---
# Use verbs as test module names
@ -36,7 +36,7 @@ Cargo prints `worker::should::consume_message_from_queue` when running this test
Use e.g. the `atomic` types family or `RefCell` itself to get an immutable handle to a internally mutable data.
Useful when you don't want your production code to accept anything that can mutate but you still want to control that value from the test.
See injecting the system clock example in [my previous blog post](/posts/2018/07/rust-injection.html).
See injecting the system clock example in [my previous blog post](/posts/2018/07/rust-injection/).
# Write the test first
@ -58,6 +58,6 @@ Rust allows for more cool tricks and generally writing less test code than menti
# Let's talk !
Have any questions ? Would like to pair on Rust ? Curious about TDD ? Ping me !
Email is good - [hello@cyplo.net](mailto:hello@cyplo.net) or try [Twitter](https://twitter.com/cyplo).
Email is good - [hello@cyplo.net](mailto:hello@cyplo.net).
thanks !

View file

@ -2,7 +2,7 @@
title: Generate Rust tests from data files
date: 2018-12-25
tags: [rust, tdd, testing]
series: [rust-testing-tricks]
series: rust-testing-tricks
---
Sometimes you just have a bunch of example data laying around and you want to make sure your code works with all of them.

View file

@ -10,7 +10,7 @@ I am fascinated by the concept of fuzzing. It fits well with my desire to test w
It's a type of automated testing, especially good with finding edge cases in your code. It runs totally outside of your code and knows nothing about it - it just throws random data at it. Modern fuzzers instrument your code to be able to tell if by changing input they change the code paths covered and by doing that they try to achieve maximum coverage. While this sounds like a very naive approach it can lead to finding incredibly interesting bugs. For that reason fuzzers are oftentimes used in the security community for finding vulnerabilities. Fuzzing is a type of a black box testing - but how you define that box is entirely up to you. It can be the whole program, it can be a single function. It just needs a clear entry point with ability to manipulate input data.
An example may be in order. We'll look into one provided by [Rust Fuzzing Authority](https://github.com/rust-fuzz) - people behind [cargo fuzz](https://fuzz.rs/book/cargo-fuzz.html) and [afl.rs](https://fuzz.rs/book/afl.html).
An example may be in order. We'll look into one provided by [Rust Fuzzing Authority](https://github.com/rust-fuzz) - people behind [cargo fuzz](https://rust-fuzz.github.io/book/cargo-fuzz.html) and [afl.rs](https://rust-fuzz.github.io/book/afl.html).
Imagine you're trying to see if you've handled all cases in your url parser. You can just do
```rust
@ -40,7 +40,7 @@ When thinking about other types of tests that are driven by randomness and are g
## Want help with fuzzing your open source project ?
If you're not sure what fuzzing is, or you want help with adding fuzzer support to your open source project - just tell me ! Either by [email](mailto:fuzzing@cyplo.dev) or on [Twitter](https://twitter.com/cyplo). I'm happy to jump on a call, pair program or whatever you fancy ! I know the most about the Rust fuzzing space, but happy to help with other languages as well - this allows me to learn :)
If you're not sure what fuzzing is, or you want help with adding fuzzer support to your open source project - just tell me ! [Email](mailto:fuzzing@cyplo.dev) works best ! I'm happy to jump on a call, pair program or whatever you fancy ! I know the most about the Rust fuzzing space, but happy to help with other languages as well - this allows me to learn :)
I also run a fuzzing server where I can test your project overnight and see if we find anything.

View file

@ -1,17 +1,20 @@
---
title: My 2019 setup
date: 2019-11-16
series: [my-setup]
series: my-setup
tags: [tools]
---
> Update 2023: my dotfiles are self-hosted now at [git.cyplo.dev](https://git.cyplo.dev/cyplo/dotfiles);
> They also have a different structure than described here; I've removed now-dead links to github.
Here's a list of software and some hardware I find useful, either things that I use daily or things that make an unusual task pleasant instead of incredibly difficult.
This is constantly evolving, so please mind the publish date of this post to gauge how dated it is. The best place to get most recent settings I currently use is my [dotfiles](https://github.com/cyplo/dotfiles) repository, especially the [nixos](https://github.com/cyplo/dotfiles/tree/master/nixos) configuration.
This is constantly evolving, so please mind the publish date of this post to gauge how dated it is. The best place to get most recent settings I currently use is my [dotfiles]() repository, especially the [nixos]() configuration.
## Laptop and OS
My daily driver is [Thinkpad T480](https://www.thinkwiki.org/wiki/Category:T480#Lenovo_ThinkPad_T480) running [NixOS](https://nixos.org/). I like the hardware for its matte screen, nice keyboard and general sturdiness. It's also black and black is nice.
The device-specific config lives [here](https://github.com/cyplo/dotfiles/blob/master/nixos/boxes/foureighty.nix).
The device-specific config lives [here]().
I use [home manager](https://github.com/rycee/home-manager) to manage my dotfiles.
I still haven't found a good way of having all this setup ported exactly to non-NixOS operating systems.
@ -22,18 +25,18 @@ NixOS's ability to boot into a previous version of the whole system is another b
## Networking gear
I had a lot of problems with network speed over wifi previously, because of that I bought a Netgear [Nighthawk X4S R7800](https://www.netgear.co.uk/home/products/networking/wifi-routers/R7800.aspx) router and installed [OpenWRT](https://openwrt.org/) on it. After all this change, I am able to run very frequent multi-gigabyte backup transfers over wifi and everything works nicely.
I had a lot of problems with network speed over wifi previously, because of that I bought a Netgear [Nighthawk X4S R7800](https://www.netgear.com/home/wifi/routers/r7800/) router and installed [OpenWRT](https://openwrt.org/) on it. After all this change, I am able to run very frequent multi-gigabyte backup transfers over wifi and everything works nicely.
## Graphical interface
I started running [i3](https://i3wm.org/) recently because of the strain Gnome3 was putting on my system, and I am liking it so far, mostly for the speed of navigation and little resource usage. There's [polybar](https://github.com/polybar/polybar) on top and not much else in terms of bells and whistles present.
I use [autorandr](https://github.com/phillipberndt/autorandr) to keep track of different display devices on different machines - it will automatically set the best resolution for whatever the screen combination I am currently using. See [config](https://github.com/cyplo/dotfiles/blob/master/nixos/user-xsession.nix) for more details.
I use [autorandr](https://github.com/phillipberndt/autorandr) to keep track of different display devices on different machines - it will automatically set the best resolution for whatever the screen combination I am currently using. See [config]() for more details.
[Firefox](https://www.mozilla.org/en-GB/firefox/new/) remains my browser of choice, I highly recommend you try it, it is so much faster now than it used to be. Make sure to switch the tracking protection on.
## Secrets management
I have a [veracrypt](https://www.veracrypt.fr/en/Home.html) encrypted container, where my secrets reside, with a small set of scripts to [mount](https://github.com/cyplo/dotfiles/blob/master/tools/mount-vault) and [unmount](https://github.com/cyplo/dotfiles/blob/master/tools/umount-vault) it. The container is synced between different machines using [syncthing](https://syncthing.net/).
I have a [veracrypt](https://www.veracrypt.fr/en/Home.html) encrypted container, where my secrets reside, with a small set of scripts to [mount]() and [unmount]() it. The container is synced between different machines using [syncthing](https://syncthing.net/).
Inside the container, among other things, there is a [password store](https://www.passwordstore.org/) directory, which I use from either command line or from Firefox, using [this plugin](https://github.com/passff/passff)
## Sync
@ -61,14 +64,14 @@ I settled on [Fira Code Retina](https://github.com/tonsky/FiraCode) for most of
## Terminal
I find [termite](https://github.com/thestinger/termite) quite fast, while supporting extended character and colour sets.
My shell is [zsh](https://www.zsh.org/) with minimal [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) [config](https://github.com/cyplo/dotfiles/blob/master/nixos/programs/zsh.nix). I always run it inside a [tmux](https://github.com/tmux/tmux/wiki) session though, and no matter how many terminal windows I open, I am always greeted with the same state. All history and window state is shared between all terminal windows all tmux windows as well - it is always the same one tmux session. Because I am always running tmux, sometimes I end up in a situation when I ssh into some box and need to run tmux there - for that reason I have my main tmux session having different leader key than the default, this way I can choose which tmux session will receive my command - my machine or the one I'm connecting to. All of the above comes from a combination of [shell](https://github.com/cyplo/dotfiles/blob/master/nixos/programs/zsh.nix) and [tmux](https://github.com/cyplo/dotfiles/blob/master/nixos/programs/tmux.nix) settings.
My shell is [zsh](https://www.zsh.org/) with minimal [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) [config](). I always run it inside a [tmux](https://github.com/tmux/tmux/wiki) session though, and no matter how many terminal windows I open, I am always greeted with the same state. All history and window state is shared between all terminal windows all tmux windows as well - it is always the same one tmux session. Because I am always running tmux, sometimes I end up in a situation when I ssh into some box and need to run tmux there - for that reason I have my main tmux session having different leader key than the default, this way I can choose which tmux session will receive my command - my machine or the one I'm connecting to. All of the above comes from a combination of [shell]() and [tmux]() settings.
Here's a small collection of other tools I found help a lot when on the terminal:
- [ripgrep](https://github.com/BurntSushi/ripgrep) - it is just so much faster than grep
- [fd](https://github.com/sharkdp/fd) - same but for `find`
- [bat](https://github.com/sharkdp/bat) - a cooler `cat`
- [genpass](https://crates.io/crates/genpass) for generating passwords
- [genpass](https://lib.rs/crates/genpass) for generating passwords
- [z.lua](https://github.com/skywind3000/z.lua) for faster navigation
And that's it !

View file

@ -1,4 +0,0 @@
pairing sessions update
- using genpass
- fuzzing

View file

@ -1,17 +1,17 @@
---
title: Don't let failures spread over your suite with process-based tests isolation
date: 2020-12-28
series: [rust-testing-tricks]
series: rust-testing-tricks
tags: [rust, testing]
---
Being able to precisely control what failures in underlying systems occur and at what time can be really useful in achieving a fast and stable test suite. While I am a big proponent of dependency inversion and being able to control dependencies via the explicit injection points in your API, sometimes it's impractical to do so. This is where [`fail`](https://crates.io/crates/fail) can help us immensely, providing an escape hatch for situations like those as it allows to inject failures into previously defined failure points.
Being able to precisely control what failures in underlying systems occur and at what time can be really useful in achieving a fast and stable test suite. While I am a big proponent of dependency inversion and being able to control dependencies via the explicit injection points in your API, sometimes it's impractical to do so. This is where [`fail`](https://lib.rs/crates/fail) can help us immensely, providing an escape hatch for situations like those as it allows to inject failures into previously defined failure points.
It comes at a price though. If you would mix your other unit tests and tests activating fail points you will notice some unexpected failures in the test suite. As `cargo test` runs tests in parallel by default, the tests activating a fail point can interfere with another test that did not want that fail point active at all that is ran at the same time. The crate authors [recommend](https://docs.rs/fail/#usage-in-tests) running all of the tests using fail points in a separate executable and using `FailScenario` to serialise test execution.
There is another way, that I found simpler for the way I write tests, if you allow for yet another helper crate. We can run each test in a separate process, effectively isolating it from the rest, stopping failures from spreading.
Let's take a look at an example from [`bakare`](https://git.sr.ht/~cyplo/bakare) - my experiment in writing a backup system.
Let's take a look at an example from [`bakare`](https://git.cyplo.dev/cyplo/bakare) - my experiment in writing a backup system.
`cargo.toml`

View file

@ -1,10 +1,12 @@
---
title: My 2020 setup
date: 2020-12-29
series: [my-setup]
series: my-setup
tags: [tools]
---
> Update 2023 - updated links to the most current code store - git.cyplo.dev instead of sr.ht
Hello and welcome to the second edition of me doing a summary of the year of using tech tools.
Here's a list of software and some hardware I find useful, either things that I use daily or things that make an unusual task pleasant instead of incredibly difficult.
@ -12,12 +14,12 @@ This is constantly evolving, so please mind the publish date of this post, pleas
## Laptop, OS and other work hardware
- [Thinkpad T480](https://www.thinkwiki.org/wiki/Category:T480#Lenovo_ThinkPad_T480), the device-specific config lives [here](https://git.sr.ht/~cyplo/dotfiles/tree/master/item/nixos/boxes/foureighty/default.nix).
- [Thinkpad T480](https://www.thinkwiki.org/wiki/Category:T480#Lenovo_ThinkPad_T480), the device-specific config lives [here](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/boxes/foureighty/default.nix).
- CalDigit TS3 Plus usb-c hub
- Iiyama ProLite 27" 4K monitor
- IKEA BEKANT motorised standing desk
No dramatic changes here since the [last year](https://blog.cyplo.dev/posts/2019/11/tools/), I'm still on [NixOS](https://nixos.org/) on the T480. Thinkpad got a RAM upgrade to 48GiB and is handling it well, despite it being above it stated memory limit. I've also managed to get my `home-manager` config [called](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/boxes/foureighty/default.nix#L33) from the main system configuration, so now I just need to do `sudo nixos-rebuild switch --upgrade` once and it does my `home-manager` setup as well. This allowed me to split the config into modules a bit better.
No dramatic changes here since the [last year](https://blog.cyplo.dev/posts/2019/11/tools/), I'm still on [NixOS](https://nixos.org/) on the T480. Thinkpad got a RAM upgrade to 48GiB and is handling it well, despite it being above it stated memory limit. I've also managed to get my `home-manager` config called from the main system configuration, so now I just need to do `sudo nixos-rebuild switch --upgrade` once and it does my `home-manager` setup as well. This allowed me to split the config into modules a bit better.
I'm really happy with the standing desk as it allows me to switch from sitting to standing and back very quickly.
@ -41,8 +43,8 @@ While I stopped having WiFi speed problems with the purchase of the Netgear R780
## Graphical interface
- [i3](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/i3)
- [grobi](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/i3/grobi.nix)
- [i3](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/i3)
- [grobi](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/i3/grobi.nix)
Running `grobi` now instead of `autorandr` but otherwise the config seems to be stabilising.
@ -52,7 +54,7 @@ Running `grobi` now instead of `autorandr` but otherwise the config seems to be
- [password store](https://www.passwordstore.org/) + [passff](https://github.com/passff/passff)
- [bitwarden](https://bitwarden.com/)
I have a `veracrypt` encrypted container, where my secrets reside, with a small set of scripts to [mount](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/tools/mount-vault) and [unmount](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/tools/umount-vault) it. The container is synced between different machines using `syncthing`.
I have a `veracrypt` encrypted container, where my secrets reside, with a small set of scripts to [mount](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/home-manager/scripts/mount-vault.nix) and [unmount](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/home-manager/scripts/umount-vault.nix) it. The container is synced between different machines using `syncthing`.
Inside the container, among other things, there is a `password store` directory, which I use from either command line or from Firefox.
For when I need to share a secret I use `bitwarden` as it allows for that in a quite an easy way.
@ -77,8 +79,8 @@ I made some progress on [bakare](https://github.com/cyplo/bakare), a small backu
## Editors
- vim [configured via nix](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/home-manager/programs/vim.nix)
- VSCode [also configured via nix](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/gui/vscode.nix)
- vim [configured via nix](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/vim)
- VSCode [also configured via nix](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/gui/vscode.nix)
Not much of a change here.
@ -88,19 +90,19 @@ I settled on [Fira Code Retina](https://github.com/tonsky/FiraCode) for most of
## Terminal
- [kitty](https://sw.kovidgoyal.net/kitty/) and [my config](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/home-manager/programs/kitty.nix) for it
- [zsh](https://www.zsh.org/) + [config](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/home-manager/programs/zsh.nix)
- [tmux](https://github.com/tmux/tmux/wiki) + [config](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/home-manager/programs/tmux.nix)
- [kitty](https://sw.kovidgoyal.net/kitty/) and [my config](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/home-manager/programs/kitty.nix) for it
- [zsh](https://www.zsh.org/) + [config](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/zsh)
- [tmux](https://github.com/tmux/tmux/wiki) + [config](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/home-manager/programs/tmux.nix)
While I still like `termite` and `alacritty`, I have switched to `kitty` lately as it is still quite fast while providing for some fancy shenanigans like graphics in the terminal. I'm not fully happy with my setup yet, as, for example, kitty sometimes requires restart for the graphics feature to work.
Here's a small collection of other tools I found help a lot when on the terminal:
- [newsboat](https://newsboat.org/) - a new one on the list, I find it providing a cool and relaxing way of reading RSS in the terminal, see [here](https://git.sr.ht/~cyplo/dotfiles/tree/83ddcc09dc68389b129d598722eca9e90a6dff33/item/nixos/home-manager/programs/newsboat.nix) for my config, including my subscriptions list
- [newsboat](https://newsboat.org/) - a new one on the list, I find it providing a cool and relaxing way of reading RSS in the terminal, see [here](https://git.cyplo.dev/cyplo/dotfiles/src/branch/main/nixos/home-manager/programs/newsboat.nix) for my config, including my subscriptions list
- [ripgrep](https://github.com/BurntSushi/ripgrep) - it is just so much faster than grep
- [fd](https://github.com/sharkdp/fd) - same but for `find`
- [bat](https://github.com/sharkdp/bat) - a cooler `cat`
- [genpass](https://crates.io/crates/genpass) for generating passwords
- [genpass](https://lib.rs/crates/genpass) for generating passwords
- [z.lua](https://github.com/skywind3000/z.lua) for faster navigation
### TODOs for 2021:

View file

@ -9,7 +9,7 @@ I have a collection of photos & documents that I really care about.
I synch them between computers using syncthing and also run backups regularly.
What I didn't have was a way to quickly detect bitrot.
Enter [legdur](https://crates.io/crates/legdur)
Enter [legdur](https://git.cyplo.dev/cyplo/legdur)
`legdur` is a simple CLI program to compute hashes of large sets of files in large directory structures and compare them with a previous snapshot.
Think having your photo collection you acquired over time and worrying about bitrot.
@ -18,6 +18,11 @@ Think having your photo collection you acquired over time and worrying about bit
`cargo install legdur --force` should get you there on a system that has Rust installed already.
## Try it out without installation
If you have a nix-flakes enabled system:
`nix run git+https://git.cyplo.dev/cyplo/legdur.git`
## Usage
`legdur path/to/a/directory/`
@ -42,15 +47,12 @@ finished:
## How it works
* it will compute a hash of each file present in the directory structure (it works recursively).
* if previously computed `legdur.db` exists it will compare the current state of the world to the one represented by `legdur.db` and output any differences. Only files that changed or got deleted get printed out, additions are not.
* if previously computed `legdur.db` exists it will compare the current state of the world to the one represented by `legdur.db` and output any differences. Only files that changed or got deleted get printed out, additions or file moves anywhere within the directory are not.
* it will move the current `legdur.db` to `legdur.old` and write the new state of the world to a new `legdur.db`
## Contact & contributions
* Let me know if you'd like to hack on this by contacting me on `legdur@cyplo.dev` or via `cyplo@todon.nl` on Mastodon.
* Discuss on [lobsters](https://lobste.rs/s/klljdd/legdur_keep_your_legacy_durable)
* Let me know if you'd like to hack on this by contacting me on `legdur@cyplo.dev` or via `cyplo@peninsula.industries` on the Fediverse.
## Sources
`hg clone https://hg.sr.ht/~cyplo/legdur`
`git clone https://git.cyplo.dev/cyplo/legdur.git`

View file

@ -0,0 +1,12 @@
---
title: This blog is now self-hosted !
date: 2023-08-19
tags: [meta, selfhosting]
---
This is just a quick info that this blog is now self-hosted by yours truly. I'm using a small server at [Mythic Beasts](https://www.mythic-beasts.com/).
I have a small [CI situation](https://git.cyplo.dev/cyplo/blog/actions) going on via (self-hosted) Gitea Actions, it `rsync`s the contents to the server. Good old `nginx` + `rsync` and that's it.
I took this as an opportunity to hook up [htmltest](https://github.com/wjdp/htmltest) and it highlighted that a lot of places I linked to no longer exist or have moved. I've [updated](https://git.cyplo.dev/cyplo/blog/commit/df6aba4c4687918f31593e70048c28cf92482b09) all 13 years worth of blog posts and I'm happy to report that there's no longer any dead link present !

View file

@ -0,0 +1,155 @@
---
title: Creating a base OCI image for Nix flake builds within Gitea/Forgejo
date: 2023-09-18
tags: [nix, nixos, ci, docker, oci]
---
I've been moving more and more of my infrastructure to be self-hosted recently.
Part of that involves setting up CI jobs for testing and publishing artifacts, mostly rust crates but also this very blog.
I really wanted to re-use my existing Nix flakes for those projects, this way I know my [local dev env](https://git.cyplo.dev/cyplo/blog/src/branch/main/flake.nix#L15) would be the same env then [used on CI](https://git.cyplo.dev/cyplo/blog/src/branch/main/.gitea/workflows/build.yaml#L14).
I am [self-hosting](https://git.cyplo.dev/explore/) a Gitea instance (will probably be migrating to Forgejo) and it uses a [CI system](https://docs.gitea.io/en-us/usage/usage/actions/overview/) built to resemble [Github actions](https://github.com/actions) - basically you run your jobs as containers and within those you can run arbitrary commands. You can also take advantage of the existing ecosystem of `actions`.
I wanted a base image that would have on one hand `nix` with `flakes` enabled but on the other hand would be compatible with running popular actions from other authors. This meant having `nix`, `git` but also `nodejs` available amongts other things. I couldn't find one that would have both, so I built one !
I'm building on top of the [definitions](https://github.com/nix-community/docker-nixpkgs/blob/master/images/nix-flakes/default.nix) from [docker-nixpkgs](https://github.com/nix-community/docker-nixpkgs) and just tweaking them to add the things needed for `actions` and also for the definition itself to be a flake, for an added flavour. This allows me to add multiple image definitions in the same repo and the build them independently when needed.
Here's the whole definition in all of its glory, defining 2 images - `hello` and `flakes-action` - the `hello` being a test image for testing the process itself and `flakes-action` is the one I'm using on CI currently.
```nix
{
description = "docker base images";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem
(system:
let
pkgs = import nixpkgs { inherit system; };
pkgsStatic = pkgs.pkgsStatic;
lib = pkgs.lib;
in
{
packages = {
hello = pkgs.dockerTools.buildImage {
name = "hello-docker";
config = {
Cmd = [ "${pkgs.hello}/bin/hello" ];
};
};
flakes-action = pkgs.dockerTools.buildImageWithNixDb {
name = "flakes-action";
contents = with pkgs; [
./root
bash
coreutils
curl
gawk
gitFull
git-lfs
gnused
nodejs
wget
sudo
nixFlakes
cacert
gnutar
gzip
openssh
xz
(pkgs.writeTextFile {
name = "nix.conf";
destination = "/etc/nix/nix.conf";
text = ''
accept-flake-config = true
experimental-features = nix-command flakes
'';
})
];
extraCommands = ''
# for /usr/bin/env
mkdir usr
ln -s ../bin usr/bin
# make sure /tmp exists
mkdir -m 1777 tmp
# need a HOME
mkdir -vp root
'';
config = {
Cmd = [ "/bin/bash" ];
Env = [
"LANG=en_GB.UTF-8"
"ENV=/etc/profile.d/nix.sh"
"BASH_ENV=/etc/profile.d/nix.sh"
"NIX_BUILD_SHELL=/bin/bash"
"NIX_PATH=nixpkgs=${./fake_nixpkgs}"
"PAGER=cat"
"PATH=/usr/bin:/bin"
"SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
"USER=root"
];
};
};
};
});
}
```
If you want to build this yourself you can:
```bash
git clone https://git.cyplo.dev/cyplo/base-images.git
cd base-images
nix build '.#flakes-action'
docker load < result # this took me so much time, to realise I need `load` and not `import`...
docker tag [image id] yourimage.repo/base-images/flakes-action:latest
docker push yourimage.repo/base-images/flakes-action:latest
```
Then to use on CI, an example of a Gitea CI config:
```yaml
on: push
jobs:
Publish:
runs-on: flakes-action
steps:
- uses: actions/checkout@v3
name: Checkout
- name: Build
run: |
nix develop -c hugo --gc --minify
```
It uses the image pushed and both a custom build script but also a well-known `checkout` action.
You need to teach your Gitea runner about the image first btw; if you use NixOS for the runner definition, it could look like this:
```nix
services.gitea-actions-runner = {
instances.boltyone = {
enable = true;
url = "https://yourgitea.domain";
tokenFile = config.sops.secrets."gitea-runner-token".path;
name = "bolty one";
labels = [
"flakes-action:docker://yourimage.repo/base-images/flakes-action:latest"
"ubuntu-kinetic:docker://ubuntu:kinetic"
"linux_amd64:host"
];
};
};
```
P.S. shoutout to [nixery](https://nixery.dev/) that I tried first and the resulting images were just a bit off as it was not easy to get them to support flakes. I think it's an amazing tool in its own right though and you should try it, you can do things like `docker run -ti nixery.dev/shell/git/htop bash` and it will happily just give you an image with those arbitrary nixpkgs included !
Happy hacking !
[Discuss this post on the Fediverse](https://peninsula.industries/@cyplo/111087014413124274)

View file

@ -20,6 +20,7 @@
git
go
hugo
htmltest
hut
nodejs
ruby

5
go.mod
View file

@ -1,5 +0,0 @@
module git.cyplo.dev/cyplo/blog.git
go 1.20
require github.com/canstand/compost v0.6.0 // indirect

2
go.sum
View file

@ -1,2 +0,0 @@
github.com/canstand/compost v0.6.0 h1:MqMcuPeH5s2KCdNzb/UCXIsdXyhLrOPmoujsJTKpmUw=
github.com/canstand/compost v0.6.0/go.mod h1:wUf2xCY8s0i4zIiQZwebZR80lwldaFgp7nam+Rn+Vlk=

View file

@ -0,0 +1,63 @@
{{ define "main" }}
<div class="container" role="main">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
{{ with .Content }}
<div class="well">
{{.}}
</div>
{{ end }}
<div class="posts-list">
{{ range .Paginator.Pages }}
<article class="post-preview">
<a href="{{ .Permalink }}">
<h2 class="post-title">{{ .Title }}</h2>
{{ if .Params.subtitle }}
<h3 class="post-subtitle">
{{ .Params.subtitle }}
</h3>
{{ end }}
</a>
<p class="post-meta">
{{ partial "post_meta.html" . }}
</p>
<div class="post-entry">
{{ if .Truncated }}
{{ .Summary }}
<a href="{{ .Permalink }}" class="post-read-more">[{{ i18n "readMore" }}]</a>
{{ else }}
{{ .Content }}
{{ end }}
</div>
{{ if .Params.tags }}
<div class="blog-tags">
{{ range .Params.tags }}
{{ partial "tag-link" . }}
{{ end }}
</div>
{{ end }}
</article>
{{ end }}
</div>
{{ if or (.Paginator.HasPrev) (.Paginator.HasNext) }}
<ul class="pager main-pager">
{{ if .Paginator.HasPrev }}
<li class="previous">
<a href="{{ .Permalink }}page/{{ .Paginator.Prev.PageNumber }}/">&larr; {{ i18n "newerPosts" }}</a>
</li>
{{ end }}
{{ if .Paginator.HasNext }}
<li class="next">
<a href="{{ .Permalink }}page/{{ .Paginator.Next.PageNumber }}/">{{ i18n "olderPosts" }} &rarr;</a>
</li>
{{ end }}
</ul>
{{ end }}
</div>
</div>
</div>
{{ end }}

View file

@ -0,0 +1,64 @@
{{ define "main" }}
<div class="container" role="main">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<article role="main" class="blog-post">
{{ partial "top-tags" . }}
{{ partial "part-of-series" . }}
{{ .Content }}
{{ if .Params.tags }}
<div class="blog-tags">
{{ range .Params.tags }}
{{ partial "tag-link" . }}
{{ end }}
</div>
{{ end }}
{{ if $.Param "socialShare" }}
<hr/>
<section id="social-share">
<div class="list-inline footer-links">
{{ partial "share-links" . }}
</div>
</section>
{{ end }}
{{ partial "see-also-series-list" . }}
{{ if not .Params.series }}
{{ if .Site.Params.showRelatedPosts }}
{{ $related := .Site.RegularPages.Related . | first 3 }}
{{ with $related }}
<h4 class="see-also">{{ i18n "seeAlso" }}</h4>
<ul>
{{ range . }}
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
{{ end }}
</ul>
{{ end }}
{{ end }}
{{ end }}
</article>
{{ if ne .Type "page" }}
<ul class="pager blog-pager">
{{ if .PrevInSection }}
<li class="previous">
<a href="{{ .PrevInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .PrevInSection.Title }}">&larr; {{ i18n "previousPost" }}</a>
</li>
{{ end }}
{{ if .NextInSection }}
<li class="next">
<a href="{{ .NextInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .NextInSection.Title }}">{{ i18n "nextPost" }} &rarr;</a>
</li>
{{ end }}
</ul>
{{ end }}
</div>
</div>
</div>
{{ end }}

View file

@ -0,0 +1,84 @@
{{ if eq .Type "page" }}
{{ partial "page_meta.html" . }}
{{ end }}
<footer>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<ul class="list-inline text-center footer-links">
{{ range .Site.Data.beautifulhugo.social.social_icons }}
{{- if isset $.Site.Author .id }}
<li>
<a {{ if .rel }}rel="{{ .rel }}"{{- end -}} href="{{ printf .url (index $.Site.Author .id) }}" title="{{ .title }}">
<span class="fa-stack fa-lg">
<i class="fas fa-circle fa-stack-2x"></i>
<i class="{{ .icon }} fa-stack-1x fa-inverse"></i>
</span>
</a>
</li>
{{- end -}}
{{ end }}
{{ if .Site.Params.rss }}
<li>
<a href="{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}" title="RSS">
<span class="fa-stack fa-lg">
<i class="fas fa-circle fa-stack-2x"></i>
<i class="fas fa-rss fa-stack-1x fa-inverse"></i>
</span>
</a>
</li>
{{ end }}
</ul>
<p class="credits copyright text-muted">
{{ if .Site.Author.name }}
{{ if .Site.Author.website }}
<a href="{{ .Site.Author.website }}">{{ .Site.Author.name }}</a>
{{ else }}
{{ .Site.Author.name }}
{{ end }}
{{ end }}
&nbsp;&bull;&nbsp;&copy;
{{ if .Site.Params.since }}
{{ .Site.Params.since }} - {{ .Site.LastChange.Format "2006" }}
{{ else }}
{{ .Site.LastChange.Format "2006" }}
{{ end }}
{{ if .Site.Title }}
&nbsp;&bull;&nbsp;
<a href="{{ "" | absLangURL }}">{{ .Site.Title }}</a>
{{ end }}
</p>
<!-- Please don't remove this, keep my open source work credited :) -->
<p class="credits theme-by text-muted">
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> powered &nbsp;&bull;&nbsp; Theme is "peninsula" by me, adapted from <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>, adapted from <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
{{ if $.GitInfo }}&nbsp;&bull;&nbsp;[<a href="{{ .Site.Params.commit }}{{ .GitInfo.Hash }}">{{ substr .GitInfo.Hash 0 8 }}</a>]{{ end }}
</p>
</div>
</div>
</div>
</div>
</footer>
<script src="{{ "js/katex.min.js" | absURL }}"></script>
<script src="{{ "js/auto-render.min.js" | absURL }}"></script>
<script src="{{ "js/jquery-3.5.1.slim.min.js" | absURL }}"></script>
<script src="{{ "js/bootstrap.min.js" | absURL }}"></script>
<script src="{{ "js/main.js" | absURL }}"></script>
{{- if .Site.Params.staticman }}
<script src="{{ "js/staticman.js" | absURL }}"></script>
{{- end }}
{{- if .Site.Params.useHLJS }}
<script src="{{ "js/highlight.min.js" | absURL }}"></script>
<script> hljs.initHighlightingOnLoad(); </script>
<script> $(document).ready(function() {$("pre.chroma").css("padding","0");}); </script>
{{- end -}}
<script> renderMathInElement(document.body); </script>
<script src="{{ "js/photoswipe.min.js" | absURL }}"></script>
<script src="{{ "js/photoswipe-ui-default.min.js" | absURL }}"></script>
<script src="{{ "js/load-photoswipe.js" | absURL }}"></script>
{{- partial "footer_custom.html" . }}

View file

@ -0,0 +1,8 @@
{{ if $.Params.series }}
<div class="blog-series">
<p>
This post is part of the <a href="/series/{{ .Params.series }}">{{ replace .Params.series "-" " " }}</a> series.
</p>
<br />
</div>
{{ end }}

View file

@ -0,0 +1,38 @@
<span class="post-meta">
{{ $lastmodstr := default (i18n "dateFormat") .Site.Params.dateformat | .Lastmod.Format }}
{{ $datestr := default (i18n "dateFormat") .Site.Params.dateformat | .Date.Format }}
<i class="fas fa-calendar"></i>&nbsp;{{ $datestr | i18n "postedOnDate"}}
{{ if ne $datestr $lastmodstr }}
&nbsp;{{ $lastmodstr | i18n "lastModified" }}
{{ end }}
{{ if .Site.Params.readingTime }}
&nbsp;|&nbsp;<i class="fas fa-clock"></i>&nbsp;{{ i18n "readingTime"}}{{ .ReadingTime }}&nbsp;{{ i18n "readTime" }}
{{ end }}
{{ if .Site.Params.wordCount }}
&nbsp;|&nbsp;<i class="fas fa-book"></i>&nbsp;{{ .WordCount }}&nbsp;{{ i18n "words" }}
{{ end }}
{{- if .Site.Params.staticman -}}
&nbsp;|&nbsp;<i class="fas fa-comment"></i>&nbsp;
{{ $slug := replace .URL "/" "" }}
{{ if .Site.Data.comments }}
{{ $comments := index $.Site.Data.comments $slug }}
{{ if $comments }}
{{ if gt (len $comments) 1 }}
{{ len $comments }} {{ i18n "moreComment" }}
{{ else }}
{{ len $comments }} {{ i18n "oneComment" }}
{{ end }}
{{ else }}
0 {{ i18n "oneComment" }}
{{ end }}
{{ end }}
{{ end }}
{{ if .IsTranslated -}}
{{- $sortedTranslations := sort .Translations "Site.Language.Weight" -}}
{{- $links := apply $sortedTranslations "partial" "translation_link.html" "." -}}
{{- $cleanLinks := apply $links "chomp" "." -}}
{{- $linksOutput := delimit $cleanLinks (i18n "translationsSeparator") -}}
&nbsp;&bull;&nbsp;{{ i18n "translationsLabel" }}{{ $linksOutput }}
{{- end }}
</span>

View file

@ -0,0 +1,35 @@
{{ if .Params.series }}
<section>
<h4 class="see-also">{{ i18n "seeAlso" }}</h4>
<ul>
{{ $series_taxonomy_name := "series" }}
{{ range $taxonomy_term, $taxonomy := .Site.Taxonomies }}
{{ if eq $taxonomy_term $series_taxonomy_name }}
{{ with $.Site.GetPage (printf "/%s" $taxonomy_term) }}
{{ range $key, $value := $taxonomy }}
{{ if eq $key $.Params.series }}
{{ range $value.Pages }}
{{ if ne .File.UniqueID $.File.UniqueID }}
<li hugo-nav="{{ .RelPermalink}}">
<a href="{{ .Permalink}}">{{ .LinkTitle }}</a>
</li>
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ if $.Site.Params.showRelatedPosts }}
{{ $related := $.Site.RegularPages.Related . | first 2 }}
{{ with $related }}
{{ range . }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
</li>
{{ end }}
{{ end }}
{{ end }}
</ul>
</section>
{{ end }}

View file

@ -0,0 +1,4 @@
{{ $baseUrl := absURL "tags" }}
{{ $tagName := urlize . }}
{{ $tagUrl := printf "%s/%s" $baseUrl $tagName }}
<a href="{{ $tagUrl }}">{{ $tagName }}</a>&nbsp;

View file

@ -0,0 +1,13 @@
{{ if not .Params.series }}
{{ if .Params.tags }}
{{ if .Params.series }}
<div class="blog-tags-with-series blog-tags">
{{ else}}
<div class="blog-tags">
{{ end }}
{{ range .Params.tags }}
{{ partial "tag-link" . }}
{{ end }}
</div>
{{ end }}
{{ end }}

1631
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,4 +0,0 @@
{
"name": "blog",
"version": "0.1.0"
}

View file

@ -1,32 +0,0 @@
{
"comments": {
"dependencies": {
"@alpinejs/intersect": "github.com/canstand/compost",
"alpinejs": "github.com/canstand/compost"
},
"devDependencies": {
"@tailwindcss/typography": "github.com/canstand/compost",
"autoprefixer": "github.com/canstand/compost",
"postcss": "github.com/canstand/compost",
"postcss-cli": "github.com/canstand/compost",
"prettier": "github.com/canstand/compost",
"prettier-plugin-go-template": "github.com/canstand/compost",
"tailwindcss": "github.com/canstand/compost"
}
},
"dependencies": {
"@alpinejs/intersect": "^3.12.3",
"alpinejs": "^3.12.3"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.9",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.27",
"postcss-cli": "^10.1.0",
"prettier": "^3.0.0",
"prettier-plugin-go-template": "^0.0.15",
"tailwindcss": "^3.3.3"
},
"name": "blog",
"version": "0.1.0"
}

26
static/css/custom.css Normal file
View file

@ -0,0 +1,26 @@
.blog-tags-with-series {
margin-bottom: 0px;
}
.blog-series {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #999;
font-size: 15px;
margin-bottom: 30px;
}
.blog-series:before {
content: "Series: ";
}
.blog-series a {
color: #008aff;
text-decoration: none;
padding: 0px 5px;
}
.blog-series a:hover {
border-radius: 2px;
color: #008aff;
background-color: #ccc;
}

59
static/css/syntax.css Normal file
View file

@ -0,0 +1,59 @@
/* Background */ .chroma { color: #f8f8f2; background-color: #272822 }
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; }
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em; }
/* Keyword */ .chroma .k { color: #66d9ef }
/* KeywordConstant */ .chroma .kc { color: #66d9ef }
/* KeywordDeclaration */ .chroma .kd { color: #66d9ef }
/* KeywordNamespace */ .chroma .kn { color: #f92672 }
/* KeywordPseudo */ .chroma .kp { color: #66d9ef }
/* KeywordReserved */ .chroma .kr { color: #66d9ef }
/* KeywordType */ .chroma .kt { color: #66d9ef }
/* NameAttribute */ .chroma .na { color: #a6e22e }
/* NameClass */ .chroma .nc { color: #a6e22e }
/* NameConstant */ .chroma .no { color: #66d9ef }
/* NameDecorator */ .chroma .nd { color: #a6e22e }
/* NameException */ .chroma .ne { color: #a6e22e }
/* NameFunction */ .chroma .nf { color: #a6e22e }
/* NameOther */ .chroma .nx { color: #a6e22e }
/* NameTag */ .chroma .nt { color: #f92672 }
/* Literal */ .chroma .l { color: #ae81ff }
/* LiteralDate */ .chroma .ld { color: #e6db74 }
/* LiteralString */ .chroma .s { color: #e6db74 }
/* LiteralStringAffix */ .chroma .sa { color: #e6db74 }
/* LiteralStringBacktick */ .chroma .sb { color: #e6db74 }
/* LiteralStringChar */ .chroma .sc { color: #e6db74 }
/* LiteralStringDelimiter */ .chroma .dl { color: #e6db74 }
/* LiteralStringDoc */ .chroma .sd { color: #e6db74 }
/* LiteralStringDouble */ .chroma .s2 { color: #e6db74 }
/* LiteralStringEscape */ .chroma .se { color: #ae81ff }
/* LiteralStringHeredoc */ .chroma .sh { color: #e6db74 }
/* LiteralStringInterpol */ .chroma .si { color: #e6db74 }
/* LiteralStringOther */ .chroma .sx { color: #e6db74 }
/* LiteralStringRegex */ .chroma .sr { color: #e6db74 }
/* LiteralStringSingle */ .chroma .s1 { color: #e6db74 }
/* LiteralStringSymbol */ .chroma .ss { color: #e6db74 }
/* LiteralNumber */ .chroma .m { color: #ae81ff }
/* LiteralNumberBin */ .chroma .mb { color: #ae81ff }
/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff }
/* LiteralNumberHex */ .chroma .mh { color: #ae81ff }
/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff }
/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff }
/* LiteralNumberOct */ .chroma .mo { color: #ae81ff }
/* Operator */ .chroma .o { color: #f92672 }
/* OperatorWord */ .chroma .ow { color: #f92672 }
/* Comment */ .chroma .c { color: #75715e }
/* CommentHashbang */ .chroma .ch { color: #75715e }
/* CommentMultiline */ .chroma .cm { color: #75715e }
/* CommentSingle */ .chroma .c1 { color: #75715e }
/* CommentSpecial */ .chroma .cs { color: #75715e }
/* CommentPreproc */ .chroma .cp { color: #75715e }
/* CommentPreprocFile */ .chroma .cpf { color: #75715e }
/* GenericDeleted */ .chroma .gd { color: #f92672 }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericInserted */ .chroma .gi { color: #a6e22e }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { color: #75715e }

17
themes/beautifulhugo/.gitattributes vendored Normal file
View file

@ -0,0 +1,17 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

50
themes/beautifulhugo/.gitignore vendored Normal file
View file

@ -0,0 +1,50 @@
# Themes directory of example site; ignored so that we can clone the repo
# inside the themes directory and test the example site with "hugo server".
exampleSite/themes/
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msm
*.msp
# Windows shortcuts
*.lnk
# Vim swap files
*.swp
# =========================
# Operating System Files
# =========================
# OSX
# =========================
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

View file

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

View file

@ -0,0 +1,186 @@
# Beautiful Hugo - An adaptation of the Beautiful Jekyll theme
![Beautiful Hugo Theme Screenshot](https://github.com/halogenica/beautifulhugo/blob/master/images/screenshot.png)
## Installation
$ mkdir themes
$ cd themes
$ git submodule add https://github.com/halogenica/beautifulhugo.git beautifulhugo
See [the Hugo documentation](https://gohugo.io/themes/installing/) for more information.
## Extra Features
### Responsive
This theme is designed to look great on both large-screen and small-screen (mobile) devices.
### Syntax highlighting
This theme has support for either Hugo's lightning fast Chroma, or both server side and client side highlighting. See [the Hugo docs for more](https://gohugo.io/content-management/syntax-highlighting/).
#### Chroma - New server side syntax highlighting
To enable Chroma, add the following to your site parameters:
```
pygmentsCodeFences = true
pygmentsUseClasses = true
```
Then, you can generate a different style by running:
```
hugo gen chromastyles --style=trac > static/css/syntax.css
```
#### Pygments - Old server side syntax highlighting
To use this feature install Pygments (`pip install Pygments`) and add the following to your site parameters:
```
pygmentsStyle = "trac"
pygmentsUseClassic = true
```
Pygments is mostly compatable with the newer Chroma. It is slower but has some additional theme options. I recommend Chroma over Pygments. Pygments will use `syntax.css` for highlighting, unless you also set the config `pygmentsUseClasses = false` which will generate the style code directly in the HTML file.
#### Highlight.js - Client side syntax highlighting
```
[Params]
useHLJS = true
```
Client side highlighting does not require pygments to be installed. This will use `highlight.min.css` instead of `syntax.css` for highlighting (effectively disabling Chroma). Highlight.js has a wider range of support for languages and themes, and an alternative highlighting engine.
### Disqus support
To use this feature, uncomment and fill out the `disqusShortname` parameter in `config.toml`.
### Staticman support
Add *Staticman* configuration section in `config.toml` or `config.yaml`
Sample `config.toml` configuration
```
[Params.staticman]
api = "https://<API-ENDPOINT>/v3/entry/{GIT-HOST}/<USERNAME>/<REPOSITORY-BLOGNAME>/master/comments"
[Params.staticman.recaptcha]
sitekey: "6LeGeTgUAAAAAAqVrfTwox1kJQFdWl-mLzKasV0v"
secret: "hsGjWtWHR4HK4pT7cUsWTArJdZDxxE2pkdg/ArwCguqYQrhuubjj3RS9C5qa8xu4cx/Y9EwHwAMEeXPCZbLR9eW1K9LshissvNcYFfC/b8KKb4deH4V1+oqJEk/JcoK6jp6Rr2nZV4rjDP9M7nunC3WR5UGwMIYb8kKhur9pAic="
```
Note: The public `API-ENDPOINT` https://staticman.net is currently hitting its API limit, so one may use other API instances to provide Staticman comment service.
The section `[Params.staticman.recaptcha]` is *optional*. To add reCAPTCHA to your site, you have to replace the default values with your own ones (to be obtained from Google.) The site `secret` has to be encrypted with
https://<API-ENDPOINT>/v3/encrypt/<SITE-SECRET>
You must also configure the `staticman.yml` in you blog website.
```
comments:
allowedFields: ["name", "email", "website", "comment"]
branch : "master"
commitMessage : "New comment in {options.slug}"
path: "data/comments/{options.slug}"
filename : "comment-{@timestamp}"
format : "yaml"
moderation : true
requiredFields : ['name', 'email', 'comment']
transforms:
email : md5
generatedFields:
date:
type : "date"
options:
format : "iso8601"
reCaptcha:
enabled: true
siteKey: "6LeGeTgUAAAAAAqVrfTwox1kJQFdWl-mLzKasV0v"
secret: "hsGjWtWHR4HK4pT7cUsWTArJdZDxxE2pkdg/ArwCguqYQrhuubjj3RS9C5qa8xu4cx/Y9EwHwAMEeXPCZbLR9eW1K9LshissvNcYFfC/b8KKb4deH4V1+oqJEk/JcoK6jp6Rr2nZV4rjDP9M7nunC3WR5UGwMIYb8kKhur9pAic="
```
If you *don't* have the section `[Params.staticman]` in `config.toml`, you *won't* need the section `reCaptcha` in `staticman.yml`
### Google Analytics
To add Google Analytics, simply sign up to [Google Analytics](https://www.google.com/analytics/) to obtain your Google Tracking ID, and add this tracking ID to the `googleAnalytics` parameter in `config.toml`.
Note that the Google Analytics tracking code will only be inserted into the page when the site isn't served on Hugo's built-in server, to prevent tracking from local testing environments.
### Commit SHA on the footer
If the source of your site is in a Git repo, the SHA corresponding to the commit the site is built from can be shown on the footer. To do so, two site parameters `commit` has to be defined in the config file `config.toml`:
```
enableGitInfo = true
[Params]
commit = "https://github.com/<username>/<siterepo>/tree/"
```
See at [vincenttam/vincenttam.gitlab.io](https://gitlab.com/vincenttam/vincenttam.gitlab.io) for an example of how to add it to a continuous integration system.
### Multilingual
To allow Beautiful Hugo to go multilingual, you need to define the languages
you want to use inside the `languages` parameter on `config.toml` file, also
redefining the content dir for each one. Check the `i18n/` folder to see all
languages available.
```toml
[languages]
[languages.en]
contentDir = "content/en" # English
[languages.ja]
contentDir = "content/ja" # Japanese
[languages.br]
contentDir = "content/br" # Brazilian Portuguese
```
Now you just need to create a subdir within the `content/` folder for each
language and just put stuff inside `page/` and `post/` regular directories.
```
content/ content/ content/
└── en/ └── br/ └── ja/
   ├── page/ ├── page/    ├── page/
   └── post/ └── post/    └── post/
```
### Extra shortcodes
There are two extra shortcodes provided (along with the customized figure shortcode):
#### Details
This simply adds the html5 detail attribute, supported on all *modern* browsers. Use it like this:
```
{{< details "This is the details title (click to expand)" >}}
This is the content (hidden until clicked).
{{< /details >}}
```
#### Split
This adds a two column side-by-side environment (will turn into 1 col for narrow devices):
```
{{< columns >}}
This is column 1.
{{< column >}}
This is column 2.
{{< endcolumns >}}
```
## About
This is an adaptation of the Jekyll theme [Beautiful Jekyll](https://deanattali.com/beautiful-jekyll/) by [Dean Attali](https://deanattali.com/aboutme#contact). It supports most of the features of the original theme, and many new features. It has diverged from the Jekyll theme over time, with years of community updates.
## License
MIT Licensed, see [LICENSE](https://github.com/halogenica/Hugo-BeautifulHugo/blob/master/LICENSE).

View file

@ -0,0 +1,9 @@
---
title: "{{ replace .Name "-" " " | title }}"
author: ""
type: ""
date: {{ .Date }}
subtitle: ""
image: ""
tags: []
---

View file

@ -0,0 +1,174 @@
[[social_icons]]
id = "email"
url = "mailto:%s"
title = "Email me"
icon = "fas fa-envelope"
[[social_icons]]
id = "facebook"
url = "https://www.facebook.com/%s"
title = "Facebook"
icon = "fab fa-facebook"
[[social_icons]]
id = "github"
url = "https://github.com/%s"
title = "GitHub"
icon = "fab fa-github"
[[social_icons]]
id = "gitlab"
url = "https://gitlab.com/%s"
title = "GitLab"
icon = "fab fa-gitlab"
[[social_icons]]
id = "bitbucket"
url = "https://bitbucket.org/%s"
title = "Bitbucket"
icon = "fab fa-bitbucket"
[[social_icons]]
id = "twitter"
url = "https://twitter.com/%s"
title = "Twitter"
icon = "fab fa-twitter"
[[social_icons]]
id = "slack"
url = "https://%s.slack.com/"
title = "Slack"
icon = "fab fa-slack"
[[social_icons]]
id = "reddit"
url = "https://reddit.com/u/%s"
title = "Reddit"
icon = "fab fa-reddit-alien"
[[social_icons]]
id = "linkedin"
url = "https://linkedin.com/in/%s"
title = "LinkedIn"
icon = "fab fa-linkedin"
[[social_icons]]
id = "xing"
url = "https://www.xing.com/profile/%s"
title = "Xing"
icon = "fab fa-xing"
[[social_icons]]
id = "stackoverflow"
url = "https://stackoverflow.com/%s"
title = "StackOverflow"
icon = "fab fa-stack-overflow"
[[social_icons]]
id = "snapchat"
url = "https://www.snapchat.com/add/%s"
title = "Snapchat"
icon = "fab fa-snapchat-ghost"
[[social_icons]]
id = "instagram"
url = "https://www.instagram.com/%s"
title = "Instagram"
icon = "fab fa-instagram"
[[social_icons]]
id = "youtube"
url = "https://www.youtube.com/%s"
title = "Youtube"
icon = "fab fa-youtube"
[[social_icons]]
id = "soundcloud"
url = "https://soundcloud.com/%s"
title = "SoundCloud"
icon = "fab fa-soundcloud"
[[social_icons]]
id = "spotify"
url = "https://open.spotify.com/user/%s"
title = "Spotify"
icon = "fab fa-spotify"
[[social_icons]]
id = "bandcamp"
url = "https://%s.bandcamp.com/"
title = "Bandcamp"
icon = "fab fa-bandcamp"
[[social_icons]]
id = "itchio"
url = "https://itch.io/profile/%s"
title = "Itch.io"
icon = "fas fa-gamepad"
[[social_icons]]
id = "keybase"
url = "https://keybase.io/%s"
title = "Keybase"
icon = "fab fa-keybase"
[[social_icons]]
id = "vk"
url = "https://vk.com/%s"
title = "VK"
icon = "fab fa-vk"
[[social_icons]]
id = "paypal"
url = "https://paypal.me/%s"
title = "PayPal"
icon = "fab fa-paypal"
[[social_icons]]
id = "telegram"
url = "https://telegram.me/%s"
title = "Telegram"
icon = "fab fa-telegram"
[[social_icons]]
id = "500px"
url = "https://500px.com/%s"
title = "500px"
icon = "fab fa-500px"
[[social_icons]]
id = "codepen"
url = "https://codepen.io/%s"
title = "CodePen"
icon = "fab fa-codepen"
[[social_icons]]
id = "kaggle"
url = "https://www.kaggle.com/%s"
title = "kaggle"
icon = "fab fa-kaggle"
[[social_icons]]
id = "mastodon"
url = "https://%s"
title = "Mastodon"
icon = "fab fa-mastodon"
rel = "me"
[[social_icons]]
id = "weibo"
url = "https://weibo.com/%s"
title = "Weibo"
icon = "fab fa-weibo"
[[social_icons]]
id = "discord"
url = "https://discord.gg/%s"
title = "Discord"
icon = "fab fa-discord"
[[social_icons]]
id = "strava"
url = "https://www.strava.com/athletes/%s"
title = "Strava"
icon = "fab fa-strava"

View file

@ -0,0 +1,115 @@
baseurl = "https://username.github.io"
DefaultContentLanguage = "en"
#DefaultContentLanguage = "ja"
title = "Beautiful Hugo"
theme = "beautifulhugo"
metaDataFormat = "yaml"
pygmentsStyle = "trac"
pygmentsUseClasses = true
pygmentsCodeFences = true
pygmentsCodefencesGuessSyntax = true
#pygmentsUseClassic = true
#pygmentOptions = "linenos=inline"
#disqusShortname = "XXX"
#googleAnalytics = "XXX"
[Params]
# homeTitle = "Beautiful Hugo Theme" # Set a different text for the header on the home page
subtitle = "Build a beautiful and simple website in minutes"
mainSections = ["post","posts"]
logo = "img/avatar-icon.png" # Expecting square dimensions
favicon = "img/favicon.ico"
dateFormat = "January 2, 2006"
commit = false
rss = true
comments = true
readingTime = true
wordCount = true
useHLJS = true
socialShare = true
delayDisqus = true
showRelatedPosts = true
# hideAuthor = true
# gcse = "012345678901234567890:abcdefghijk" # Get your code from google.com/cse. Make sure to go to "Look and Feel" and change Layout to "Full Width" and Theme to "Classic"
#[[Params.bigimg]]
# src = "img/triangle.jpg"
# desc = "Triangle"
#[[Params.bigimg]]
# src = "img/sphere.jpg"
# desc = "Sphere"
# # position: see values of CSS background-position.
# position = "center top"
#[[Params.bigimg]]
# src = "img/hexagon.jpg"
# desc = "Hexagon"
[Author]
name = "Some Person"
website = "yourwebsite.com"
email = "youremail@domain.com"
facebook = "username"
github = "username"
gitlab = "username"
bitbucket = "username"
twitter = "username"
reddit = "username"
linkedin = "username"
xing = "username"
stackoverflow = "users/XXXXXXX/username"
snapchat = "username"
instagram = "username"
youtube = "user/username" # or channel/channelname
soundcloud = "username"
spotify = "username"
bandcamp = "username"
itchio = "username"
vk = "username"
paypal = "username"
telegram = "username"
500px = "username"
codepen = "username"
mastodon = "url"
kaggle = "username"
weibo = "username"
slack = "username"
discord = "invite code (https://discord.gg/XXXXXXX)"
strava = "userid"
[[menu.main]]
name = "Blog"
url = ""
weight = 1
[[menu.main]]
name = "About"
url = "page/about/"
weight = 3
[[menu.main]]
identifier = "samples"
name = "Samples"
weight = 2
[[menu.main]]
parent = "samples"
name = "Big Image Sample"
url = "post/2017-03-07-bigimg-sample"
weight = 1
[[menu.main]]
parent = "samples"
name = "Math Sample"
url = "post/2017-03-05-math-sample"
weight = 2
[[menu.main]]
parent = "samples"
name = "Code Sample"
url = "post/2016-03-08-code-sample"
weight = 3
[[menu.main]]
name = "Tags"
url = "tags"
weight = 3

View file

@ -0,0 +1,2 @@
## Front Page Content
`beautifulhugo` supports content on your front page. Edit `/content/_index.md` to change what appears here. Delete `/content/_index.md` if you don't want any content here.

View file

@ -0,0 +1,16 @@
---
title: About me
subtitle: Why you'd want to go on a date with me
comments: false
---
My name is Inigo Montoya. I have the following qualities:
- I rock a great mustache
- I'm extremely loyal to my family
What else do you need?
### my history
To be honest, I'm having some trouble remembering right now, so why don't you just watch [my movie](http://en.wikipedia.org/wiki/The_Princess_Bride_%28film%29) and it will answer **all** your questions.

View file

@ -0,0 +1,6 @@
---
title: First post!
date: 2015-01-05
---
This is my first post, how exciting!

View file

@ -0,0 +1,6 @@
---
title: Pirates arrrr
date: 2015-01-15
---
Piracy is typically an act of robbery or criminal violence at sea. The term can include acts committed on land, in the air, or in other major bodies of water or on a shore. It does not normally include crimes committed against persons traveling on the same vessel as the perpetrator (e.g. one passenger stealing from others on the same vessel). The term has been used throughout history to refer to raids across land borders by non-state agents.

View file

@ -0,0 +1,11 @@
---
title: Soccer
subtitle: Best sport ever!
date: 2015-01-19
---
From Wikipedia:
Association football, more commonly known as football or soccer,[2] is a sport played between two teams of eleven players with a spherical ball. It is played by 250 million players in over 200 countries, making it the world's most popular sport.[3][4][5][6] The game is played on a rectangular field with a goal at each end. The object of the game is to score by getting the ball into the opposing goal.
The goalkeepers are the only players allowed to touch the ball with their hands or arms while it is in play and then only in their penalty area. Outfield players mostly use their feet to strike or pass the ball, but may use their head or torso to strike the ball instead. The team that scores the most goals by the end of the match wins. If the score is level at the end of the game, either a draw is declared or the game goes into extra time and/or a penalty shootout depending on the format of the competition. The Laws of the Game were originally codified in England by The Football Association in 1863. Association football is governed internationally by the International Federation of Association Football (FIFA; French: Fédération Internationale de Football Association) which organises a World Cup every four years.[7]

View file

@ -0,0 +1,6 @@
---
title: Dear diary
date: 2015-01-27
---
What is it with that Mary girl? Dragging me to school every day. As if I had a choice. What you don't hear in those nursery rhymes is that she starves me if I don't go to school with her; it's the only way I can stay alive! I'm thinking about being adopted by Little Bo Peep, sure I may get lost, but anything is better than being with Mary and those little brats at school (shudder, shudder).

View file

@ -0,0 +1,41 @@
---
title: To be
subtitle: ... or not to be?
date: 2015-02-13
---
To be, or not to be--that is the question:
Whether 'tis nobler in the mind to suffer
The slings and arrows of outrageous fortune
Or to take arms against a sea of troubles
And by opposing end them. To die, to sleep--
No more--and by a sleep to say we end
The heartache, and the thousand natural shocks
That flesh is heir to. 'Tis a consummation
Devoutly to be wished. To die, to sleep--
To sleep--perchance to dream: ay, there's the rub,
For in that sleep of death what dreams may come
When we have shuffled off this mortal coil,
Must give us pause. There's the respect
That makes calamity of so long life.
For who would bear the whips and scorns of time,
Th' oppressor's wrong, the proud man's contumely
The pangs of despised love, the law's delay,
The insolence of office, and the spurns
That patient merit of th' unworthy takes,
When he himself might his quietus make
With a bare bodkin? Who would fardels bear,
To grunt and sweat under a weary life,
But that the dread of something after death,
The undiscovered country, from whose bourn
No traveller returns, puzzles the will,
And makes us rather bear those ills we have
Than fly to others that we know not of?
Thus conscience does make cowards of us all,
And thus the native hue of resolution
Is sicklied o'er with the pale cast of thought,
And enterprise of great pitch and moment
With this regard their currents turn awry
And lose the name of action. -- Soft you now,
The fair Ophelia! -- Nymph, in thy orisons
Be all my sins remembered.

View file

@ -0,0 +1,35 @@
---
title: Test markdown
subtitle: Each post also has a subtitle
date: 2015-02-20
tags: ["example", "markdown"]
---
You can write regular [markdown](http://markdowntutorial.com/) here and [Hugo](https://gohugo.io) will automatically convert it to a nice webpage. I strongly encourage you to [take 5 minutes to learn how to write in markdown](http://markdowntutorial.com/) - it'll teach you how to transform regular text into bold/italics/headings/tables/etc.
**Here is some bold text**
## Here is a secondary heading
Here's a useless table:
| Number | Next number | Previous number |
| :------ |:--- | :--- |
| Five | Six | Four |
| Ten | Eleven | Nine |
| Seven | Eight | Six |
| Two | Three | One |
How about a yummy crepe?
![Crepe](http://s3-media3.fl.yelpcdn.com/bphoto/cQ1Yoa75m2yUFFbY2xwuqw/348s.jpg)
Here's a code chunk with syntax highlighting:
```javascript
var foo = function(x) {
return(x + 5);
}
foo(3)
```

View file

@ -0,0 +1,14 @@
---
title: Flake it till you make it
subtitle: Excerpt from Soulshaping by Jeff Brown
date: 2015-02-26
bigimg: [{src: "/img/path.jpg", desc: "Path"}]
---
Under what circumstances should we step off a path? When is it essential that we finish what we start? If I bought a bag of peanuts and had an allergic reaction, no one would fault me if I threw it out. If I ended a relationship with a woman who hit me, no one would say that I had a commitment problem. But if I walk away from a seemingly secure route because my soul has other ideas, I am a flake?
The truth is that no one else can definitively know the path we are here to walk. Its tempting to listen—many of us long for the omnipotent other—but unless they are genuine psychic intuitives, they cant know. All others can know is their own truth, and if theyve actually done the work to excavate it, they will have the good sense to know that they cannot genuinely know anyone elses. Only soul knows the path it is here to walk. Since you are the only one living in your temple, only you can know its scriptures and interpretive structure.
At the heart of the struggle are two very different ideas of success—survival-driven and soul-driven. For survivalists, success is security, pragmatism, power over others. Success is the absence of material suffering, the nourishing of the soul be damned. It is an odd and ironic thing that most of the material power in our world often resides in the hands of younger souls. Still working in the egoic and material realms, they love the sensations of power and focus most of their energy on accumulation. Older souls tend not to be as materially driven. They have already played the worldly game in previous lives and they search for more subtle shades of meaning in this one—authentication rather than accumulation. They are often ignored by the culture at large, although they really are the truest warriors.
A soulful notion of success rests on the actualization of our innate image. Success is simply the completion of a soul step, however unsightly it may be. We have finished what we started when the lesson is learned. What a fear-based culture calls a wonderful opportunity may be fruitless and misguided for the soul. Staying in a passionless relationship may satisfy our need for comfort, but it may stifle the soul. Becoming a famous lawyer is only worthwhile if the soul demands it. It is an essential failure if you are called to be a monastic this time around. If you need to explore and abandon ten careers in order to stretch your soul toward its innate image, then so be it. Flake it till you make it.

View file

@ -0,0 +1,42 @@
---
title: Code Sample
subtitle: Using Hugo or Pygments
date: 2016-03-08
tags: ["example", "code"]
---
The following are two code samples using syntax highlighting.
<!--more-->
The following is a code sample using triple backticks ( ``` ) code fencing provided in Hugo. This is client side highlighting and does not require any special installation.
```javascript
var num1, num2, sum
num1 = prompt("Enter first number")
num2 = prompt("Enter second number")
sum = parseInt(num1) + parseInt(num2) // "+" means "add"
alert("Sum = " + sum) // "+" means combine into a string
```
The following is a code sample using the "highlight" shortcode provided in Hugo. This is server side highlighting and requires Python and Pygments to be installed.
{{< highlight javascript >}}
var num1, num2, sum
num1 = prompt("Enter first number")
num2 = prompt("Enter second number")
sum = parseInt(num1) + parseInt(num2) // "+" means "add"
alert("Sum = " + sum) // "+" means combine into a string
{{</ highlight >}}
And here is the same code with line numbers:
{{< highlight javascript "linenos=inline">}}
var num1, num2, sum
num1 = prompt("Enter first number")
num2 = prompt("Enter second number")
sum = parseInt(num1) + parseInt(num2) // "+" means "add"
alert("Sum = " + sum) // "+" means combine into a string
{{</ highlight >}}

View file

@ -0,0 +1,49 @@
---
title: Math Sample
subtitle: Using KaTeX
date: 2017-03-05
tags: ["example", "math"]
---
KaTeX can be used to generate complex math formulas server-side.
$$
\phi = \frac{(1+\sqrt{5})}{2} = 1.6180339887\cdots
$$
Additional details can be found on [GitHub](https://github.com/Khan/KaTeX) or on the [Wiki](http://tiddlywiki.com/plugins/tiddlywiki/katex/).
<!--more-->
### Example 1
If the text between $$ contains newlines it will rendered in display mode:
```
$$
f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi
$$
```
$$
f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi
$$
### Example 2
```
$$
\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\cdots} } } }
$$
```
$$
\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\cdots} } } }
$$
### Example 3
```
$$
1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}, \quad\quad \text{for }\lvert q\rvert<1.
$$
```
$$
1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}, \quad\quad \text{for }\lvert q\rvert<1.
$$

View file

@ -0,0 +1,40 @@
---
title: Big Image Sample
subtitle: Using Multiple Images
date: 2017-03-07
tags: ["example", "bigimg"]
bigimg: [{src: "/img/triangle.jpg", desc: "Triangle"}, {src: "/img/sphere.jpg", desc: "Sphere"}, {src: "/img/hexagon.jpg", desc: "Hexagon"}]
---
The image banners at the top of the page are refered to as "bigimg" in this theme. They are optional, and one more more can be specified. If more than one is specified, the images rotate every 10 seconds. In the front matter, bigimgs are specified using an array of hashes.
<!--more-->
A single bigimg can be specified in the front matter by the following YAML:
```
bigimg: [{src: "/img/triangle.jpg", desc: "Triangle"}]
```
Multiple bigimgs can be specified in the front matter by the following YAML:
```
bigimg: [{src: "/img/triangle.jpg", desc: "Triangle"},
{src: "/img/sphere.jpg", desc: "Sphere"},
{src: "/img/hexagon.jpg", desc: "Hexagon"}]
```
Also note that the description field is optional, and images could instead be specified by:
```
bigimg: [{src: "/img/triangle.jpg"},
{src: "/img/sphere.jpg"},
{src: "/img/hexagon.jpg"}]
```
The above YAML array of hashes were written in "flow" style. However when generating a new page or post with `hugo new post/mypost.md`, hugo may interpret the archetype for bigimg in the default YAML style. Defining multiple bigimg's complete with descriptions in this style would be specified by:
```
bigimg:
- {src: "/img/triangle.jpg", desc: "Triangle"}
- {src: "/img/sphere.jpg", desc: "Sphere"}
- {src: "/img/hexagon.jpg", desc: "Hexagon"}
```
Additional information can be found [in this YAML tutorial](https://rhnh.net/2011/01/31/yaml-tutorial/).

View file

@ -0,0 +1,37 @@
---
title: Photoswipe Gallery Sample
subtitle: Making a Gallery
date: 2017-03-20
tags: ["example", "photoswipe"]
---
Beautiful Hugo adds a few custom shortcodes created by [Li-Wen Yip](https://www.liwen.id.au/heg/) and [Gert-Jan van den Berg](https://github.com/GjjvdBurg/HugoPhotoSwipe) for making galleries with [PhotoSwipe](http://photoswipe.com) .
{{< gallery caption-effect="fade" >}}
{{< figure thumb="-thumb" link="/img/hexagon.jpg" >}}
{{< figure thumb="-thumb" link="/img/sphere.jpg" caption="Sphere" >}}
{{< figure thumb="-thumb" link="/img/triangle.jpg" caption="Triangle" alt="This is a long comment about a triangle" >}}
{{< /gallery >}}
<!--more-->
## Example
The above gallery was created using the following shortcodes:
```
{{</* gallery caption-effect="fade" */>}}
{{</* figure thumb="-thumb" link="/img/hexagon.jpg" */>}}
{{</* figure thumb="-thumb" link="/img/sphere.jpg" caption="Sphere" */>}}
{{</* figure thumb="-thumb" link="/img/triangle.jpg" caption="Triangle" alt="This is a long comment about a triangle" */>}}
{{</* /gallery */>}}
```
## Usage
For full details please see the [hugo-easy-gallery GitHub](https://github.com/liwenyip/hugo-easy-gallery/) page. Basic usages from above are:
- Create a gallery with open and close tags `{{</* gallery */>}}` and `{{</* /gallery */>}}`
- `{{</* figure src="image.jpg" */>}}` will use `image.jpg` for thumbnail and lightbox
- `{{</* figure src="thumb.jpg" link="image.jpg" */>}}` will use `thumb.jpg` for thumbnail and `image.jpg` for lightbox
- `{{</* figure thumb="-small" link="image.jpg" */>}}` will use `image-small.jpg` for thumbnail and `image.jpg` for lightbox
- All the [features/parameters](https://gohugo.io/extras/shortcodes) of Hugo's built-in `figure` shortcode work as normal, i.e. src, link, title, caption, class, attr (attribution), attrlink, alt
- `{{</* gallery caption-effect="fade" */>}}` will fade in captions for all figures in this gallery instead of the default slide-up behavior
- Many gallery styles for captions and hover effects exist; view the [hugo-easy-gallery GitHub](https://github.com/liwenyip/hugo-easy-gallery/) for all options
- Note that this theme will load the photoswipe gallery theme and scripts by default, no need to load photoswipe on your individual pages

View file

@ -0,0 +1,7 @@
<!--
If you want to include any custom html just before </body>, put it in this file.
Or you can delete these file if you don't need it.
-->
<!-- for example, you could include some js libraries:
<script src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.19.1/vis.js" integrity="sha256-HdIuWBZj4eftihsoDCJoMYjZi6aNVaw7YlUpzKT3ZxI=" crossorigin="anonymous"></script>
-->

View file

@ -0,0 +1,18 @@
<!--
If you want to include any custom html just before </head>, put it in this file.
Or you can delete these file if you don't need it.
-->
<!-- for example, you could insert this custom css, which makes the bigimg not stretch:
<style>
.intro-header.big-img, .intro-header.big-img .big-img-transition {
-webkit-background-size: contain !important;
-moz-background-size: contain !important;
background-size: contain !important;
-o-background-size: contain !important;
background-color: lightgrey;
}
</style>
-->
<!-- or you could include some additional css libraries:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.19.1/vis.css" integrity="sha256-I1UoFd33KHIydu88R9owFaQWzwkiZV4hXXug5aYaM28=" crossorigin="anonymous" />
-->

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2 de Janeiro de 2006"
- id: shortdateFormat
translation: "02/Jan/2006 15:04:05"
- id: postedOnDate
translation: "Postado em {{ . }}"
- id: lastModified
translation: "(Ultima modificação em {{ . }})"
- id: translationsLabel
translation: "Outras linguagens: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Saiba mais"
- id: olderPosts
translation: "Posts antigos"
- id: newerPosts
translation: "Posts novos"
- id: previousPost
translation: "Post anterior"
- id: nextPost
translation: "Próximo Post"
- id: readTime
translation: "minutos"
- id: words
translation: "palavras"
# 404 page
- id: pageNotFound
translation: "Opa, a página não existe"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> alimentada &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adaptado de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Ver navegação"
- id: languageSwitcherLabel
translation: "Idioma"
- id: gcseLabelShort
translation: "Buscar"
- id: gcseLabelLong
translation: "Buscar {{ .Site.Title }}"
- id: gcseClose
translation: "Fechar"
# Staticman
- id: noComment
translation: "Sem comentários"
- id: oneComment
translation: "comentário"
- id: moreComment
translation: "comentários"
- id: useMarkdown
translation: "Você pode usar sintaxe MarkDown"
- id: yourName
translation: "Seu nome"
- id: yourEmail
translation: "Seu email"
- id: yourWebsite
translation: "Seu website"
# Delayed Disqus
- id: show
translation: "Mostrar"
- id: comments
translation: "comentários"
# Related posts
- id: seeAlso
translation: "Veja também"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "02.01.2006"
- id: shortdateFormat
translation: "2 Jan, 2006 15:04:05"
- id: postedOnDate
translation: "Gepostet am {{ . }}"
- id: lastModified
translation: "(Zuletzt geändert am {{ . }})"
- id: translationsLabel
translation: "Andere Sprachen: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Mehr"
- id: olderPosts
translation: "Ältere Posts"
- id: newerPosts
translation: "Neuere Posts"
- id: previousPost
translation: "Letzter Post"
- id: nextPost
translation: "Nächster Post"
- id: readTime
translation: "Minuten"
- id: words
translation: "Wörter"
# 404 page
- id: pageNotFound
translation: "Ups, diese Seite existiert nicht. (404 Error)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> angetrieben &nbsp;&bull;&nbsp; Theme <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> angepasst von <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Navigation"
- id: languageSwitcherLabel
translation: "Sprache"
- id: gcseLabelShort
translation: "Suche"
- id: gcseLabelLong
translation: "Suche {{ .Site.Title }}"
- id: gcseClose
translation: "Schließen"
# Staticman
- id: noComment
translation: "Kein Kommentar"
- id: oneComment
translation: "Kommentar"
- id: moreComment
translation: "Kommentare"
- id: useMarkdown
translation: "Sie können Markdown-Syntax verwenden"
- id: yourName
translation: "Ihr Name"
- id: yourEmail
translation: "Ihre Emailadresse"
- id: yourWebsite
translation: "Ihre Website"
# Delayed Disqus
- id: show
translation: "Zeige"
- id: comments
translation: "Kommentare"
# Related posts
- id: seeAlso
translation: "Siehe auch"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "January 2, 2006"
- id: shortdateFormat
translation: "Jan 2, 2006 15:04:05"
- id: postedOnDate
translation: "Slået op den {{ .Count }}"
- id: lastModified
translation: "(Senest redigeret den {{ .Count }})"
- id: translationsLabel
translation: "Andre sprog: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Læs mere"
- id: olderPosts
translation: "Ældre opslag"
- id: newerPosts
translation: "Nyere opslag"
- id: previousPost
translation: "Forrige opslag"
- id: nextPost
translation: "Næste opslag"
- id: readTime
translation: "Minutter"
- id: words
translation: "Ord"
# 404 page
- id: pageNotFound
translation: "Ups, denne side eksisterer ikke. (404 error)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> drevet &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> tilpasset fra <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Navigation"
- id: languageSwitcherLabel
translation: "Sprog"
- id: gcseLabelShort
translation: "Søg"
- id: gcseLabelLong
translation: "Søg {{ .Site.Title }}"
- id: gcseClose
translation: "Luk"
# Staticman
- id: noComment
translation: "Ingen kommentar"
- id: oneComment
translation: "Kommentar"
- id: moreComment
translation: "Kommentarer"
- id: useMarkdown
translation: "Du kan anvende Markdown syntax"
- id: yourName
translation: "Dit navn"
- id: yourEmail
translation: "Din emailadresse"
- id: yourWebsite
translation: "Din hjemmeside"
# Delayed Disqus
- id: show
translation: "Vis"
- id: comments
translation: "Kommentarer"
# Related posts
- id: seeAlso
translation: "Se også"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "January 2, 2006"
- id: shortdateFormat
translation: "Jan 2, 2006 15:04:05"
- id: postedOnDate
translation: "Posted on {{ . }}"
- id: lastModified
translation: "(Last modified on {{ . }})"
- id: translationsLabel
translation: "Other languages: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Read More"
- id: olderPosts
translation: "Older Posts"
- id: newerPosts
translation: "Newer Posts"
- id: previousPost
translation: "Previous Post"
- id: nextPost
translation: "Next Post"
- id: readTime
translation: "minutes"
- id: words
translation: "words"
# 404 page
- id: pageNotFound
translation: "Whoops, this page doesn't exist. Move along. (404 error)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> powered &nbsp;&bull;&nbsp; Theme <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adapted from <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Toggle navigation"
- id: languageSwitcherLabel
translation: "Language"
- id: gcseLabelShort
translation: "Search"
- id: gcseLabelLong
translation: "Search {{ .Site.Title }}"
- id: gcseClose
translation: "Close"
# Staticman
- id: noComment
translation: "No comment"
- id: oneComment
translation: "comment"
- id: moreComment
translation: "comments"
- id: useMarkdown
translation: "You can use Markdown syntax"
- id: yourName
translation: "Your name"
- id: yourEmail
translation: "Your email address"
- id: yourWebsite
translation: "Your website"
# Delayed Disqus
- id: show
translation: "Show"
- id: comments
translation: "comments"
# Related posts
- id: seeAlso
translation: "See also"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2006-01-02"
- id: shortdateFormat
translation: "2 Jan, 2006 15:04:05"
- id: postedOnDate
translation: "Afiŝiĝis je {{ . }}"
- id: lastModified
translation: "(Laste aliiĝis je {{ . }})"
- id: translationsLabel
translation: "Aliaj lingvoj: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Legi pli"
- id: olderPosts
translation: "Plimalnovaj afiŝoj"
- id: newerPosts
translation: "Plinovaj afiŝoj"
- id: previousPost
translation: "Antaŭa afiŝo"
- id: nextPost
translation: "Sekva afiŝo"
- id: readTime
translation: "minutoj"
- id: words
translation: "vortoj"
# 404 page
- id: pageNotFound
translation: "Ups, ĉi tiu paĝo ne ekzistas. (404 Error)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a>-povigita &nbsp;&bull;&nbsp; Haŭto de <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adaptiĝis de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Navigacio"
- id: languageSwitcherLabel
translation: "Lingvo"
- id: gcseLabelShort
translation: "Serĉi"
- id: gcseLabelLong
translation: "Serĉi {{ .Site.Title }}"
- id: gcseClose
translation: "Fermi"
# Staticman
- id: noComment
translation: "Sen komentoj"
- id: oneComment
translation: "komento"
- id: moreComment
translation: "komentoj"
- id: useMarkdown
translation: "Vi povus uzi Markdown-sintakson"
- id: yourName
translation: "Via nomo"
- id: yourEmail
translation: "Via retpoŝtadreso"
- id: yourWebsite
translation: "Via retpaĝaro"
# Delayed Disqus
- id: show
translation: "Montru"
- id: comments
translation: "komentoj"
# Related posts
- id: seeAlso
translation: "Vidu ankaŭ"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2 de enero, 2006"
- id: shortdateFormat
translation: "2 Jan, 2006 15:04:05"
- id: postedOnDate
translation: "Publicado el {{ . }}"
- id: lastModified
translation: "(Última modificación en {{ . }})"
- id: translationsLabel
translation: "Otros idiomas: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Leer más"
- id: olderPosts
translation: "Artículos anteriores"
- id: newerPosts
translation: "Artículos siguientes"
- id: previousPost
translation: "Artículo anterior"
- id: nextPost
translation: "Artículo siguiente"
- id: readTime
translation: "minutos"
- id: words
translation: "palabras"
# 404 page
- id: pageNotFound
translation: "¡Vaya! Esta página no existe (error 404)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> alimentada &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adaptado de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Conmuta navegación"
- id: languageSwitcherLabel
translation: "Idioma"
- id: gcseLabelShort
translation: "Buscar"
- id: gcseLabelLong
translation: "Buscar en {{ .Site.Title }}"
- id: gcseClose
translation: "Cerrar"
# Staticman
- id: noComment
translation: "Sin comentarios"
- id: oneComment
translation: "comentario"
- id: moreComment
translation: "comentarios"
- id: useMarkdown
translation: "Puedes usar la sintaxis de Markdown"
- id: yourName
translation: "Tu nombre"
- id: yourEmail
translation: "Tu correo electrónico"
- id: yourWebsite
translation: "Tu sitio web"
# Delayed Disqus
- id: show
translation: "Mostrar"
- id: comments
translation: "comentarios"
# Related posts
- id: seeAlso
translation: "Ver también"

View file

@ -0,0 +1,76 @@
# Content
- id: dateFormat
translation: "2·01·2006"
- id: shortdateFormat
translation: "2·01·2006 - 15:04:05"
- id: postedOnDate
translation: "Publié le {{ . }}"
- id: lastModified
translation: "(Mise à jour le {{ . }})"
- id: translationsLabel
translation: "Traductions : "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Lire"
- id: olderPosts
translation: "Anciens posts"
- id: newerPosts
translation: "Nouveaux posts"
- id: previousPost
translation: "Post précédent"
- id: nextPost
translation: "Post suivant"
- id: readTime
translation: "minutes"
- id: words
translation: "mots"
# 404 page
- id: pageNotFound
translation: "Oups, cette page n'existe pas. (erreur 404)"
# Footer
- id: poweredBy # Accepts HTML
translation: 'Carbure avec <a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a>&nbsp;&bull;&nbsp; Avec le Theme <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adapté de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Activer la navigation"
- id: languageSwitcherLabel
translation: "Langue"
- id: gcseLabelShort
translation: "Rechercher"
- id: gcseLabelLong
translation: "Rechercher {{ .Site.Title }}"
- id: gcseClose
translation: "Fermer"
# Staticman
- id: noComment
translation: "Pas de commentaire"
- id: oneComment
translation: "commentaire"
- id: moreComment
translation: "commentaires"
- id: useMarkdown
translation: "Rédigez votre commentaire ici. (Vous pouvez utiliser la syntaxe Markdown)"
- id: yourName
translation: "Votre nom"
- id: yourEmail
translation: "Votre adresse mail"
- id: yourWebsite
translation: "Votre site web"
- id: sendComment
translation: "Envoyer"
# Delayed Disqus
- id: show
translation: "Afficher"
- id: comments
translation: "commentaires"
# Related posts
- id: seeAlso
translation: "Suggestions de lecture :"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "Siječanj 2, 2006"
- id: shortdateFormat
translation: "Sij 2, 2006 15:04:05"
- id: postedOnDate
translation: "Obajvljeno na {{ .Count }}"
- id: lastModified
translation: "(Zadnja promjena na {{ .Count }})"
- id: translationsLabel
translation: "Ostali jezici: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Pročitaj više"
- id: olderPosts
translation: "Starije objave"
- id: newerPosts
translation: "Novije objave"
- id: previousPost
translation: "Prethodna objava"
- id: nextPost
translation: "Slijedeća objava"
- id: readTime
translation: "minuta"
- id: words
translation: "riječi"
# 404 page
- id: pageNotFound
translation: "Whoops, ova stranica ne postoji. Idemo dalje. (404 error)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Pokreće Hugo v{{ .Site.Hugo.Version }}</a> &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> prilagođena od <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Uključi/isključi navigaciju"
- id: languageSwitcherLabel
translation: "Jezik"
- id: gcseLabelShort
translation: "Traži"
- id: gcseLabelLong
translation: "Traži {{ .Site.Title }}"
- id: gcseClose
translation: "Zatvori"
# Staticman
- id: noComment
translation: "Nema komenatara"
- id: oneComment
translation: "komentar"
- id: moreComment
translation: "komenatari"
- id: useMarkdown
translation: "Možete koristiti Markdown sintaksu"
- id: yourName
translation: "Vaše ime"
- id: yourEmail
translation: "Vaša email adresa"
- id: yourWebsite
translation: "You web stranica"
# Delayed Disqus
- id: show
translation: "Pokaži"
- id: comments
translation: "komentari"
# Related posts
- id: seeAlso
translation: "Također vidi"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2 January 2006"
- id: shortdateFormat
translation: "2 Jan 2006 15:04:05"
- id: postedOnDate
translation: "Pubblicato il {{ . }}"
- id: lastModified
translation: "(Ultima modifica il {{ . }})"
- id: translationsLabel
translation: "Altre lingue: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Leggi"
- id: olderPosts
translation: "Articoli più vecchi"
- id: newerPosts
translation: "Articoli più recenti"
- id: previousPost
translation: "Articolo precedente"
- id: nextPost
translation: "Articolo successivo"
- id: readTime
translation: "minuti"
- id: words
translation: "parole"
# 404 page
- id: pageNotFound
translation: "Ops, questa pagina non esiste. (errore 404)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Sviluppato con Hugo v{{ .Site.Hugo.Version }}</a> &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adattato da <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Menu"
- id: languageSwitcherLabel
translation: "Lingua"
- id: gcseLabelShort
translation: "Cerca"
- id: gcseLabelLong
translation: "Cerca {{ .Site.Title }}"
- id: gcseClose
translation: "Chiudi"
# Staticman
- id: noComment
translation: "Nessun commento"
- id: oneComment
translation: "commento"
- id: moreComment
translation: "commenti"
- id: useMarkdown
translation: "Puoi usare la sintassi Markdown"
- id: yourName
translation: "Il tuo nome"
- id: yourEmail
translation: "Il tuo indirizzo mail"
- id: yourWebsite
translation: "Il tuo website"
# Delayed Disqus
- id: show
translation: "Mostra"
- id: comments
translation: "commenti"
# Related posts
- id: seeAlso
translation: "Vedi anche"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2006年1月2日"
- id: shortdateFormat
translation: "2 Jan, 2006 15:04:05"
- id: postedOnDate
translation: "{{ . }}に投稿"
- id: lastModified
translation: "(最終更新日時{{ . }})"
- id: translationsLabel
translation: "翻訳:"
- id: translationsSeparator
translation: "・"
- id: readMore
translation: "続きを読む"
- id: olderPosts
translation: "古いページ"
- id: newerPosts
translation: "新しいページ"
- id: previousPost
translation: "前ページ"
- id: nextPost
translation: "次ページ"
- id: readTime
translation: "分間"
- id: words
translation: "言葉"
# 404 page
- id: pageNotFound
translation: "おっと、このページが存在しない。他にあたってください。404エラー"
# Footer
- id: poweredBy # Accepts HTML
translation: '起動力に<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> &nbsp;&bull;&nbsp; テーマに<a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>に基づいている<a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "メニューを切り替え"
- id: languageSwitcherLabel
translation: "言語"
- id: gcseLabelShort
translation: "検索"
- id: gcseLabelLong
translation: "{{ .Site.Title }}を検索"
- id: gcseClose
translation: "閉じる"
# Staticman
- id: noComment
translation: "0 件のコメント"
- id: oneComment
translation: "件のコメント"
- id: moreComment
translation: "件のコメント"
- id: useMarkdown
translation: "Markdown を使用できます"
- id: yourName
translation: "名前"
- id: yourEmail
translation: "メールアドレス"
- id: yourWebsite
translation: "ウェブサイト"
# Delayed Disqus
- id: show
translation: "ショー"
- id: comments
translation: "コメント"
# Related posts
- id: seeAlso
translation: "も参照してください"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "2006년 1월 2일"
- id: shortdateFormat
translation: "2006. 1. 2. 15:04:05"
- id: postedOnDate
translation: "{{ .Count }}에 게시됨"
- id: lastModified
translation: "({{ .Count }}에 마지막으로 수정됨)"
- id: translationsLabel
translation: "다른 언어: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "더 읽기"
- id: olderPosts
translation: "이전 페이지"
- id: newerPosts
translation: "다음 페이지"
- id: previousPost
translation: "이전 글"
- id: nextPost
translation: "다음 글"
- id: readTime
translation: "분"
- id: words
translation: "단어"
# 404 page
- id: pageNotFound
translation: "이런, 이 페이지를 찾을 수 없어요. (404 오류)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a> 을 사용함 &nbsp;&bull;&nbsp; <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a> 를 개조한 <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> 테마'
# Navigation
- id: toggleNavigation
translation: "네비게이션 토글"
- id: languageSwitcherLabel
translation: "언어"
- id: gcseLabelShort
translation: "검색"
- id: gcseLabelLong
translation: "{{ .Site.Title }}에서 검색"
- id: gcseClose
translation: "닫기"
# Staticman
- id: noComment
translation: "댓글이 없습니다."
- id: oneComment
translation: "개의 댓글"
- id: moreComment
translation: "개의 댓글들"
- id: useMarkdown
translation: "마크다운 문법을 쓸 수 있습니다."
- id: yourName
translation: "이름"
- id: yourEmail
translation: "이메일"
- id: yourWebsite
translation: "웹사이트"
# Delayed Disqus
- id: show
translation: "표시"
- id: comments
translation: "댓글들"
# Related posts
- id: seeAlso
translation: "더 보면 좋을 글들"

View file

@ -0,0 +1,297 @@
# Content
- id: dateFormat
translation: "2 January 2006"
- id: shortdateFormat
translation: "2 Jan 2006 15:04:05"
- id: postedOnDate
translation: "Publegaa il {{ .Count }}"
- id: lastModified
translation: "(Darrera modifega ell {{ .Count }})"
- id: translationsLabel
translation: "Alter lengov: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Lensg"
- id: olderPosts
translation: "Articol pussee vegg"
- id: newerPosts
translation: "Articoli pussee noeuv"
- id: previousPost
translation: "Articolo de prima"
- id: nextPost
translation: "Articolo dopo"
- id: readTime
translation: "megnuu"
- id: words
translation: "paroll"
# 404 page
- id: pageNotFound
translation: "Ocio, quella pagina chi la esist no. (errore 404)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Desviluppaa con Hugo v{{ .Site.Hugo.Version }}</a> &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adattaa de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Attiva/disattiva la navigazion"
- id: languageSwitcherLabel
translation: "Lengua"
- id: gcseLabelShort
translation: "Cerca"
- id: gcseLabelLong
translation: "Cerca {{ .Site.Title }}"
- id: gcseClose
translation: "Sara su"
# Staticman
- id: noComment
translation: "Nissub comment"
- id: oneComment
translation: "comment"
- id: moreComment
translation: "comment"
- id: useMarkdown
translation: "Te pòdet doperà la sintassi Markdown"
- id: yourName
translation: "El tò nomm"
- id: yourEmail
translation: "La toa adressa e-mail"
- id: yourWebsite
translation: "El tò sitt web"
# Delayed Disqus
- id: show
translation: "Mostra"
- id: comments
translation: "comment"
# Related posts
- id: seeAlso
translation: "Varda anca"
# Content
- id: dateFormat
translation: "2 January 2006"
- id: shortdateFormat
translation: "2 Jan 2006 15:04:05"
- id: postedOnDate
translation: "Publegaa il {{ .Count }}"
- id: lastModified
translation: "(Darrera modifega ell {{ .Count }})"
- id: translationsLabel
translation: "Alter lengov: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Lensg"
- id: olderPosts
translation: "Articol pussee vegg"
- id: newerPosts
translation: "Articoli pussee noeuv"
- id: previousPost
translation: "Articolo de prima"
- id: nextPost
translation: "Articolo dopo"
- id: readTime
translation: "megnuu"
- id: words
translation: "paroll"
# 404 page
- id: pageNotFound
translation: "Ocio, quella pagina chi la esist no. (errore 404)"
# Footer
- id: poweredBy # Accepts HTML
translation: '<a href="https://gohugo.io">Desviluppaa con Hugo v{{ .Site.Hugo.Version }}</a> &nbsp;&bull;&nbsp; Tema <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> adattaa de <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Attiva/disattiva la navigazion"
- id: languageSwitcherLabel
translation: "Lengua"
- id: gcseLabelShort
translation: "Cerca"
- id: gcseLabelLong
translation: "Cerca {{ .Site.Title }}"
- id: gcseClose
translation: "Sara su"
# Staticman
- id: noComment
translation: "Nissub comment"
- id: oneComment
translation: "comment"
- id: moreComment
translation: "comment"
- id: useMarkdown
translation: "Te pòdet doperà la sintassi Markdown"
- id: yourName
translation: "El tò nomm"
- id: yourEmail
translation: "La toa adressa e-mail"
- id: yourWebsite
translation: "El tò sitt web"
# Delayed Disqus
- id: show
translation: "Mostra"
- id: comments
translation: "comment"
# Related posts
- id: seeAlso
translation: "Varda anca"

View file

@ -0,0 +1,74 @@
# Content
- id: dateFormat
translation: "02.01.2006"
- id: shortdateFormat
translation: "2 Jan, 2006 15:04:05"
- id: postedOnDate
translation: "Postet {{ . }}"
- id: lastModified
translation: "(Sist endret {{ . }})"
- id: translationsLabel
translation: "Andre språk: "
- id: translationsSeparator
translation: ", "
- id: readMore
translation: "Les Mer"
- id: olderPosts
translation: "Eldre Poster"
- id: newerPosts
translation: "Nyere Poster"
- id: previousPost
translation: "Forrige Post"
- id: nextPost
translation: "Neste Post"
- id: readTime
translation: "minutter"
- id: words
translation: "ord"
# 404 page
- id: pageNotFound
translation: "Oisann! Denne siden finnes visst ikke. Prøv noe annet. (404 feil)"
# Footer
- id: poweredBy # Accepts HTML
translation: 'Kjører på <a href="https://gohugo.io">Hugo v{{ .Site.Hugo.Version }}</a>&nbsp;&bull;&nbsp; Tema fra <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a> tilpasset fra <a href="https://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a>'
# Navigation
- id: toggleNavigation
translation: "Navigasjon på/av"
- id: languageSwitcherLabel
translation: "Språk"
- id: gcseLabelShort
translation: "Søk"
- id: gcseLabelLong
translation: "Søk {{ .Site.Title }}"
- id: gcseClose
translation: "Lukk"
# Staticman
- id: noComment
translation: "Ingen kommentarer"
- id: oneComment
translation: "kommentar"
- id: moreComment
translation: "kommentarer"
- id: useMarkdown
translation: "Du kan bruke Markdown syntax"
- id: yourName
translation: "Ditt navn"
- id: yourEmail
translation: "Din e-postadresse"
- id: yourWebsite
translation: "Din webside"
# Delayed Disqus
- id: show
translation: "Vis"
- id: comments
translation: "kommentarer"
# Related posts
- id: seeAlso
translation: "Se også"

Some files were not shown because too many files have changed in this diff Show more