Skip to content

Instantly share code, notes, and snippets.

View dx3mod's full-sized avatar

Михаил dx3mod

View GitHub Profile
@dx3mod
dx3mod / read_flash_by_usbasp.c
Last active November 2, 2025 15:49
Code to read the first 0x00ff bytes of the FLASH memory using the USBASP programmer
#include <libusb-1.0/libusb.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
libusb_context *ctx = NULL;
libusb_init_context(&ctx, NULL, 0);
libusb_device_handle *handle =
libusb_open_device_with_vid_pid(ctx, 0x16c0, 0x05dc);
@dx3mod
dx3mod / bearbeer.svg
Last active November 1, 2025 22:15
bearbeer
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@dx3mod
dx3mod / dead_simple_read_files_in_lwt.ml
Last active December 2, 2024 12:45
Dead simple example of using Lwt_engine to read files
let string_of_buffer buffer = Buffer.to_bytes buffer |> Bytes.unsafe_to_string
let read_file ?(perm = 0o777) filename =
let promise, resolver = Lwt.task () in
let fd = Unix.openfile filename [ O_RDONLY ] perm in
let buffer = Buffer.create 1024 in
let chunk = Bytes.create 1024 in
let chunk_length = Bytes.length chunk in
@dx3mod
dx3mod / dream_middleware_with_field_passing.ml
Created November 13, 2024 19:59
Example of a middleware (for Dream) with field passing.
open Lwt.Syntax
module Open_file_middleware = struct
(* Create a tag for finding the stored value by it. *)
let opened_file = Dream_pure.Message.new_field ()
(* Middleware function. *)
let open_file filename handler request =
(* Each request opens a file. *)
Lwt_io.with_file ~mode:Input filename @@ fun ic ->
@dx3mod
dx3mod / recursive_descent_tiny_json_parser.ml
Last active December 2, 2024 12:28
Парсиинг подмножества JSON методом рекурсивного спуска
(** Парсиинг подмножества JSON методом рекурсивного спуска *)
(** Представление JSON-значения *)
type json_value =
| Null
| Bool of bool
| Int of int
| String of string
| Assoc of (string * json_value) list
@dx3mod
dx3mod / setting.json
Created September 3, 2024 14:45
My VSCode setup
{
"workbench.startupEditor": "none",
"editor.fontFamily": "Cascadia Code",
"editor.fontSize": 12,
"editor.fontLigatures": true,
// settings
"cSpell.language": "en,ru",
"workbench.iconTheme": "bearded-icons",
"workbench.colorTheme": "Sequoia Retro",
"git.autofetch": true,
@dx3mod
dx3mod / simple_angstrom_passwd_parser.ml
Last active December 2, 2024 12:29
Простой парсер /etc/passwd файла с помошью парсеров-комбинаторов
(* Простой парсер /etc/passwd файла с помошью парсеров-комбинаторов.
utop # Passwd.user_of_string "dx3mod:x:1000:1000:Михаил:/home/dx3mod:/usr/bin/fish";;
- : Passwd.user =
{Passwd.name = "dx3mod"; hash = Passwd.Hide; uid = 1000; gid = 1000;
description = "Михаил"; home = "/home/dx3mod"; shell = "/usr/bin/fish"}
utop # let passwd_contents = In_channel.(with_open_text "/etc/passwd" input_all);;
utop # Passwd.of_string passwd_contents;;
- : Passwd.user list =
@dx3mod
dx3mod / how-to-create-portable-rpm-repo.md
Created October 3, 2023 18:16
Создание "переносимого" RPM репозитория

Создание "переносимого" RPM репозитория

Примеры выполнены для openSUSE!

Иногда у горячих голов появляется желание иметь чудо флешку со софтом, с помощью которой можно будет устанавливать софт на автономные компьютеры. В недалеком прошлом иметь репозиторий на CD/DVD было вполне нормально, но в современном мне 202X году это малоактуально.

Так как если у вас, например, корпоративная локальная сеть, то наиболее правильным вариантом было бы иметь просто локальный репозиторий на сервере, создать который, например, можно с помощью Repository Mirroring Tool. Но это enterprise и несколько слишком для обывательских задач, поэтому давайте рассмотрим более костыльный способ.

Немного теории