Skip to content

Commit

Permalink
fix: deprecate not-by-ai
Browse files Browse the repository at this point in the history
As they have introduced pricing, which makes no sense, and we had a
discussion that using that badge it's a nice way to tell the AI which
content to use and which not to

feat(android_sdk): introduce android_sdk

[Android SDK Platform tools](https://developer.android.com/tools/releases/platform-tools) is a component for the Android SDK. It includes tools that interface with the Android platform, primarily adb and fastboot.

**[Installation](https://developer.android.com/tools/releases/platform-tools)**

While many Linux distributions already package Android Platform Tools (for example `android-platform-tools-base` on Debian), it is preferable to install the most recent version from the official website. Packaged versions might be outdated and incompatible with most recent Android handsets.

- Download [the latest toolset](https://dl.google.com/android/repository/platform-tools-latest-linux.zip)
- Extract it somewhere in your filesystem
- Create links to the programs you want to use in your `$PATH`

Next you will need to enable debugging on the Android device you are testing. [Please follow the official instructions on how to do so.](https://developer.android.com/studio/command-line/adb)

**Usage**

**Connecting over USB**

To use `adb` with a device connected over USB, you must enable USB debugging in the device system settings, under Developer options. On Android 4.2 (API level 17) and higher, the Developer options screen is hidden by default.

*Enable the Developer options*

To make it visible, [enable Developer options](https://developer.android.com/studio/debug/dev-options#enable). On Android 4.1 and lower, the Developer options screen is available by default. On Android 4.2 and higher, you must enable this screen.

- On your device, find the Build number option (Settings > About phone > Build number)
- Tap the Build Number option seven times until you see the message You are now a developer! This enables developer options on your device.
- Return to the previous screen to find Developer options at the bottom.

*Enable USB debugging*

Before you can use the debugger and other tools, you need to enable USB debugging, which allows Android Studio and other SDK tools to recognize your device when connected via USB.

Enable USB debugging in the device system settings under Developer options. You can find this option in one of the following locations, depending on your Android version:

- Android 9 (API level 28) and higher: Settings > System > Advanced > Developer Options > USB debugging
- Android 8.0.0 (API level 26) and Android 8.1.0 (API level 27): Settings > System > Developer Options > USB debugging
- Android 7.1 (API level 25) and lower: Settings > Developer Options > USB debugging

*Test it works*

If everything is configured appropriately you should see your device when launching the command `adb devices`.

*Create udev rules if it fails*

If you see the next error:

```
failed to open device: Access denied (insufficient permissions)

* failed to start daemon
adb: failed to check server version: cannot connect to daemon
```

It indicates an issue with permissions when `adb` tries to communicate with the device via USB. Here are some steps you can take to resolve this issue:

- Check USB permissions
  - Ensure that you have the necessary permissions to access the USB device. If you're running on Linux, check if the device has appropriate udev rules.
  - You can try adding your user to the `plugdev` group:

    ```bash
    sudo usermod -aG plugdev $USER
    ```

  - Make sure you have a `udev` rule for Android devices in `/etc/udev/rules.d/`. If not, you can create one by adding a file like `51-android.rules`:

    ```bash
    sudo touch /etc/udev/rules.d/51-android.rules
    ```

  - Add this line to the file to grant access to Android devices:

    ```bash
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
    ```

  - Reload the `udev` rules:

    ```bash
    sudo udevadm control --reload-rules
    sudo service udev restart
    ```

  - Unplug and reconnect the USB device.
**References**
- [Home](https://developer.android.com/tools/releases/platform-tools)

feat(antitourism#artículos): Nuevo artículo contra el turismo

- [Abolir el turismo - Escuela de las periferias](https://www.elsaltodiario.com/turismo/abolir-turismo): Lleguemos a donde lleguemos, no puede ser que sea más fácil imaginar el fin del capitalismo que el fin del turismo.

feat(himalaya#Configure navigation bindings): Configure navigation bindings

The default bindings conflict with my git bindings, and to make them similar to orgmode agenda I'm changing the next and previous page:

```lua
return {
  {
    "pimalaya/himalaya-vim",
    keys = {
      { "b", "<plug>(himalaya-folder-select-previous-page)", desc = "Go to the previous email page" },
      { "f", "<plug>(himalaya-folder-select-next-page)", desc = "Go to the next email page" },
    },
  },
}

```

fix(himalaya#Configure the account bindings): Configure the account bindings
 ### Configure the account bindings

- In the email write view:
  - `q` or `<c-s>`: Save and send the email
 If you want them too set the next config:

```lua
-- get the current buffer's full file path
local filepath = vim.api.nvim_buf_get_name(0)

-- bind `q` and `<c-s>` to close the window
if string.match(filepath, "write") then
  vim.api.nvim_buf_set_keymap(0, "n", "<c-s>", ":w<cr>:bd<cr>", { noremap = true, silent = true })
  vim.api.nvim_buf_set_keymap(0, "n", "q", ":w<cr>:bd<cr>", { noremap = true, silent = true })
else
  -- in read mode you can't save the buffer
  vim.api.nvim_buf_set_keymap(0, "n", "q", ":bd<cr>", { noremap = true, silent = true })
end

```

fix(himalaya): Refresh the active account

```lua
     keys = {
       -- Email refreshing bindings
      { "<leader>r", ":lua FetchEmails()<CR>", desc = "Fetch emails" },
     },
     config = function()
      function FetchEmails()
        local account = vim.api.nvim_eval("himalaya#domain#account#current()")

         vim.notify("Fetching emails for " .. account .. ", please wait...", vim.log.levels.INFO)
         vim.cmd("redraw")

        -- Start the mbsync job
         vim.fn.jobstart("mbsync " .. account, {
           on_exit = function(_, exit_code, _)
             if exit_code == 0 then
               vim.notify("Emails for " .. account .. " fetched successfully!", vim.log.levels.INFO)
              -- Reload Himalaya only after successful mbsync
              vim.cmd("Himalaya " .. account)
             else
               vim.notify("Failed to fetch emails for " .. account .. ". Check the logs.", vim.log.levels.ERROR)
             end
```
fix(himalaya#Emails are shown with different timezones): Emails are shown with different timezones

Set the account configuration `envelope.list.datetime-local-tz = true`

fix(himalaya#Emails are not being copied to Sent ): Emails are not being copied to Sent

Set the account configuration `message.send.save-copy = true`

feat(linux_snippets#How to debug a CPU Throttling high alert): How to debug a CPU Throttling high alert

It may be because it has hit a limit set by kubernetes or docker. If the metrics don't show that it may be because the machine has run out of CPU credits.

feat(mobile_verification_toolkit): Introduce mobile verification toolkit

[Mobile Verification Toolkit](https://github.com/mvt-project/mvt) (MVT) is a collection of utilities to simplify and automate the process of gathering forensic traces helpful to identify a potential compromise of Android and iOS devices.

MVT's capabilities are continuously evolving, but some of its key features include:

- Decrypt encrypted iOS backups.
- Process and parse records from numerous iOS system and apps databases, logs and system analytics.
- Extract installed applications from Android devices.
- Extract diagnostic information from Android devices through the adb protocol.
- Compare extracted records to a provided list of malicious indicators in STIX2 format.
- Generate JSON logs of extracted records, and separate JSON logs of all detected malicious traces.
- Generate a unified chronological timeline of extracted records, along with a timeline all detected malicious traces.

MVT is a forensic research tool intended for technologists and investigators. Using it requires understanding the basics of forensic analysis and using command-line tools. MVT is not intended for end-user self-assessment. If you are concerned with the security of your device please seek expert assistance.

It has been developed and released by the Amnesty International Security Lab in July 2021 in the context of the Pegasus Project along with a technical forensic methodology. It continues to be maintained by Amnesty International and other contributors.

MVT supports using public indicators of compromise (IOCs) to scan mobile devices for potential traces of targeting or infection by known spyware campaigns.

**Warning** Public indicators of compromise are insufficient to determine that a device is "clean", and not targeted with a particular spyware tool. Reliance on public indicators alone can miss recent forensic traces and give a false sense of security.

Reliable and comprehensive digital forensic support and triage requires access to non-public indicators, research and threat intelligence.

Such support is available to civil society through [Amnesty International's Security Lab](https://securitylab.amnesty.org/get-help/?c=mvt_docs) or through their forensic partnership with [Access Now’s Digital Security Helpline](https://www.accessnow.org/help/).

**How it works**

*[Indicators of compromise](https://docs.mvt.re/en/latest/iocs/)*

MVT uses [Structured Threat Information Expression (STIX)](https://oasis-open.github.io/cti-documentation/stix/intro.html) files to identify potential traces of compromise.

These indicators of compromise are contained in a file with a particular structure of [JSON](https://en.wikipedia.org/wiki/JSON) with the `.stix2` or `.json` extensions.

*STIX2 Support*

So far MVT implements only a subset of [STIX2 specifications](https://docs.oasis-open.org/cti/stix/v2.1/csprd01/stix-v2.1-csprd01.html):

* It only supports checks for one value (such as `[domain-name:value='DOMAIN']`) and not boolean expressions over multiple comparisons
* It only supports the following types: `domain-name:value`, `process:name`, `email-addr:value`, `file:name`, `file:path`, `file:hashes.md5`, `file:hashes.sha1`, `file:hashes.sha256`, `app:id`, `configuration-profile:id`, `android-property:name`, `url:value` (but each type will only be checked by a module if it is relevant to the type of data obtained)

*Known repositories of STIX2 IOCs*

- The [Amnesty International investigations repository](https://github.com/AmnestyTech/investigations) contains STIX-formatted IOCs for:
    - [Pegasus](https://en.wikipedia.org/wiki/Pegasus_(spyware)) ([STIX2](https://raw.githubusercontent.com/AmnestyTech/investigations/master/2021-07-18_nso/pegasus.stix2))
    - [Predator from Cytrox](https://citizenlab.ca/2021/12/pegasus-vs-predator-dissidents-doubly-infected-iphone-reveals-cytrox-mercenary-spyware/) ([STIX2](https://raw.githubusercontent.com/AmnestyTech/investigations/master/2021-12-16_cytrox/cytrox.stix2))
    - [An Android Spyware Campaign Linked to a Mercenary Company](https://github.com/AmnestyTech/investigations/tree/master/2023-03-29_android_campaign) ([STIX2](https://github.com/AmnestyTech/investigations/blob/master/2023-03-29_android_campaign/malware.stix2))
- [This repository](https://github.com/Te-k/stalkerware-indicators) contains IOCs for Android stalkerware including [a STIX MVT-compatible file](https://raw.githubusercontent.com/Te-k/stalkerware-indicators/master/generated/stalkerware.stix2).
- They are also maintaining [a list of IOCs](https://github.com/mvt-project/mvt-indicators) in STIX format from public spyware campaigns.

You can automatically download the latest public indicator files with the command `mvt-ios download-iocs` or `mvt-android download-iocs`. These commands download the list of indicators from the [mvt-indicators](https://github.com/mvt-project/mvt-indicators/blob/main/indicators.yaml) repository and store them in the [appdir](https://pypi.org/project/appdirs/) folder. They are then loaded automatically by MVT.

Please [open an issue](https://github.com/mvt-project/mvt/issues/) to suggest new sources of STIX-formatted IOCs.

**[Consensual Forensics](https://docs.mvt.re/en/latest/introduction/)**

While MVT is capable of extracting and processing various types of very personal records typically found on a mobile phone (such as calls history, SMS and WhatsApp messages, etc.), this is intended to help identify potential attack vectors such as malicious SMS messages leading to exploitation.

MVT's purpose is not to facilitate adversarial forensics of non-consenting individuals' devices. The use of MVT and derivative products to extract and/or analyse data originating from devices used by individuals not consenting to the procedure is explicitly prohibited in the [license](license.md).

**[Installation](https://docs.mvt.re/en/latest/install/)**

**[Using docker](https://docs.mvt.re/en/latest/docker/)**

**Not using docker**

Before proceeding, please note that MVT requires Python 3.6+ to run. While it should be available on most operating systems, please make sure of that before proceeding.

*Dependencies on Linux*

First install some basic dependencies that will be necessary to build all required tools:

```bash
sudo apt install python3 python3-venv python3-pip sqlite3 libusb-1.0-0
```

`libusb-1.0-0` is not required if you intend to only use `mvt-ios` and not `mvt-android`.

(Recommended) Set up `pipx`

For Ubuntu 23.04 or above:
```bash
sudo apt install pipx
pipx ensurepath
```

For Ubuntu 22.04 or below:
```
python3 -m pip install --user pipx
python3 -m pipx ensurepath
```

Other distributions: check for a `pipx` or `python-pipx` via your package manager.

When working with Android devices you should additionally install [Android SDK Platform Tools](https://developer.android.com/studio/releases/platform-tools). If you prefer to install a package made available by your distribution of choice, please make sure the version is recent to ensure compatibility with modern Android devices.

*Installing ADB*

Follow the steps of [android_sdk.md#installation].

*Installing MVT*

1. Install `pipx` following the instructions above for your OS/distribution. Make sure to run `pipx ensurepath` and open a new terminal window.
2. ```bash
   pipx install mvt
   ```

You now should have the `mvt-ios` and `mvt-android` utilities installed. If you run into problems with these commands not being found, ensure you have run `pipx ensurepath` and opened a new terminal window.

**Usage**

**Download the indicators**

If you want to check android:
```bash
mvt-android download-iocs
```
If you want to check ios:
```bash
mvt-ios download-iocs
```

**[Checking an Android mobile](https://docs.mvt.re/en/latest/android/methodology/)**

Unfortunately Android devices provide much less observability than their iOS cousins. Android stores very little diagnostic information useful to triage potential compromises, and because of this `mvt-android` capabilities are limited as well.

However, not all is lost.

First [make sure `adb` works fine](android_sdk.md#connecting-over-usb).

Then you can run:

```bash
mvt-android check-adb --output .
```

**Check installed Apps**

Because malware attacks over Android typically take the form of malicious or backdoored apps, the very first thing you might want to do is to extract and verify all installed Android packages and triage quickly if there are any which stand out as malicious or which might be atypical.

While it is out of the scope of this documentation to dwell into details on how to analyze Android apps, MVT does allow to easily and automatically extract information about installed apps, download copies of them, and quickly look them up on services such as [VirusTotal](https://www.virustotal.com).

You can [download all the apks](https://docs.mvt.re/en/latest/android/download_apks/) with the next command:

```bash
mvt-android download-apks --output /path/to/folder
```

MVT will likely warn you it was unable to download certain installed packages. There is no reason to be alarmed: this is typically expected behavior when MVT attempts to download a system package it has no privileges to access.

*Upload apks to VirusTotal*

Be warned thought that each apk you upload to VirusTotal can be downloaded by any VirusTotal user, so if you have private apps that may have confidential information stored in the apk you should not use the upload to VirusTotal feature.

!!! info "Using VirusTotal"
	Please note that in order to use VirusTotal lookups you are required to provide your own API key through the `MVT_VT_API_KEY` environment variable. You should also note that VirusTotal enforces strict API usage. Be mindful that MVT might consume your hourly search quota.

*Register in VirusTotal*
You can register a new account [here](https://www.virustotal.com/gui/join-us). Then get your key from [here](https://www.virustotal.com/gui/my-apikey).

The standard free end-user account. It is not tied to any corporate group and so it does not have access to Premium services. You are subjected to the following limitations:

- Request rate:	4 lookups / min
- Daily quota:500 lookups / day
- Monthly quota:	15.5 K lookups / month

I've tried to find the [pricing](https://docs.virustotal.com/docs/difference-public-private#price) but got nowhere. Maybe the default limits are enough

**Check the device over Android Debug Bridge**

Some additional diagnostic information can be extracted from the phone using the [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `mvt-android` allows to automatically extract information including [dumpsys](https://developer.android.com/studio/command-line/dumpsys) results, details on installed packages (without download), running processes, presence of root binaries and packages, and more.

**[Work with the indicators of compromise](https://docs.mvt.re/en/latest/iocs/)**

You can indicate a path to a STIX2 indicators file when checking iPhone backups or filesystem dumps. For example:

```bash
mvt-ios check-backup --iocs ~/ios/malware.stix2 --output /path/to/iphone/output /path/to/backup
```

Or, with data from an Android backup:

```bash
mvt-android check-backup --iocs ~/iocs/malware.stix2 /path/to/android/backup/
```

After extracting forensics data from a device, you are also able to compare it with any STIX2 file you indicate:

```bash
mvt-ios check-iocs --iocs ~/iocs/malware.stix2 /path/to/iphone/output/
```

The `--iocs` option can be invoked multiple times to let MVT import multiple STIX2 files at once. For example:

```bash
mvt-ios check-backup --iocs ~/iocs/malware1.stix --iocs ~/iocs/malware2.stix2 /path/to/backup
```

It is also possible to load STIX2 files automatically from the environment variable `MVT_STIX2`:

```bash
export MVT_STIX2="/home/user/IOC1.stix2:/home/user/IOC2.stix2"
```
**Troubleshooting**

**Suspicious org.thoughtcrime.securesms in trace logs**
It's the signal app.

**Seeing applications of other profiles**
`adb` is able to extract the applications of other profiles, so it's able to analyse them. That's why you may see receivers (monitoring telephony state/incoming calls or to intercept incoming SMS messages) in the logs, as the program checks signatures on those apps.

**References**

- [Source](https://github.com/mvt-project/mvt)
- [Docs](https://docs.mvt.re/en/latest/)

feat(orgmode#Custom agendas): Custom agendas

There is still no easy way to define your [custom agenda views](https://orgmode.org/manual/Custom-Agenda-Views.html), but it looks possible [1](nvim-orgmode/orgmode#478) and [2](nvim-orgmode/orgmode#135).

I've made an [ugly fix](nvim-orgmode/orgmode#831) to be able to use it with the `tags` agenda. Until it's solved you can use [my fork](https://github.com/lyz-code/orgmode). To define your custom agenda you can set for example:

```Lua
    keys = {
      {
        "<leader>gt",
        function()
          require("orgmode.api.agenda").tags({
            query = "+today/-INACTIVE-DONE-REJECTED",
            todo_only = true,
          })
        end,
        desc = "Open orgmode agenda for today",
      },
    }
```

feat(orgmode): Trigger capture outside vim

If you're outside vim you can trigger the capture (if you're using i3) by adding this config:

```bash
for_window [title="Capture"] floating enable, resize set 50 ppt 30 ppt
bindsym $mod+c exec PATH="$PATH:/home/lyz/.local/bin" kitty --title Capture nvim +"lua require('orgmode').action('capture.prompt')"
```

By pressing `alt+c` a floating terminal will open with the capture template.

feat(orgmode#Clocking): Clocking

There is partial support for [Clocking work time](https://orgmode.org/manual/Clocking-Work-Time.html).

I've changed the default bindings to make them more comfortable:

```lua
mappings = {
  org = {
    org_clock_in = "<leader>ci",
    org_clock_out = "<leader>co",
    org_clock_cancel = "<leader>cx",
    org_clock_goto = "<leader>cj",
  },
  agenda = {
    org_agenda_clock_in = "i",
    org_agenda_clock_out = "o",
    org_agenda_clock_cancel = "x",
    org_agenda_clock_goto = "<leader>cj",
  },
```

In theory you can use the key `R` in any agenda to report the time, although I still find it kind of buggy.

feat(orgzly#All files give conflicts when nothing has changed): All files give conflicts when nothing has changed

Thinks broke bad, so I exported and sent the files I knew had changed since it broke and then I cleared the orgzly by:

- Removing the repositories connection (Settings / Sync / Repositories): Hard press (copy the path) and then remove
- Removing the database (Settings / Application / Clean local database)
- Restarting the app
- Adding again the repository
- Do a sync

feat(rabbitmq): Introduce Rabbitmq

[Rabbitmq](https://www.rabbitmq.com/) is a reliable and mature messaging and streaming broker, which is easy to deploy on cloud environments, on-premises, and on your local machine.

**Check that it's working**

If RabbitMQ's Management Plugin is enabled, you can use a browser or curl to check the status of the server:

```bash
curl -i http://<rabbitmq-host>:15672/api/overview
```
Replace `<rabbitmq-host>` with your RabbitMQ server’s hostname or IP address. The default port for the management interface is 15672. You might need to provide credentials if the management plugin requires authentication:

```bash
curl -i -u guest:guest http://<rabbitmq-host>:15672/api/overview
```

If successful, you will get a JSON response with information about the server.

**References**
- [Home](https://www.rabbitmq.com/)

fix(vim_plugin_development#Neovim plugin debug): Neovim plugin debug
If you use `lazy` your plugins will be installed in `~/.local/share/nvim/lazy/pack/packer/start/`.

You can manually edit those files to develop new feature or fix issues on the plugins.

fix(vim_plugin_development#Debugging using Snacks): Debugging using Snacks

Utility functions you can use in your code.

Personally, I have the code below at the top of my `init.lua`:

```lua
_G.dd = function(...)
  Snacks.debug.inspect(...)
end
_G.bt = function()
  Snacks.debug.backtrace()
end
vim.print = _G.dd
```

What this does:

- Add a global `dd(...)` you can use anywhere to quickly show a
  notification with a pretty printed dump of the object(s)
  with lua treesitter highlighting
- Add a global `bt()` to show a notification with a pretty
  backtrace.
- Override Neovim's `vim.print`, which is also used by `:= {something = 123}`

![image](https://github.com/user-attachments/assets/0517aed7-fbd0-42ee-8058-c213410d80a7)
  • Loading branch information
lyz-code committed Nov 27, 2024
1 parent b1688f1 commit 40a6e4f
Show file tree
Hide file tree
Showing 951 changed files with 575 additions and 1,042 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
site
.pdm-python
cheatsheet
red
1 change: 0 additions & 1 deletion docs/abstract_syntax_trees.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,3 @@ TBD

[`pyparsing`](https://github.com/pyparsing/pyparsing/) looks to be a good
candidate to implement ASTs.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/action_management.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,3 @@ switch to a stricter plan to be able to deliver value in time. This makes more
sense in work environments, at personal level I usually just surf the hype
unless I have a clear objective with a due date to reach.

[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/activism.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,3 @@
# Random thoughts on activism

- If you find it uncomfortable selling activist content to the people maybe it's because you don't fully trust in the content. If you did, you'd be eager to spread the word.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/activitywatch.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,3 @@ tweak it so it can be imported, or analyze the data through other processes.
* [Home](https://activitywatch.net/)
* [Docs](https://docs.activitywatch.net/en/latest/introduction.html)
* [Git](https://github.com/ActivityWatch/activitywatch)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/adr.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,3 @@ used to using other tools for the similar purpose, like Vim or grep.

* [Joel Parker guide on ADRs](https://github.com/joelparkerhenderson/architecture_decision_record)
* [Michael Nygard post on ARDs](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aerial_silk.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,3 @@ other direction until your wrists are between you and the tissue.

* When rolling up silk over your legs, always leave room for the knee, do loops
above and below but never over.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/afew.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,3 @@ afew -v --tag --new

* [Git](https://github.com/afewmail/afew)
* [Docs](https://afew.readthedocs.io/en/latest/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/age_of_empires.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,4 +206,3 @@ Build new houses when you're 2 of population down to the limit
- [Hera channel](https://www.youtube.com/@HeraAgeofEmpires2): Awesome to learn to play
- [Hera gameplay channel](https://www.youtube.com/@Hera-Gameplay): Good 1st person point of view games
- [Tatoh channel](https://www.youtube.com/@TaToHAoE): Good spanish content.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/ai.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,3 @@

## Philosophy of Artificial Intelligence
- [ChatGPT, la educación, y los loros](https://escritura.social/astrojuanlu/chatgpt-la-educacion-y-los-loros)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aiohttp.md
Original file line number Diff line number Diff line change
Expand Up @@ -344,4 +344,3 @@ Because `aiohttp` is asynchronous, its API is designed to make the most out of n
# References

- [Docs](https://docs.aiohttp.org/en/stable/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aleph.md
Original file line number Diff line number Diff line change
Expand Up @@ -580,4 +580,3 @@ Once you have the files that triggered the errors, the best way to handle them i
- [Docs](https://docs.alephdata.org/)
- [Support chat](https://alephdata.slack.com)
- [API docs](https://redocly.github.io/redoc/?url=https://aleph.occrp.org/api/openapi.json)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/alot.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,3 @@ directory](https://github.com/pazz/alot/tree/master/extra/themes).
* [Docs](https://alot.readthedocs.io/en/latest/)
* [Wiki](https://github.com/pazz/alot/wiki)
* [FAQ](https://alot.readthedocs.io/en/latest/faq.html)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/amazfit_band_5.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,3 @@ firmware](https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Amazfit-Band-5-F
you need to get the firmware from the [geek doing
forum](https://geekdoing.com/threads/amazfit-band-5-original-firmwares-resources-fonts.2331/)
though, so it is interesting to create an account and watch the post.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/analytical_web_reading.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,3 @@ Glasp is a “social web highlighter” for the desktop. This means that your h
# References

- [MakeUseof article](https://www.makeuseof.com/tools-annotate-highlight-web-pages-research-study/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
84 changes: 84 additions & 0 deletions docs/android_sdk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
[Android SDK Platform tools](https://developer.android.com/tools/releases/platform-tools) is a component for the Android SDK. It includes tools that interface with the Android platform, primarily adb and fastboot.

# [Installation](https://developer.android.com/tools/releases/platform-tools)

While many Linux distributions already package Android Platform Tools (for example `android-platform-tools-base` on Debian), it is preferable to install the most recent version from the official website. Packaged versions might be outdated and incompatible with most recent Android handsets.

- Download [the latest toolset](https://dl.google.com/android/repository/platform-tools-latest-linux.zip)
- Extract it somewhere in your filesystem
- Create links to the programs you want to use in your `$PATH`

Next you will need to enable debugging on the Android device you are testing. [Please follow the official instructions on how to do so.](https://developer.android.com/studio/command-line/adb)

# Usage


## Connecting over USB

To use `adb` with a device connected over USB, you must enable USB debugging in the device system settings, under Developer options. On Android 4.2 (API level 17) and higher, the Developer options screen is hidden by default.

### Enable the Developer options

To make it visible, [enable Developer options](https://developer.android.com/studio/debug/dev-options#enable). On Android 4.1 and lower, the Developer options screen is available by default. On Android 4.2 and higher, you must enable this screen.

- On your device, find the Build number option (Settings > About phone > Build number)
- Tap the Build Number option seven times until you see the message You are now a developer! This enables developer options on your device.
- Return to the previous screen to find Developer options at the bottom.

### Enable USB debugging

Before you can use the debugger and other tools, you need to enable USB debugging, which allows Android Studio and other SDK tools to recognize your device when connected via USB.

Enable USB debugging in the device system settings under Developer options. You can find this option in one of the following locations, depending on your Android version:

- Android 9 (API level 28) and higher: Settings > System > Advanced > Developer Options > USB debugging
- Android 8.0.0 (API level 26) and Android 8.1.0 (API level 27): Settings > System > Developer Options > USB debugging
- Android 7.1 (API level 25) and lower: Settings > Developer Options > USB debugging

### Test it works

If everything is configured appropriately you should see your device when launching the command `adb devices`.

#### Create udev rules if it fails

If you see the next error:

```
failed to open device: Access denied (insufficient permissions)
* failed to start daemon
adb: failed to check server version: cannot connect to daemon
```

It indicates an issue with permissions when `adb` tries to communicate with the device via USB. Here are some steps you can take to resolve this issue:

- Check USB permissions
- Ensure that you have the necessary permissions to access the USB device. If you're running on Linux, check if the device has appropriate udev rules.
- You can try adding your user to the `plugdev` group:

```bash
sudo usermod -aG plugdev $USER
```

- Make sure you have a `udev` rule for Android devices in `/etc/udev/rules.d/`. If not, you can create one by adding a file like `51-android.rules`:

```bash
sudo touch /etc/udev/rules.d/51-android.rules
```

- Add this line to the file to grant access to Android devices:

```bash
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```

- Reload the `udev` rules:

```bash
sudo udevadm control --reload-rules
sudo service udev restart
```

- Unplug and reconnect the USB device.
# References
- [Home](https://developer.android.com/tools/releases/platform-tools)
1 change: 0 additions & 1 deletion docs/android_tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,3 @@ As a non root user you can
can manually unplug it. Instead of leaving the mobile charge in the night and
stay connected at 100% a lot of hours until you unplug, charge it throughout the
day.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/anki.md
Original file line number Diff line number Diff line change
Expand Up @@ -485,4 +485,3 @@ If you want to interact with anki directly without opening the GUI application [
* [Homepage](https://apps.ankiweb.net/)
* [Forums](https://forums.ankiweb.net/)
* [Anki-Connect reference](https://foosoft.net/projects/anki-connect/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/anonymous_feedback.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,4 +182,3 @@ Once you have sent the anonymous feedback, be sure to:
* [Julian Cook article](https://www.linkedin.com/pulse/three-reasons-why-anonymous-workplace-feedback-better-julian-cook).
I haven't used it's text, but it's written for managers in their language,
it may help someone there.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/ansible_snippets.md
Original file line number Diff line number Diff line change
Expand Up @@ -604,4 +604,3 @@ To make the `command` idempotent you can use a `stat` task before.
command: mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
```
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/anticolonialism.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,3 @@
## Music
- [We Will Not Go Down (Song for Gaza Palestine) - Michael Heart](https://yewtu.be/watch?v=dlfhoU66s4Y)

[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/antifascism.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,3 @@ falls into a pity image then it may strengthen their victim role.
## Campañas
- [Crowdfunding para la libertad de los 6 de Zaragoza](https://www.goteo.org/project/libertad-6-de-zaragoza)

[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/antifascist_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,3 @@ citizen can freely do, we have only industrialized the process".

They've done a [crowdfunding](https://afd-muell.de/) to fund the legal process
that may result.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/antiracism.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,3 @@ Videos:
Podcasts:

- [Diario de Jadiya](https://deesonosehabla.com/episodios/episodio-2-jadiya/) ([link al archivo](https://dts.podtrac.com/redirect.mp3/dovetail.prxu.org/302/7fa33dd2-3f29-48f5-ad96-f6874909d9fb/Master_ep.2_Jadiya.mp3)): es algo que todo xenófobo debería de escuchar, es un diario de una chavala saharaui que formó parte del programa de veranos en familias españolas.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
4 changes: 4 additions & 0 deletions docs/antitourism.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@

# References

## Artículos

- [Abolir el turismo - Escuela de las periferias](https://www.elsaltodiario.com/turismo/abolir-turismo): Lleguemos a donde lleguemos, no puede ser que sea más fácil imaginar el fin del capitalismo que el fin del turismo.

## Libros

- [Verano sin vacaciones. Las hijas de la Costa del Sol de ana geranios](https://piedrapapellibros.com/producto/verano-sin-vacaciones-las-hijas-de-la-costa-del-sol/)
Expand Down
1 change: 0 additions & 1 deletion docs/antitransphobia.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,3 @@ mandatory for all society, and shouldn't be used against the trans people.
# References

* [Wikipedia page on Transphobia](https://en.wikipedia.org/wiki/Transphobia)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/database_architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,3 @@ Suitable for:
# References

* [Decoupling database migrations from server startup](https://pythonspeed.com/articles/schema-migrations-server-startup/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/domain_driven_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -250,4 +250,3 @@ for [click command line tests](click.md#injecting-fake-dependencies).

* Domain-Driven Design by Eric Evans.
* Implementing Domain-Driven Design by Vaughn Vermon.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/microservices.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,3 @@ backwards compatibility to avoid sudden dependency breakage.
* [Hands-On RESTful Python Web Services by Gaston
C.Hillar](https://www.packtpub.com/eu/application-development/hands-restful-python-web-services-second-edition):
I didn't like it at all.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/orm_builder_query_or_raw_sql.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,3 @@ through classical mappings to split the storage logic from the business one.

* [Raw SQL vs Query Builder vs ORM by Martin Thoma](https://levelup.gitconnected.com/raw-sql-vs-query-builder-vs-orm-eee72dbdd275)
* [ORMs vs Plain SQL in Python by Koby Bass](https://medium.com/@kobybum/orms-vs-plain-sql-in-python-2ba5362bca21)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/redis.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,3 @@ There are several ways to interact with a Redis server, such as:
# Reference

* [Real Python Redis introduction](https://realpython.com/python-redis/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/repository_pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,3 @@ class Task:
* [The repository pattern chapter of the Architecture Patterns with
Python](https://www.cosmicpython.com/book/preface.html) book by
Harry J.W. Percival and Bob Gregory.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/restful_apis.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,4 +216,3 @@ Build it with `docker-compose build test-sqlite` and run the tests with
# References

* [Rest API tutorial](https://restfulapi.net/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/service_layer_pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,3 @@ entire workflow for a use case.
* [The service layer pattern chapter of the Architecture Patterns with
Python](https://www.cosmicpython.com/book/chapter_04_service_layer.html) book by
Harry J.W. Percival and Bob Gregory.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/architecture/solid.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,3 @@ and less implementation dependent interaction schema.
* [Architecture Patterns with
Python](https://www.cosmicpython.com/book/preface.html) by
Harry J.W. Percival and Bob Gregory.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/argocd.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,4 +294,3 @@ This is tricky, because ingress is one of theses cases were you have to delete t
# References

* [Docs](https://argo-cd.readthedocs.io/en/stable/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/asyncio.md
Original file line number Diff line number Diff line change
Expand Up @@ -609,4 +609,3 @@ addopts = "--asyncio-mode=auto"
## Libraries to explore

* [Asyncer](https://github.com/tiangolo/asyncer)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/authentik.md
Original file line number Diff line number Diff line change
Expand Up @@ -922,4 +922,3 @@ This will output a link, that can be used to instantly gain access to authentik

* [Terraform provider docs](https://registry.terraform.io/providers/goauthentik/authentik/latest/docs)
* [Terraform provider source code](https://github.com/goauthentik/terraform-provider-authentik)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aws_savings_plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,4 +372,3 @@ Go to the [AWS savings plan
simulator](https://aws.amazon.com/savingsplans/compute-pricing/) and check the
different instances you were evaluating.

[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aws_snippets.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,3 @@ You can list the network interfaces that match the IP you're searching for
```bash
aws ec2 describe-network-interfaces --filters Name=association.public-ip,Values="{{ your_ip_address}}"
```
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/aws_waf.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,4 +259,3 @@ To process an problematic IP:
# References

* [Homepage](https://aws.amazon.com/waf/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/bash_snippets.md
Original file line number Diff line number Diff line change
Expand Up @@ -403,4 +403,3 @@ And then you'll have:
"other_property": "value"
}
```
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/bats.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,3 @@ Bats is most useful when testing software written in Bash, but you can use it to
# References
- [Source](https://github.com/bats-core/bats-core)
- [Docs](https://bats-core.readthedocs.io/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/bean_sql.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,3 @@ It will return the quarter in the format `YYYY-QX`.
- [Examples](https://aumayr.github.io/beancount-sql-queries/)


[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/beancount.md
Original file line number Diff line number Diff line change
Expand Up @@ -545,4 +545,3 @@ I'm going to try with [fava dashboards](fava_dashboards.md) and see how it goes
* [Awesome beancount](https://awesome-beancount.com/)
* [Docs in google](https://docs.google.com/document/d/1RaondTJCS_IUPBHFNdT8oqFKJjVJDsfsn6JEjBG04eA/edit)
* [Vim plugin](https://github.com/nathangrigg/vim-beancount)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/beautifulsoup.md
Original file line number Diff line number Diff line change
Expand Up @@ -755,4 +755,3 @@ soup = BeautifulSoup(s.replace(r"\"", '"').replace(r"\/", "/"), "html.parser")
# References

* [Docs](https://beautiful-soup-4.readthedocs.io/en/latest/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/beets.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,3 @@ Note that you just need to add `-A` for “don’t autotag”.
* [Git](https://github.com/beetbox/beets)
* [Docs](https://beets.readthedocs.io/en/stable/guides/main.html)
* [Homepage](https://beets.io/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/book_binding.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,3 @@ along one edge with a thick needle and sturdy thread.
* https://www.youtube.com/watch?v=Av_rU-yOPd4
* https://www.youtube.com/watch?v=9O4kFTOEh6k
* https://www.youtube.com/watch?v=XGQ5P8QVHSg
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/book_management.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,3 @@ This is a nasty operation, my suggestion is to export it with Calibre and then p
The search works by using a Python regular expression. All matched text is simply removed from the document or replaced using the replacement pattern. The replacement pattern is optional, if left blank then text matching the search pattern will be deleted from the document.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/bookwyrm.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,3 @@

- [Home](https://joinbookwyrm.com/)
- [Popular instances](https://joinbookwyrm.com/instances/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/botany/trees.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,3 @@ Below there are some guides to differentiate it from the
| Size | 30-45m | 10-15m (in Europe) |
| Same colour both sides | no (darker and glossy up) | yes |
| Where they grow | everywhere | very close to each other |
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/boto3.md
Original file line number Diff line number Diff line change
Expand Up @@ -676,4 +676,3 @@ Check the official docs to check the method arguments:

* [Git](https://github.com/boto/boto3)
* [Docs](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/calendar_management.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,3 @@ I've created a small tool that:
- Tells me the number of [pomodoros](roadmap_tools.md#pomodoro) that I have until the next event.
- Once a pomodoro finishes it makes me focus on the amount left so that I can prepare for the event
- Catches my attention when the event is starting.
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/calendar_versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,3 @@ article section.
# References

* [Home](https://calver.org/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/castellano.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,3 @@ Por su parte, el indefinido `una` toma generalmente la forma `un` cuando anteced

Al tratarse de sustantivos femeninos, con los demostrativos este, ese, aquel o con cualquier otro adjetivo determinativo, como todo, mucho, poco, otro, etc., deben usarse las formas femeninas correspondientes: esta hacha, aquella misma arma, toda el agua, mucha hambre, etc. (y no este hacha, aquel mismo arma, todo el agua, mucho hambre, etc.)

[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,3 @@ This serves two purposes:
# References

* [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/chezmoi.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,3 @@ the `velero` binary and save it to `~/.local/bin/velero`.
# References

- [Home](https://www.chezmoi.io/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/chromium.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@
```
apt-get install chromium
```
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/cleaning_tips.md
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
- If you need to clean the car headlights you can use a mixture of one squeezed lemon and two spoonfuls of baking soda
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/code_learning.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,3 @@ TBD
## Senior

TBD
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/coding/javascript/javascript.md
Original file line number Diff line number Diff line change
Expand Up @@ -1802,4 +1802,3 @@ document.getElementById("demo").innerHTML = x;
* [Re-introduction to JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript)
* [Chikwekwe's articles on cookies vs LocalStorage](https://medium.com/swlh/cookies-vs-localstorage-whats-the-difference-d99f0eb09b44)
* [Jeff's post on xmlhttprequest vs Fetch API](https://jeffdevslife.com/p/xmlhttprequest-vs-fetch-api/)
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
1 change: 0 additions & 1 deletion docs/coding/json/json.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,3 @@ apt-get install jq
```

Vim supports this linter through [ALE](vim_plugins.md#ale).
[![](not-by-ai.svg){: .center}](https://notbyai.fyi)
Loading

0 comments on commit 40a6e4f

Please sign in to comment.