diff --git a/engine/draft-build.sh b/engine/draft-build.sh new file mode 100755 index 0000000..e4e79e5 --- /dev/null +++ b/engine/draft-build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +cd "$(git rev-parse --show-toplevel)" || exit 1 +echo "* org-publish" +emacs -nw \ + --load project.el \ + --eval "(progn (org-publish \"draft\") (evil-quit))" + +echo "* org-publish [done]" diff --git a/engine/serve.sh b/engine/serve.sh index 2cfcd1b..fe058eb 100755 --- a/engine/serve.sh +++ b/engine/serve.sh @@ -10,4 +10,4 @@ fi cd $webdir && \ echo "Serving: $webdir" && \ -sws -d --port 3001 . +sws -d --port 3000 . diff --git a/project.el b/project.el index 15ce804..aa805d5 100644 --- a/project.el +++ b/project.el @@ -284,7 +284,7 @@ " %s" ;; source " -sampling-factor 4:2:0" " -strip" - " -resize 300x300\\>" + " -resize 320x320\\>" " -interlace Plane" " -quality 85" " -define filter:blur=0.75" diff --git a/project.el.sig b/project.el.sig index f71b3f1..9f34186 100644 Binary files a/project.el.sig and b/project.el.sig differ diff --git a/src/css/y.css b/src/css/y.css index 45ddbe5..edcd680 100644 --- a/src/css/y.css +++ b/src/css/y.css @@ -98,12 +98,12 @@ p, ul[class], ol[class], li, -figure, figcaption, dl, dd { margin: 0; } +figure { margin: 1em 0; } /* Make default font-size 1rem and add smooth scrolling to anchors */ html { @@ -112,10 +112,10 @@ html { } body { - font-family: Georgia, Cambria, 'Times New Roman', Times, serif; - line-height: 1.8; + font-family: "American Typewriter", Georgia, serif; + line-height: 1.5; - max-width: 80ch; + max-width: 60ch; min-height: 100vh; overflow-x: hidden; margin: 0 auto; @@ -125,7 +125,7 @@ body { counter-reset: definition; color: hsl(0, 5%, 10%); - background-color: hsl(210, 20%, 98%); + background-color: hsl(218, 20%, 98%); text-rendering: optimizeLegibility; } @@ -144,12 +144,6 @@ a:not([class]) { text-decoration-skip-ink: auto; } -/* Make links red */ -a, -a:visited { - color: #a00; -} - /* Make images easier to work with */ img { max-width: 100%; @@ -178,25 +172,24 @@ article > * + * { code, pre, kbd { - font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', - monospace; - font-size: 85%; + font-family: Courier, monospace; } pre { - padding: 1rem 1.4rem; + padding: 1rem; max-width: 100%; overflow: auto; - border: 1px solid hsl(210, 15%, 49%); + border: 1px solid hsl(218, 15%, 49%); border-radius: 4px; - background: hsl(210, 40%, 96%); + background: hsl(218, 40%, 96%); + font-size: 85%; } pre code { font-size: 95%; position: relative; } kbd { - background: hsl(210, 5%, 100%); - border: 1px solid hsl(210, 5%, 70%); + background: hsl(218, 5%, 100%); + border: 1px solid hsl(218, 5%, 70%); border-radius: 2px; padding: 2px 4px; font-size: 75%; @@ -239,8 +232,9 @@ nav li { } /* Center definitions (most useful for display equations) */ +dl dt { font-weight: 700; } dl dd { - text-align: center; + padding-left: 3rem; } /* Theorem */ @@ -308,6 +302,7 @@ dl dd { } /* Make footnote text smaller and left align it (looks bad with long URLs) */ +.footref { display: inline-block; padding: 0 3px; } .footnotes p { text-align: left; line-height: 1.5; @@ -415,11 +410,13 @@ body>input { display: none; } #labels > .content { margin: 0 auto; text-align: center; } label { font-weight: 700; } label:hover { cursor: pointer; } +label ~ pre { margin-top: 0; } +.org-src-container { margin: 1rem 0; } #logo { text-align: center; } body { margin:0; padding: 0; border: 0; max-width: none;} #preamble, #postamble { text-align: center; } #content,.content,#preamble,#postamble { - max-width: 80ch; + max-width: 60ch; overflow: hidden; margin: 0 auto; } @@ -427,7 +424,13 @@ figure img { width: 100%; } .footdef > sup { vertical-align: top; font-size: medium; } .footdef > sup > a { padding: 0.5em; } .footpara { display: inline; } -footer { margin: 3em 0; padding: 1em 0; border-top: solid 1px; border-bottom: solid 1px; line-height: 1em; } +footer { margin: 3em 0; + padding: 1em 0; + border-top: solid 1px; + border-bottom: solid 1px; + line-height: 1em; + font-size: 0.85em; + } td { border-bottom: none; padding: .2rem; } table { margin-top: 1rem; } nav { text-align: center; padding: 2em 0; } @@ -459,24 +462,32 @@ pre { line-height: 1em; } --fg0: var(--b0); --fg: var(--b02); --rfg: #000; - --hl: var(--o); + --hl: var(--r); } /* dark preferred */ @media (prefers-color-scheme: dark) { :root { - --bg: black; + --bg: hsl(218,20%,16%); --rbg: var(--b03); - --fg: var(--b1); + --fg: var(--b0); --fg0: var(--b00); --rfg: var(--b2); - --hl: var(--y); + --hl: var(--g); + --y: #ae8c51; + --o: #a9654a; + --r: #af6255; + --m: #ae5e7d; + --v: #6774b2; + --b: #3f8cc3; + --c: #15a198; + --g: #939452; } img { filter: brightness(0.7) saturate(0.5); } pre { - background: hsl(210,40%,15%); - border-color: hsl(210,15%,43%); + background: hsl(218,20%,18%); + border-color: hsl(218,15%,23%); } } @@ -488,30 +499,53 @@ input#l:checked ~ div { --fg: var(--b02); --rfg: #000; --hl: var(--o); + --y: #c18600; + --o: #d84100; + --r: #e62729; + --m: #ec0085; + --v: #6c71c4; + --b: #0095ff; + --c: #00b0a3; + --g: #879a00; } input#l:checked ~ div img { filter: none; } input#l:checked ~ div pre { - border: 1px solid hsl(210, 15%, 49%); - background: hsl(210, 40%, 96%); + border: 1px solid hsl(218, 15%, 49%); + background: hsl(218, 40%, 96%); } /* dark checked */ input#d:checked ~ div { - --bg: hsl(210,20%,2%); + --bg: hsl(218,20%,16%); --rbg: var(--b03); - --fg: var(--b1); + --fg: var(--b0); --fg0: var(--b00); --rfg: var(--b2); - --hl: var(--y); + --hl: var(--g); + --y: #ae8c51; + --o: #a9654a; + --r: #af6255; + --m: #ae5e7d; + --v: #6774b2; + --b: #3f8cc3; + --c: #15a198; + --g: #939452; } input#d:checked ~ div img { filter: brightness(0.7) saturate(0.5); } input#d:checked ~ div pre { - background: hsl(210,40%,15%); - border-color: hsl(210,15%,43%); + background: hsl(218,20%,18%); + border-color: hsl(218,15%,23%); +} + +/* ---- */ +::selection { + background: var(--m); + color: hsl(218,40%,96%); + text-decoration: hsl(218,40%,96%); } body, body > div { @@ -523,13 +557,14 @@ a,a:visited { color: var(--hl); } /* ---- SYNTAX HIGHLIGHTING ---- */ #table-of-contents { text-align: left; } .org-rainbow-delimiters-depth-1, .org-rainbow-delimiters-depth-9, -.org-css-selector, .org-nix-attribute, .org-builtin, +.org-css-selector, .org-builtin, .IN_REVIEW { color:var(--c); } .org-rainbow-delimiters-depth-2, .org-nix-builtin, .org-variable-name, -.org-haskell-definition, .org-haskell-operator, .org-function-name, .org-diff-changed { +.org-haskell-definition, .org-haskell-operator, .org-function-name, .org-diff-changed, +.org-nix-attribute, .org-nxml-element-local-name { color:var(--b); } diff --git a/src/drafts/XXXX-how-i-use-nix/com.github.target.lorri.plist b/src/drafts/XXXX-how-i-use-nix/com.github.target.lorri.plist new file mode 100644 index 0000000..1381526 --- /dev/null +++ b/src/drafts/XXXX-how-i-use-nix/com.github.target.lorri.plist @@ -0,0 +1,23 @@ + + + + + Label + com.github.target.lorri + ProgramArguments + + /bin/zsh + -i + -c + $HOME/.nix-profile/bin/lorri daemon + + StandardOutPath + /var/tmp/lorri.log + StandardErrorPath + /var/tmp/lorri.log + RunAtLoad + + KeepAlive + + + diff --git a/src/drafts/XXXX-how-i-use-nix/index.org b/src/drafts/XXXX-how-i-use-nix/index.org new file mode 100644 index 0000000..ef44c01 --- /dev/null +++ b/src/drafts/XXXX-how-i-use-nix/index.org @@ -0,0 +1,313 @@ +#+Title: How I use nix +#+Author: Yann Esposito +#+Email: yann@esposito.host +#+Date: [2020-06-14 Sun] +#+KEYWORDS: nix, programming +#+DESCRIPTION: In this article I explain how I use nix. +#+DESCRIPTION: As a brew replacement, as home environment manager, +#+DESCRIPTION: to have reproductible dev environment. +#+LANGUAGE: en +#+LANG: en +#+OPTIONS: H:5 auto-id:t toc:nil +#+STARTUP: showeverything + +Have you ever written a small script and you update your system and this +stop working? +Have you copied your tool/script to another machine it doesn't work because +some dependency is missing? +Have you tried to sync your dotfiles to another env and there are a few +details not working? Some missing dependency? +If the answer is yes, then [[https://nixos.org/nix][nix]] can help. + +** Scripts +:PROPERTIES: +:CUSTOM_ID: scripts +:END: + +Suppose you want to write a portable script. +For example, the script I use to minify my CSS. +Here it is: + +#+begin_src shell +#!/usr/bin/env nix-shell +#!nix-shell --pure +#!nix-shell -i bash +#!nix-shell -I nixpkgs="https://github.com/NixOS/nixpkgs/archive/19.09.tar.gz" +#!nix-shell -p bash minify + +minify "$1" > "$2" +#+end_src + +So let's analyze each line of the header block: + +- ~#!/usr/bin/env nix-shell~ :: basic, use ~nix-shell~ to run the script. +- ~#!nix-shell --pure~ :: only use dependencies installed in this nix shell + environment. A bit as if the PATH environment variable was emptied. +- ~#!nix-shell -i bash~ :: tell ~nix-shell~ to run ~bash~ +- ~#!nix-shell -I nixpkgs="https://github.com/NixOS/nixpkgs/archive/19.09.tar.gz"~ :: + pin the nixpkgs using this archive. +- ~#!nix-shell -p bash minify~ :: install ~bash~ and ~minify~ in the nix shell. + +Now if the script is run on a machine with ~nix~ installed you can be +pretty sure it will work as expected. +Even if I update my OS and I forget about this script for a few years. +As long as I can install nix on the new system and I could download the tar +file the script will be run the same way as the day I wrote it. + +**Remark**: +You can use any shell (like ~fish~, ~zsh~) but also other languages +~python~, ~haskell~, etc... + +** Temporary working env +:PROPERTIES: +:CUSTOM_ID: temporary-working-env +:END: + +Quite often, I need to do something, and run a specific command that need +me to install a very specific command. +And I'm pretty sure I will not use this tool ever again. + +For those cases, what I do, is generally run my command directly with a +fresh ~nix-shell~. + +#+begin_src shell +> nix-shell -p httpie +[nix-shell:~]$ ... here I can use httpie ... +#+end_src + +If I don't use ~httpie~ for a while it will be garbage collected +eventually. + +** Home Manager +:PROPERTIES: +:CUSTOM_ID: home-manager +:END: + +A few years ago I used =brew= to install the tools I need. +With =nix= you can install a new tool with ~nix-env -i~ instead of ~brew install~. +Still recently I prefer to use [[https://github.com/rycee/home-manager][home-manager]]. + +The main advantage is that it is even more reproductible and can easily be +shared accross different machines. + +Mainly when I need a new binary I add it in a description list in the file +=~/.config/nixpkgs/home.nix=. +It looks like this: + +#+begin_src nix +home.packages = with pkgs; [ + # emacs + emacsMacport + imagemagick + gnupg + # shell + direnv + ... +]; +#+end_src + +then I simply run ~home-manager switch~ and I've got all those tools in my env. + +*** Pinning the packages +:PROPERTIES: +:CUSTOM_ID: pinning-the-packages +:END: + +#+begin_src nix +{ config, pkgs, ... }: +let + # ... + pkgs = import (fetchGit { + name = "nixpkgs20"; + url = "https://github.com/NixOS/nixpkgs"; + # obtained via + # git ls-remote https://github.com/NixOS/nixpkgs nixpkgs-20.03-darwin + ref = "refs/heads/nixpkgs-20.03-darwin"; + rev = "58f884cd3d89f47672e649c6edfb2382d4afff6a"; + }) {}; + # ... +in { + # ... +} +#+end_src + +*** Specific tools +:PROPERTIES: +:CUSTOM_ID: specific-tools +:END: + +There are a few noticiable artifacts here: + +The first one is ~weechat~ is a very specify build of weechat with the +plugin I need. +For that I created a new directory =weechat-with-weeslack= containing a +=default.nix=: + +#+begin_src nix +{ pkgs, ...}: +pkgs.weechat.override { + configure = { availablePlugins, ... }: { + # plugins = with availablePlugins; [ python perl guile ]; + scripts = with pkgs.weechatScripts; [ wee-slack ]; + }; +} +#+end_src + +And in my =home.nix= I use: + +#+begin_src nix + weechat-with-weeslack = import ./weechat-with-weeslack { + inherit pkgs; + }; +#+end_src + +Even if this looks cryptic. +The important detail is just that there exists a way to say to nix I'd like +to use weechat (an IRC client) with the wee-slack client (which uses python). +And nix handle the rest for me without any conflict. + +*** Another nice tool is =sws= +:PROPERTIES: +:CUSTOM_ID: another-nice-tool-is--sws- +:END: + +I use macOS so even though I'm using a darwin focused nixpkgs +sometimes a few package can be broken and can't be installed. + +That occurred with [[https://hackage.haskell.org/package/sws][=sws=]] during the upgrade to 20.03 on darwin. +This is a simple tool that need haskell to be compiled locally and +installed. +Here is how I could install it: + +#+begin_src nix +let + ... + rel19 = import (fetchGit { + name = "nixpkgs19"; + url = "https://github.com/NixOS/nixpkgs"; + ref = "refs/heads/nixpkgs-19.09-darwin"; + rev = "2f9bafaca90acd010cccd0e79e5f27aa7537957e"; + }) {}; + haskellDeps = ps: with ps; [ + base + protolude + tidal + shake + rel19.haskellPackages.sws + ]; + ghc = pkgs.haskellPackages.ghcWithPackages haskellDeps; + ... +in + home.packages = with pkgs; [ + ... + ghc + ... + ] +#+end_src + +So I used the older version from 19.09. + +** Dev environment +:PROPERTIES: +:CUSTOM_ID: dev-environment +:END: + +When working on a project. +You can produce a pretty good local environment. +For example, for my blog, I only use emacs and a few shell scripts. +Still I needed to fix a few binaries, like the correct ~date~ via +~coreutils~. +And also I use ~html-xml-utils~ to easily deal with html/xml parsing. +I use it to generate my RSS xml file. + +So I have a ~shell.nix~ files at the root of my project: + +#+begin_src nix +{ pkgs ? import (fetchTarball https://github.com/NixOS/nixpkgs/archive/19.09.tar.gz) {} }: + let my_aspell = pkgs.aspellWithDicts(p: with p; [en fr]); + in + pkgs.mkShell { + buildInputs = [ pkgs.coreutils + pkgs.html-xml-utils + pkgs.zsh + pkgs.perl + pkgs.perlPackages.URI + pkgs.minify + pkgs.haskellPackages.sws + pkgs.cacert + ]; + } +#+end_src + +So I just need to launch ~nix-shell~ and I have my environment. + +A nice addition is to use direnv[fn:direnv] which support ~nix-shell~ by putting +~use_nix~ inside the ~.envrc~ at the root of the project. +But by default invoking ~nix-shell~ can take a few seconds everytime. +But we can do even better by using lorri[fn:lorri]. +I start the lorri daemon in my ~StartupItems~ mainly I simply created +the file =~/Library/LaunchAgents/com.github.target.lorri.plist=: + +#+begin_src xml :tangle com.github.target.lorri.plist :mkdirp t + + + + + Label + com.github.target.lorri + ProgramArguments + + /bin/zsh + -i + -c + $HOME/.nix-profile/bin/lorri daemon + + StandardOutPath + /var/tmp/lorri.log + StandardErrorPath + /var/tmp/lorri.log + RunAtLoad + + KeepAlive + + + +#+end_src + +And started the daemon with: + +#+begin_src bash +launchctl load ~/Library/LaunchAgents/com.github.target.lorri.plist +#+end_src + +~lorri~ takes care of keeping a cache and watch my configuration change by +project. +This makes the call to ~direnv~ almost instantaneous and seemless. +I just changed the content of my ~.envrc~ with: + +#+begin_src shell +eval "$(lorri direnv)" +#+end_src + +And of course this would work the same way with more complex ~shell.nix~. +Typically for Haskell projects. + +[fn:direnv] https://direnv.net +[fn:lorri] https://github.com/target/lorri + + +** Install +:PROPERTIES: +:CUSTOM_ID: install +:END: + +So you would like to use nix too? + +First, let's start by the bad news. +Recent macOS security policy made nix a bit harder to install on a mac. +See [[https://hydra.nixos.org/build/119559243/download/1/manual/#sect-macos-installation][macOS Installation instructions]]. + +Once you have nix installed you should update the nix-channel. +Mainly a nix-channels is where are the definitions of all the packages. +See [[https://hydra.nixos.org/build/119559243/download/1/manual/#sec-channels][nixOS documentation]]. +