From ed0753ad224f0c65133bd7a63180257eecd9f5e3 Mon Sep 17 00:00:00 2001 From: Jasper Ras Date: Wed, 8 Jan 2025 10:48:09 +0100 Subject: vault backup: 2025-01-08 10:48:09 --- 3 resources/Images/IMG_3980.jpg | Bin 0 -> 956624 bytes 3 resources/Images/IMG_3981.jpg | Bin 0 -> 609603 bytes 3 resources/Images/IMG_3982.jpg | Bin 0 -> 959890 bytes 3 resources/Images/IMG_3985.jpg | Bin 0 -> 715157 bytes 3 resources/Images/IMG_3987.jpg | Bin 0 -> 1116170 bytes 3 resources/Images/Pasted image 20250107205518.jpg | Bin 0 -> 609603 bytes 3 resources/ansible.md | 20 - 3 resources/ansible/ad-hoc-commands.md | 25 + 3 resources/ansible/ansible.md | 1 + 3 resources/ansible/build-array-loop.md | 6 + 3 resources/ansible/build-list-silences.md | 1 + 3 resources/ansible/debug.md | 29 + 3 resources/ansible/default-filter.md | 7 + 3 resources/ansible/delegate-to.md | 3 + 3 resources/ansible/dicts.md | 1 + 3 resources/ansible/extra-vars.md | 8 + 3 resources/ansible/find.md | 9 + 3 resources/ansible/loop-output.md | 1 + 3 resources/ansible/loop-register.md | 41 ++ 3 resources/ansible/loop-results-prior-loop.md | 30 + 3 resources/ansible/nested-loops.md | 3 + 3 resources/ansible/set-facts.md | 1 + 3 resources/astal-ags/building-with-nix.md | 1 + 3 resources/css/display.md | 3 + 3 resources/css/flexbox.md | 12 + 3 resources/css/grids.md | 681 +++++++++++++++++++++ 3 resources/elixir.md | 228 ------- 3 resources/elixir/elixir.md | 228 +++++++ 3 resources/group.one infra.md | 1 - 3 resources/libvirt/mediated-devices.md | 8 + 3 resources/libvirt/sr-iov.md | 6 + 3 resources/linux/Watch.md | 1 + 3 resources/linux/apt.md | 2 + 3 resources/linux/bootloader.md | 1 + 3 resources/linux/device-drivers.md | 19 + 3 resources/linux/device-mapper.md | 25 + 3 resources/linux/filesystems/tmpfs.md | 13 + .../linux/filesystems/virtual filesystem.md | 0 3 resources/linux/glibc.md | 1 + 3 resources/linux/lsof.md | 65 ++ 3 resources/linux/man pages.md | 2 + 3 resources/linux/networking/dhcp.md | 4 + 3 resources/linux/networking/ip-masquerade-nat.md | 14 + 3 resources/linux/networking/nbp.md | 3 + 3 resources/linux/networking/pxe-boot.md | 15 + 3 resources/linux/networking/udp.md | 0 3 resources/linux/nic.md | 1 + .../linux/shared anonymous memory mappings.md | 2 + 3 resources/linux/system v shared memory.md | 2 + 3 resources/linux/tftp.md | 2 + 3 resources/man pages.md | 2 - 3 resources/math/cartesian-product.md | 1 + 3 resources/mathematics/convolution.md | 0 3 resources/mermaidjs.md | 21 - 3 resources/mermaidjs/mermaidjs.md | 21 + 3 resources/mysql-foreign-keys.md | 1 + 3 resources/nix.md | 58 -- 3 resources/nix/flakes.md | 19 + 3 resources/nix/language.md | 5 + 3 resources/nix/language/keyword-import.md | 2 + 3 resources/nix/language/keyword-let.md | 9 + 3 resources/nix/language/keyword-rec.md | 17 + 3 resources/nix/language/keyword-with.md | 12 + 3 resources/nix/overlays.md | 8 + 3 resources/nix/package.md | 3 + 3 resources/nix/packages/apply-patches.md | 14 + 3 resources/nix/repl.md | 2 + 3 resources/nix/shell.nix.md | 39 ++ 3 resources/note taking system.md | 21 - 3 resources/openstack/create-port-fixed-ip.md | 1 + 3 resources/openstack/guest-pmsuspended.md | 3 + .../openstack/nova-live-migration-volume.md | 14 + 3 resources/puppet/replace-line-file.md | 28 + 3 resources/ripgrep-symlinks.md | 1 + 3 resources/slug.md | 3 + 3 resources/sollicitatie-vragenlijst.md | 7 - 3 resources/statistics/moving-average.md | 17 + 77 files changed, 1497 insertions(+), 358 deletions(-) create mode 100644 3 resources/Images/IMG_3980.jpg create mode 100644 3 resources/Images/IMG_3981.jpg create mode 100644 3 resources/Images/IMG_3982.jpg create mode 100644 3 resources/Images/IMG_3985.jpg create mode 100644 3 resources/Images/IMG_3987.jpg create mode 100644 3 resources/Images/Pasted image 20250107205518.jpg delete mode 100644 3 resources/ansible.md create mode 100644 3 resources/ansible/ad-hoc-commands.md create mode 100644 3 resources/ansible/ansible.md create mode 100644 3 resources/ansible/build-array-loop.md create mode 100644 3 resources/ansible/build-list-silences.md create mode 100644 3 resources/ansible/debug.md create mode 100644 3 resources/ansible/default-filter.md create mode 100644 3 resources/ansible/delegate-to.md create mode 100644 3 resources/ansible/dicts.md create mode 100644 3 resources/ansible/extra-vars.md create mode 100644 3 resources/ansible/find.md create mode 100644 3 resources/ansible/loop-output.md create mode 100644 3 resources/ansible/loop-register.md create mode 100644 3 resources/ansible/loop-results-prior-loop.md create mode 100644 3 resources/ansible/nested-loops.md create mode 100644 3 resources/ansible/set-facts.md create mode 100644 3 resources/astal-ags/building-with-nix.md create mode 100644 3 resources/css/display.md create mode 100644 3 resources/css/flexbox.md create mode 100644 3 resources/css/grids.md delete mode 100644 3 resources/elixir.md create mode 100644 3 resources/elixir/elixir.md delete mode 100644 3 resources/group.one infra.md create mode 100644 3 resources/libvirt/mediated-devices.md create mode 100644 3 resources/libvirt/sr-iov.md create mode 100644 3 resources/linux/Watch.md create mode 100644 3 resources/linux/apt.md create mode 100644 3 resources/linux/bootloader.md create mode 100644 3 resources/linux/device-drivers.md create mode 100644 3 resources/linux/device-mapper.md create mode 100644 3 resources/linux/filesystems/tmpfs.md create mode 100644 3 resources/linux/filesystems/virtual filesystem.md create mode 100644 3 resources/linux/glibc.md create mode 100644 3 resources/linux/lsof.md create mode 100644 3 resources/linux/man pages.md create mode 100644 3 resources/linux/networking/dhcp.md create mode 100644 3 resources/linux/networking/ip-masquerade-nat.md create mode 100644 3 resources/linux/networking/nbp.md create mode 100644 3 resources/linux/networking/pxe-boot.md create mode 100644 3 resources/linux/networking/udp.md create mode 100644 3 resources/linux/nic.md create mode 100644 3 resources/linux/shared anonymous memory mappings.md create mode 100644 3 resources/linux/system v shared memory.md create mode 100644 3 resources/linux/tftp.md delete mode 100644 3 resources/man pages.md create mode 100644 3 resources/math/cartesian-product.md create mode 100644 3 resources/mathematics/convolution.md delete mode 100644 3 resources/mermaidjs.md create mode 100644 3 resources/mermaidjs/mermaidjs.md create mode 100644 3 resources/mysql-foreign-keys.md delete mode 100644 3 resources/nix.md create mode 100644 3 resources/nix/flakes.md create mode 100644 3 resources/nix/language.md create mode 100644 3 resources/nix/language/keyword-import.md create mode 100644 3 resources/nix/language/keyword-let.md create mode 100644 3 resources/nix/language/keyword-rec.md create mode 100644 3 resources/nix/language/keyword-with.md create mode 100644 3 resources/nix/overlays.md create mode 100644 3 resources/nix/package.md create mode 100644 3 resources/nix/packages/apply-patches.md create mode 100644 3 resources/nix/repl.md create mode 100644 3 resources/nix/shell.nix.md delete mode 100644 3 resources/note taking system.md create mode 100644 3 resources/openstack/create-port-fixed-ip.md create mode 100644 3 resources/openstack/guest-pmsuspended.md create mode 100644 3 resources/openstack/nova-live-migration-volume.md create mode 100644 3 resources/puppet/replace-line-file.md create mode 100644 3 resources/ripgrep-symlinks.md create mode 100644 3 resources/slug.md delete mode 100644 3 resources/sollicitatie-vragenlijst.md create mode 100644 3 resources/statistics/moving-average.md (limited to '3 resources') diff --git a/3 resources/Images/IMG_3980.jpg b/3 resources/Images/IMG_3980.jpg new file mode 100644 index 0000000..93dac36 Binary files /dev/null and b/3 resources/Images/IMG_3980.jpg differ diff --git a/3 resources/Images/IMG_3981.jpg b/3 resources/Images/IMG_3981.jpg new file mode 100644 index 0000000..bea7875 Binary files /dev/null and b/3 resources/Images/IMG_3981.jpg differ diff --git a/3 resources/Images/IMG_3982.jpg b/3 resources/Images/IMG_3982.jpg new file mode 100644 index 0000000..8697dc4 Binary files /dev/null and b/3 resources/Images/IMG_3982.jpg differ diff --git a/3 resources/Images/IMG_3985.jpg b/3 resources/Images/IMG_3985.jpg new file mode 100644 index 0000000..e78dec5 Binary files /dev/null and b/3 resources/Images/IMG_3985.jpg differ diff --git a/3 resources/Images/IMG_3987.jpg b/3 resources/Images/IMG_3987.jpg new file mode 100644 index 0000000..da257d5 Binary files /dev/null and b/3 resources/Images/IMG_3987.jpg differ diff --git a/3 resources/Images/Pasted image 20250107205518.jpg b/3 resources/Images/Pasted image 20250107205518.jpg new file mode 100644 index 0000000..bea7875 Binary files /dev/null and b/3 resources/Images/Pasted image 20250107205518.jpg differ diff --git a/3 resources/ansible.md b/3 resources/ansible.md deleted file mode 100644 index 501f9d0..0000000 --- a/3 resources/ansible.md +++ /dev/null @@ -1,20 +0,0 @@ -# Ad-hoc commands -update apt cache: -``` -ansible -m ansible.builtin.apt -a "update_cache=true cache_valid_time=3600" -``` - -update packages: -``` -ansible -m ansible.builtin.apt -a "name=* state=latest" -``` - -run puppet: -``` -ansible -a "/opt/puppetlabs/bin/puppet agent --test" -``` - -reboot: -``` -ansible -m ansible.builtin.reboot -f 1 -``` diff --git a/3 resources/ansible/ad-hoc-commands.md b/3 resources/ansible/ad-hoc-commands.md new file mode 100644 index 0000000..eda1265 --- /dev/null +++ b/3 resources/ansible/ad-hoc-commands.md @@ -0,0 +1,25 @@ +Using ansible we can perform ad-hoc commands, useful for a one-off thing that won't require writing a full playbook. + +Some examples include: +update apt cache: +``` +ansible -m ansible.builtin.apt -a "update_cache=true cache_valid_time=3600" +``` + +update packages: +``` +ansible -m ansible.builtin.apt -a "name=* state=latest" +``` + +run puppet: +``` +ansible -a "/opt/puppetlabs/bin/puppet agent --test" +``` + +reboot: +``` +ansible -m ansible.builtin.reboot -f 1 +``` + +[[ansible]] +#ansible \ No newline at end of file diff --git a/3 resources/ansible/ansible.md b/3 resources/ansible/ansible.md new file mode 100644 index 0000000..5886288 --- /dev/null +++ b/3 resources/ansible/ansible.md @@ -0,0 +1 @@ +At its heart it's just an abstraction over running commands remotely over SSH. It enables some powerful automation like setting up a server following a predetermined script. \ No newline at end of file diff --git a/3 resources/ansible/build-array-loop.md b/3 resources/ansible/build-array-loop.md new file mode 100644 index 0000000..15f441f --- /dev/null +++ b/3 resources/ansible/build-array-loop.md @@ -0,0 +1,6 @@ +How to construct an array variable containing results of an iterative ansible task? +Use register. The referenced variable will contain a property results which is a list containing the combined outputs of the loop. + +https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html#registering-variables-with-a-loop + +[[ansible]] \ No newline at end of file diff --git a/3 resources/ansible/build-list-silences.md b/3 resources/ansible/build-list-silences.md new file mode 100644 index 0000000..dc8ef61 --- /dev/null +++ b/3 resources/ansible/build-list-silences.md @@ -0,0 +1 @@ +Explain what I did today at work to build a list of silences and then have one task to unsilence all of them. \ No newline at end of file diff --git a/3 resources/ansible/debug.md b/3 resources/ansible/debug.md new file mode 100644 index 0000000..552af1f --- /dev/null +++ b/3 resources/ansible/debug.md @@ -0,0 +1,29 @@ +``` +- name: Print the gateway for each host when defined + ansible.builtin.debug: + msg: System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }} + when: ansible_default_ipv4.gateway is defined + +- name: Get uptime information + ansible.builtin.shell: /usr/bin/uptime + register: result + +- name: Print return information from the previous task + ansible.builtin.debug: + var: result + verbosity: 2 + +- name: Display all variables/facts known for a host + ansible.builtin.debug: + var: hostvars[inventory_hostname] + verbosity: 4 + +- name: Prints two lines of messages, but only if there is an environment value set + ansible.builtin.debug: + msg: + - "Provisioning based on YOUR_KEY which is: {{ lookup('ansible.builtin.env', 'YOUR_KEY') }}" + - "These servers were built using the password of '{{ password_used }}'. Please retain this for later use." +``` + +--- +https://docs.ansible.com/ansible/latest/collections/ansible/builtin/debug_module.html \ No newline at end of file diff --git a/3 resources/ansible/default-filter.md b/3 resources/ansible/default-filter.md new file mode 100644 index 0000000..2255e71 --- /dev/null +++ b/3 resources/ansible/default-filter.md @@ -0,0 +1,7 @@ +Using the default filter, if we reference an undefined variable we can set a default: `{{ var | default([]) }}`. + +defaults: +- int +- str +- list ([]) +- dict ({}) \ No newline at end of file diff --git a/3 resources/ansible/delegate-to.md b/3 resources/ansible/delegate-to.md new file mode 100644 index 0000000..270ccb1 --- /dev/null +++ b/3 resources/ansible/delegate-to.md @@ -0,0 +1,3 @@ +Through the use of delegate to, we can run a task for certain nodes and delegate work on behalf of those nodes to other hosts. + +A great example of usage is this: diff --git a/3 resources/ansible/dicts.md b/3 resources/ansible/dicts.md new file mode 100644 index 0000000..eac3d1b --- /dev/null +++ b/3 resources/ansible/dicts.md @@ -0,0 +1 @@ +Merged using combine: `{{ dict1 | ansible.builtin.combine(dict2) }}` \ No newline at end of file diff --git a/3 resources/ansible/extra-vars.md b/3 resources/ansible/extra-vars.md new file mode 100644 index 0000000..07b0764 --- /dev/null +++ b/3 resources/ansible/extra-vars.md @@ -0,0 +1,8 @@ +We can pass variables to the ansible upon invoking it using `--extra-vars` or `-e`. + +``` +--extra-vars "blaat=piet henk=joop" +--extra-vars '{"blaat":"piet","henk":"joop"}' +--extra-vars "@file.json" +--extra-vars "@file.yml" +``` diff --git a/3 resources/ansible/find.md b/3 resources/ansible/find.md new file mode 100644 index 0000000..1f4de51 --- /dev/null +++ b/3 resources/ansible/find.md @@ -0,0 +1,9 @@ +``` +- name: Find file with size >= 50G + ansible.builtin.find: + paths: + - /var/lib/nova/instances/_base + size: 50g +``` +--- +https://docs.ansible.com/ansible/latest/collections/ansible/builtin/find_module.html \ No newline at end of file diff --git a/3 resources/ansible/loop-output.md b/3 resources/ansible/loop-output.md new file mode 100644 index 0000000..30a0848 --- /dev/null +++ b/3 resources/ansible/loop-output.md @@ -0,0 +1 @@ +Using the label field we can select what to print, instead of the whole item. \ No newline at end of file diff --git a/3 resources/ansible/loop-register.md b/3 resources/ansible/loop-register.md new file mode 100644 index 0000000..bab52a5 --- /dev/null +++ b/3 resources/ansible/loop-register.md @@ -0,0 +1,41 @@ +When using a loop the registered variable will contain the results of all the responses: +```JSON +{ + "changed": true, + "msg": "All items completed", + "results": [ + { + "changed": true, + "cmd": "echo \"one\" ", + "delta": "0:00:00.003110", + "end": "2013-12-19 12:00:05.187153", + "invocation": { + "module_args": "echo \"one\"", + "module_name": "shell" + }, + "item": "one", + "rc": 0, + "start": "2013-12-19 12:00:05.184043", + "stderr": "", + "stdout": "one" + }, + { + "changed": true, + "cmd": "echo \"two\" ", + "delta": "0:00:00.002920", + "end": "2013-12-19 12:00:05.245502", + "invocation": { + "module_args": "echo \"two\"", + "module_name": "shell" + }, + "item": "two", + "rc": 0, + "start": "2013-12-19 12:00:05.242582", + "stderr": "", + "stdout": "two" + } + ] +} +``` + +Thus we can loop over each results `{{ registered_var.results }}`. \ No newline at end of file diff --git a/3 resources/ansible/loop-results-prior-loop.md b/3 resources/ansible/loop-results-prior-loop.md new file mode 100644 index 0000000..cbd50a2 --- /dev/null +++ b/3 resources/ansible/loop-results-prior-loop.md @@ -0,0 +1,30 @@ +```YAML +- name: First loop + loop: {{ blaat }} + register: loooped + ... + +- name: Second loop + loop: {{ loooped.results }} + when: item.skipped is not defined +``` + +this loops over results of prior loop only but does not process any skipped results. + +In case the results array contains another array that we want to loop over, for example when we did a shell command in a loop we can use extract: +``` +- name: Print magic + ansible.builtin.debug: + msg: "{{ ['stdout_lines'] | map('extract', item) }}" + loop: "{{ magic.results }}" +``` + +A cool example of this in practice: +``` +- name: Print blockpull command + ansible.builtin.debug: + msg: "virsh blockpull {{ ['stdout_lines'] | map('extract', item) | list | flatten | join(' ') }}" + loop: "{{ domain_and_disk_paths.results }}" + loop_control: + label: "{{ inventory_hostname }}" +``` \ No newline at end of file diff --git a/3 resources/ansible/nested-loops.md b/3 resources/ansible/nested-loops.md new file mode 100644 index 0000000..3a5be97 --- /dev/null +++ b/3 resources/ansible/nested-loops.md @@ -0,0 +1,3 @@ +Nested loops can be done not by nesting loops over two separate lists, but by looping over the [[cartesian-product]] of the two using the `product` filter. + +`{{ list1 | product(list) | list }}` \ No newline at end of file diff --git a/3 resources/ansible/set-facts.md b/3 resources/ansible/set-facts.md new file mode 100644 index 0000000..e94eeb6 --- /dev/null +++ b/3 resources/ansible/set-facts.md @@ -0,0 +1 @@ +These can be used to set and update variables specific to nodes, at runtime. \ No newline at end of file diff --git a/3 resources/astal-ags/building-with-nix.md b/3 resources/astal-ags/building-with-nix.md new file mode 100644 index 0000000..c059716 --- /dev/null +++ b/3 resources/astal-ags/building-with-nix.md @@ -0,0 +1 @@ +`ags init` creates us a nice flake that exposes our bundled project as an installable package. That can be used to install it via nix and reference it in hyprland config to exec-once. \ No newline at end of file diff --git a/3 resources/css/display.md b/3 resources/css/display.md new file mode 100644 index 0000000..cf27f55 --- /dev/null +++ b/3 resources/css/display.md @@ -0,0 +1,3 @@ +display none vs visibility hidden: display: none is really like the element does not exist. Visibility hidden just hides it but it still takes space. + +A display: none element can still have size and be coloured with a background image. It still doesn't take space. This can be used for a timeline bar for example! \ No newline at end of file diff --git a/3 resources/css/flexbox.md b/3 resources/css/flexbox.md new file mode 100644 index 0000000..9e8f95e --- /dev/null +++ b/3 resources/css/flexbox.md @@ -0,0 +1,12 @@ +Flexbox deals with layout always in only one dimension; it's possible to specify which dimension: either vertical or horizontal. + +Two axes: main and cross + +Control main axis: `flex-direction: row|row-reverse|column|column-reverse`. The first two make it a horizontal layout and the latter make it a vertical layout. + +Cross axis is always the opposite of `flex-direction`, so if `flex-direction: row-reverse` the cross axis is `column-reverse`. + +[[TODO]] What is: "writing mode of the document"? Mentioned on the docs. +This document explains: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_flexible_box_layout/Relationship_of_flexbox_to_other_layout_methods#writing_modes + + diff --git a/3 resources/css/grids.md b/3 resources/css/grids.md new file mode 100644 index 0000000..66b0ec8 --- /dev/null +++ b/3 resources/css/grids.md @@ -0,0 +1,681 @@ +--- + +excalidraw-plugin: parsed +tags: [excalidraw] + +--- +==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving' + + +# Excalidraw Data +## Text Elements +%% +## Drawing +```compressed-json +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 + +hwAEnYKu5DTGAAF2AQABdgIAA=== +``` +%% \ No newline at end of file diff --git a/3 resources/elixir.md b/3 resources/elixir.md deleted file mode 100644 index 4d38de1..0000000 --- a/3 resources/elixir.md +++ /dev/null @@ -1,228 +0,0 @@ -Elixir supports "macro's", which is Elixir code that runs at compile time. They receive the AST of the source code as input and can apply transformations to it. This is how Elixir is written itself, using Elixir macro's. - -Elixir functions can be organized into [[elixir - modules]]. -``` -defmodule MyModule do - # Comment - @moduledoc "Documentation for the module" - import IO - alias IO, as MyIO # Alias import - - @pi 3.14 # Module attribute - - @doc "Describe what the function does" - def hello do - MyIO.puts("blaat") - 3*@pi # Module attribute reference - done - - @spec hello_private(string) # typespec, can be used by dialyzer, very useful - defp hello_private(hello) do - puts(hello) - done -done -``` - -The [[Elixir - Kernel]] module is always imported, so functions we use without prefix come from Kernel. - -Elixir introduces a concept called [[Elixir - Atoms]]. They are named constants, like enumerations in C. -``` -:blaat -:"Bla at" -Blaat == :"Elixir.Blaat" # Alias - -var = :blaat # var contains only a reference to the atom, thus is small and fast. -``` - -[[Elixir - Aliases]] are internally represented as "Elixir.RealThing", in the case of the module alias above `MyIO == Elixir.IO`. - -[[Elixir - Tuples]] group a, usually small, fixed number of elements together. Kernel.elem/2 for access, Kernel.put_elem/3 for updating. - -[[Elixir - Lists]] are a recursive structure with a head of any type and a tail which is another list. They are notated as regular arrays in other languages, but can be written as `[head | tail]`. Therefore it's easy and efficient to push a new item to the top, we can use the head | tail notation -> -https://hexdocs.pm/elixir/List.html -https://hexdocs.pm/elixir/Enum.html -``` -list = [1, 2, 3] -list = [4 | list] -list -[4, 1, 2, 3] -``` - -[[Elixir - Immutable functions]] give a form of atomicity, because operations (other functions) they call do not mutate data if anything fails we can just return the original data without having changed anything. - -[[Elixir - Maps]] %{}, can also be created with Map.new([{1, 2}, {3, 4}]) (2-tuples). -https://hexdocs.pm/elixir/Map.html -``` -a = %{1 => 1} -a[1] -1 -``` -Maps can also be used to define structures, -``` -person = %{name: "Jasper"} -``` - -[[Elixir - Binaries]] are consecutive sequences of bytes. -``` -<<1, 1>> is a two-byte binary where each byte has value of, thus -0000 0001 0000 0001 -<<1>> <> <<2>> concatenate two binaries -0000 0001 0000 0010 -``` - -[[Elixir - Strings]] -``` -"This is a stringt" -" -Multiline -string -" -a = 1337 -"Print number #{a}" # #{} allows evaluation of values strings - -~s(This is a sigil which is also a string) -~s(Is useful to "use" quotes) -str = "INTERPOLATION!" -~S(Capital-S sigil allows prevention of string #{str} and \nescaping) -"Capital-S sigil allows prevention of string \#{str} and \\nescaping" - -"Blaat" <> " henk" # Concatenation works like binaries, because strings are binaries -``` - -[[Elixir - Lambda]] -``` -square = fn x -> # lambda's use fn - x*x -end - -square.(5) # lambda is called with name period arguments enclosed by parens. The dot is to make it known that we are calling a lambda and not a regular function. -``` - -For cases where the lambda just forwards its arguments to another function there is a special syntax, example: -[[Elixir - capture operator]] -``` -Enum.each([1, 2, 3], fn x -> IO.puts(x) end) -Enum.each([1, 2, 3], &IO.puts/1) # The & is called the "capture operator" and can also be used to shorten a lambda definition: -lambda = fn x, y, z -> x * y + z end -lambda = &(&1 * &2 + &3) # Like bash arguments ${1} ${2} etc -``` - -[[Elixir - Closure]] -A lambda can reference variables from the outside scope. If we rebind the variable in the parent scope, the lambda will still reference the old one. -``` -outside = "Abc" -lambda = &IO.puts/1 -outside = "cdef" -lambda.() -"Abc" -``` - -Range -0..1, internally represented as a map with bounds set, therefore small no matter how "big" the range. Is also an enumeration so can use the Enum module. - -Keyword list -List of 2-tuple where the 1st element is an atom. E.g. `[{:monday, 1}, {:tuesday, 2}]` can be written more elegant as `[monday: 1, tuesday: 2]` -https://hexdocs.pm/elixir/Keyword.html -Can be used as kwargs like in python. - -MapSet -https://hexdocs.pm/elixir/MapSet.html -Also an enumeration. -Initialize with MapSet.new - -Times and Dates -Have modules: Date, Time, DateTime, NaiveDateTime -Created with sigil ~D for dates, and ~T for time -``` -dt = ~D[2023-01-01] -dt.year -2023 - -tm = ~T[19:03:32] -tm.second -32 -``` - -IO lists -Are lists that can consist of one of three types: -- Int in range 0..255 -- Binaries -- Another IO list -It is thus a tree. Input operations are O(1) - - -Pattern matching -The '=' operator is not an assignment operator, but a match operator. -pattern = expression -Pattern can be list, map, tuple, variable, binaries, binary strings -constants, atom can be matched to discriminate results of expressions. -{:ok, result} = expr, fails is expr returns for example {:error, result} -Patterns can be nested: `{_, {hour, _, }, _} = :calendar.local_time()` - -Maps can partial match, to extract a property from a complex map. -Lists can abuse their recursive naturs: `[head | tail] = [1, 2, 3] head = 1, tail = [2,3]` -Pin-operator `^` is used to match against the value of a variable: -``` -a = "Bob" -{^a, _} = {"Bob", 25} <- Matches because the value of a is "Bob" -{^a, _} = {"Alice", 25} <- Doesn't match -``` - -Pattern matching using strings it's possible to match the beginning of a string and assign the rest to a var: -``` -command = "ping www.hostnet.nl" -"ping " <> url = command -url = "www.hostnet.nl" -``` - -Pattern matching can be done in function arguments and enabled "multiclause functions", which is a sort of function overloading. It's multiple definitions of the same function, with the same arity, but with different argument patterns. They are treated as a single function, so with the capture operator you can use all "variants". -``` -defmodule Geo do - def area({:square, a, b}), do a * b end - def area({:circle, r}), do r * r * pi end - def area(unknown), do {:error, {:unknown_shape, unknown}} end - # ^ do mind that the arity has to match for this catch-all error, also - # ordering is important. The runtime matches from top to bottom. -end - -fn = &Geo.area/1 - -fn.({:square, 1, 2}) -2 -fn.({:circle, 23}) -whatever this is -``` - -Conditionals can be implemented using multiclause functions, but also with the regular if..else statements, cond do .. end and case expression do ... end. - -A with-clause can be used to match multiple patterns in order and halt if a pattern doesn't match. -``` -defp extract_login(%{"login" => login}%) do, %{:ok, login} end -defp extract_login(_) do, {:error, "login missing"} end - -defp extract_email(%{"email" => email}) do, %{:ok, email} end -defp extract_email(_) do, %{:error, "email missing"} end - -def extract_user(user) do - case extract_login(user) do - {:error, reason} -> {:error, reason} - {:ok, login} -> - case extract_email(user) do - {:error, reason} -> {:error, reason} - {ok, email} -> %{login: login, email: email} - end - end -end - -# can be written as - -def extract_user(user) do - with {:ok, login} <- extract_login(user), - {:ok, email} <- extract_email(user) do - {:ok, %{login: login, email: email}} - end -end -``` - -Looping is mainly implemented via recursion. The break condition is implemented via a multiclause function matching the condition that you want to break at. -Recursion can be expensive, unless the recursive call is at the end of a function, which is called a tail-call. Tail-calls are optimized to not require any additional memory, because their result is also the result of the caller, so we don't need to come back to the caller. \ No newline at end of file diff --git a/3 resources/elixir/elixir.md b/3 resources/elixir/elixir.md new file mode 100644 index 0000000..4d38de1 --- /dev/null +++ b/3 resources/elixir/elixir.md @@ -0,0 +1,228 @@ +Elixir supports "macro's", which is Elixir code that runs at compile time. They receive the AST of the source code as input and can apply transformations to it. This is how Elixir is written itself, using Elixir macro's. + +Elixir functions can be organized into [[elixir - modules]]. +``` +defmodule MyModule do + # Comment + @moduledoc "Documentation for the module" + import IO + alias IO, as MyIO # Alias import + + @pi 3.14 # Module attribute + + @doc "Describe what the function does" + def hello do + MyIO.puts("blaat") + 3*@pi # Module attribute reference + done + + @spec hello_private(string) # typespec, can be used by dialyzer, very useful + defp hello_private(hello) do + puts(hello) + done +done +``` + +The [[Elixir - Kernel]] module is always imported, so functions we use without prefix come from Kernel. + +Elixir introduces a concept called [[Elixir - Atoms]]. They are named constants, like enumerations in C. +``` +:blaat +:"Bla at" +Blaat == :"Elixir.Blaat" # Alias + +var = :blaat # var contains only a reference to the atom, thus is small and fast. +``` + +[[Elixir - Aliases]] are internally represented as "Elixir.RealThing", in the case of the module alias above `MyIO == Elixir.IO`. + +[[Elixir - Tuples]] group a, usually small, fixed number of elements together. Kernel.elem/2 for access, Kernel.put_elem/3 for updating. + +[[Elixir - Lists]] are a recursive structure with a head of any type and a tail which is another list. They are notated as regular arrays in other languages, but can be written as `[head | tail]`. Therefore it's easy and efficient to push a new item to the top, we can use the head | tail notation -> +https://hexdocs.pm/elixir/List.html +https://hexdocs.pm/elixir/Enum.html +``` +list = [1, 2, 3] +list = [4 | list] +list +[4, 1, 2, 3] +``` + +[[Elixir - Immutable functions]] give a form of atomicity, because operations (other functions) they call do not mutate data if anything fails we can just return the original data without having changed anything. + +[[Elixir - Maps]] %{}, can also be created with Map.new([{1, 2}, {3, 4}]) (2-tuples). +https://hexdocs.pm/elixir/Map.html +``` +a = %{1 => 1} +a[1] +1 +``` +Maps can also be used to define structures, +``` +person = %{name: "Jasper"} +``` + +[[Elixir - Binaries]] are consecutive sequences of bytes. +``` +<<1, 1>> is a two-byte binary where each byte has value of, thus +0000 0001 0000 0001 +<<1>> <> <<2>> concatenate two binaries +0000 0001 0000 0010 +``` + +[[Elixir - Strings]] +``` +"This is a stringt" +" +Multiline +string +" +a = 1337 +"Print number #{a}" # #{} allows evaluation of values strings + +~s(This is a sigil which is also a string) +~s(Is useful to "use" quotes) +str = "INTERPOLATION!" +~S(Capital-S sigil allows prevention of string #{str} and \nescaping) +"Capital-S sigil allows prevention of string \#{str} and \\nescaping" + +"Blaat" <> " henk" # Concatenation works like binaries, because strings are binaries +``` + +[[Elixir - Lambda]] +``` +square = fn x -> # lambda's use fn + x*x +end + +square.(5) # lambda is called with name period arguments enclosed by parens. The dot is to make it known that we are calling a lambda and not a regular function. +``` + +For cases where the lambda just forwards its arguments to another function there is a special syntax, example: +[[Elixir - capture operator]] +``` +Enum.each([1, 2, 3], fn x -> IO.puts(x) end) +Enum.each([1, 2, 3], &IO.puts/1) # The & is called the "capture operator" and can also be used to shorten a lambda definition: +lambda = fn x, y, z -> x * y + z end +lambda = &(&1 * &2 + &3) # Like bash arguments ${1} ${2} etc +``` + +[[Elixir - Closure]] +A lambda can reference variables from the outside scope. If we rebind the variable in the parent scope, the lambda will still reference the old one. +``` +outside = "Abc" +lambda = &IO.puts/1 +outside = "cdef" +lambda.() +"Abc" +``` + +Range +0..1, internally represented as a map with bounds set, therefore small no matter how "big" the range. Is also an enumeration so can use the Enum module. + +Keyword list +List of 2-tuple where the 1st element is an atom. E.g. `[{:monday, 1}, {:tuesday, 2}]` can be written more elegant as `[monday: 1, tuesday: 2]` +https://hexdocs.pm/elixir/Keyword.html +Can be used as kwargs like in python. + +MapSet +https://hexdocs.pm/elixir/MapSet.html +Also an enumeration. +Initialize with MapSet.new + +Times and Dates +Have modules: Date, Time, DateTime, NaiveDateTime +Created with sigil ~D for dates, and ~T for time +``` +dt = ~D[2023-01-01] +dt.year +2023 + +tm = ~T[19:03:32] +tm.second +32 +``` + +IO lists +Are lists that can consist of one of three types: +- Int in range 0..255 +- Binaries +- Another IO list +It is thus a tree. Input operations are O(1) + + +Pattern matching +The '=' operator is not an assignment operator, but a match operator. +pattern = expression +Pattern can be list, map, tuple, variable, binaries, binary strings +constants, atom can be matched to discriminate results of expressions. +{:ok, result} = expr, fails is expr returns for example {:error, result} +Patterns can be nested: `{_, {hour, _, }, _} = :calendar.local_time()` + +Maps can partial match, to extract a property from a complex map. +Lists can abuse their recursive naturs: `[head | tail] = [1, 2, 3] head = 1, tail = [2,3]` +Pin-operator `^` is used to match against the value of a variable: +``` +a = "Bob" +{^a, _} = {"Bob", 25} <- Matches because the value of a is "Bob" +{^a, _} = {"Alice", 25} <- Doesn't match +``` + +Pattern matching using strings it's possible to match the beginning of a string and assign the rest to a var: +``` +command = "ping www.hostnet.nl" +"ping " <> url = command +url = "www.hostnet.nl" +``` + +Pattern matching can be done in function arguments and enabled "multiclause functions", which is a sort of function overloading. It's multiple definitions of the same function, with the same arity, but with different argument patterns. They are treated as a single function, so with the capture operator you can use all "variants". +``` +defmodule Geo do + def area({:square, a, b}), do a * b end + def area({:circle, r}), do r * r * pi end + def area(unknown), do {:error, {:unknown_shape, unknown}} end + # ^ do mind that the arity has to match for this catch-all error, also + # ordering is important. The runtime matches from top to bottom. +end + +fn = &Geo.area/1 + +fn.({:square, 1, 2}) +2 +fn.({:circle, 23}) +whatever this is +``` + +Conditionals can be implemented using multiclause functions, but also with the regular if..else statements, cond do .. end and case expression do ... end. + +A with-clause can be used to match multiple patterns in order and halt if a pattern doesn't match. +``` +defp extract_login(%{"login" => login}%) do, %{:ok, login} end +defp extract_login(_) do, {:error, "login missing"} end + +defp extract_email(%{"email" => email}) do, %{:ok, email} end +defp extract_email(_) do, %{:error, "email missing"} end + +def extract_user(user) do + case extract_login(user) do + {:error, reason} -> {:error, reason} + {:ok, login} -> + case extract_email(user) do + {:error, reason} -> {:error, reason} + {ok, email} -> %{login: login, email: email} + end + end +end + +# can be written as + +def extract_user(user) do + with {:ok, login} <- extract_login(user), + {:ok, email} <- extract_email(user) do + {:ok, %{login: login, email: email}} + end +end +``` + +Looping is mainly implemented via recursion. The break condition is implemented via a multiclause function matching the condition that you want to break at. +Recursion can be expensive, unless the recursive call is at the end of a function, which is called a tail-call. Tail-calls are optimized to not require any additional memory, because their result is also the result of the caller, so we don't need to come back to the caller. \ No newline at end of file diff --git a/3 resources/group.one infra.md b/3 resources/group.one infra.md deleted file mode 100644 index 1d9ba33..0000000 --- a/3 resources/group.one infra.md +++ /dev/null @@ -1 +0,0 @@ -I want to have an overview of systems and what they are responsible for. Example, what is OneHOP or OneHome and what do they do. I plan to write that down in this document. \ No newline at end of file diff --git a/3 resources/libvirt/mediated-devices.md b/3 resources/libvirt/mediated-devices.md new file mode 100644 index 0000000..3011a28 --- /dev/null +++ b/3 resources/libvirt/mediated-devices.md @@ -0,0 +1,8 @@ +https://libvirt.org/drvnodedev.html#mediated-devices-mdevs + +They are virtual devices that share a single physical device. + +Similar to [[sr-iov]] but sr-iov required registering and unregistering devices with the host PCIe bus via a host driver. +Mediated devices don't have to do this. + +So why would we still choose sriov? \ No newline at end of file diff --git a/3 resources/libvirt/sr-iov.md b/3 resources/libvirt/sr-iov.md new file mode 100644 index 0000000..e7eec8e --- /dev/null +++ b/3 resources/libvirt/sr-iov.md @@ -0,0 +1,6 @@ +Single root input/output virtualization: enables sharing of single PCI-e devices with multiple guests. + +Physical device = PF (Physical Function) +Virtual device = VF (Virtual Function) + +A PF is divided (by manufacturer) into *n* VFs. Thus a PF can be shared at most with *n* guests. \ No newline at end of file diff --git a/3 resources/linux/Watch.md b/3 resources/linux/Watch.md new file mode 100644 index 0000000..dafeb80 --- /dev/null +++ b/3 resources/linux/Watch.md @@ -0,0 +1 @@ +`watch (1)` periodically executes the executable on argv. It can be used to reload the output of a command, like `sudo watch ovs-dpctl dump-flows` . \ No newline at end of file diff --git a/3 resources/linux/apt.md b/3 resources/linux/apt.md new file mode 100644 index 0000000..36a098c --- /dev/null +++ b/3 resources/linux/apt.md @@ -0,0 +1,2 @@ +reinstall packages: +`apt reinstall ` \ No newline at end of file diff --git a/3 resources/linux/bootloader.md b/3 resources/linux/bootloader.md new file mode 100644 index 0000000..e9c2fff --- /dev/null +++ b/3 resources/linux/bootloader.md @@ -0,0 +1 @@ +[[TODO]] \ No newline at end of file diff --git a/3 resources/linux/device-drivers.md b/3 resources/linux/device-drivers.md new file mode 100644 index 0000000..e4fe9d2 --- /dev/null +++ b/3 resources/linux/device-drivers.md @@ -0,0 +1,19 @@ +major, minor numbers +major = driver (used by kernel when opening device to dispatch to correct driver) +minor = used by driver to differentiate device(s) + +after disk the major, minor numbers are shown: +``` +[jasras@n04.compute.vps2-lej1 ~]$ ls -l /dev/dm-* +brw-rw---- 1 root disk 253, 0 Oct 25 10:10 /dev/dm-0 +brw-rw---- 1 root disk 253, 1 Oct 25 10:11 /dev/dm-1 +brw-rw---- 1 root root 253, 11 Oct 28 19:58 /dev/dm-11 +brw-rw---- 1 root root 253, 12 Oct 28 19:58 /dev/dm-12 +``` + +available devices: `cat /proc/devices` + +character devices vs block devices; what is the difference? + +--- +[oreilly-device-drivers](https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch03s02.html) \ No newline at end of file diff --git a/3 resources/linux/device-mapper.md b/3 resources/linux/device-mapper.md new file mode 100644 index 0000000..f862496 --- /dev/null +++ b/3 resources/linux/device-mapper.md @@ -0,0 +1,25 @@ +Device mapper is a kernel driver to map physical block devices to virtual ones; this means that for example we can have many physical devices be represented by a single virtual one (linear mapping). + +How does it work? +[[TODO]] +What is its function in relation to multipath? + +Logical devices using device-mapper can be managed using `man 8 dmsetup` +``` +[jasras@n04.compute.vps2-lej1 ~]$ sudo dmsetup info 3600a098038314d736724566a67346538 +Name: 3600a098038314d736724566a67346538 +State: ACTIVE +Read Ahead: 256 +Tables present: LIVE +Open count: 1 +Event number: 3 +Major, minor: 253, 12 +Number of targets: 1 +UUID: mpath-3600a098038314d736724566a67346538 +``` + +If dmsetup cannot remove a device because a process still has it open, but lsof does not show any processes that open it, use `-f` which replaces the device with a fake that rejects all I/O. + +--- +[device-mapper](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/device_mapper#device_mapper) +[dmsetup](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/dmsetup#dmsetup) \ No newline at end of file diff --git a/3 resources/linux/filesystems/tmpfs.md b/3 resources/linux/filesystems/tmpfs.md new file mode 100644 index 0000000..624c835 --- /dev/null +++ b/3 resources/linux/filesystems/tmpfs.md @@ -0,0 +1,13 @@ +Is a [[virtual filesystem]] that is stored in memory; it uses both RAM and swap space. +> Kernel option: CONFIG_TMPFS + +`mount -t tmpfs source target` + +A tmpfs can only grow to 50% of RAM avail. unless overridden with size=nbytes mount option. +Only consumes RAM for actual usage. +Data is ephemeral/volatile. + +Mount stacking: mount over existing /tmp, to improve speed of apps using alot of tmp files, then unmount to delete data. + +Kernel uses tmpfs for [[system v shared memory]] and [[shared anonymous memory mappings]]. +`/dev/shm` or `/run/shm`: [[glibc]] of [[POSIX]] shared memory and [[POSIX]] semaphores. \ No newline at end of file diff --git a/3 resources/linux/filesystems/virtual filesystem.md b/3 resources/linux/filesystems/virtual filesystem.md new file mode 100644 index 0000000..e69de29 diff --git a/3 resources/linux/glibc.md b/3 resources/linux/glibc.md new file mode 100644 index 0000000..18d18e1 --- /dev/null +++ b/3 resources/linux/glibc.md @@ -0,0 +1 @@ +The GNU C standard library. \ No newline at end of file diff --git a/3 resources/linux/lsof.md b/3 resources/linux/lsof.md new file mode 100644 index 0000000..e95b968 --- /dev/null +++ b/3 resources/linux/lsof.md @@ -0,0 +1,65 @@ +``` +lsof -p 1111 # show open files for this PID +lsof /path/to/file # show which process has this open +``` + +A usage in the wild; using lsof to find the qemu process for a specific base image and using that to get instance name and disk path: +``` +lsof -F p {{ item['path'] }} | cut -b 2- | head -1 | xargs ps | grep -oP '(instance\\-[a-z0-9]+)|(\\/var\\/lib\\/nova\\/instances\\/[a-z0-9\\-]+\\/disk)' | uniq +``` + +(man lsof: search "OUTPUT FOR OTHER PROGRAMS") +output for other programs +``` +specify -F +These are the fields that lsof will produce. The single character listed first is the field identifier. + a file access mode + c process command name (all characters from proc or + user structure) + C file structure share count + d file's device character code + D file's major/minor device number (0x) + f file descriptor (always selected) + F file structure address (0x) + G file flaGs (0x; names if +fg follows) + g process group ID + i file's inode number + K tasK ID + k link count + l file's lock status + L process login name + m marker between repeated output + M the task comMand name + n file name, comment, Internet address + N node identifier (ox + o file's offset (decimal) + p process ID (always selected) + P protocol name + r raw device number (0x) + R parent process ID + s file's size (decimal) + S file's stream identification + t file's type + T TCP/TPI information, identified by prefixes (the + `=' is part of the prefix): + QR= + QS= + SO= (not all dialects) + SS= (not all dialects) + ST= + TF= (not all dialects) + WR= (not all dialects) + WW= (not all dialects) + (TCP/TPI information isn't reported for all supported + UNIX dialects. The -h or -? help output for the + -T option will show what TCP/TPI reporting can be + requested.) + u process user ID + z Solaris 10 and higher zone name + Z SELinux security context (inhibited when SELinux is disabled) + 0 use NUL field terminator character in place of NL + 1-9 dialect-specific field identifiers (The output + of -F? identifies the information to be found + in dialect-specific fields.) + +``` \ No newline at end of file diff --git a/3 resources/linux/man pages.md b/3 resources/linux/man pages.md new file mode 100644 index 0000000..576d4b8 --- /dev/null +++ b/3 resources/linux/man pages.md @@ -0,0 +1,2 @@ +I need to more consistently read man pages. Example is `man task` to see how taskwarrior works, after reading it today I found that it is actually quite easy. +They often contain good information on how to use a certain tool. \ No newline at end of file diff --git a/3 resources/linux/networking/dhcp.md b/3 resources/linux/networking/dhcp.md new file mode 100644 index 0000000..e426d6f --- /dev/null +++ b/3 resources/linux/networking/dhcp.md @@ -0,0 +1,4 @@ +Dynamic Host Configuration Protocol +Allows hosts dynamically receive an IP address. + +[[TODO]] learn exactly how it works \ No newline at end of file diff --git a/3 resources/linux/networking/ip-masquerade-nat.md b/3 resources/linux/networking/ip-masquerade-nat.md new file mode 100644 index 0000000..8b722f4 --- /dev/null +++ b/3 resources/linux/networking/ip-masquerade-nat.md @@ -0,0 +1,14 @@ +A function in the kernel that allows guests with internal/private IPs to access the internet by using the hosts' public IP similar to 1 to many NAT. + +Differences with Proxy, IP Masq, NAT: + +**Proxy** +Requires special configuration on internal client side. Can be used for caching. + +**IP Masq** +A form of NAT used primarily in Linux devices. Translates IP address and uses the connection tracking table and ports to map responses back to the internal connection. + +**NAT** +Has different types with different use-cases. +Static NAT: 1-1 mapping of pub/private IP. Dynamic NAT: pool of pub ips to dynamically map private IPs to based on availability. +PAT (Port): similar to IP Masq; 1-many using ports. \ No newline at end of file diff --git a/3 resources/linux/networking/nbp.md b/3 resources/linux/networking/nbp.md new file mode 100644 index 0000000..19676ea --- /dev/null +++ b/3 resources/linux/networking/nbp.md @@ -0,0 +1,3 @@ +Network Bootstrap Program + +Is a bootloader that is obtained via the network typically via [[TFTP]]. It handles setting up an environment in which an OS can run or install. For example, it displays a boot menu and downloads the kernel images. It sets up hardware, for example the [[NIC]]s. \ No newline at end of file diff --git a/3 resources/linux/networking/pxe-boot.md b/3 resources/linux/networking/pxe-boot.md new file mode 100644 index 0000000..d532ac3 --- /dev/null +++ b/3 resources/linux/networking/pxe-boot.md @@ -0,0 +1,15 @@ +PXE = Preboot Execution Environment. + +PXE boot process: +1. Modified [[DHCP]] request: request to include boot information (PXE boot request). +2. Process DHCP response which includes an IP address of [[TFTP]] server and filename of [[NBP]]. +3. Download NBP over TFTP. +4. NBP executes + 1. Loads additional stuff over network, like kernel images. + 2. Handles the boot menu +5. Kernel takes over boot process and potentially downloads additional files required to complete booting. + +Popular NBP's: +- PXELINUX +- iPXE +- GRUB2 diff --git a/3 resources/linux/networking/udp.md b/3 resources/linux/networking/udp.md new file mode 100644 index 0000000..e69de29 diff --git a/3 resources/linux/nic.md b/3 resources/linux/nic.md new file mode 100644 index 0000000..592ad1c --- /dev/null +++ b/3 resources/linux/nic.md @@ -0,0 +1 @@ +Network Interface Card \ No newline at end of file diff --git a/3 resources/linux/shared anonymous memory mappings.md b/3 resources/linux/shared anonymous memory mappings.md new file mode 100644 index 0000000..71d1cfc --- /dev/null +++ b/3 resources/linux/shared anonymous memory mappings.md @@ -0,0 +1,2 @@ +[[TODO]] +Linux API book: chapter 49 \ No newline at end of file diff --git a/3 resources/linux/system v shared memory.md b/3 resources/linux/system v shared memory.md new file mode 100644 index 0000000..d1f690d --- /dev/null +++ b/3 resources/linux/system v shared memory.md @@ -0,0 +1,2 @@ +[[TODO]] +Linux API book chapter 48 \ No newline at end of file diff --git a/3 resources/linux/tftp.md b/3 resources/linux/tftp.md new file mode 100644 index 0000000..259fdec --- /dev/null +++ b/3 resources/linux/tftp.md @@ -0,0 +1,2 @@ +Trivial File Transfer Protocol +[[TODO]] \ No newline at end of file diff --git a/3 resources/man pages.md b/3 resources/man pages.md deleted file mode 100644 index 576d4b8..0000000 --- a/3 resources/man pages.md +++ /dev/null @@ -1,2 +0,0 @@ -I need to more consistently read man pages. Example is `man task` to see how taskwarrior works, after reading it today I found that it is actually quite easy. -They often contain good information on how to use a certain tool. \ No newline at end of file diff --git a/3 resources/math/cartesian-product.md b/3 resources/math/cartesian-product.md new file mode 100644 index 0000000..0e0a9a4 --- /dev/null +++ b/3 resources/math/cartesian-product.md @@ -0,0 +1 @@ +The Cartesian product in [[set theory]] denoted as A x B where A and B are both sets and it would result in pairs of (a, b) for each a and b in A and B respectively. \ No newline at end of file diff --git a/3 resources/mathematics/convolution.md b/3 resources/mathematics/convolution.md new file mode 100644 index 0000000..e69de29 diff --git a/3 resources/mermaidjs.md b/3 resources/mermaidjs.md deleted file mode 100644 index e468459..0000000 --- a/3 resources/mermaidjs.md +++ /dev/null @@ -1,21 +0,0 @@ -**ZenUML** -Optional **Title** -**Participants** can be declared when used or at the start. -**Annotators** give **participants** a special icon, defined at the doc site. -**Aliases** give a short **participant** name a more descriptive name when rendered, e.g: A as Alice <- Alice will be rendered, but the code can use A. -**Messages** between **participants** can be **sync, async, creation or reply**. -**Sync** use A.\ have a block {} for nested messages -**Async** use an arrow A->B: How are you? -**Creation** new keyword new A(optional params) -**Reply** three ways to define: -* Assign var from **Sync** message, e.g: OptionalType a = A.SyncMessage() -* Return A.SyncMessage { return blaat } -* @return or @reply on an **async** message -**Nesting** can be done on both creation and sync messages using blocks {}. -**Comments** can be added using `// comment` and support markdown. -**Loops** can be defined using keywords: **while, for, foreach and loop**. -**Alternative** paths can be sequenced using **if, else** statements. if(blaat) { A.syncMessage(B) } -**Opt** fragments rendered via `opt { ... }`. This can be useful for optional responses or paths. -**Parallel** paths can be defined using `par { ... }`. -**Try/catch/finally** statements are supported as well. -**@Starter(participant)** to make the line start from a **participant** \ No newline at end of file diff --git a/3 resources/mermaidjs/mermaidjs.md b/3 resources/mermaidjs/mermaidjs.md new file mode 100644 index 0000000..e468459 --- /dev/null +++ b/3 resources/mermaidjs/mermaidjs.md @@ -0,0 +1,21 @@ +**ZenUML** +Optional **Title** +**Participants** can be declared when used or at the start. +**Annotators** give **participants** a special icon, defined at the doc site. +**Aliases** give a short **participant** name a more descriptive name when rendered, e.g: A as Alice <- Alice will be rendered, but the code can use A. +**Messages** between **participants** can be **sync, async, creation or reply**. +**Sync** use A.\ have a block {} for nested messages +**Async** use an arrow A->B: How are you? +**Creation** new keyword new A(optional params) +**Reply** three ways to define: +* Assign var from **Sync** message, e.g: OptionalType a = A.SyncMessage() +* Return A.SyncMessage { return blaat } +* @return or @reply on an **async** message +**Nesting** can be done on both creation and sync messages using blocks {}. +**Comments** can be added using `// comment` and support markdown. +**Loops** can be defined using keywords: **while, for, foreach and loop**. +**Alternative** paths can be sequenced using **if, else** statements. if(blaat) { A.syncMessage(B) } +**Opt** fragments rendered via `opt { ... }`. This can be useful for optional responses or paths. +**Parallel** paths can be defined using `par { ... }`. +**Try/catch/finally** statements are supported as well. +**@Starter(participant)** to make the line start from a **participant** \ No newline at end of file diff --git a/3 resources/mysql-foreign-keys.md b/3 resources/mysql-foreign-keys.md new file mode 100644 index 0000000..0338256 --- /dev/null +++ b/3 resources/mysql-foreign-keys.md @@ -0,0 +1 @@ +Live in information_schema.referential_constraints. \ No newline at end of file diff --git a/3 resources/nix.md b/3 resources/nix.md deleted file mode 100644 index d407d2e..0000000 --- a/3 resources/nix.md +++ /dev/null @@ -1,58 +0,0 @@ -# Language - `nix repl` to interactively evaluate Nix expressions. `:p` if output is not full. - `nix-instantiate --eval .nix` to evaluate a Nix expression from a file. `--strict`. - -Nix is like JSON, but with functions. -Recursive attribute sets can reference values declared earlier in the same set. -```nix -rec { - one = 1; - two = one + 1; -} -``` - -A `let` binding is used to assign names to values just as attribute sets, they can then be used in expressions. Let bindings have a local scope. - -A `with` allows referencing attributes of attribute sets without referencing the set. -# Flakes -Nix flakes are source trees containing a file `flake.nix` at their root. The file `flake.nix` provides a standardized way to provide [[Zettelkast/Index/Nix]] artifacts. It's like a package manager for [[Zettelkast/Index/Nix]]. A flake can be dependent on other Flakes and it's possible to pin dependencies to exact revisions by using a `flake.lock` file. - -Nix flake evaluation is hermetic, meaning that it produces the same result wherever it's built.k - -The feature can be enabled in `~/.config/nix/nix.conf`: - -``` -experimental-features = nix-command flakes -``` - -To initialize in a repo: `nix flake init`. - -In flakes dependencies have to be specified explicitly and MUST be locked to specific versions therefore it's no longer allowed to use the nixpkgs found in `NIX_PATH` by referencing it like ``. - -Output of a Flake is an arbitrary [[Zettelkast/Index/Nix]] value such as a package, [[NixOS]] module or library function. -Commands `nix build` and `nix shell` will build the output `packages..default` unless we specify another output, for example: `nix shell .#checks.aarch64-linux.build`. - -# Overlays -[[TODO]] - -# Shell.nix -Can be used to set up per dir environments, e.g using direnv to automatically activate them. -## Python -https://nixos.org/manual/nixpkgs/stable/#python - -```nix -{ pkgs ? import {}}: - -pkgs.mkShell { - packages = [ pkgs.virtualenv ]; -} -``` - -```nix -with import {}; -( -let my_toolz = python311.pkgs.buildPythonPackage rec { pname = "toolz"; version = "0.10.0"; pyproject = true; src = fetchPypi { inherit pname version; hash = "sha256-CP3V73yWSArRHBLUct4hrNMjWZlvaaUlkpm1QP66RWA="; }; nativeBuildInputs = [ python311.pkgs.setuptools python311.pkgs.wheel ]; # has no tests doCheck = false; meta = { homepage = "https://github.com/pytoolz/toolz/"; description = "List processing tools and functional utilities"; # [...] }; }; in python311.withPackages (ps: with ps; [ numpy my_toolz ]) ).env -``` - ---- -[Flakes Wiki](https://nixos.wiki/wiki/Flakes) \ No newline at end of file diff --git a/3 resources/nix/flakes.md b/3 resources/nix/flakes.md new file mode 100644 index 0000000..fb99500 --- /dev/null +++ b/3 resources/nix/flakes.md @@ -0,0 +1,19 @@ +Nix flakes are source trees containing a file `flake.nix` at their root. The file `flake.nix` provides a standardized way to provide [[Zettelkast/Index/Nix]] artifacts. It's like a package manager for [[Zettelkast/Index/Nix]]. A flake can be dependent on other Flakes and it's possible to pin dependencies to exact revisions by using a `flake.lock` file. + +Nix flake evaluation is hermetic, meaning that it produces the same result wherever it's built.k + +The feature can be enabled in `~/.config/nix/nix.conf`: + +``` +experimental-features = nix-command flakes +``` + +To initialize in a repo: `nix flake init`. + +In flakes dependencies have to be specified explicitly and MUST be locked to specific versions therefore it's no longer allowed to use the nixpkgs found in `NIX_PATH` by referencing it like ``. + +Output of a Flake is an arbitrary [[Zettelkast/Index/Nix]] value such as a package, [[NixOS]] module or library function. +Commands `nix build` and `nix shell` will build the output `packages..default` unless we specify another output, for example: `nix shell .#checks.aarch64-linux.build`. + +--- +[Flakes Wiki](https://nixos.wiki/wiki/Flakes) \ No newline at end of file diff --git a/3 resources/nix/language.md b/3 resources/nix/language.md new file mode 100644 index 0000000..01101d9 --- /dev/null +++ b/3 resources/nix/language.md @@ -0,0 +1,5 @@ +"Nix is like JSON, but with functions". + +[[keyword-rec]] +[[keyword-let]] +[[keyword-with]] diff --git a/3 resources/nix/language/keyword-import.md b/3 resources/nix/language/keyword-import.md new file mode 100644 index 0000000..616c155 --- /dev/null +++ b/3 resources/nix/language/keyword-import.md @@ -0,0 +1,2 @@ +The import keyword brings a Nix expression from another source into scope such that we can reference it. For example, we can `import ` and it would bring the entire attribute set that is Nixpkgs into scope and allows us to reference any of its attributes. + diff --git a/3 resources/nix/language/keyword-let.md b/3 resources/nix/language/keyword-let.md new file mode 100644 index 0000000..3b2f401 --- /dev/null +++ b/3 resources/nix/language/keyword-let.md @@ -0,0 +1,9 @@ +Keyword: `let` +Used to assign variables that can be used in an expression immediately following the let-binding. +```nix +let + one = 1; +in { + two = one + 1; +} +``` diff --git a/3 resources/nix/language/keyword-rec.md b/3 resources/nix/language/keyword-rec.md new file mode 100644 index 0000000..456f877 --- /dev/null +++ b/3 resources/nix/language/keyword-rec.md @@ -0,0 +1,17 @@ +Recursive attribute sets can reference values declared earlier in the same set. +keyword: `rec` +```nix +rec { + one = 1; + two = one + 1; +} +``` + +Ordering does not matter: +```nix +nix-repl> rec { two = one + 1; one = 1; } +{ + one = 1; + two = 2; +} +``` diff --git a/3 resources/nix/language/keyword-with.md b/3 resources/nix/language/keyword-with.md new file mode 100644 index 0000000..10763ff --- /dev/null +++ b/3 resources/nix/language/keyword-with.md @@ -0,0 +1,12 @@ +The `with` keyword brings all attributes from a given set, e.g nixpkgs, into the local scope. Making them accessible as if they were declared in the same file. + +An example, bringing everything from nixpkgs into scope: +``` +with import ; +with python310Packages; <-- declared in nixpkgs + +buildPythonPackage <-- declared in python310Packages +``` + +The import statement is required here because imports a nix expression from another source, in this case nixpkgs. +It is not required at line two, because python310Packages itself is already in the local scope. \ No newline at end of file diff --git a/3 resources/nix/overlays.md b/3 resources/nix/overlays.md new file mode 100644 index 0000000..70dad85 --- /dev/null +++ b/3 resources/nix/overlays.md @@ -0,0 +1,8 @@ +Functions that accept two args (conventionally: final, prev) and return a set of [[package]]s. + +The `prev` arguments holds the set of packages of the "parent" overlay while the `final` argument holds the end result of **all** overlays applied. This means that overlays depend on each other. It is unclear how we can tell on which overlay an overlay depends. + +We can use it to override existing packages or add new packages. + +--- +https://nixos.wiki/wiki/Overlays diff --git a/3 resources/nix/package.md b/3 resources/nix/package.md new file mode 100644 index 0000000..231e3a6 --- /dev/null +++ b/3 resources/nix/package.md @@ -0,0 +1,3 @@ +Packages != NixOS Modules + +Packages are from Nixpkgs. \ No newline at end of file diff --git a/3 resources/nix/packages/apply-patches.md b/3 resources/nix/packages/apply-patches.md new file mode 100644 index 0000000..e703f81 --- /dev/null +++ b/3 resources/nix/packages/apply-patches.md @@ -0,0 +1,14 @@ +We can apply patches to existing packages using [[overlays]]: +```nix +final: prev { + nova = prev.nova.overrideAttrs (old: { + patches = (old.patches or []) ++ [ + prev.fetchpatch { + url = "https://github.com/owner/repo/commit/hash.patch"; + hash = "somehash"; + }) + ./relative.patch + ] + }) +} +``` diff --git a/3 resources/nix/repl.md b/3 resources/nix/repl.md new file mode 100644 index 0000000..6a0fd4a --- /dev/null +++ b/3 resources/nix/repl.md @@ -0,0 +1,2 @@ +`nix repl` to interactively evaluate Nix expressions. `:p` if output is not full. + `nix-instantiate --eval .nix` to evaluate a Nix expression from a file. `--strict`. \ No newline at end of file diff --git a/3 resources/nix/shell.nix.md b/3 resources/nix/shell.nix.md new file mode 100644 index 0000000..d5fa8ce --- /dev/null +++ b/3 resources/nix/shell.nix.md @@ -0,0 +1,39 @@ +Can be used to set up per dir environments, e.g using direnv to automatically activate them. +## Python +https://nixos.org/manual/nixpkgs/stable/#python + +```nix +{ pkgs ? import {}}: + +pkgs.mkShell { + packages = [ pkgs.virtualenv ]; +} +``` + +```nix +with import {}; +let + my_toolz = python311.pkgs.buildPythonPackage rec { + pname = "toolz"; + version = "0.10.0"; + pyproject = true; + src = fetchPypi { + inherit pname version; + hash = "sha256-CP3V73yWSArRHBLUct4hrNMjWZlvaaUlkpm1QP66RWA="; + }; + nativeBuildInputs = [ + python311.pkgs.setuptools + python311.pkgs.wheel + ]; # has no tests + doCheck = false; + meta = { + homepage = "https://github.com/pytoolz/toolz/"; + description = "List processing tools and functional utilities"; + # [...] + }; + }; +in python311.withPackages (ps: with ps; [ numpy my_toolz ]) ).env +``` + +The [[keyword-import]] is required here because imports a nix expression from another source, in this case nixpkgs. +It is not required at line two, because python310Packages itself is already in the local scope. \ No newline at end of file diff --git a/3 resources/note taking system.md b/3 resources/note taking system.md deleted file mode 100644 index 907e2ce..0000000 --- a/3 resources/note taking system.md +++ /dev/null @@ -1,21 +0,0 @@ -## Why take notes? -By writing down notes we can relate information about a subject in a very personal way using our own experiences to relate them to. - -We can us our notes as inspiration to create. In a centralized note taking system it is possible to easily revisit notes and use them to inspire new ideas. - -Another effect of a centralized note system is that it is very easy to search through our notes and use them as reference material. - -## How -Using the para method; a method of note taking by Tiago Forte (Building a second brain) - -Projects: Anything that requires the completion of multiple tasks to reach a certain outcome. -Areas: Something that you are responsible for for a longer period of your live. -Resources: Notes about resources that you use to do anything, such as tools and programming languages for example. -Archive: Notes that you feel are nog longer relevant to you. They might end up being useful in unexpected ways -so don't throw away! - -GTD: Getting Things Done - -## Quotes -"If I can't write about something; I don't understand the topic." - Mischa van den Burg? -"Clear thinking becomes clear writing; one can't exist without the other." - William Zinsser. diff --git a/3 resources/openstack/create-port-fixed-ip.md b/3 resources/openstack/create-port-fixed-ip.md new file mode 100644 index 0000000..3b6ab46 --- /dev/null +++ b/3 resources/openstack/create-port-fixed-ip.md @@ -0,0 +1 @@ +Creating a port with a fixed IP requires admin privileges. It is not sufficient to have an RBAC policy that shares the network with a tenant. \ No newline at end of file diff --git a/3 resources/openstack/guest-pmsuspended.md b/3 resources/openstack/guest-pmsuspended.md new file mode 100644 index 0000000..8995e6e --- /dev/null +++ b/3 resources/openstack/guest-pmsuspended.md @@ -0,0 +1,3 @@ +Encountered a guest running some desktop image that sleeps and puts libvirt domain in state pmsuspend. + +Openstack does not sync power states in this case so the nova instance is still ACTIVE. \ No newline at end of file diff --git a/3 resources/openstack/nova-live-migration-volume.md b/3 resources/openstack/nova-live-migration-volume.md new file mode 100644 index 0000000..50bb6d0 --- /dev/null +++ b/3 resources/openstack/nova-live-migration-volume.md @@ -0,0 +1,14 @@ +Table cinder.volume_attachment, contains which volume_driver. target_lun `()` here maps to `dm-`. +Luns are not unique across pod, each node has a target_lun 2 and thus dm-2 connected. + +os-brick is responsible for connecting volumes; +if connection_info it receives contains target_iqns, target_luns etc it will not do a scan and just returns those. +`@see os_brick/initiator/connectors/iscsi.py` + +`nova/virt/libvirt/driver.py -> def _connect_volume` does attaching of volumes using os-brick. Driver exposes some methods that do this and are called elsewhere: `swap_volume`, `attach_volume`, `pre_live_migration`. + +`pre_live_migration` is called by `nova/compute/manager.py` + +So in `nova/compute/manager.py` there is a function that does the rollback, and it rollbacks bdm's and deletes volume attachments before it calls `rollback_live_migration_at_destination` which in turn makes an attempt at deleting the actual volume attachment to the node. But at that point all objects have been rollbacked already so it has invalid information. + +If the code in new versions of openstack isn't any different i'll just make a bug report and see what they come up with. diff --git a/3 resources/puppet/replace-line-file.md b/3 resources/puppet/replace-line-file.md new file mode 100644 index 0000000..985ce91 --- /dev/null +++ b/3 resources/puppet/replace-line-file.md @@ -0,0 +1,28 @@ +``` + file_line { + '/etc/sysconfig/libvirt-guests onboot': + path => '/etc/default/libvirt-guests', + line => 'ON_BOOT=ignore', + match => 'ON_BOOT='; + '/etc/libvirt/qemu.conf vnctls': + path => '/etc/libvirt/qemu.conf', + line => 'vnc_tls = 0', + match => '^#?vnc_tls = ', + notify => Service['libvirt']; + '/etc/libvirt/qemu.conf vnctls_verify': + path => '/etc/libvirt/qemu.conf', + line => 'vnc_tls_x509_verify = 0', + match => 'vnc_tls_x509_verify =', + notify => Service['libvirt']; + '/etc/libvirt/qemu.conf tls': + path => '/etc/libvirt/qemu.conf', + match => '^default_tls_x509_cert_dir = "/etc/pki/qemu"$', + line => '#default_tls_x509_cert_dir = "/etc/pki/qemu"', + notify => Service['libvirt']; + '/etc/libvirt/qemu.conf tls_verify': + path => '/etc/libvirt/qemu.conf', + match => '^default_tls_x509_verify = 1$', + line => '#default_tls_x509_verify = 1', + notify => Service['libvirt']; + } +``` diff --git a/3 resources/ripgrep-symlinks.md b/3 resources/ripgrep-symlinks.md new file mode 100644 index 0000000..b8ce387 --- /dev/null +++ b/3 resources/ripgrep-symlinks.md @@ -0,0 +1 @@ +Pass `-L` to `rg` to make it follow symlinks: this is handy for example when searching hieradata, because node definitions can be symlinked. \ No newline at end of file diff --git a/3 resources/slug.md b/3 resources/slug.md new file mode 100644 index 0000000..08904e6 --- /dev/null +++ b/3 resources/slug.md @@ -0,0 +1,3 @@ +A user-friendly representation of the name of a page used in the path of an URL. +For example a page titled: My Friends And I, would be referenced via its slug: my-friends-and-i or my-friends-i. +It can be optimized for brevity so its easier to type and remember. diff --git a/3 resources/sollicitatie-vragenlijst.md b/3 resources/sollicitatie-vragenlijst.md deleted file mode 100644 index 08e2f89..0000000 --- a/3 resources/sollicitatie-vragenlijst.md +++ /dev/null @@ -1,7 +0,0 @@ -- Ben je bekend met scrum, agile, kanban, jira etc? - - -Technische vragen: -threading, race conditions, deadlocks -message queue -- Kun je uitleggen hoe een binary search werkt \ No newline at end of file diff --git a/3 resources/statistics/moving-average.md b/3 resources/statistics/moving-average.md new file mode 100644 index 0000000..5622d3f --- /dev/null +++ b/3 resources/statistics/moving-average.md @@ -0,0 +1,17 @@ +Also known as; rolling-average, running-average, moving-mean, running-mean, rolling-mean. + +Has three variations: simple, weighted, cumulative. + +A type of [[convolution]]. + +Reduces noisiness in a time-series graph which makes long-term trends or cycles more easily visible. + +Keeps averaging a subset of given set and move the subset one space to the right. +Example with sample-size of 3: +``` +set: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +i=1: avg([0, 1, 2]) = 1 +i=2: avg([1, 2, 3]) = 2 +i=3: avg([2, 3, 4]) = 3 +... +``` -- cgit v1.2.3