summaryrefslogtreecommitdiff
path: root/content/posts
diff options
context:
space:
mode:
author2026-01-31 20:38:50 +0300
committer2026-01-31 23:38:53 +0300
commit49458f5ffd5a48c465117ec27f6437683f75acc1 (patch)
treea99ee68116d10c2b2e5a70c442cdadec95ba793c /content/posts
downloadblog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.gz
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.bz2
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.xz
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.zip
initial
Diffstat (limited to 'content/posts')
-rw-r--r--content/posts/2021-02-13-jsonnet.md101
-rw-r--r--content/posts/2021-05-13-цифровая-гигиена.md91
-rw-r--r--content/posts/2022-05-30-возрождение.md27
-rw-r--r--content/posts/2022-05-31-golang-1.md44
-rw-r--r--content/posts/2023-01-12-gitrepo.md167
-rw-r--r--content/posts/2023-05-26-gist.md19
-rw-r--r--content/posts/2023-07-24-tls.md85
-rw-r--r--content/posts/2023-12-29-переезд.md28
-rw-r--r--content/posts/2024-01-03-архив.md14
-rw-r--r--content/posts/2024-02-21-tls.md54
-rw-r--r--content/posts/2024-06-01-вам-не-нужны-пуши.md110
-rw-r--r--content/posts/2024-06-02-книги-1.md21
-rw-r--r--content/posts/2024-07-13-joplin.md43
-rw-r--r--content/posts/2024-07-21-bbs.md33
-rw-r--r--content/posts/2024-09-26-hugo-wordpress.md16
-rw-r--r--content/posts/2024-10-06-цитатник-рунета.md64
-rw-r--r--content/posts/2024-10-17-книги-2.md39
-rw-r--r--content/posts/2024-11-15-hugo.md19
-rw-r--r--content/posts/2024-11-17-obsidian.md240
-rw-r--r--content/posts/2024-11-27-hyperlocality.md182
-rw-r--r--content/posts/2024-11-29-hobbies.md44
-rw-r--r--content/posts/2024-12-12-guessr.md130
-rw-r--r--content/posts/2024-12-15-conditional-operator-go.md35
-rw-r--r--content/posts/2024-12-15-posse.md81
-rw-r--r--content/posts/2024-12-17-infra.md120
-rw-r--r--content/posts/2024-12-30-irc.md75
-rw-r--r--content/posts/2024-12-31-new-year.md50
-rw-r--r--content/posts/2025-04-05-tabs-or-spaces.md400
-rw-r--r--content/posts/2025-05-19-nxpcms-2.md19
-rw-r--r--content/posts/2025-05-19-nxpcms.md77
-rw-r--r--content/posts/2025-06-08-my-setup.md31
-rw-r--r--content/posts/2025-08-02-meshtastic.md66
-rw-r--r--content/posts/2025-08-05-lets-code-3d.md154
-rw-r--r--content/posts/2025-08-09-makeup-organizer.md38
-rw-r--r--content/posts/2025-09-01-travel-1.md142
-rw-r--r--content/posts/2025-10-06-ai.md124
-rw-r--r--content/posts/2025-10-11-blog.md32
-rw-r--r--content/posts/2025-10-18-the-ghost-in-the-machine.md184
-rw-r--r--content/posts/2025-11-03-blog-deploy.md46
-rw-r--r--content/posts/2025-11-03-my-setup.md21
-rw-r--r--content/posts/2025-11-04-blog-deploy-2.md50
-rw-r--r--content/posts/2025-11-09-migration.md55
-rw-r--r--content/posts/2025-11-23-org.md253
-rw-r--r--content/posts/2025-12-02-httpsocalypse.md31
-rw-r--r--content/posts/2025-12-21-sicktech.md228
-rw-r--r--content/posts/2025-12-23-comments.md12
-rw-r--r--content/posts/2025-12-24-email.md99
-rw-r--r--content/posts/2025-12-27-osm.md40
-rw-r--r--content/posts/2025-12-28-philharmonic-park.md32
-rw-r--r--content/posts/2025-12-29-newyear-excel.md22
-rw-r--r--content/posts/2025-12-31-new-year.md28
-rw-r--r--content/posts/2025-12-31-qchat.md46
-rw-r--r--content/posts/_index.md8
-rw-r--r--content/posts/files/2021-02-13-jsonnet_logo.webpbin0 -> 47006 bytes
-rw-r--r--content/posts/files/2024-07-13-joplin_joplin.webpbin0 -> 111506 bytes
-rw-r--r--content/posts/files/2024-10-06-цитатник-рунета_bash_org.webpbin0 -> 20774 bytes
-rw-r--r--content/posts/files/2024-10-17-книги-2_Rama16wiki.webpbin0 -> 44726 bytes
-rw-r--r--content/posts/files/2024-11-17-obsidian_img/logo.webpbin0 -> 9244 bytes
-rw-r--r--content/posts/files/2024-11-17-obsidian_img/publish.webpbin0 -> 23110 bytes
-rw-r--r--content/posts/files/2024-11-17-obsidian_img/templater.webpbin0 -> 17140 bytes
-rw-r--r--content/posts/files/2024-11-27-hyperlocality_img/90e.webpbin0 -> 71910 bytes
-rw-r--r--content/posts/files/2024-11-27-hyperlocality_img/braindance.webpbin0 -> 92740 bytes
-rw-r--r--content/posts/files/2024-11-27-hyperlocality_img/camp.webpbin0 -> 115704 bytes
-rw-r--r--content/posts/files/2024-11-27-hyperlocality_img/in-internet.webpbin0 -> 136578 bytes
-rw-r--r--content/posts/files/2024-11-29-hobbies_dozor.webpbin0 -> 101246 bytes
-rw-r--r--content/posts/files/2024-12-12-guessr_logo.webpbin0 -> 112508 bytes
-rw-r--r--content/posts/files/2024-12-15-conditional-operator-go_ternary.webpbin0 -> 7408 bytes
-rw-r--r--content/posts/files/2024-12-15-posse_posse.webpbin0 -> 60800 bytes
-rw-r--r--content/posts/files/2024-12-17-infra_cover.webpbin0 -> 532556 bytes
-rw-r--r--content/posts/files/2024-12-30-irc_logo.webpbin0 -> 10130 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/1.webpbin0 -> 141164 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/2.webpbin0 -> 212740 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/2025.webpbin0 -> 163920 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/3.webpbin0 -> 446502 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/4.webpbin0 -> 146032 bytes
-rw-r--r--content/posts/files/2024-12-31-new-year_img/5.webpbin0 -> 190524 bytes
-rw-r--r--content/posts/files/2025-12-21-img1.jpgbin0 -> 162511 bytes
-rw-r--r--content/posts/files/2025-12-21-img2.jpgbin0 -> 88801 bytes
-rw-r--r--content/posts/files/2025-12-21-img3.pngbin0 -> 340974 bytes
-rw-r--r--content/posts/files/2025-12-21-sicktech.pngbin0 -> 263578 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo.jpgbin0 -> 227501 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_1.jpgbin0 -> 221795 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_10.jpgbin0 -> 127547 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_11.jpgbin0 -> 151264 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_12.jpgbin0 -> 121963 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_13.jpgbin0 -> 126052 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_14.jpgbin0 -> 225031 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_2.jpgbin0 -> 226528 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_3.jpgbin0 -> 234383 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_4.jpgbin0 -> 214772 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_5.jpgbin0 -> 179943 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_6.jpgbin0 -> 168080 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_7.jpgbin0 -> 161387 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_8.jpgbin0 -> 127482 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/photo_9.jpgbin0 -> 213571 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo.jpgbin0 -> 11353 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpgbin0 -> 14146 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpgbin0 -> 9230 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpgbin0 -> 10581 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpgbin0 -> 13124 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpgbin0 -> 14557 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpgbin0 -> 15019 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpgbin0 -> 15041 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpgbin0 -> 15339 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpgbin0 -> 14214 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpgbin0 -> 12279 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpgbin0 -> 10936 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpgbin0 -> 15840 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpgbin0 -> 11695 bytes
-rw-r--r--content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpgbin0 -> 15837 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpgbin0 -> 307509 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpgbin0 -> 284188 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpgbin0 -> 253734 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpgbin0 -> 242625 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpgbin0 -> 331494 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.pngbin0 -> 1966164 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpgbin0 -> 352290 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpgbin0 -> 216175 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.pngbin0 -> 1423681 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.pngbin0 -> 1487705 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpgbin0 -> 294826 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpgbin0 -> 183104 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpgbin0 -> 18056 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpgbin0 -> 12003 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpgbin0 -> 17032 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpgbin0 -> 17446 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpgbin0 -> 16794 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpgbin0 -> 29912 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpgbin0 -> 21623 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpgbin0 -> 10522 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpgbin0 -> 14036 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpgbin0 -> 25867 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpgbin0 -> 18394 bytes
-rw-r--r--content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpgbin0 -> 15546 bytes
-rw-r--r--content/posts/files/2025-12-29-newyear-excel_img/cover.pngbin0 -> 46582 bytes
-rw-r--r--content/posts/files/2025-12-29-newyear-excel_img/cover1.pngbin0 -> 14651 bytes
-rw-r--r--content/posts/files/2025-12-29-newyear-excel_img/new_year.odsbin0 -> 28669 bytes
-rw-r--r--content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsxbin0 -> 7859 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/1.webpbin0 -> 1307382 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/10.webpbin0 -> 1024096 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/11.webpbin0 -> 1031876 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/12.webpbin0 -> 373748 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/13.webpbin0 -> 574476 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/14.webpbin0 -> 385098 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/15.webpbin0 -> 381654 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/16.webpbin0 -> 2601414 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/17.webpbin0 -> 3254752 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/18.webpbin0 -> 1640240 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/19.webpbin0 -> 2578076 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/2.webpbin0 -> 1660606 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/20.webpbin0 -> 3858586 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/21.webpbin0 -> 4400828 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/22.webpbin0 -> 2109710 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/23.webpbin0 -> 988944 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/3.webpbin0 -> 5237948 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/4.webpbin0 -> 1403370 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/5.webpbin0 -> 1424414 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/6.webpbin0 -> 1129282 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/7.webpbin0 -> 1178630 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/8.webpbin0 -> 4411964 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/9.webpbin0 -> 755094 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_1.webpbin0 -> 68140 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_10.webpbin0 -> 119806 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_11.webpbin0 -> 114776 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_12.webpbin0 -> 27904 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_13.webpbin0 -> 36594 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_14.webpbin0 -> 29198 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_15.webpbin0 -> 30840 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_16.webpbin0 -> 83166 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_17.webpbin0 -> 154656 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_18.webpbin0 -> 99452 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_19.webpbin0 -> 94816 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_2.webpbin0 -> 49558 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_20.webpbin0 -> 144248 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_21.webpbin0 -> 179974 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_22.webpbin0 -> 56148 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_23.webpbin0 -> 64300 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_3.webpbin0 -> 162906 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_4.webpbin0 -> 45526 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_5.webpbin0 -> 48660 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_6.webpbin0 -> 52192 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_7.webpbin0 -> 44236 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_8.webpbin0 -> 110076 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/preview_9.webpbin0 -> 83176 bytes
-rw-r--r--content/posts/files/2025-travel-1_img/saologo.pngbin0 -> 20791 bytes
-rw-r--r--content/posts/files/hype_curve.pngbin0 -> 130810 bytes
-rw-r--r--content/posts/files/laughing-man.jpegbin0 -> 234679 bytes
-rw-r--r--content/posts/files/lets-code-3d_img/1.jpgbin0 -> 86020 bytes
-rw-r--r--content/posts/files/lets-code-3d_img/2.jpgbin0 -> 58451 bytes
-rw-r--r--content/posts/files/lets-code-3d_img/3.pngbin0 -> 108360 bytes
-rw-r--r--content/posts/files/lets-code-3d_img/4.jpgbin0 -> 75461 bytes
-rw-r--r--content/posts/files/lets-code-3d_result.stlbin0 -> 3684 bytes
-rw-r--r--content/posts/files/lets-code-3d_source.scad66
-rw-r--r--content/posts/files/makeup-organizer_img/1.pngbin0 -> 180919 bytes
-rw-r--r--content/posts/files/makeup-organizer_img/2.pngbin0 -> 354046 bytes
-rw-r--r--content/posts/files/makeup-organizer_img/3.pngbin0 -> 115406 bytes
-rw-r--r--content/posts/files/makeup-organizer_organizer.tar.zstbin0 -> 660078 bytes
-rw-r--r--content/posts/files/meshtastic_img/tbeam.jpgbin0 -> 269445 bytes
-rw-r--r--content/posts/files/meshtastic_img/tbeam.webpbin0 -> 116662 bytes
199 files changed, 4236 insertions, 0 deletions
diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md
new file mode 100644
index 0000000..e4ea27e
--- /dev/null
+++ b/content/posts/2021-02-13-jsonnet.md
@@ -0,0 +1,101 @@
+---
+categories:
+- Без рубрики
+date: '2021-02-13T22:08:19Z'
+image: files/2021-02-13-jsonnet_logo.webp
+tags:
+- go
+- it
+- разное
+title: Jsonnet
+---
+
+Редко такое бывает, что случайно натыкаешься на какую-то технологию и она
+вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня
+такой технологией стал [Jsonnet](https://jsonnet.org/) от Google.
+
+В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит
+не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык,
+результатом выполнения которого будет сформированый JSON (и не только)
+документ(или несколько документов[^1]).
+[^1]:https://jsonnet.org/learning/getting_started.html#multi
+
+Если интересно, рекомендую сразу переходить к туториалу —
+https://jsonnet.org/learning/tutorial.html.
+
+## Почему же это круто?
+
+Ну, во-первых, он реально мощный и простой. С его помощью можно формировать
+документы любой сложности.
+
+Во-вторых, его можно встроить в свою программу на Go (и не только, но на Go —
+проще всего — https://jsonnet.org/ref/bindings.html), и это даст бесплатно
+мощный DSL для написания очень гибких конфигов.
+
+В третьих, ну камон, приятно же когда компьютер берет на себя рутинную работу по
+формированию больших и сложных JSON’ов!
+
+## Пример
+
+Накидал простенький пример который формирует конфигурацию пайплайна для
+гипотетической CI системы:
+
+```json
+local map(arr, predicate) = // определяем функцию map
+if std.length(arr) == 0 then
+ []
+ else
+ [
+ predicate(arr[0])
+ ] + map(arr[1:], predicate); // функциональненько!
+local tasks = [['go1.14', '1.14-alpine'],['go1.15', '1.15-alpine'],['go1.16-RC', '1.16-rc-alpine']];
+local commands = ['go build', 'go test']; // Общая часть
+{ // Результирующий JSON
+ pipeline: map(tasks, function (task) { // Вызов map от tasks
+ name: task[0],
+ image: "golang:"+task[1],
+ commands: commands,
+ })
+}
+```
+
+Результат:
+
+```json
+{
+ "pipeline": [
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.14-alpine",
+ "name": "go1.14"
+ },
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.15-alpine",
+ "name": "go1.15"
+ },
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.16-rc-alpine",
+ "name": "go1.16-RC"
+ }
+ ]
+}
+```
+
+Круть же!
+
+Да, на небольшом примере не очень показательно, но даже тут, скажем, при добавлении новой цели сборки будет достаточно слегка подправить массив tasks и автоматически сформируется все остальное, а не копипаст целой секции и ручная правка в нужных местах.
+
+Я оставил за скобками то, что этот шаблонизатора позволяет формировать не только JSON но и фактически любой другой текстовый формат. И даже из одного скрипта формировать несколько документов разного формата. При этом локальные переменные будут использоваться общие. Теоретически, если упороться, можно одним скриптом сформировать весь /etc на новом сервере. Почему бы и нет?:)
+
+Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! \ No newline at end of file
diff --git a/content/posts/2021-05-13-цифровая-гигиена.md b/content/posts/2021-05-13-цифровая-гигиена.md
new file mode 100644
index 0000000..d9fcede
--- /dev/null
+++ b/content/posts/2021-05-13-цифровая-гигиена.md
@@ -0,0 +1,91 @@
+---
+categories:
+- Без рубрики
+date: '2021-05-13T15:37:01Z'
+tags:
+- it
+- паранойя
+- разное
+title: Немного о цифровой гигиене
+---
+
+## Вступление
+
+Как раз вступление тут особо и не нужно. Ни для кого не открою америки, что в
+современном цифровом обществе все мы являемся товаром для интернет-медиа
+гигантов, того же фейсбука да гугла. Не скажу что это для меня, как личности
+опасно или вредно, но мне это неприятно. Решил с этим что-то делать.
+
+## Вводные
+
+- В интернетах я уже очень давно и много где и как “наследил” своими данными. И
+ с этим уже ничего не поделать.
+- У меня в телефоне и на всех компьютерах куча приложений работающих с
+ интернетом, и не только мессенджеры.
+- У меня достаточно узкий круг людей с кем бы я хотел быть на связи, и не хочу
+ чтобы мои действия как-то ухудшили или усложнили их жизнь.
+- Вопрос анонимности для меня не стоит, я не анонимен и это моё осознанное
+ решение. Я законопослушный человек и прятаться мне не от кого. И да, я знаю
+ что этот тезис стараниями либерах нынче пытаются выставить как глупость, но
+ нет. Глупость — это слушать либерах, а не иметь свою голову на плечах. И
+ контртезис “Гы гы гы, ну раз тебе нечего скрывать — поставь камеру у себя в
+ спальне и ванной” даже комментировать не буду в силу его ущербности.
+- Я пользователь техники Apple и с этим уже ничего не поделать, менять целиком
+ экосистему для меня не вариант (это очень дорого, бессмысленно, а местами и
+ невозможно, например, рабочий мак мне поменять не на что). И да, есть наивная
+ надежда что у яблок в плане приватности всё получше чем у ведроидов. Во всяком
+ случае по сравнению со стоком. Гиковские прошивки с вырезанными зондами в
+ расчет не беру, верю что у них совсем всё хорошо.
+
+## Цели
+
+1. Уменьшить информационный шум вокруг себя и тем самым улучшить качество жизни.
+2. Уменьшить свой “информационный след”
+3. Иметь больше контроля над своими данными, чтобы мои волосы стали мягкими и
+ шелковистыми.
+
+## Наброски плана
+
+1. Перейти максимально на собственные ресурсы, которые я контролирую и которые
+ *точно* не сливают ничего налево.Примерно так: социалки =>
+ <https://soc.neonxp.ru/> , GitHub =&gt; <https://gitrepo.ru/> , Облачные
+ диски =&gt; локальный NAS Synology и т.д.
+2. Мне надо сократить мессенджеры в идеале до одного, не считая корпоративного
+ рабочего. Тут всё просто — оставляю Telegram, остальные сношу.
+3. Мне надо отказаться от неэтичных социальных сетей, где я не могу полностью
+ контролировать свои данные.
+4. При отказе от социальных сетей чтобы не доставить проблем моим контактам надо
+ оставить “новый адрес” по которому со мной можно связаться и, например, этот
+ пост. Я не хочу чтобы для всех мои действия были прозрачны и понятны, а не
+ “молча удалиться” оставив кого-то в недоумении.
+5. Везде где возможно отключить или заблокировать телеметрию, чтобы как можно
+ меньше моих данных неконтролируемо утекало. Да, полностью не перекрыть, но
+ сократить возможно.
+6. Для связи с “миром” оставить только e-mail как наиболее удобный асинхронный
+ метод коммуникации.
+
+## Дальнейшие шаги
+
+1. Превратить наброски плана в цельный план. Написать манифест? Возможно.
+2. Подготовить “визитку” с актуальными контактами и объяснением что произошло.
+ Причем как в виде изображения, так и текста.
+3. Вышеуказанную визитку поместить на уже неактуальных для меня местах обитания
+ (инстаграм, вк и проч). Удаляться не хочу. Жалко контент за столько лет, да и
+ пункт 3 предыдущего абзаца.
+4. Удалить “лишние” приложения от вышеуказанных сервисов.
+5. Разлогиниться в этих сервисах и очистить браузеры от них, чтобы исключить
+ треккинг на сторонних сайтах.
+6. ?????
+7. PROFIT!
+
+## Обратная связь
+
+Очень бы хотелось получить обратную связь по моему плану. Комментарии про то что
+упустил и предложения улучшений приветствуются в комментариях к посту, в
+комментариях к [телеграм каналу](https://t.me/neonxp), или на почту
+<a.kiryukhin@mail.ru> (кстати, стоит наверное и почту перевести к себе? Но пока
+уровень сервиса врядли смогу адекватный обеспечить)
+
+*UPD:* Да, я знаю что уже данные так и останутся в чужих руках, но со временем
+они будут всё больше и больше протухать, а мой “цифровой профиль” терять
+актуальность. Ведь я не скала, я тоже меняюсь и ухожу от этого профиля. \ No newline at end of file
diff --git a/content/posts/2022-05-30-возрождение.md b/content/posts/2022-05-30-возрождение.md
new file mode 100644
index 0000000..c6721c8
--- /dev/null
+++ b/content/posts/2022-05-30-возрождение.md
@@ -0,0 +1,27 @@
+---
+categories:
+- Без рубрики
+date: '2022-05-30T23:37:00Z'
+tags:
+- блог
+- моё
+title: Возрождение?
+---
+
+Определенно, вести блог это не мое. Учитывая, что последний пост был год назад —
+sad but true.
+
+Не буду говорить, что “вот сейчас то уж точно буду вести регулярно”. Нет не
+буду.
+
+Но раз в полгода-год, наверное все же буду.
+
+Из новостей, что не писал в канал, наверное, только парочка:
+
+1. сейчас всё свободное время пилю свой петпроджект 😉 Пока что выходит ух какая
+ красота. Но об этом как-нибудь в другой раз, как говорится, пол работы не
+ показывают 🙂
+2. в ленивом режиме начали заниматься вопросами улучшения жилищных условий.
+ Давно пора.
+
+До встречи когда-нибудь потом 🙂 \ No newline at end of file
diff --git a/content/posts/2022-05-31-golang-1.md b/content/posts/2022-05-31-golang-1.md
new file mode 100644
index 0000000..75e1b64
--- /dev/null
+++ b/content/posts/2022-05-31-golang-1.md
@@ -0,0 +1,44 @@
+---
+categories:
+- Без рубрики
+date: '2022-05-31T01:00:00Z'
+tags:
+- go
+- it
+title: Golang подборка 1
+---
+
+Просто собираю подборку интересных ссылок по гошке на почитать потом.
+
+- [Extra](https://github.com/neonxp/extra) — Моё. Пакет с разными полезными
+ функциями без дополнительных зависимостей.
+- Серия видосов про создание игры в стиле Animal Crossing на golang с помощью
+ raylib —
+ https://www.youtube.com/watch?v=iWp-mCIQgMU&list=PLVotA8ycjnCsy30WQCwVU5RrZkt4lLgY5&index=1
+- Самописный распределенный типа Postgres
+ https://notes.eatonphil.com/distributed-postgres.html. Под капотом raft от
+ hashicorp, boltdb и самое интересное — парсинг SQL
+- Рассчет расстояния между двумя Geo точками:
+
+```go
+import "math"
+...
+// https://en.wikipedia.org/wiki/Haversine_formula
+func GetDistance(lat1, lon1, lat2, lon2 float64) float64 {
+ lat1 *= math.Pi / 180
+ lon1 *= math.Pi / 180
+ lat2 *= math.Pi / 180
+ lon2 *= math.Pi / 180
+ return 12742 * math.Asin(
+ math.Sqrt(
+ math.Pow(math.Sin((lat2-lat1)/2), 2) +
+ math.Cos(lat1) *
+ math.Cos(lat2) *
+ math.Pow(math.Sin((lon2-lon1)/2), 2)
+ )
+ )
+}
+```
+
+- [god](https://github.com/pioz/god) — Утилита подгатавливающая демоны из go
+ программы. Для меня ценное — что генерит systemd конфиги. \ No newline at end of file
diff --git a/content/posts/2023-01-12-gitrepo.md b/content/posts/2023-01-12-gitrepo.md
new file mode 100644
index 0000000..7e521c3
--- /dev/null
+++ b/content/posts/2023-01-12-gitrepo.md
@@ -0,0 +1,167 @@
+---
+categories:
+- Мои проекты
+date: '2023-01-12T20:22:00Z'
+tags:
+- it
+- моё
+title: GitRepo.ru
+---
+
+Сегодня серьезно переделал свой хостинг [репозиториев
+кода](https://gitrepo.ru/):
+
+- Переехал на большой арендованный сервак
+- Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose
+- Gitea заменил на её форк [Forgejo](https://forgejo.org/)
+- Впилил CI/CD на основе [Woodpecker CI](https://woodpecker-ci.org/)
+
+Приглашаю пользоваться заместо бездуховного западного github:
+<https://gitrepo.ru/>
+
+Сервер физически находится в датацентре в Москве у весьма годного провайдера
+Selectel.
+
+Тем более, время сейчас неспокойное и неизвестно когда github станет недоступен
+для РФ, а GitRepo — он вот тут, в нашей стране.
+
+# Немного про устройство
+
+Расскажу немного как я организовал себе Ops сервиса.
+
+У меня на руках `docker-compose.yml` который полностью описывает всю
+конфигурацию сервака, примерно так:
+
+```yml
+version: "3"
+services:
+ caddy:
+ image: caddy:2.6.2-alpine
+ container_name: gateway
+ restart: unless-stopped
+ ports:
+ - "80:80"
+ - "443:443"
+ - "443:443/udp"
+ volumes:
+ - ./Caddyfile:/etc/caddy/Caddyfile
+ - caddy_data:/data
+ - caddy_config:/config
+ networks:
+ - gateway
+ git:
+ image: codeberg.org/forgejo/forgejo:1.18.0-1
+ container_name: git
+ environment:
+ - USER_UID=1000
+ - USER_GID=1000
+ - TZ=Europe/Moscow
+ - USER=git
+ - GITEA__database__DB_TYPE=postgres
+ - GITEA__database__HOST=db:5432
+ - GITEA__database__NAME=${PG_NAME}
+ - GITEA__database__USER=${PG_USER}
+ - GITEA__database__PASSWD=${PG_PASS}
+ restart: always
+ networks:
+ - gitea
+ - gateway
+ volumes:
+ - /home/git/.ssh/:/data/git/.ssh
+ - forgejo:/data
+ - /etc/timezone:/etc/timezone:ro
+ - /etc/localtime:/etc/localtime:ro
+ ports:
+ - "127.0.0.1:2222:22"
+ depends_on:
+ db:
+ condition: service_healthy
+ db:
+ image: postgres:13
+ restart: always
+ environment:
+ - POSTGRES_USER=${PG_USER}
+ - POSTGRES_PASSWORD=${PG_PASS}
+ - POSTGRES_DB=${PG_NAME}
+ healthcheck:
+ test: /usr/bin/pg_isready
+ interval: 5s
+ timeout: 10s
+ retries: 120
+ networks:
+ - gitea
+ volumes:
+ - postgres:/var/lib/postgresql/data
+ woodpecker-server:
+ image: woodpeckerci/woodpecker-server:latest
+ volumes:
+ - woodpecker-server-data:/var/lib/woodpecker/
+ environment:
+ - WOODPECKER_OPEN=true
+ - WOODPECKER_GITEA=true
+ - WOODPECKER_GITEA_URL=https://gitrepo.ru
+ - WOODPECKER_GITEA_CLIENT=${GITEA_CLIENT}
+ - WOODPECKER_GITEA_SECRET=${GITEA_SECRET}
+ - WOODPECKER_HOST=https://ci.gitrepo.ru
+ - WOODPECKER_ADMIN=neonxp
+ - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
+ networks:
+ - gitea
+ - gateway
+ depends_on:
+ - git
+ woodpecker-agent:
+ image: woodpeckerci/woodpecker-agent:latest
+ command: agent
+ restart: always
+ depends_on:
+ - woodpecker-server
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ environment:
+ - WOODPECKER_SERVER=woodpecker-server:9000
+ - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
+ networks:
+ - gitea
+volumes:
+ woodpecker-server-data:
+ caddy_data:
+ caddy_config:
+ forgejo:
+ postgres:
+networks:
+ gateway:
+ gitea:
+ external: false
+
+```
+
+а рядом лежит `.env` файлик с значениями переменных `${...}`.
+
+Запускаю деплой я с локального компьютера, предварительно добавив удаленный
+сервер в [контекст
+докера](https://docs.docker.com/engine/context/working-with-contexts/):
+
+```
+# Создаю новый контекст для удаленного сервера
+docker context create gitrepo --docker "host=ssh://gitrepo.ru"
+# Все последующие docker команды выполняются на удаленном сервере
+docker use gitrepo
+# Возвращаюсь в локальный контекст
+docker use default
+```
+
+# Оставшиеся проблемы
+
+Сейчас так получается, что Caddyfile должен лежать на удаленном сервере, т.к.
+часть конфига
+
+```yml
+ volumes:
+ - ./Caddyfile:/etc/caddy/Caddyfile
+```
+
+выполняется в контексте именно удаленного сервера, а значит при его апдейте на
+локальном серваке приходится делать SCP этого файла на сервак. Такое себе.
+
+Как это решить — есть интересная идея, но это уже в другой раз. \ No newline at end of file
diff --git a/content/posts/2023-05-26-gist.md b/content/posts/2023-05-26-gist.md
new file mode 100644
index 0000000..25b362f
--- /dev/null
+++ b/content/posts/2023-05-26-gist.md
@@ -0,0 +1,19 @@
+---
+categories:
+- Мои проекты
+date: '2023-05-26T17:40:21Z'
+tags:
+- it
+- моё
+title: Импортозамещение Gist
+---
+
+
+И в догонку к комментариям, запустил на своём серваке свой аналог Gist’ов от
+GitHub.
+
+Вот и он: [gist.neonxp.ru](https://gist.neonxp.ru/)
+
+Пользуйтесь 🙂
+
+[Другие мои проекты](/projects) \ No newline at end of file
diff --git a/content/posts/2023-07-24-tls.md b/content/posts/2023-07-24-tls.md
new file mode 100644
index 0000000..43ee345
--- /dev/null
+++ b/content/posts/2023-07-24-tls.md
@@ -0,0 +1,85 @@
+---
+categories:
+- Без рубрики
+date: '2023-07-24T20:04:17Z'
+tags:
+- it
+- Россия
+- TLS
+title: Немного мыслей о TLS (HTTPS) в России
+---
+
+Накопилось немного мыслей относительно того, что может грозить нам (и мне) в
+связи с трендом на “балканизацию” рунета.
+
+И самое болезненное место — HTTPS который нынче стандарт де-факто в современных
+интернетах. А болезненное оно потому, что целиком и полностью контролируется
+другой стороной нынешного противостояния. Все доверенные удостоверяющие центры
+принадлежат странам “коллективного запада”. Помню, были ещё какие-то китайские,
+вроде, но с ними был какой-то скандал и не факт что они есть.
+
+Есть относительно [доверенный УЦ от Минцифры](https://www.gosuslugi.ru/tls). Это
+здорово и я это всецело поддерживаю. Вот только есть момент. Он не для нас,
+простых людей, и при попытке его получить видим то, что на скриншоте ниже. А
+сранный Firefox вообще хочет его внести в черный список, чтобы даже специально
+его нельзя было установить. В общем, пока его я поставить не могу даже при всём
+желании.
+
+Какие ещё альтернативы есть, если нас вдруг прокинет Let’s encrypt?
+
+1. Не использовать HTTPS вообще. Я же не магазин и у меня нет форм логина,
+ которые требуют шифрования. Так-то оно так, да не так. Браузеры уже сейчас
+ очень косо смотрят на “обычные”, не HTTPS сайты, а в дальнейшем, не удивлюсь
+ если перестанут открывать вообще. Так же на HTTP сайтах не работают
+ прикольные браузерные API типа геолокации (наверное, это в каком-то роде даже
+ плюс 😉 ). Ну и ещё проблема, что, например, этот сайт без HTTPS вообще не
+ может работать, ибо для доменов зоны .dev насильно включено HSTS и они не
+ могут работать не по HTTPS. Последнее то я решу старым добрым доменом
+ neonxp.ru, но тем не менее.
+2. Самоподписанные сертификаты. Вот это уже более менее похоже на правду! Да,
+ такие сайты надо добавлять в исключения и мороки с сертификатами чуть больше.
+ Но тут та же история с доменами .dev. Для них самоподписаные не катят. Выход
+ — опять таки старый добрый neonxp.ru.
+
+К чему я всё это? А то что в случае “балканизации” мы остаемся без нормального
+валидного HTTPS. Для себя я выбрал второй путь, с самоподписанными
+сертификатами. Чекнуть как работает можно на зеркале блога на
+<https://neonxp.ru> . Там я выпустил сам себе сертификат на домен от своего
+собственного удостоверяющего центра 🙂 А доверять ему или не доверять — дело
+посетителей сайта.
+
+Если доверяете мне то [вот сертификат моего УЦ](/files/root_ca.crt), а установка
+такая же как сертификата Минцифры 🙂
+
+Ну и совсем краткая инструкция как выпустить сертификат для себя:
+
+1. `openssl genrsa -out root_ca.key 4096` — создание секретного ключа УЦ (должен
+ храниться в безопасности!)
+2. `openssl req -x509 -new -key root_ca.key -days 3650 -out root_ca.crt` —
+ создаем сам сертификат УЦ (он НЕ секретный). Я указал срок действия 10 лет,
+ но это потому что я ленивый и не хочу его перегенеривать каждый год. Так
+ делать не советую.
+3. `openssl genrsa -out server.key 4096` — создаем секретный ключ уже для
+ конкретного сайта (и поддоменов)
+4. `openssl req -new -key server.key -subj "/CN=neonxp.ru/CN=*.neonxp.ru" -out
+ server.csr` — генерируем файл запроса для конкретного сайта
+5. Создаем файл `openssl.cnf` с примерно таким содержимым:
+ ```
+ [SAN]
+ subjectAltName = @alt_names
+ [alt_names]
+ DNS.1 = neonxp.ru
+ DNS.2 = *.neonxp.ru
+ ```
+6. И, наконец, создаем сертификат для сайта, который будет подписан ключами
+ server.key и root\_ca.key (то есть и своим удостоверяющим центром тоже):
+ ```
+ openssl x509 -req -in server.csr -CA root_ca.crt -CAkey root_ca.key -CAcreateserial -out server.crt -days 365 -extensions SAN -extfile openssl.cnf
+ ```
+
+В общем, всё. Полученные root_ca.crt (но не root_ca.key!), server.key и
+server.crt можно вносить в конфигурацию используемого вебсервера. А так же
+внести root_ca.crt в доверенные для себя.
+
+Так у меня выглядят [сертификат на сайт](/img/posts/20230724_204209.webp) и
+[сертификат УЦ](/img/posts/20230724_204325.webp). \ No newline at end of file
diff --git a/content/posts/2023-12-29-переезд.md b/content/posts/2023-12-29-переезд.md
new file mode 100644
index 0000000..c4a17bf
--- /dev/null
+++ b/content/posts/2023-12-29-переезд.md
@@ -0,0 +1,28 @@
+---
+categories:
+- Без рубрики
+date: '2023-12-29T00:15:44Z'
+tags:
+- блог
+- разное
+title: Переезд и проблемы обновления
+---
+
+Немного новостей.
+
+Начну с грустного. Крайне неудачно обновил forgejo на gitrepo.ru. В общем, БД
+побилась без возможности восстановления. Репозитории я спас, обращайтесь —пришлю
+архив репозиториев.
+
+Очень грустно, я был крайне расстроен. Штош, теперь настроил зато постоянные
+бекапы БД и данных на локальный NAS. Прошу прощения у пользователей, я очень
+виноват.
+
+А теперь о негрустном. Всё же решил что мне больше нравится основным домен не
+.dev, а именно .ru. Времена неспокойные — лучше перестраховаться и сделать
+ставку именно на национальный домен, а не на международный. К тому же у .dev
+домена есть неприятная особенность, что он требует обязательно валидного (то
+есть одобренного западными “партнерами”) сертификата. А это не дело, как я уже
+[писал в заметке](https://neonxp.ru/posts/2023-07-24-tls/).
+
+Пока что как-то так 🤷🏻‍♂️ \ No newline at end of file
diff --git a/content/posts/2024-01-03-архив.md b/content/posts/2024-01-03-архив.md
new file mode 100644
index 0000000..65a5be8
--- /dev/null
+++ b/content/posts/2024-01-03-архив.md
@@ -0,0 +1,14 @@
+---
+categories:
+- Без рубрики
+date: '2024-01-03T17:28:40Z'
+tags:
+- блог
+title: Архив
+---
+
+Покопавшись по вебархиву смог вытащить древние посты с разных моих старых
+блогов. В основном, кринжовые, конечно, но это моя жизнь, как она была в то
+время. Так что пусть будут.
+
+[Архив блога](https://neonxp.ru/archive/) \ No newline at end of file
diff --git a/content/posts/2024-02-21-tls.md b/content/posts/2024-02-21-tls.md
new file mode 100644
index 0000000..65f8dfa
--- /dev/null
+++ b/content/posts/2024-02-21-tls.md
@@ -0,0 +1,54 @@
+---
+categories:
+- Без рубрики
+date: '2024-02-21T21:51:29Z'
+tags:
+- it
+- Россия
+- TLS
+title: Конфигурация HTTPS с сертификатом от Минцифры
+---
+
+Третьего дня потратил достаточно много времени на установку на данном сайте
+сертификата от Минцифры.А поскольку сертификат краткоживущий (90 дней) — заметка
+мне самому пригодится на будущее.
+
+Началось всё с того, что я с удивлением обнаружил, что на госуслугах теперь
+можно выпустить сертификат для домена физлицу.Это меня обрадовало, хотя ранее я
+приунывал что нет никакой альтернативы простым смертным. Теперь есть.
+<del>Закрывайте буржуйнет.</del>
+
+Поехали!
+
+1. Идём сюда: https://www.gosuslugi.ru/627603/1/form
+2. По приведенной инструкции генерируем файл запроса сертификата. Вкратце так (только вместо neonxp.ru указываем свой домен):
+ ```
+ openssl req -out neonxp.ru.csr -new -subj "/C=RU/CN=neonxp.ru" -addext "keyUsage = digitalSignature, keyEncipherment" -addext "subjectAltName=DNS: neonxp.ru" -addext "extendedKeyUsage = serverAuth" -newkey rsa:2048 -nodes -keyout neonxp.ru.key
+ ```
+ Важно! Нужно сохранить файл ключа neonxp.ru.key в надежном месте. Если он попадет в чужие руки — нужно будет отзывать сертификат и начинать всё заново! SAN и Wildcard пока не поддерживается, но что имеем — то и имеем. Но по слухам таки будут, как минимум SAN.
+3. Полученный файл csr загружаем там же на госуслуги
+4. Ждём не долго (реально недолго, у меня прислали сертификат буквально через несколько минут!)
+5. В ответ придёт файл с рандомным названием. Сохраняем его туда, где лежат другие файлы под названием “домен.crt”
+6. Скачиваем корневой и промежуточные сертификаты:
+ ```
+ wget https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer
+ wget https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer
+ ```
+7. Преобразуем скачанный сертификат в формат PEM:
+ ```
+ openssl x509 -in neonxp.ru.crt -out neonxp.cer -outform PEM
+ ```
+8. Соединяем свой сертификат и минцифровские в один бандл:
+ ```
+ cat neonxp.cer russian_trusted_sub_ca_pem.cer russian_trusted_root_ca_pem.cer > chain.cer
+ ```
+9. Используем полученный бандл и сгенерированный в пункте 2 файл ключа в конфигурации вебсервера. У меня используется Caddy, поэтому мой конфиг выглядит так:
+ ```
+ neonxp.ru:443 {
+ tls /data/ssl/chain.cer /data/ssl/neonxp.ru.key
+ ...
+ }
+ ```
+
+В общем-то, всё. Как настанет время продлевать — я дополню заметку деталями
+именно продления. Если будут вопросы — пишите, попробуем решить.
diff --git a/content/posts/2024-06-01-вам-не-нужны-пуши.md b/content/posts/2024-06-01-вам-не-нужны-пуши.md
new file mode 100644
index 0000000..4d5960f
--- /dev/null
+++ b/content/posts/2024-06-01-вам-не-нужны-пуши.md
@@ -0,0 +1,110 @@
+---
+categories:
+- Без рубрики
+date: '2024-06-01T21:05:55Z'
+tags:
+- it
+- разное
+title: Вам не нужны пуши!
+---
+
+Я не шучу. Серьёзно.
+
+С неделю назад меня осенила крайне простая мысль, которая ранее, почему-то, мне
+не приходила.
+
+<!--more-->
+
+Но сначала, две вводных, или, скажем, тезиса, которые послужили для вывода этой
+мысли:
+
+## Тезис №1
+
+Меня действительно огорчает количество пушей которые постоянно сыплются мне на
+телефон. Это вызывает раздражение сразуна нескольких уровнях:
+
+1. Сам момент их прихода — я автоматически смотрю на телефон, что же пришло
+2. Если я игнорирую пуш — он потом висит в шторке вызывая раздражение
+3. Очень часто это сранная реклама от какого-нибудь озона или магнит маркета
+ (бывш. KazanExpress)
+
+Но бывают же и полезные пуши! Например, уведомления от Госуслуг или информация
+что заказ доставлен ну илисообщения в мессенджерах.
+
+То есть, как будто, ради вышеуказанных полезных пушей, я должен терпеть и тонну
+бесполезного говна!
+
+## Тезис №2
+
+Ну и вторая вводная, которая, какмне кажется подтолкнула меня — я всегда любил
+_простые_ и открытые технологии, какдревние, типа RSS, e-mail, irc, так и новые,
+но такие же простые и открытые, как, например, gemini (да, сейчас он наэтом
+сайте сломан, но я его починю на днях, честно!), федиверс и прочие подобные.
+Кстати, сейчас подумалось, что именноэти качества меня и так сильно влюбили в
+golang 🙂
+
+## Та самая простая мысль
+
+На стыке двух вышеуказанных тезисов у меня внезапно для себя самого и
+синтезировалась крайне простая мысль:
+
+> **<u>Действительно</u>** важные вещи всегда приходят на электропочту, а
+> сообщения в мессенджерах — это не срочно!
+
+Таким образом, запретив на телефоне вообще все пуши кроме электропочты я
+избавился от этого угнетающего информационногошума, оставив только полезный
+сигнал.
+
+-Хей, да на почте же один спам! — скажешь ты мне
+
+На самом деле, уже давно нет. Я лично использую почту mail.ru (в данном случае,
+это не очень важно и относится к любой)и на ней спама как такового уже давно нет
+(если думаешь, что это не так, перепроверь, возможно, твои
+представленияустарели). При этом, самое великое в этом то, что почта (на самом
+деле, не важно, какая именно — mail.ru, yandex или,прости господи, гмейл)
+предоставляет гибкие фильтры входящей почты. И потратив буквально пару десятков
+минут можносформировать правила, чтобы, например, от того же озона пропускались
+только письма со статусом заказа и больше ничего.
+
+Вот так, древняя технология обычных, старых-добрых, писем позволяет решить
+проблему современных назойливых уведомлений!
+
+При этом, почта не пушит проверять её постоянно! Самое главное её преимущество
+для меня — это её ассинхронность, вотличие от мессенджеров. Можно отключить от
+нее уведомления тоже, но завести себе правило, что раз в Н времени выделятьвремя
+на ее проверку. Самое главное — делать это в _комфортное для себя_ время.
+
+## Так же как и на мессенджеры, кстати!
+
+Выше я уже сказал, что мессенджеры — это не срочно. Ничего страшного не
+случится, если я отвечу через час-два-три иливообще вечером. Если будет что-то
+_действительно_ срочное — мне можно и позвонить. Но, к счастью, мне повезло, что
+мояжизнь достаточно спокойная и _действительно_ срочное почти не случается.
+Отрефлексируй, уважаемый читатель, насколько*действительно* срочные и важные
+вопросы, которые ты таковыми считаешь и которыми ежедневно дёргают тебя? И
+ответь себечестно, мир бы разрушился, если бы ты их отложил на комфортное для
+_себя_, а не других время?
+
+Такой эксперимент я ставлю на себе уже неделю. Я практически не захожу в
+мессенджеры, всё действительно важное мнеприходит на почту, лишней рекламы я не
+вижу, нет никакого информационного шума, который буквально стал
+бичомсовременности.
+
+## Вывод за неделю
+
+Моё внутреннее состояние ощущается как очень спокойное и, главное, комфортное. Я
+чувствую полный контроль над тем, чтои когда я потребляю и нет никакого
+информационного насилия, как его называет
+[Столяров](http://stolyarov.info/)(хоть мне этот персонаж и кажется чрезвычайно
+радикальным и оттого отталкивающим, но что-то в его словах таки есть).
+
+Считаю, что эксперимент оказался удачным, и я его продолжу!
+
+## Пишите письма!
+
+Напомню раз пришлось к слову, пожалуй, свою электропочту: <i@neonxp.ru> или
+<a.kiryukhin@mail.ru> обе почты абсолютноравноценны, писать можно на любую.
+Очевидно из поста, что молниеносный ответ я не гарантирую, но, сам факт ответа
+вобозримое время гарантирован!
+
+73!
diff --git a/content/posts/2024-06-02-книги-1.md b/content/posts/2024-06-02-книги-1.md
new file mode 100644
index 0000000..0173245
--- /dev/null
+++ b/content/posts/2024-06-02-книги-1.md
@@ -0,0 +1,21 @@
+---
+categories:
+- Без рубрики
+date: '2024-06-02T01:48:16Z'
+tags:
+- книги
+- фантастика
+title: Книжные рекомендации 1
+---
+
+Подумалось, почему бы не рекомендовать понравившиеся мне книги.
+
+В прошлый раз, ещё [в VK рекомендовал](https://vk.com/wall-174034751_45)
+Азимовский цикл “Основание”. А в этот раз рекомендую цикл фантастики Андре
+Нортона “Королева Солнца”.
+
+Если без спойлеров — цикл описывает приключения помощника супер-карго Дейла на
+космическом корабле вольных торговцев «Королева Солнца». Читается легко и
+увлекательно. Книги небольшие, проглатываются за пару часов.
+
+[Скачать](andre_norton-queen_of_sun.zip) \ No newline at end of file
diff --git a/content/posts/2024-07-13-joplin.md b/content/posts/2024-07-13-joplin.md
new file mode 100644
index 0000000..f23bcc7
--- /dev/null
+++ b/content/posts/2024-07-13-joplin.md
@@ -0,0 +1,43 @@
+---
+categories:
+- Без рубрики
+date: '2024-07-13T20:49:12Z'
+image: files/2024-07-13-joplin_joplin.webp
+tags:
+- it
+- joplin
+title: Заметочник Joplin
+---
+
+Просто хочу поделиться отличным приложением для заметок, вместо популярного
+Notion и менее популярного Obsidian.
+
+Название на для русского уха звучит по дурацки —
+[Joplin](https://joplinapp.org/). Но, не смотря на такое название,
+самоприложение очень даже серьёзное.
+
+В общем и целом, это достаточно продвинутый опенсорсный заметочник. В качестве
+формата текста он использует Markdown[^1].
+[^1]:https://skillbox.ru/media/code/yazyk-razmetki-markdown-shpargalka-po-sintaksisu-s-primerami/
+
+Так же, из приятностей — большое количество плагинов
+(<https://github.com/topics/joplin-plugin>) и возможность использовать свой
+сервер для синхронизации
+https://docs.vultr.com/how-to-host-a-joplin-server-with-docker-on-ubuntu .
+Для себя я, конечно же, поставил на свой сервак. Ну, а более бюджетно, если нет
+своего сервера — можно использовать любой WebDav сервер. В частности, [Облако
+Mail.Ru](https://help.mail.ru/cloud_web/app/webdav/) или Яндекс Диск (адрес
+<https://webdav.yandex.ru>, необходимо использовать [пароль
+приложения](https://yandex.ru/support/id/authorization/app-passwords.html)).
+
+Но почему же стоит поднять свой сервер? Ну хотя бы для того, чтобы иметь
+возможность спокойно публиковать заметки, например, вот так:
+<https://notes.neonxp.ru/shares/UKB6Rkgt2yA2q1yrwpvb8F>.
+
+Или возможность совместной работы, например, со своей парой над общим списком
+покупок.
+
+~~P.S. Если нужен аккаунт на моем сервере синхронизации Joplin — пишите на
+почту, самостоятельной регистрации на сервере синхронизации не предусмотренно.
+Вот только не забудьте при синхронизации включить в настройках шифрование
+заметок. Я не хочу потом получать подозрения в нарушение приватности.~~ \ No newline at end of file
diff --git a/content/posts/2024-07-21-bbs.md b/content/posts/2024-07-21-bbs.md
new file mode 100644
index 0000000..c304c84
--- /dev/null
+++ b/content/posts/2024-07-21-bbs.md
@@ -0,0 +1,33 @@
+---
+categories:
+- Без рубрики
+date: '2024-07-21T20:28:34Z'
+tags:
+- разное
+title: Преемственность от BBS до Телеграма
+---
+
+Чисто на правах воскресной шизы.
+
+Обнаружил для себя интересную тенденцию, в характерных своему времени
+инструментах для общения за последние 40+ лет:
+
+Если взять эволюционный ряд BBS (в т.ч. Фидо) → Форумы → Соцсети → Мессенджеры,
+то можно выделить в них несколько общихчерт:
+
+- Возможность общения 1—1
+- Возможность общения 1—М (оператор BBS, администратор форума может сделать
+ какую-то тему в read-only и сам туда писать,получая что-то типа каналов в
+ телеге или блога)
+- Возможность общения М—М (обычный режим форума или многопользовательский чат в
+ мессенджерах)
+- Возможность обмена файлами (в т.ч. картинками, не зависимо от того, сразу они
+ отображаются у собеседника или нет)
+- Возможность проводить голосования (внезапно, да?)
+
+Что из этого следует? Да ничего, просто забавно. Интересно, что будет в
+постмессенджеровую эпоху? По идее, какой быинструмент ни был — эти же черты
+будут присущи и ему.
+
+P.S. Да, я тут не упомянул про мейллисты и условные IRC, но просто не знал куда
+и после чего их приткнуть. Но по факту,черты все те же самые. \ No newline at end of file
diff --git a/content/posts/2024-09-26-hugo-wordpress.md b/content/posts/2024-09-26-hugo-wordpress.md
new file mode 100644
index 0000000..aa862ef
--- /dev/null
+++ b/content/posts/2024-09-26-hugo-wordpress.md
@@ -0,0 +1,16 @@
+---
+categories:
+- Без рубрики
+date: '2024-09-26T19:05:00Z'
+tags:
+- блог
+title: Hugo → WordPress
+---
+
+Поменял в блоге движок с модного Hugo на немодный бумерский WordPress. Почему?
+Да просто он удобнее.
+
+Серьёзно, неужели этот гиковский пердолинг с сборкой блога через Git CI удобнее
+чем просто написать пост в браузере? Ну если не врать себе, то конечно же нет.
+
+Так что да, с возрастом начинаешь ценить просто удобные, а не новомодные вещи. \ No newline at end of file
diff --git a/content/posts/2024-10-06-цитатник-рунета.md b/content/posts/2024-10-06-цитатник-рунета.md
new file mode 100644
index 0000000..cc9ba60
--- /dev/null
+++ b/content/posts/2024-10-06-цитатник-рунета.md
@@ -0,0 +1,64 @@
+---
+categories:
+- Мои проекты
+date: '2024-10-06T12:00:11Z'
+image: files/2024-10-06-цитатник-рунета_bash_org.webp
+location: Казань
+tags:
+- go
+- it
+- моё
+title: Цитатник Рунета
+---
+
+В середине-конце нулевых был очень популярный сайт баш.орг.ру. Думаю, те, «кому
+за» помнят ещё такой.
+
+Сайт просто был сборником цитат из разных чатов, irc каналов или личных
+переписок. Изначально, был исключительно анимешно-айтишной направленности и тем
+самым для нас, студентов и гиков был крайне популярным местом. В своё время, он
+подарил мне много часов приятного времяпрепровождения и ламповых вечеров.
+
+Затем, когда БОР (как часто его сокращали) выиграл премию Рунета, на него хлынул
+поток, как сейчас бы сказали, «нормисов». Которые, уже в свою очередь, заполнили
+БОР всяким про отношения, офисно-планктонные темы, фейковыми цитатами, ответами
+на цитаты, ответами на ответы на цитаты и прочим подобным, далёким от
+изначального айтишного флёра, шлаком.
+
+В общем, как всегда, в андеграунд пришли нормисы и всё испортили. И да, баш
+скатился уже, по сути, к десятым годам.
+
+Примерно тогда же он для меня и закончился, ибо стал уже совсем не «торт». Потом
+он как-то жил больше декады за границами моего внимания. Успев при этом поменять
+адрес с зоны .ru на зону .im зачем-то. Ну а с началом СВО его админы
+окончательно сошли с ума и закрыли БОР который к тому времени и так едва ли был
+жив. На этом, его история окончательно закончилась.
+
+Однако, не смотря на это БОР был интересным и знаковым феноменом, который
+неотрывно вписан как в историю рунета так и в мою личную историю юности.
+
+Посему, я решил, так сказать, или возродить его, ну или, как минимум, сделать
+ему мемориал.
+
+Сказано — сделано. Купил домен, который отсылается к самому старому домену
+оригинала — [sh.org.ru](https://sh.org.ru) (sh является командной оболочкой,
+предком командной оболочки bash). За несколько часов написал скраппер по
+зеркалам и архивам бора, спарсил более 80К цитат. Затем, написал на golang
+простенький движок и всего за день запустил свой цитатник в свободное плавание!
+
+Из функций пока только вывод цитат по страницам, а так же вывод случайных 20
+цитат + кнопка для выдачи других 20 случайных. Лично мне гораздо больше нравятся
+как раз случайные подборки. Их можно обновлять почти бесконечно!
+
+Да, он пока не умеет принимать новые цитаты (да и кто их будет слать то, лол?),
+да и нет других функций, типа голосований (классическими `[+]`, `[-]`,
+`[:|||:]`). Буду ли я это доделывать и как-то развивать? Не знаю. Возможно,
+время цитатника безвозвратно ушло. Но может быть и внезапный комбек. Кто знает
+🤷‍♂️. В ближайшие дни я допилю и голосвалку и добавление цитат, но вряд ли буду
+в это инвестировать много времени. Есть ещё и мысль публиковать цитаты через ТГ
+бота простой пересылкой ему сообщений, а он уже их сам анонимизирует заменяя
+данные пользователей на обезличенные XXX и YYY и оформляет цитату как надо. Как
+вам такая идея?
+
+Вообще, я бы хотел это как-то, наверное, обсудить, относительно того как это
+развивать и стоит ли? \ No newline at end of file
diff --git a/content/posts/2024-10-17-книги-2.md b/content/posts/2024-10-17-книги-2.md
new file mode 100644
index 0000000..96cafc7
--- /dev/null
+++ b/content/posts/2024-10-17-книги-2.md
@@ -0,0 +1,39 @@
+---
+categories:
+- Без рубрики
+date: '2024-10-17T19:26:00Z'
+image: files/2024-10-17-книги-2_Rama16wiki.webp
+location: Казань
+tags:
+- книги
+title: Книжные рекомендации №2
+---
+
+Продолжу, пожалуй.
+
+Сегодня хочу порекомендовать всего две книги:
+
+## Свидание с Рамой
+
+Артур Кларк, 1973
+
+Фантастическая повесть о встрече человечества с необитаемым(?) инопланетным
+кораблём, который прилетел в нашу солнечную систему. На изображении выше — вид
+этого корабля изнутри.
+
+- На сайте lib.ru:
+ [www.lib.ru/KLARK/rama1.txt](http://www.lib.ru/KLARK/rama1.txt)
+- В виде аудиокниги: <https://akniga.org/klark-artur-svidanie-s-ramoy>
+- Если надо — могу выложить по запросу в формате fb2
+
+## Глубина в небе
+
+Вернор Виндж, 1999
+
+Об экспедиции двух разных человеческих колоний к странной звезде, имеющей
+свойство выключаться на 200 лет. Причиной отправки стали принятые с окрестной
+планеты радио сигналы, свидетельствующие о наличии разумной жизни на ней.
+
+Книга является частью цикла, и я прикладываю цикл целиком:
+
+[Цикл «КенгХо» скачать](КенгХо.zip) \ No newline at end of file
diff --git a/content/posts/2024-11-15-hugo.md b/content/posts/2024-11-15-hugo.md
new file mode 100644
index 0000000..7a677a4
--- /dev/null
+++ b/content/posts/2024-11-15-hugo.md
@@ -0,0 +1,19 @@
+---
+categories:
+- Без рубрики
+date: '2024-11-15T01:11:49+03:00'
+location: Казань
+tags:
+- разное
+title: Hugo
+---
+
+Так, ну я вернулся на hugo :D
+
+Основная причина — я нашел решение основной моей проблемы с Hugo, а именно,
+удобной публикации.
+
+А как именно решил — тема отдельного поста на потом.
+
+Ну и тему наконец-то сделал сам с нуля. Как говорится, хочешь сделать хорошо —
+сделай это сам. \ No newline at end of file
diff --git a/content/posts/2024-11-17-obsidian.md b/content/posts/2024-11-17-obsidian.md
new file mode 100644
index 0000000..9ecf5f4
--- /dev/null
+++ b/content/posts/2024-11-17-obsidian.md
@@ -0,0 +1,240 @@
+---
+categories:
+- Без рубрики
+date: '2024-11-17T22:30:37+03:00'
+description: ''
+image: files/2024-11-17-obsidian_img/logo.webp
+location: Казань
+tags:
+- it
+- joplin
+- obsidian
+title: Obsidian
+---
+
+Некоторое время назад я [писал](/posts/2024-07-13-joplin/) про заметочник
+Joplin.
+
+С тех пор мои вкусы несколько поменялись и я открыл для себя его величество
+[Obsidian](https://obsidian.md/).
+
+В целом он такой же заметочник, с ± тем же функционалом, но имеет для меня одну
+особенность, которая буквально переворачивает всё. Это мощнейшая система
+плагинов. Серьёзно, я нашел плагины которые покрывают для меня всё, кроме одного
+(но об этом позже).
+
+## Что такое Obisidian?
+
+Obsidian представляет собой приложение для ведения персональных баз данных,
+основанное на принципах локальных файлов Markdown. Это значит, что ваши данные
+хранятся в виде обычных текстовых файлов, что обеспечивает максимальную гибкость
+и независимость от облачных сервисов.
+
+Приложение работает на операционных системах: Windows, macOS, Linux, iOS,
+Android.
+
+<!--more-->
+
+## Основные функции и преимущества
+
+1. **Граф связей** — да, он есть уже много где, но нельзя его не упомянуть.
+2. **Markdown** — очень приятно, что все заметки хранятся в Markdown, что
+ обеспечивает максимальную интероперабельность и переносимость
+3. **Плагины** — плагины пишутся на JS/TS и их много. Даже не так, их **МНОГО**.
+ Что приятно, они скачиваются и лежат в той же директории что и основное
+ хранилище, а это важно для следующего пункта
+4. **Синхронизация** — она есть. Но вроде как платная. Но мне это и не
+ интересно, я использую Syncthing. Просто шарю через него директорию
+ хранилища по схеме оба ноутбука <-> NAS <-> Android. При этом синкаются все
+ плагины и настройки.
+5. **Скорость** — не смотря на то, что он написан на проклятом электроне,
+ работает достаточно шустро, претензий нет.
+6. **Доска для рисования** — мелочь, конечно, но удобно, когда надо на скорую
+ руку накидать небольшую схемку. В конце этого поста как раз есть пример
+ такой схемки.
+
+## Минусы
+
+1. **Проприетарность** — Obsidian хоть и в целом бесплатный, но он не свободный
+ и даже не opensource. Да, это серьёзный минус, но он компенсируется тем, что
+ хотябы вся база данных не в проприетарном формате. И в случае чего можно
+ будет с наименьшими проблемами свалить куда-нибудь.
+2. **Electron** — ну это скорей мой личный пунктик. Но при этом приходиться
+ смиряться с электроном что на Obsidian что на VSCode (VSCodium, конечно же),
+ потому что лучше-то и нет.
+
+Это только то, что сейчас пришло в голову.
+
+## А теперь самое вкусное
+
+Не помню, я упоминал что у него много плагинов? :)
+
+Так вот, поехали, мои самые любимые:
+
+### Dataview
+
+https://blacksmithgu.github.io/obsidian-dataview/
+
+Ну это просто must-have плагин, который позволяет обращаться с вашими заметками
+именно как с базой данных, не меньше.
+
+Например, можно создать новый документ, написать в него
+
+```
+ ```dataview
+ TASK
+ WHERE status = " "
+ ```
+```
+
+и волшебным образом вместо этого блока появятся все невыполненные задачи, а вот
+так
+
+```
+ ```dataview
+ TASK
+ WHERE status = "x"
+ ```
+```
+
+мы получим все выполненные.
+
+Язык запросов очень мощный[^1], в нём сто́ит разобраться.
+[^1]:https://blacksmithgu.github.io/obsidian-dataview/queries/structure/
+
+Ещё есть возможность делать однострочные запросы, например, в домашней заметке
+(которая у меня открывается по умолчанию) у меня есть ссылка на именно
+сегодняшнюю заметку ежедневного журнала. Сделано вот так:
+
+```
+`=link(dateformat(date(today), "yyyy.MM.dd"))`
+```
+
+### Templater
+
+https://silentvoid13.github.io/Templater/
+
+Этот плагин позволяет мне задать некоторым директориям умолчальный шаблон.
+Например, вот такой у меня шаблон для ежедневных журналов:
+
+```
+<%*
+try {
+ // Получаем имя текущей ежедневной заметки
+ const noteName = tp.file.title;
+
+ // Разбиваем полученное имя на компоненты даты
+ const [year, month, day] = noteName.split('.').map(Number);
+
+ // Создаём объект Date на основе поученных компонентов
+ const currentNoteDate = new Date(year, month - 1, day);
+
+ // Вычисляем предыдущий и следующий день
+ let previousDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() - 1));
+ let nextDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() + 2));
+
+ // Форматируем дату обратно в "DD-MM-YYYY"
+ const formatDate = (date) => {
+ const dd = String(date.getDate()).padStart(2, '0');
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
+ const yyyy = date.getFullYear();
+ return `${yyyy}.${mm}.${dd}`;
+ };
+
+ const previousDay = formatDate(previousDayDate);
+ const nextDay = formatDate(nextDayDate);
+
+ // Формируем ссылки
+ const baseFolder = tp.file.folder(true);
+ const previousNotePath = `${baseFolder}/${previousDay}.md`;
+ const nextNotePath = `${baseFolder}/${nextDay}.md`;
+
+ // Выводим даты в виде ссылок
+ tR += `← [[${previousNotePath}|${previousDay}]] | [[${nextNotePath}|${nextDay}]] →`;
+} catch (error) {
+ console.error("Templater Error:", error);
+}
+%>
+
+## Задачи
+___
+<%
+`- [ ]`
+%>
+
+## Заметки
+___
+
+```
+
+и переходя к сегодняшней заметке я сразу получаю такую заготовку:
+
+![Заметка из шаблона](/posts/files/2024-11-17-obsidian_img/templater.webp "Заметка из шаблона")
+
+### Остальные плагины
+
+Остальные тоже крутые, но я их приведу просто списком:
+
+- [tasks](https://publish.obsidian.md/tasks/Introduction) — помогает более
+ богато управлять задачами. В частности, у меня проставляет дату завершения
+ задачи, и проставляет даты дедлайна и прочее.
+- [reminder](https://uphy.github.io/obsidian-reminder/) — трекает и напоминает
+ про задачи
+- [calendar](https://github.com/liamcain/obsidian-calendar-plugin) — просто
+ миникалендарь в боковой панели
+- [homepage](https://github.com/mirnovov/obsidian-homepage) — позволяет задать
+ произвольную заметку "домашней"
+- [icon-folder](https://github.com/timolins/obsidian-icon-folder) — позволяет
+ задавать директориям и заметкам произвольные иконки. Пример есть как раз на
+ скриншоте выше.
+- [pomodoro-timer](https://github.com/eatgrass/obsidian-pomodoro-timer) — думаю,
+ из названия и так понятно
+- [kanban](https://publish.obsidian.md/kanban/) — шикарнейший канбан плагин
+
+## А что же мне не хватает?
+
+Я упомянул выше что мне кое чего не хватает. А именно, постить заметку в мой
+блог по протоколу [Micropub](https://indieweb.org/Micropub).
+
+Только из-за Obsidian и того, что он использует Markdown я опять [вернулся на
+Hugo](/posts/2024-11-15-hugo/), который так же рендерится из Markdown.
+
+«Но Hugo это же генератор статичных сайтов, куда ты ему будешь отправлять
+заметку для публикации?» — можешь спросить меня ты. А я отвечу что у меня вот
+такой план:
+
+```mermaid
+graph TB
+b1["Заметка в Obsidian"]
+b2["Плагин obsidian-micropub"]
+b3["micropub сервер на моем сервере"]
+b4["вызов hugo"]
+b5["Загрузка или копирование результата на веб сервер"]
+b1 --> |Publish в контекстном меню| b2
+b2 --> |POST neonxp.ru/micropub| b3
+b3 --> |Запись в директорию content блога| b4
+b4 --> |hugo рендерит markdown -> html| b5
+style b1 fill:#28252e, stroke:#754fcc
+style b2 fill:#2e2121, stroke:#c81319
+style b3 fill:#2e2121, stroke:#c81319
+style b4 fill:#222c2c, stroke:#20acaa
+style b5 fill:#222c2c, stroke:#20acaa
+```
+
+То что выделено красным — ещё не существует в природе.
+
+micropub сервер для hugo я уже начал писать. Да, есть nanopub сервер, но у него
+есть два серьёзных недостатка, это PHP и то что его сделал не я.
+
+micropub плагин для obsidian я вижу сделать на основе существующего плагина
+rest-publish. Ну или как пойдёт.
+
+В общем, меня ждёт ещё очень много весёлого дрочева с этим всем.
+
+## Закругляюсь
+
+Пожалуй, пока на этом всё. Поделился как радостью использования Obsidian, так и
+планами на пет-проекты, что ещё надо-то?
+
+Если что, пишите комментарии. Лучше всего здесь, но можно и во всяких
+телеграмах-вкшках.
diff --git a/content/posts/2024-11-27-hyperlocality.md b/content/posts/2024-11-27-hyperlocality.md
new file mode 100644
index 0000000..eb8ff84
--- /dev/null
+++ b/content/posts/2024-11-27-hyperlocality.md
@@ -0,0 +1,182 @@
+---
+categories:
+- гиперлокальность
+date: '2024-11-27T17:50:18+03:00'
+description: ''
+location: Казань
+tags:
+- разное
+- IT
+- размышления
+- гиперлокальность
+title: Гиперлокальность
+---
+
+Это очередной пост моих пространных рассуждений про тенденции и будущее
+интернета, которых в последнее время становится как-то многовато. Вероятно, в
+последствии, это станет даже серией постов.
+
+Этот же я воспринимаю, как вводный в лор гиперлокальности.
+
+Сначала, пожалуй, расскажу про посылки, а потом уже о том, куда они ведут, и
+какие из этого можно сделать выводы.
+<!--more-->
+## Посылка
+
+Думаю, все мы заметили как много вокруг стало ИИ инструментов. Сейчас ИИ на
+хайпе и его засовывают буквально куда можно и куда нельзя. Само по себе меня это
+не беспокоит. Я отношусь к ИИ как к просто очередному инструменту, который можно
+и нужно использовать там, где он применим. С этим нет проблем. Пройдёт какое-то
+время и ИИ инструменты займут ниши, где они наиболее уместны и где от них
+наибольшая польза. Однако тут есть и негативный нюанс. Этот инструмент будет
+способствовать в том числе и тому, что интернет станет (если ещё не стал!) по
+сути своей «мёртвым». Не мёртвым буквально, а «мёртвым» в том же смысле, в
+котором в «Руководстве путешествующего автостопом по галактики» Д. Адамса была
+вселенная обозначена необитаемой.
+
+> Вселенная — кое-какая информация, облегчающая существование в ней.
+>
+> <...>
+>
+> 4. Население: Отсутствует. Известно, что существует бесконечное множество
+> планет. Это объясняется той простой причиной, что пространство, в котором они
+> могут существовать, также бесконечно. Однако не всякая из этих планет
+> обитаема. Отсюда следует, что число обитаемых планет конечно. Частное от
+> деления любого конечного числа на бесконечность стремится к нулю и не дает
+> остатка, следовательно, можно заключить, что средняя численность населения
+> планет Вселенной равна нулю. Отсюда следует, что численность населения во всей
+> Вселенной также равна нулю, и потому все люди, которые порой попадаются на
+> вашем пути, являются продуктом вашего воспаленного воображения.
+>
+> Д. Адамс — Ресторан «У края Вселенной», 19 глава
+
+## Следствие
+
+Количество сгенерированного ИИ контента, ИИ ботов пишущих комментарии и иным
+способом имитирующих людей будет расти нелинейно. Таким образом будет
+«размываться» весьма конечное количиство «живых» пользователей «неживыми» до
+того, что все эти миллиарды «живых» пользователей будут лишь статистической
+погрешностью относительно «неживых» ИИ ботов.
+
+## Как это повлияет на наше восприятие реальности?
+
+Представьте себе мир, где большинство сообщений, комментариев и публикаций
+создаются ИИ. Мы будем жить в мире, где трудно отличить реальность от иллюзии.
+Где каждый день нам придётся задаваться вопросом: кто написал этот комментарий –
+реальный человек или искусственный интеллект? Это приведёт к тому, что доверие к
+информации в интернете начнёт стремительно падать. Люди станут всё больше
+сомневаться в подлинности того, что видят и читают. В итоге, интернет
+превратится в огромное море данных, где настоящие голоса людей тонут в океане
+фальшивок и симуляций.
+
+![Киберпанк который мы
+заслужили](/posts/files/2024-11-27-hyperlocality_img/braindance.webp "Киберпанк
+который мы заслужили" )
+
+## Гиперлокальность
+
+Уже сейчас вполне себе просматиривается контур того, что я, за неимением лучшего
+термина, называю «Гиперлокальностью». Термин мне нравится тем что он, с одной
+стороны, хорошо описывает то, куда, по моему мнению, мы придём, а с другой
+стороны, названием отсылает к «гипертексту».
+
+### Что я под этим подразумеваю?
+
+Помните старые времена, когда интернет только-только появлялся и из каждого
+утюга звучало как одно из его преимуществ, то, что «вы сможете находить себе
+собеседников и друзьей в любой точке мира, не выходя из дома». Звучало
+многообещающе, и в каком-то смысле, оно так и было.
+
+![Наивное представление из 90х о том, что интернет будет нас
+соединять](/posts/files/2024-11-27-hyperlocality_img/90e.webp "Наивное
+представление из 90х о том, что интернет будет нас соединять")
+
+Но что происходит сейчас? Интернет, вместо того чтобы соединять людей по всему
+миру, начинает дробиться на маленькие замкнутые круги. Почему так происходит?
+Ответ кроется в недоверии. Когда невозможно понять, кто перед тобой – настоящий
+человек или ИИ-бот, люди начинают замыкаться в узких кругах тех, кому они
+доверяют.
+
+> Интернет, он не сближает. Это скопление одиночества. Мы вроде вместе, но
+> каждый один. Иллюзия общения, иллюзия дружбы, иллюзия жизни…
+>
+> Януш Леон Вишневский — Одиночество в Сети
+
+Эти круги становятся всё меньше и меньше, пока не превращаются в замкнутые
+сообщества, где общение ограничено только теми, кого знаешь лично. Таким
+образом, получается некая WebOfTrust, но только по валидации «человечности». Это
+напоминает модель «доверительных сетей», которая существовала задолго до
+появления интернета, но теперь она приобретает новый смысл в цифровую эпоху.
+
+А личные знакомства они, как правило, достаточно локальные. А следовательно, в
+ближайшее время мы увидим расцвет изолированных «анклавов» из _лично_ знакомых
+между собой людей, который и будут существовать своими маленькими,
+**гиперлокальными** сообществами. Размер при этом может быть почти любой, как
+группка из трёх друзей, так и небольшой клуб из пары десятков _лично знакомых_
+единомышленников.
+
+Причём, примеры гиперлокальных сообществ уже сейчас есть и в большом количестве.
+Например, у меня с друзьями уже почти 10 лет есть свой маленький чатик на шесть
+голов. И, в принципе, этого круга общения мне вполне хватает. И в своём кругу
+мы, конечно же, уверенны в «человечности» каждого из нас, ибо знакомы и ИРЛ.
+
+Причём, «достаточность» этого кружка для меня такая, что если у меня, вдруг,
+магическим образом, останется только этот чатик, мой NAS в который загруженно
+примерно 50К книг и несколько любимых сериалов, и, конечно, VPN до работы, чтобы
+я мог зарабатывать на жизнь — то, это и будет вся моя гиперлокальная сеть. И как
+будто, не сильно то я и потеряю если останется только это, ну или как минимум,
+уж точно выживу. Если что, это именно магически и гипотетически, но тем не
+менее.
+
+Так же, подобные кружки, я видел и, например, у своих старших родственников.
+Они, в основном, устраивают гиперлокальные «кружки» в том же вотсаппе. Там они
+делятся рекомендациями фильмов, рецептами, шутками, новостями и прочим подобным.
+
+### А к чему я это всё?
+
+Да к тому что на текущем этапе развития интернета, мы всё больше уходим от
+**глобальной** сети к **гиперлокальной**. И, наверное, мне это даже вполне
+нравится. Это как-то... уютно чтоли.
+
+![Примерно так я визуализирую гиперлокальное
+сообщество](/posts/files/2024-11-27-hyperlocality_img/camp.webp "Примерно так я
+визуализирую гиперлокальное сообщество" )
+
+## Перспективы
+
+Дисклеймер. Дальше идут мои размышления, которые основываются в основном на
+интуитивных, а не объективных предположениях
+
+С развитием этого тренда будут всё больше и больше отмирать крупные социальные
+сети типа ВК или РКНбука. История сделает виток и восскресит т.н. локалки,
+которые были популярны в 90е-00е. Конечно же, уже в другом облике. Никто не
+будет лазать по чердакам чтобы протянуть витуху между соседями, но именно суть
+останется. А суть в том, что будет бо́льшая концентрация на небольшом числе
+условно локальных ресурсов, где человек будет только со своими друзьями, а
+«большой» интернет отходит на второй план.
+
+Так же могут получить развитие indieweb технологии, а так же self-hosted решения
+для общения, например, Matrix. Эти инструменты потребуются как ответ на
+заполненные ботами и спамом соцсети и мессенджеры. Конечно же, всё что нужно не
+затащить в свою уютненькую локалочку, но вылазка за недостающей инфой в интернет
+будет ощущаться, как выход из своей зоны комфорта в дикую и опасную пустошь.
+
+![Вылазка в «большой»
+интернет](/posts/files/2024-11-27-hyperlocality_img/in-internet.webp "Вылазка в
+«большой» интернет")
+
+## Окончание?
+
+Я отдаю себе отчёт что то, что я написал выше — весьма сумбурно. Но это
+следствие того, что я ещё не до конца исследовал эту тему, и многие мысли на эту
+тему в моей голове пока ещё не сформированы в слова, а остаются на интуитивном
+уровне.
+
+А написал я это, скорее как повод начать дискуссию на эту тему. Мне интересно,
+что вы думаете по этой теме. Возможно, мнение со стороны меня наведёт на еще
+какие мысли.
+
+В дальнейшем у меня уже есть некоторые мысли на развитие темы, но уже в каких то
+отдельных аспектах.
+
+Остаёмся на связи, 73!
diff --git a/content/posts/2024-11-29-hobbies.md b/content/posts/2024-11-29-hobbies.md
new file mode 100644
index 0000000..50fc928
--- /dev/null
+++ b/content/posts/2024-11-29-hobbies.md
@@ -0,0 +1,44 @@
+---
+categories:
+- Мысли вслух
+date: '2024-11-29T18:00:36+03:00'
+description: ''
+image: files/2024-11-29-hobbies_dozor.webp
+location: Казань
+tags:
+- размышления
+title: Откуда берутся увлечения?
+---
+
+На днях задался вопросом вынесенным в заголовок. Причём не столько над
+эволюцией, сколько о том, откуда они взялись.
+
+Раньше я часто играл в ночные полевые игры, такие как «Дозоры» и «Энкаунтеры».
+Они были мне очень интересны и играли важную роль в моей жизни. Даже, я бы
+сказал, во взрослении, так как пришлись на возраст 19–25 лет.
+
+<!--more-->
+
+Сейчас давно уже не играю, но многие мои нынешние увлечения берут начало именно
+оттуда. Например, самый очевидный пример — интерес к картографии и ГИСам
+(геоинформационным системам), поскольку для «Дозоров» они были неотъемлемой
+частью. Также сюда относится и то, что я хорошо ориентируюсь в своем городе и
+немного интересуюсь его историей.
+
+Кроме того, можно проследить интерес к радиоэлектронике: пару раз, когда с
+командой организовывали игры, я придумывал задания, основанные на простых
+электронных устройствах, собранных на микроконтроллерах.
+
+Туда же и любовь к исключительно ноутбукам, да и вообще переносной, что важно,
+технике. Теплое отношение к простым, надёжным, нетребовательным технологиям. Это
+всё оттуда же!
+
+Любовь к программированию у меня возникла чуть раньше, поэтому её связать с
+этими играми я не могу. Здесь, скорее случилось наоборот. И я не менее трех раз
+даже порывался писать собственный «движок» для НПИ. Но, пока ни разу не успешно.
+Вероятно, меня здесь привлекает процесс, а не результат. Так что, последний мой
+заход хоть и является вполне себе функционально законченным, но для его развития
+времени я не выкраиваю, к сожалению.
+
+Что-то еще было, но я не успел записать, и теперь забыл. Вывод: не стоит давать
+остывать размышлениям дольше суток, а писать сразу 🙂 \ No newline at end of file
diff --git a/content/posts/2024-12-12-guessr.md b/content/posts/2024-12-12-guessr.md
new file mode 100644
index 0000000..235901c
--- /dev/null
+++ b/content/posts/2024-12-12-guessr.md
@@ -0,0 +1,130 @@
+---
+categories:
+- Мои проекты
+date: '2024-12-12T22:27:49+03:00'
+description: ''
+image: files/2024-12-12-guessr_logo.webp
+location: Казань
+tags:
+- IT
+- Проект выходного дня
+title: Guessr
+---
+
+На недавних выходных я запилил очередной «проект выходного дня». На этот раз —
+аналог известного сервиса GeoGuessr, но в отличие от него, все точки
+сконцентрированы в моей родной Казани. Ну и я не использую панорамы, а
+фотографии мест.
+
+Я обещал выложить исходники, и в общем, вот они:
+https://git.neonxp.ru/guessr.git/
+
+## Немного про разработку
+
+Первым встал вопрос, откуда брать данные, а именно фотографии и координаты
+точек. Пару лет назад нашу страну покинул такой проект, как Ingress,
+представлявший собой гео игру в дополненной реальности. В свою очередь, я
+посчитал, что раз проект решил отказаться от нас, как игроков, я посчитал
+морально оправданным ~~спиз~~экспропреировать кусочек их данных, а именно
+спарсил с их карты intel.ingress.com т.н. «порталы», которые, по сути и есть эти
+самые геоточки с фотографиями.
+
+Дамп я загнал в Postgresql с подключенным расширением
+[Postgis](https://postgis.net/).
+
+Ну а далее написал достаточно простой API на Golang, который реализует следующие
+методы:
+
+- Создание новой игровой сессии, в ответ ставится кука внутри которой
+ зашифровано текущее состояние — ник, количество очков, ID текущего
+ угадываемого объекта (в начале пустое).
+ ```http
+ POST /api/state
+ Content-Type: application/json
+
+ {
+ "username": "NeonXP"
+ }
+ ```
+
+- Получение состояния. Просто возвращает вышеуказанные параметры
+ ```http
+ GET /api/state
+ ```
+
+- Выдача нового объекта для угадывания. При этом возвращается ссылка на фото и
+ обновляется состояние, тем что в него вписывается ID объекта
+ ```http
+ POST /api/next
+ ```
+
+- Угадывание. Собственно, на вход передаются координаты куда на карте указал
+ игрок. А в ответ возвращается:
+ - Название объекта
+ - Расстояние от переданной точки до реального размещения объекта
+ - Geojson строка в которой зашифрована линия соединяющая точку и объект (нужна
+ для отрисовки красной линии на карте)
+
+ При этом высчитываются очки которые получает игрок за попытку по формуле
+ max(1000-d, 0), где d - расстояние между выбранной точкой и объектом в метрах.
+ То есть, если разница меньше 1000м, то чем ближе - тем больше очков (максимум
+ 1000 очков за 1 очень точное угадывание).
+ ```http
+ POST /api/guess
+ Content-Type: application/json
+
+ {
+ "lat": 55.123,
+ "lon": 49.123
+ }
+ ```
+
+Вот в общем-то и всё API!
+
+Из интересностей, при выборе очередной точки у неё в БД увеличивается счетчик, а
+сам select выбирает случайную точку только среди тех точек, где этот счетчик
+минимальный. То есть, пока не будут выданы игрокам все точки, уже выбранные
+заново не будут выданы. Вот это место в коде:
+https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n26 (стр. 26-32)
+
+```go
+err = btx.NewSelect().
+ ColumnExpr(`p.guid, p.img`).
+ Model(r).
+ Where(`p.count = (SELECT MIN(pl.count) FROM places pl WHERE pl.deleted_at IS NULL)`).
+ OrderExpr(`RANDOM()`).
+ Limit(1).
+ Scan(ctx, r)
+```
+
+Ещё я бы отметил то, что я решил по максимуму логику вынести в БД, и, например,
+при угадывании расстояние до точки, а также вышеупомянутый geojson формируются
+так же на стороне БД:
+https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n50 (стр. 50-59)
+
+```go
+err := p.db.NewSelect().
+ Model(&model.Place{GUID: guid}).
+ WherePK("guid").
+ ColumnExpr(`p.name, p.guid, p.img,
+ ST_Distance(ST_MakePoint(?, ?)::geography, p.position::geography)::int AS distance,
+ ST_AsGeoJSON(ST_MakeLine(
+ ST_SetSRID(ST_MakePoint(?, ?), 4326),
+ ST_SetSRID(p.position, 4326)
+ )) AS geojson`, lon, lat, lon, lat).
+ Scan(ctx, r)
+```
+
+## Дальнейшие планы
+
+В комментах к анонсу ребята накидали достаточно много хороших идей, синтезировав
+которые, и добавив свои хотелки я составил примерно такой чеклист:
+
+- [ ] Авторизация и общая доска лидерства
+- [ ] После угадывания спрашивать у игрока «сложность», чтобы потом можно было,
+ например, настраивать чтобы попадались только простые объекты. И, например,
+ разное количество очков за простые и сложные объекты
+- [ ] Подумать как вынести игру в оффлайн, по типу того же ингресса. Это сложно
+ и предстоит хорошо это обдумать
+
+Как-то так :) А впереди новые выходные и новые «проекты выходного дня»! \ No newline at end of file
diff --git a/content/posts/2024-12-15-conditional-operator-go.md b/content/posts/2024-12-15-conditional-operator-go.md
new file mode 100644
index 0000000..480ba42
--- /dev/null
+++ b/content/posts/2024-12-15-conditional-operator-go.md
@@ -0,0 +1,35 @@
+---
+categories:
+- Без рубрики
+date: '2024-12-15T23:47:08+03:00'
+description: ''
+image: files/2024-12-15-conditional-operator-go_ternary.webp
+location: Казань
+tags:
+- IT
+- Go
+title: Тернарник в Go
+---
+
+Хотите немного ~~наркомании~~ сахара для Go?
+
+Их есть у меня:
+
+Тернарный оператор для Go на генериках
+
+```go
+func If[T any](condition bool, thn T, els T) T {
+ if condition {
+ return thn
+ }
+ return els
+}
+```
+
+[Плейграунд чтобы потыкать](https://go.dev/play/p/sBDnPGHce8I)
+
+Будет настроение — добавлю в свою либку https://neonxp.ru/go/extra , а пока,
+как-то так держите.
+
+**Не стоит** использовать в реальном коде. Я лично не вижу никакого оправдания
+для использования, кроме как покекать.
diff --git a/content/posts/2024-12-15-posse.md b/content/posts/2024-12-15-posse.md
new file mode 100644
index 0000000..023e1e2
--- /dev/null
+++ b/content/posts/2024-12-15-posse.md
@@ -0,0 +1,81 @@
+---
+categories:
+- Блог
+date: '2024-12-15T22:10:46+03:00'
+description: ''
+image: files/2024-12-15-posse_posse.webp
+location: Казань
+tags:
+- блог
+- разное
+title: POSSE
+---
+
+Решил я перейти к использованию практики POSSE. Что это такое? Аббревиатура
+расшифровывается примерно следующими способами:
+
+**P** - Publish или Post, **OS** - Own Site, **SE** - Syndicate Elsewhere (мне
+больше нравится, Share Everywhere)
+
+Это практика, когда изначально любой материал публикуется на полностью
+подконтрольном собственном сайте, а только затем переразмещаяется на всякие
+социальные сети, типа ВК, Телеги и прочих Мастодонов.
+
+<!--more-->
+
+## Почему это важно?
+
+* Во-первых, **платформы ненадежны**. Любая платформа в любой момент может
+ сделать что угодно с вашим контентом, или закрыться.
+* Во-вторых, **право собственности**. Не секрет, что у платформ весьма вольное
+ представление об авторском праве на материалы размещаемые пользователями. С
+ одной стороны, у них неограниченное право распоряжения контентом для любых
+ целей, а с другой никакой ответственности за содержание контента. Не слишком
+ ли кучеряво? А следуя POSSE, я и все кто следуют POSSE — сохраняют
+ первоисточник под своим контролем, отдавая платформам лишь небольшой огрызок
+ от контента. Да, у меня не больно какой-то великий контент, за который стоит
+ трястись, но я всё равно предпочту сохранить за собой все права на него.
+* В-третьих, **за пользователем остаётся право** выбирать где ему удобнее
+ следить за контентом. Либо на первоисточнике, с помощью божественного RSS (к
+ чему я бы хотел призывать), либо на удобной платформе куда происходит
+ синдикация.
+* В-четвёртых, ... А давайте, я не буду пересказывать вот эту статью[1]? 😉 В
+ общем, это правильная и нужная практика. Как минимум, на долгосрок. Платформы
+ приходят и уходят, а файлы (в виде markdown моего блога) останутся на всегда.
+
+=> https://indieweb.org/POSSE [1]
+
+## Что я сделал чтобы следовать POSSE?
+
+Ну для начала, у меня сильно чесались руки переделать дизайн блога. Вроде,
+получилось так, как я и хотел, в стиле сайтов начала-середины 2010х. Просто
+потому что могу, кто же мне тут что запретит 😉. Тем самым я улучшил UX блога,
+до хотя бы терпимого. Походу дела, при редизайне, я порасставил правильных тегов
+и микроформатов для правильной синдикации с другими платформами.
+
+Далее, я перепилил немного улучшил программку, которую написал уже достаточно
+давно, которая читает RSS моего блога и отправляет новые посты в Телеграм канал.
+Вот она, если что: [2]
+
+=> https://git.neonxp.ru/posse [2]
+
+Кстати, в очередной раз напоминаю о RSS ленте [3] блога. Эта лента — это самый
+правильный способ подписки на блог!
+
+=> https://neonxp.ru/feed/ [3]
+
+Так же из этой ленты автоматически подтягиваются посты в VK группу. Это сделано
+встроенным механизмом VK, за что им определенно респект! Не часто можно
+встретить нечто подобное на закрытых платформах (помним, же как Google убивал
+RSS?)!
+
+Так же в ближайших планах и запилить WebMentions и прочие плюшки с ИндиВеба.
+
+Ну пока, как то так `¯\_(ツ)_/¯`
+
+Есть что сказать? Внизу есть форма для невозбранного комментирования.
+
+## Ссылки по теме
+
+- https://indieweb.org/POSSE
+- https://www.theverge.com/2023/10/23/23928550/posse-posting-activitypub-standard-twitter-tumblr-mastodon
diff --git a/content/posts/2024-12-17-infra.md b/content/posts/2024-12-17-infra.md
new file mode 100644
index 0000000..8998c27
--- /dev/null
+++ b/content/posts/2024-12-17-infra.md
@@ -0,0 +1,120 @@
+---
+categories:
+- Мета
+date: '2024-12-17T21:07:53+03:00'
+description: ''
+draft: true
+image: files/2024-12-17-infra_cover.webp
+location: Казань
+tags:
+- блог
+- IT
+title: Инфраструктура блога
+---
+
+Сегодня я хочу рассказать как устроен этот блог и вообще моя инфраструктура.
+
+## Сервер
+
+Во-первых, недавно я почти полностью переехал с арендуемого сервера, на свой
+собственный, сервер, который просто стоит у меня в комнате.
+
+Именно он вынесен в заголовочное изображение и целиком помещается, даже не на
+ладони, а просто на кончиках пальцев!
+
+Конкретно, железо:
+
+* **OrangePi 3B 8Gb** — выбран в первую очередь за свою дешевизну и, самое
+ главное, M.2 разъём
+* **NVME SSD 1Tb** — собственно, жесткий диск моего микросервера
+* **Корпус с активным охлаждением** — не самое необходимое, но хотелось, чтобы
+ выглядело красиво
+
+<!-- more -->
+
+## Программное обеспечение
+
+По сути, на первом уровне, установлены armbian
+(https://www.armbian.com/orangepi3b/), веб—сервер Caddy
+(https://caddyserver.com/), да Docker. Всё остальное уже внутри Docker'а.
+
+
+## Caddy
+
+Caddy у меня работает в основном как reverse-proxy для Docker'а. Без лишних
+слов, вот конфиг:
+
+```
+{
+ log {
+ output file /var/log/caddy/access.log
+ level debug
+ }
+ email i@neonxp.ru
+}
+neonxp.ru:80 {
+ redir https://neonxp.ru
+}
+neonxp.ru:443 {
+ tls i@neonxp.ru
+ root * /var/www/neonxp.ru
+ encode gzip
+ rewrite /feed/ /posts/index.xml
+ file_server
+}
+comments.neonxp.ru {
+ reverse_proxy localhost:8008
+ tls i@neonxp.ru
+}
+```
+
+Из него я убрал всё, что не относится к непосредственно блогу.
+
+Сам блог у меня собирается с помощью Hugo и загружается в `/var/www/neonxp.ru` с
+помощью rsync[^4], а оттуда уже раздается с помощью Caddy.
+
+[^4]: https://git.neonxp.ru/blog.git/tree/Makefile#n11
+
+## Docker
+
+А вот и мой compose в котором разворачивается остальная инфраструктура для блога
+
+```yaml
+services:
+ remark42:
+ image: umputun/remark42:latest
+ restart: unless-stopped
+ container_name: "remark42"
+ ports:
+ - 8008:8080
+ env_file: remark42.env
+ volumes:
+ - remark42:/srv/var
+ posse:
+ image: registry.neonxp.ru/posse
+ restart: unless-stopped
+ container_name: posse
+ env_file: posse.env
+ volumes:
+ - ./seq.txt:/store/seq.txt
+volumes:
+ remark42:
+```
+
+Как понятно из этого docker-compose.yml — дополнительно поднимаются два
+контейнера:
+
+* remark42 — система комментариев
+* posse — моя программка, которая чекает RSS блога и репостит его в Telegram
+
+## Остальное
+
+Конечно же, на этой железке крутится не только блог, но и несколько других
+сервисов для личного использования
+
+* Nextcloud — личное облако
+* Vaultwarden — хранилище паролей
+* SOPDS — личная библиотека Либрусека
+* Git хостинг и Container registry — для разработки и хранения кода
+
+Но об этом я расскажу в другой раз 😉
diff --git a/content/posts/2024-12-30-irc.md b/content/posts/2024-12-30-irc.md
new file mode 100644
index 0000000..d58ecf6
--- /dev/null
+++ b/content/posts/2024-12-30-irc.md
@@ -0,0 +1,75 @@
+---
+categories:
+- Заметка
+date: '2024-12-30T14:54:08+03:00'
+description: ''
+draft: true
+image: files/2024-12-30-irc_logo.webp
+location: Казань
+tags:
+- IRC
+- IT
+title: IRC
+---
+
+Когда-то единственным способом общения в сети в режиме реального времени был
+исключительнольно протокол IRC. И всем бы он был хорош — простой, лёгкий, может
+работать на чём угодно. Но времена изменились и мы погрязли во всяких
+телеграммах да вотсаппах (пока не запрещенные на территории России, к
+сожалению).
+
+Это грустно, но закономерно. Но делает ли это ИРКу плохой? Да нет конечно! И
+лично меня притягивают именно такие надёжные и простые вещи — открытые,
+текстовые протоколы, софт для которых можно написать чуть ли не на коленке для
+любого электрочайника.
+
+Например, даже на таких устройствах[^1], я вполне себе могу представить клиент к
+ИРКе, но не представлю клиента телеграма.
+[^1]: https://club.hugeping.ru/blog/IYMX9ZdAnn0dA1RBO5JH#IYMX9ZdAnn0dA1RBO5JH
+
+И недавно я обнаружил, что IRC не только не умер, но и развивается,
+осовременивается! Сейчас есть актуальная современная версия протокола
+[IRCv3](https://ircv3.net/), которая не потеряла былой простоты и
+интерперабельности!
+
+# Мой IRC
+
+Короче, не затягивая сильно, я запустил для теста небольшой свой сервачок, куда
+и приглашаю забежать на огонёк и посидеть в ламповой олдскульной атмосфере:
+
+В любом современном IRC клиенте:
+
+* Сервер: `irc.neonxp.ru`
+* Порт: `6667` текстовый, `6697` TLS
+* Кодировка: `utf8`
+
+Регистрация есть через NickServ но опциональная.
+
+# Чем он хорош?
+
+Ну помимо вышеуказанных простоты и интерперабельности протокола, можно выделить
+и то, что поскольку общение чисто текстовое, без всяких гифок, картинок и
+прочего. Казалось бы, это же скорее минус? А вот и не обязательно. В каком-то
+роде это мотивирует к конструктивному общению, когда надо хоть немного включать
+мозг и думать что писать. Таким обазом, повышается осмысленность общения и
+появляется определённая самодисциплина. Примерно так же, как и в переписке по
+e-mail, что я тоже весьма и весьма уважаю.
+
+# Станет ли оно популярным?
+
+Да нет, конечно! Это всегда будет исключительно нишевая гиковская игрушка. И это
+даже хорошо. Лампово. Так же как и обычные текстовые блоги, например. Но это не
+значит, что это не имеет право на жизнь.
+
+Ну и да, это одна из технологий, которые я отношу к тем, что пригодятся
+человечеству в случае кризисов.
+
+# Альтернативы?
+
+Самая хорошая альтернатива, что я вижу — это протокол Matrix, который выглядит
+как новомодный хипстерский IRC с JSON поверх HTTP(S). С моей точки зрения, у
+него есть серьёзные недостатки, но считаю, что он вполне себе займёт ту же нишу.
+
+Всякие телеграммы и прочее завязанное на конкртеного вендора я не рассматриваю
+как альтернативы. Да, они удобные, популярные, но мертворожденные, как
+технология.
diff --git a/content/posts/2024-12-31-new-year.md b/content/posts/2024-12-31-new-year.md
new file mode 100644
index 0000000..56e2891
--- /dev/null
+++ b/content/posts/2024-12-31-new-year.md
@@ -0,0 +1,50 @@
+---
+categories:
+- Без рубрики
+date: '2024-12-31T15:48:25+03:00'
+description: ''
+image: 2025.webp
+location: Казань
+tags:
+- разное
+title: С Новым Годом!
+---
+
+Ну что же, друзья, с наступающим!
+
+В этот день принято подводить итоги года. Ну и я подведу немного:
+
+- Поступил в институт брака. Раз уж нет классического высшего, что ещё остаётся то ;)
+- В аккурат под конец года разрешились проблемы на работе. Причем разрешились
+ настолько удачно, что я почти что жду окончания новогоднего отпуска, чтобы
+ скорее начались трудовыебудни.
+- Стал активно вести блог. Но всё равно не оставляет подспудное ощущение, что
+ уже стал надоедать этим тем, кто подписан. После каждого поста жду что кто-то
+ да отпишется :) Но мне нравится его вести, так что, уже не остановлюсь :)
+- Ездили с новоиспеченной супругой на Кавказ. Самое яркое — посетили
+ обсерваторию в Нижнем Архызе. Под впечатлением, купили по приезду настоящий
+ телескоп!
+- Начали строить свой домик в деревне. Но пока ещё до заселения далеко, вот
+ только окна поставили.
+
+Под катом приложу фоточки наиболее ярких моментов, пожалуй.
+
+<!--more-->
+
+* Институт брака
+ ![Институт брака](/posts/files/2024-12-31-new-year_img/1.webp "Институт брака")
+* Выхожу с работы
+ ![Выхожу с работы](/posts/files/2024-12-31-new-year_img/2.webp "Выхожу с работы")
+* Собаньки на Кавказе
+ ![Собаньки на Кавказе](/posts/files/2024-12-31-new-year_img/3.webp "Собаньки на Кавказе")
+* Своя личная обсерватория
+ ![Своя личная обсерватория](/posts/files/2024-12-31-new-year_img/4.webp "Своя личная обсерватория")
+* Домик в деревне
+ ![Домик в деревне](/posts/files/2024-12-31-new-year_img/5.webp "Домик в деревне")
+
+Вот как-то так :)
+
+А пока, возвращаемся к новогоднему столу и готовимся встретить наступающий 2025
+год!
+
+Надеюсь, всё у нас у всех будет хорошо в этом наступающем новом году!
diff --git a/content/posts/2025-04-05-tabs-or-spaces.md b/content/posts/2025-04-05-tabs-or-spaces.md
new file mode 100644
index 0000000..a44e052
--- /dev/null
+++ b/content/posts/2025-04-05-tabs-or-spaces.md
@@ -0,0 +1,400 @@
+---
+categories:
+- Размышления
+date: '2025-04-05T16:53:27+03:00'
+description: null
+image: null
+location: Казань
+tags:
+- размышления
+title: Табы или пробелы?
+---
+
+Так получилось, что с Нового Года я ничего в блог не писал. Тому причина в
+личной загруженности, и в не менее личной лени. Так же я делал некоторые
+эксперименты над самим блогом, потому что моё внутреннее чувство прекрасного не
+даёт мне просто остановиться и не трогать то, что работает.
+
+Но всё же, я чувствую внутреннюю потребность написать небольшую заметку с
+размышлениями, которые недавно приходили ко мне в голову.
+
+А связаны они с тем, что есть определённые догмы в индустрии, которые непонятно
+(ну или понятно) почему появились, и которым слепо следуют, хотя, как будто они
+уже не имеют смысла.
+
+<!--more-->
+
+## Вечный спор
+
+Для затравки, «вечный спор» табы или пробелы использовать в коде для отсутпов.
+Лично для меня здесь не то что выбор очевиден, для меня очевидно, что и самого
+выбора то нет. Конечно же, только табы! Отступ пробелами просто не имеет права
+на жизнь, и вот почему:
+
+* Во-первых, это просто какой-то костыль, использовать пробел не по назначению.
+ Наверное, не очень очевидно, но назначение пробела — это именно разделение
+ слов. Невероятно! А наначение таба — как раз таки форматирование отступа.
+ Давайте использовать инструменты по назначению!
+* Во-вторых, и самое главное, как по мне, это гибкость табуляции. Я, как
+ читающий код, волен сам выбирать размер отступа. Например, если у меня узкий
+ экран (смартфон, например) — я выберу отступ в 2 *визуальных* пробела.
+ Наоборот, если бы у меня было слабое зрение — я бы выбрал отступ в бо́льшее
+ число *визуальных* пробелов.
+* В-третьих, исходя из предыдущего пункта, я считаю, что использование именно
+ пробелов — это диктование автором исходника мне своей воли в виде своих
+ предпочтений (например, только 4 пробела, и никак иначе!). А какого чёрта? Это
+ буквально насилие! Зачем? Я считаю, это не допустимо. Пусть у каждого будет
+ возможность выбирать себе настройки отображения на *своей* машине под *свои*
+ вкусы, а не вкусы автора!
+* В-четвёртых, самое малозначительное — это то, что таб это 1 байт, а пробелов
+ обычно больше чем 1 байт (от 2 до 8). Я считаю этот аргумент малозначительным,
+ т.к. уж что что, а места на носителях информации нынче в достатке. Но тем не
+ менее, это один из аргументов!
+
+А что по аргументам за пробелы? Да нет их. Ну окей, предположим, что есть. Во
+многих кодстайлах (PEP-8, PSR итп) закреплены именно пробелы. Я не понимаю,
+почему, вроде как, умные люди которые эти стандарты придумывали так сделали.
+Возможно, привычка. Но является ли привычка каких-то людей аргументом? Наверное,
+нет. И самое грустное, что эти стандарты уже не поменять, ибо с их
+использованием *уже* написаны мегатонны кодов.
+
+Единственное, меня радует, что хотя бы в стандарте форматирования моего любимого
+языка Go этой откровенной чуши нет. В Go отступы приняты табами и только ими.
+
+Сразу скажу, я говорил только про отступы в начале строки, но не про отступы
+внутри строки, например, чтобы выстраивать значения подряд идущих констант в
+одну ровную колонку. Там, вроде как, пробелы вполне оправданы. Но это не точно.
+Я пока не решил для себя.
+
+Думаю, здесь насчёт табов и пробелов можно завершить. Если есть что накинуть —
+пишите письма, e-mail внизу страницы.
+
+## Вечный консенсус
+
+Про табы и пробелы была скорее затравочка. Там, как мне кажется, всё очевидно.
+Но есть менее очевидная, но как мне кажется очень родственная тема. Эта тема
+вызывает сильно меньше споров, т.к. вроде как в ней уже есть консенсус. Но этот
+консенсус ошибочен!
+
+А говорю я про форматирование длины строк! А именно, т.н. hard-wraps и
+soft-wraps. Если коротко, при hard-wraps в текст в точках переноса (например, на
+80 или 120 колонке) вставляются символ переноса строк (`\n`), при мягком
+переносе текст остается на одной строке, но выглядит так, как будто он разделен
+на несколько строк.
+
+А начну я с небольшой предыстории, как я к этому пришёл. Как я уже писал в
+начале, у меня есть постоянное шило в седалище, которое не даёт мне просто
+остановиться и использовать то, что работает, как минимум, в контексте этого
+блога. И из последнего куда я смотрел — протокол Gemini[1]. Разбирая его, меня
+сначала немного удивила его особенность, а именно:
+
+=> https://geminiprotocol.net/ [1]
+
+> Text in Gemtext documents is written using "long lines", i.e. you (or your
+> editor) shouldn't be inserting newline characters every 80 characters or so.
+> Instead, leave it up to the receiving Gemini client to wrap your lines to fit
+> the device's screen size and the user's preference. This way Gemtext content
+> looks good and is easy to read on desktop monitors, laptop screens, tablets
+> and smartphones.
+
+> Note that while Gemini clients will break up lines of text which are longer
+> than the user's screen, they will not join up lines which are shorter than the
+> user's screen, like would happen in Markdown, HTML or LaTeX. This means that,
+> e.g. "dot point" lists or poems with deliberately short lines will be
+> displayed correctly without the author having to do any extra work or the
+> client having to be any smarter in order to recognise and handle that kind of
+> content correctly.
+
+Сначала, я подумал, да это же нифига не удобно, что используются длинные строки,
+а не склеиваются разделённые одним переносом как в Markdown! Более того, это моё
+возмущение подогревалось тем, что я всё это время был сторонником как раз
+hard-wraps и форматировал что код, что markdown для блога по 80 или 120 колонке.
+Потому что так всегда и везде было принято. Но потом вчитавшись, я понял, что
+как раз таки «склеивание» Markdown это максимально неправильное поведение! Оно
+порождает такие минусы, как более сложный парсинг, который должен обрабатывать
+по разному один и два переноса строк, неочевидность, когда пишешь текст в
+редакторе, а отображается он совсем по другому, потенциальные ошибки, когда
+абзацы внезапно склеиваются, и т.п.
+
+При этом, парсинг Gemtext поразительно простой. В общем случае, достаточно
+парсить по строке, и не думать о предыдущем состоянии (относится текущая строка
+к предыдущему параграфу или таки нет). Единственное исключение —
+преформатированный текст, при парсинге которого надо помнить состояние. Но и это
+очень просто, достаточно держать единственный флаг который говорит, мы сейчас в
+нормальном состоянии или в состоянии преформатированного текста. И переключать
+этот флаг когда очередная строка начинается с *```*. Вообще, Gemtext кажется
+наиболее правильным и приятным для меня языком разметки. Наверное, я на него
+перейду. Но потом, сейчас нет времени.
+
+К чему я тут углубился в описание формата Gemtext? А вот к чему: только после
+прочтения спеки этого формата до меня сошло озарение, что использование длинных,
+а не обрезанных по 80 или 120 или ещё какую колонку более правильное не только
+для формата разметки, но и для обычного кода!
+
+И вот аргументы:
+
+* Во-первых, все редакторы кода поддерживают soft-wrap и каждый волен выставить
+ для своего личного редактора удобную ему длину строки, а не подчиняться
+ привычкам автора кода.
+* Во-вторых, за длину в 80 символов топят в основном старпёры что-то там
+ говорящие про терминалы шириной в 80 символов. Только и этот аргумент не
+ понятен. Когда вы в последнее время видели терминал в 80 символов? Не эмулятор
+ терминала, а именно сам терминал? Ну даже, хорошо, пусть будет этот терминал в
+ 80 символов. Но он что, не умеет переносить? Подозреваю, что может. И в чём
+ тогда проблема? Непонятно. Короче, требование в 80 символов (ну или более
+ современное в 120) выглядит как высосанное из пальца, потому что под ним нет
+ реальной основы кроме каких-то там исторических причин на доисторическом
+ железе.
+* В-третьих, см. пункт про насилие автора кода над читателем кода. Например,
+ опять таки, узкий монитор например. И на нём не soft-wrapped текст может
+ вызывать горизонтальную прокрутку. И это убого.
+* В-четвёртых, да, это усложняет парсинг. Это слабый аргумент, я знаю. Как
+ пример, правильный парсер Markdown (не буду тут бомбить про количество разных
+ стандартов Markdown) пишется не то чтобы очень просто. В это же время,
+ написать парсер Gemtext который полностью покроет спецификацию — дело максимум
+ часа-двух для любого, кто программирует больше, хотя бы, нескольких месяцев!
+
+В общем, как и в случае с табо-пробелами я не вижу ни одной достойной причины
+делать жесткие переносы строк по какой-то длине!
+
+Возможно, я что-то упустил — тоже можно по этому поводу поспорить со мной в
+электропочте. Возможно, я даже поменяю мнение, но наврядли.
+
+## Update 06.04.25
+
+Как я и просил, один хороший человек, Владислав
+(https://t.me/c/1331521959/2285), написал ответ. Прокомментирую его здесь:
+
+> Мне есть что сказать про ширину таба и 80 символов.
+
+> Аргумент про разную ширину таба работает слабо: многие стили предполагают его
+> фиксированную длину. Если ставить другой, то форматирование ломается.
+
+> Пример: ядро Linux, где ширина таба 8, и аргументы функций "плывут" при другой
+> ширине.
+
+Я не единожды видел этот аргумент, но он как раз и кажется мне слабым. Большая
+ли разница для читающего код, как именно он его видит:
+
+```
+// tabsize=2
+ func someFunc(
+ one,
+ two,
+ three,
+ )
+...
+ callOfSomeFunc = someFunc(
+ "one",
+ "two",
+ "three",
+ )
+```
+
+или так
+
+```
+// tabsize=4
+ func someFunc(
+ one,
+ two,
+ three,
+ )
+...
+ callOfSomeFunc = someFunc(
+ "one",
+ "two",
+ "three",
+ )
+```
+
+или даже так
+
+```
+// tabsize=8
+ func someFunc(
+ one,
+ two,
+ three,
+ )
+...
+ callOfSomeFunc = someFunc(
+ "one",
+ "two",
+ "three",
+ )
+```
+
+Кажется, что для 8 пробелов на таб всё сильно уезжает, но раз человек себе так
+настроил — то как будто его право и наверное были основания?
+
+
+> Про 80 символов. Дело вообще не в размере терминала или ширине перфокарты.
+> Некоторые программисты разделяют редактор на две вкладки, чтобы смотреть два
+> файла.
+
+И тогда soft-wrap как раз и вместит весь код в каждую из половинок без
+горизонтальной прокрутки, о чём я и говорю.
+
+> Некоторые используют большой шрифт. С шириной в 120 символов мы лишаем из
+> возможности удобно читать код. К тому же, я считаю этот аргумент важным, 120
+> символов - это способ замаскировать плохой код. Чувак сделал 5 уровней
+> вложенности в коде? Отлично! Главное чтобы в 120 символов влезло.
+
+Всё так! Возможно, я не очень подробно расписал, но основная моя мысль в том,
+что такое жесткое ограничение мне кажется просто надуманным и взятым с потолка.
+А если я после функции хочу написать небольшой коммент и он ну никак не влезает
+на пяток символов? Новую строку ради этого делать? Ну как-то бредово. А для
+указанного случая гораздо лучше бы звучало ограничение в стандарте типа «не
+используйте больше 3 уровней вложенности в коде». Это хотя бы имело вполне себе
+обоснование, то что скорее всего такой код просто архитектурно неверен и его
+стоит пересмотреть.
+
+> Конечно, можно сказать что есть длинные константы или имена функций, но этот
+> спор становится менее однозначным. Как по мне вполне хороший консенсус - это
+> 100 символов в строке
+
+Здесь не согласен. Здесь опять «магическая константа» с потолка.
+
+> В целом, эти срачи мне кажутся достаточно поверхностными. Они в своем корне
+> несут вопрос "как повысить читаемость кода?", но акцентируются на мелочах.
+
+Согласен. Мелочи. Но почему и бы про мелочи не поговорить :) Из них по
+отдельности всё и строится (избитая фраза, да). В больших стандартах обычно
+говорится просто декларативно «только пробелы, отступ 4 пробела, длина строк
+120» и всё. А зачем и почему — опускается, как будто всем всё и так понятно. Мне
+вот не очень. Чувствую себя ребёнком спрашивающим «Почему небо синее?». Потому
+что мне кажется, что под этим требованием нет объективного требования кроме «так
+принято». А «так принято» я часто и принимаю как валидный аргумент, например,
+когда прихожу в какой-то проект, но в сути своей аргументом не является.
+
+> Хотелось бы иметь какие-то объективные метрики, какая-то работа в этом
+> направлении была проделана, но, как я понял, это, во-первых, недостаточно
+> точные метрики, а во-вторых, недостаточно развитая история.
+> https://seeinglogic.com/posts/visual-readability-patterns/
+
+Интересная статья, спасибо, с удовольствием прочитал. В целом, по выводам
+(https://seeinglogic.com/posts/visual-readability-patterns/#8-patterns-for-improving-code-readability)
+согласен. Метрика по Хольстеду (или как это перевести?) выглядит интересно, тем
+что она чётко считается (хотя когда я руками считал, что-то у меня не сошлось с
+примером :) ).
+
+Из объективных метрик, тут вскользь ещё упоминалась цикломатическая сложность,
+которая вполне себе имеет право на жизнь.
+
+А так же, только что пришло в голову что можно читабельность кода оценивать как
+вторую (?) производную от отступов по непустым строкам. При этом, чем эта
+производная ближе к нулю — тем лучше.
+
+То есть, грубо говоря вот такой «код»:
+
+```
+_____
+ ________
+ _____
+ _______
+ ___
+ ___
+ _____
+ __
+ ____
+___
+```
+
+Лучше чем, такой:
+
+```
+_____
+ ________
+ _____
+ _______
+ ___
+ ___
+ _____
+ __
+ ____
+ ___
+```
+
+Это стоит ещё подумать, это буквально пришло в голову только что, пока читал
+статью.
+
+P.S.: Из забавного
+
+> As others have written, computers are fast and premature optimization is a bad
+> thing.
+
+Сначала они пишут «computers are fast» а потом происходит такое: [2]
+
+=> https://tonsky.me/blog/disenchantment/ru/ [2]
+
+
+## Update 06.04.25 - 2
+
+Со вчерашнего дня я решил дополнить немного ещё.
+
+Во-первых, хочу немного снизить градус холиворности и радикальности. Ещё раз
+упомяну что не вижу проблем для выравнивания пробелами текста внутри строки. То
+есть например, вот так:
+
+```
+→ → ConstWithLongName = 0
+→ → Const1 = 1
+→ → Const2 = 2
+→ → Const3 = 3
+```
+
+для меня вполне нормально кажется. Даже более того, табы *внутри* строки кажутся
+плохим решением. Я говорю только про отступы в начале строки.
+
+Во-вторых, насчёт длинных строк. Я расписал немного сумбурно и в одну кашу
+смешал как код, так и просто текст. Не стоило так. Хоть это и разные сущности,
+но я всё равно считаю жесткое ограничение необоснованным ни там ни там. Но по
+разным причинам:
+
+* Для обычного текста ограничение в N символов выглядит таким же не обоснованым,
+ как, например, требование автора «Читайте мои тексты только шрифтом Arial
+ 12pt». Глупость? Глупость.
+* Так же встречал, что люди используют это ограничение при написании электронных
+ писем. Это выглядит как минимум странно. Письмо пишется для кого? Для
+ получателя, т.е. читателя. Почему отправитель за читателя решает то, как у
+ него будет отображаться письмо? Я часто читаю почту со смартфона с узким
+ экраном, но средним шрифтом (чтобы меньше напрягать глаза). И горизонтальная
+ прокрутка выглядит не очень. Горизонтальная прокрутка вообще почти всегда
+ выглядит не очень и её стоит избегать всеми силами.
+* Для кода же история другая. Я не настолько поехал чтобы требовать всё писать в
+ одну строку. Если у функции в сигнатуре много (больше одного - двух)
+ аргументов — то это отличная идея написать их в столбик, а не в длинную линию,
+ которая ещё неизвестно как перенесётся. Я против именно переноса только из-за
+ магической константы колиечества символов.
+
+Да и вообще я ни от кого ничего не требовал. Я предлагаю только задуматься, а
+обоснованны ли «общепринятые» вещи? Может, уже прошло какое-то время и ситуация
+поменялась и удобнее и эффективнее выбрать что-то другое?
+
+И как будто стоит абстрактному «читателю», к которому я отсылал, в этом посте,
+решать этот вопрос техническими средствами, типа editorconfig + pre-commit хуки
+на форматирование в принятый в команде формат? Возможно да. Иначе получится, что
+борясь за личную свободу — нарушаешь чужую свободу <del>писать говнокод</del>.
+
+А .editorconfig я себе такой в home положил:
+
+```.editorconfig
+[*]
+indent_style = tab
+tab_width = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+soft_wrap = true
+
+[*.{yml,yaml}]
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_size = 2
+```
+
+Вроде как, покрывает основное.
diff --git a/content/posts/2025-05-19-nxpcms-2.md b/content/posts/2025-05-19-nxpcms-2.md
new file mode 100644
index 0000000..b92a308
--- /dev/null
+++ b/content/posts/2025-05-19-nxpcms-2.md
@@ -0,0 +1,19 @@
+---
+date: '2025-05-19T01:00:00+03:00'
+title: NXPCMS — моя CMS'ка (ч.2)
+---
+
+Всё же, не могу не поделиться, какое же это счастье, когда пользуешься своим же
+самописным софтом!
+
+С одной стороны, конечно, когда видишь косячки — понимаешь, что это именно ты
+продолбался, и тебе это решать. А с другой стороны, полный контроль и ты
+понимаешь, _что_ пошло не так и _как_ это чинить!
+
+В дополнение предыдущего поста, про принципы системы, хочу добавить то, что
+сознательно не буду внедрять ни теги, ни категории. Вместо этого — обычное
+дерево файлов + в ближайшем плане полнотекстовый поиск по материалам сайта.
+А теги мне так и так казались какой-то порочной фигнёй.
+
+Вот и поделился радостью. Своя CMS располагает к тому, чтобы писать сюда больше
+и чаще ;)
diff --git a/content/posts/2025-05-19-nxpcms.md b/content/posts/2025-05-19-nxpcms.md
new file mode 100644
index 0000000..d1d30e6
--- /dev/null
+++ b/content/posts/2025-05-19-nxpcms.md
@@ -0,0 +1,77 @@
+---
+date: '2025-05-19T00:00:00+03:00'
+title: NXPCMS — моя CMS'ка (ч.1)
+---
+
+Долгое время я пользовался Hugo (а одно время, даже WordPress!). И в целом, всем
+он меня устраивал. Но недавно, произошло, казалось бы не связанное. Я снова
+воспылал интересом к треккерной музыке. При этом я немного полазал по сети,
+поспрашивал знакомых и собрал достаточно большую (>80Гб!) коллекцию. Но просто
+хранить на диске было скучно и я решил её выложить во внешку. Так появился
+shelter.neonxp.ru (сейчас не работает, почему - объясню ниже).
+
+Сначала список файлов сервил в веб просто Caddy, но у него был недостаток: он не
+мог дать послушать треккерный файл без скачивания. Тогда я накидал простенькую
+программку, которая так же просто отдаёт содержимое директории, но позволяла
+слушать треккерную музыку. Через некоторое время я подумал, а почему бы не
+прикрутить к ней и предпросмотр и других файлов? Сказано-сделано. Прикрутил
+сначала просмотрщик markdown и txt файлов. Дальше, мысль полетела уже по
+накатанной, и подумалось мне, что это же простенькая CMS. В эту сторону проектик
+я и стал развивать. И вот вчера я таки перевёл этот сайт на мою собственную CMS!
+
+Но пишу только сейчас, потому что вчера после переезда уже ничего не хотел
+писать, ибо переезд был непрост. И как я уже выше говорил, пока отключил shelter
+в пользу этого сайта. Позже заведу и shelter. Особенности моей CMS:
+* минимум конфигурации: один бинарник, который при запуске сервит сайт из
+ текущей рабочей директории.
+* структура сайта ~= файловая структура, отсюда и листинг файлов на каждой
+ странице
+* нет какого-то общего файла конфигурации (аля /etc/...), вместо этого для
+ каждой директории можно создать свой файл .config.json (формат hjson, на самом
+ деле), который распространяет своё действие на текущую директорию, и на все
+ вложенные. Вложенные директории могут иметь свои конфиги, которые могут или
+ частично или полностью переопределять родительский конфиг. Например:
+```
+/var/www/neonxp.ru/.config.json
+
+{
+ "title": "NeonXP.log",
+ "description": "Личный сайт Go-разработчика из Казани",
+ "index": [ "index.gmi", "index.md", "index.txt"],
+ "url": "https://neonxp.ru/",
+}
+```
+а для директории постов важно, чтобы сортировка была в обратном порядке, поэтому
+её конфиг выглядит следующим образом:
+```
+/var/www/neonxp.ru/posts/.config.json
+
+{
+ "description": "Блог", # <- перезапись родительского конфига
+ "desc": true,
+}
+```
+Немного напоминает дедушку Apache2 с его .htaccess :) Но мне это кажется весьма
+удачной идеей.
+* Основной формат разметки — gemtext. Просто потому что мне он нравится своим
+ радикальным минимализмом. Минималистично настолько, что его парсер в html для
+ этой CMS я написал примерно за час с нуля.
+
+На самом деле, написать свою CMSку — достаточно старая мечта, и в своём прошлом,
+я неоднократно это делал, ещё на PHP (ну тогда это было модно). Ну и кто мне
+запретит сделать это сейчас, с теми идеями что я указал выше?) По факту
+получилось что-то среднее между веб-сервером аля Apache2 и классическими CMS, и
+мне это нравится.
+
+## Что дальше?
+
+А дальше я буду развивать её в сторону тех фич, что нужны лично мне:
+* Доделать миграцию постов и материалов из старого блога. Сейчас всё
+ импортировано в автоматическом режиме и выглядит откровенно плохо
+* Поддержка предпросмотра большего числа форматов файлов
+* Хотелось бы сделать Basic авторизацию + загрузку файлов по http
+* Раз уж используется gemtext — сделать и поддержку gemini протокола
+* Прикрутить cgi или скрипты на lua? А почему-бы и нет? :) Хотя бы сделаю
+ какую-нибудь олдскульную гостевуху
+* Прикрутить все эти клёвые indieweb штуки, которые было весьма проблемно
+ прикрутить к Hugo блогу в силу его статичности
diff --git a/content/posts/2025-06-08-my-setup.md b/content/posts/2025-06-08-my-setup.md
new file mode 100644
index 0000000..a4b6dc7
--- /dev/null
+++ b/content/posts/2025-06-08-my-setup.md
@@ -0,0 +1,31 @@
+---
+date: '2025-06-08T00:00:00+03:00'
+tags:
+- сетап
+- гиковское
+title: Мой сетап 2025
+---
+
+Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и
+LLM в последнее время. Если выйдет что интересное - напишу об этом.
+
+А пока хотел написать вот о чём.
+
+Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам
+с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло
+время и мне его описать.
+
+<!--more-->
+
+- [Ноутбук](/pages/setup/laptop/)
+- [Смартфон](/pages/setup/pda/)
+- [NAS](/pages/setup/nas/)
+
+# Окончание
+
+Это всё что я вспомнил так сходу. По-любому, я что-то забыл, поэтому пост будет
+дополняться.
+
+# UPD [14.06.2025]
+
+[Пост переехал в постоянный раздел](/pages/setup/)
diff --git a/content/posts/2025-08-02-meshtastic.md b/content/posts/2025-08-02-meshtastic.md
new file mode 100644
index 0000000..fad4394
--- /dev/null
+++ b/content/posts/2025-08-02-meshtastic.md
@@ -0,0 +1,66 @@
+---
+cover: /posts/files/meshtastic_img/tbeam.webp
+date: '2025-08-02T18:00:00+03:00'
+tags:
+- meshatastic
+- гиковское
+title: Meshtastic
+---
+
+Некоторое время назад наткнулся в блоге [Евгения
+Степанищева](https://bolknote.ru/all/myshastik/) на потрясающую штуку -
+[Meshtastic](https://meshtastic.org/), или как в народе её называют -
+«мышастик». Вкратце, это протокол и, в первую очередь, специальная прошивка для
+целого спектра устройств, которые позволяют организовать
+[mesh](https://ru.ruwiki.ru/wiki/%D0%AF%D1%87%D0%B5%D0%B8%D1%81%D1%82%D0%B0%D1%8F_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F)
+сеть поверх протокола [LoRa](https://ru.ruwiki.ru/wiki/LoRa).
+
+<!--more-->
+
+Базово, как это выглядит при использовании:
+
+У каждого участника сети есть небольшое портативное радиоустройство (готовое или
+самодельное - не важно), прошитое специальной прошивкой. К устройству, чаще
+всего (но необязательно!) подключен смартфон со специальным одноимённым
+приложением. Устройство ищет и старается подключиться к другим подобным
+устройствам, а со смартфона можно писать как в публичные, так и в приватные
+каналы. Но только текстом, т.к. скорость исчисляется байтами в секунду. При
+этом, хоть и радиус каждого устройства достаточно небольшой, но засчёт ячеистой
+топологии можно передавать сообщения не только тем, кто в радиусе приёма, но и
+тем, кого напрямую устройство «не видит», зато видят соседи или соседи соседей
+(в среднем, не больше 7 хопов обычно настраивают).
+
+Загоревшись, я тут же заказал себе
+[T-Beam](https://meshtastic.org/docs/hardware/devices/lilygo/tbeam/). Настройка
+оказалась до тупости простой, единственное, что надо учитывать, это то, какие
+частоты приняты в конкретном городе. Для Казани - это 868MHz.
+
+На своём 3D принтере напечатал ти-биму корпус, закрепил его на стену и оставил
+вылавливать ноды. За неделю накопилось почти 50 штук! Но при этом, я не скажу,
+что качество связи какое-то особо хорошее - регулярно теряются сообщения, да и
+единовременно у меня, по сути, только один аплинк до остальной сети. Ну ничего,
+я уже заказал антенну получше ;).
+
+![Мой T-Beam в напечатанном чехле](/posts/files/meshtastic_img/tbeam.webp)
+
+Чехол всратоватый потому что я его печатал в наихудшем качестве, на
+неотрегулированном принтере. Главное - свою задачу защиты выполняет.
+
+Понятное дело, что это просто игрушка и никакого практического применения у неё
+нет, а в основном чате - бо́льшую часть времени сплошные «Пинг, меня слышно?».
+Но! Очень забавная игрушка. И да, теоретически может позволить экстренно
+связаться там, где другой сети просто нет. Просто, это не мой случай. Хотя,
+недавно оказался в ситуации, когда и электричества дома не было (а с ним и
+домашней сети) и одновременно была БПЛА опасность, а значит, никакущая мобильная
+сеть. То есть, практически, идеальные условия для мышастика :).
+
+Несмотря на это, я всё же не удержался и заказал ещё два устройства, но в этот
+раз попроще. Брошу один в машину, а второй или супруге отдам, или в рюкзаке
+носить буду носить. Буду своими скромными силами хоть немного, да расширять сеть
+своими устройствами.
+
+Так же ездил на стройку своего будущего дома с устройством, но, ожидаемо, там
+оно сеть не увидело. Значит буду думать или о высокой антенне на крыше, или ещё
+что выдумывать, чтобы из своих пердей «дотянуться» до большой городской сети.
+
+А к чему я про него рассказываю? А просто так. Забавная гиковская штука.
diff --git a/content/posts/2025-08-05-lets-code-3d.md b/content/posts/2025-08-05-lets-code-3d.md
new file mode 100644
index 0000000..3809861
--- /dev/null
+++ b/content/posts/2025-08-05-lets-code-3d.md
@@ -0,0 +1,154 @@
+---
+cover: /posts/files/lets-code-3d_img/4.jpg
+date: '2025-08-05T20:00:00+03:00'
+tags:
+- 3D печать
+- гиковское
+title: Давай запрограммируем деталь?
+---
+
+Некоторое время назад я по глупости запорол свои бокорезы, так, что для
+откусывания ножек радио деталей они больше не годятся. К счастью, стоят они
+совершенно не дорого, и тем же днём были заказанные новые в небезызвестном
+сервисе, который в девичестве содержал в себе название моего родного города. При
+получении я немного огорчился тем, что в комплекте к ним не шёл колпачок,
+который был у предыдущих, хотя выглядят они идентично.
+
+Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот
+колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть
+у меня на хозяйстве.
+
+<!--more-->
+
+![Бокорез и родной колпачок](/posts/files/lets-code-3d_img/1.jpg) Бокорезы и
+колпачок
+
+## Проектирование
+
+Обычно, детали для печати проектируются в CAD программах твердотельного
+моделирования. Но я в них совершенно не умею, хотя и сын
+инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый
+худший! Посему, я решил воспользоваться свободной программой для твердотельного
+моделирования [OpenSCAD](https://openscad.org/). К счастью, в репозитории
+любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он
+присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём
+не _рисуется_, а именно что _программируется_. Для понимания, приведу простой
+пример:
+
+```openscad
+cube([25,35,55]); // Нарисовать куб размерами 25мм х 25мм х 55мм
+```
+
+Просто? Очень! А учитывая что язык полноценный, с циклами и условиями
+«напрограммировать» в нём можно многое.
+
+## Первая версия
+
+Вот и я не стал долго думать, открыл [мануал с
+оффсайта](https://openscad.org/documentation.html), обмерил штангенциркулем
+оригинальный колпачок и пошёл <del>проектировать</del> программировать. На всё
+про всё у меня ушло где-то с полчаса. И у меня получилась первая версия
+колпачка. Максимально простая и дубовая. Первая куцая версия:
+
+![Колпачок v1](/posts/files/lets-code-3d_img/2.jpg)
+
+## Вторая версия
+
+В принципе, на этом можно было и остановиться, ведь свою функцию он выполняет.
+Но у меня сработал мой перфекционист и я подумал, что было бы неплохо вырезы в
+корпусе сделать один под другим, а не на одной линии, чтобы бокорез сидел ровно,
+а не под углом. Потом пришла мысль, что было бы неплохо ещё и параметризировать
+модель, чтобы было легко менять её размеры, а не хардкодить их. И вот получилась
+вторая, и на текущий момент окончательная версия:
+
+![Колпачок v2 код](/posts/files/lets-code-3d_img/3.png)
+
+И результат «в железе», то есть в пластике :)
+
+![Колпачок v2 результат](/posts/files/lets-code-3d_img/4.jpg)
+
+А сам код, думаю, он достаточно понятен ([исходники](/posts/files/source.scad) и
+[STL модель](/posts/files/result.stl) я прикладываю к этому посту):
+
+```openscad
+// Толщина стенки
+wall = 2;
+
+// Высота внешняя
+height = 12;
+
+// Длина основной части (внутренняя)
+l1 = 15;
+
+// Длина носика (внутренняя)
+l2 = 20;
+
+// Ширина у основания (внутренняя)
+w = 15;
+
+// Толщина метала бокорезов
+toolWidth = 2.1;
+
+// Нижняя крышка
+cover(0);
+
+// Верхняя крышка
+cover(height - wall);
+
+// Корпус
+difference() {
+ linear_extrude(height)
+ polygon(
+ [ // Полигон идёт против часовой стрелки
+ [0, 0],
+ [wall, 0],
+ [wall, l1],
+ [w / 2 + wall, l1 + l2], // Внутренний кончик носика
+ [w + wall, l1],
+ [w + wall, 0],
+ [w + wall * 2, 0],
+ [w + wall * 2, l1],
+ [w / 2 + wall / 2 + wall, l1 + l2 + wall], // Внешний кончик носика
+ [w / 2 - wall / 2 + wall, l1 + l2 + wall],
+ [0, l1],
+ ]
+ );
+
+ // Вырезы
+ translate([w + wall, 0, height / 2 - toolWidth]) // Правый вырез чуть ниже середины
+ cube([wall, l1 / 2, toolWidth]);
+ translate([0, 0, height / 2]) // Левый вырез чуть выше середины
+ cube([wall, l1 / 2, toolWidth]);
+}
+
+
+// Крышка
+module cover(z) {
+ translate([0, 0, z])
+ linear_extrude(wall)
+ polygon(
+ [ // Полигон идёт против часовой стрелки
+ [0, 0],
+ [w + wall * 2, 0],
+ [w + wall * 2, l1],
+ [w / 2 + wall / 2 + wall, l1 + l2 + wall],
+ [w / 2 - wall / 2 + wall, l1 + l2 + wall],
+ [0, l1],
+ ]
+ );
+}
+```
+
+Надеюсь, я кому-то показал что даже без специального конструкторского
+образования, но умея программировать - можно получать не только эфимерные
+программки, но и вполне себе физические предметы, которые пригождаются в быту.
+И если интересно, подбиваю экономику: напечатано 2 колпачка (1 и 2 версия),
+каждый весом по 4 грамма, то есть примерно по 4₽ за штуку. Печатал пластиком
+PLA, как моим самым любимым.
+
+## Ссылки
+
+- Сайт OpenSCAD - https://openscad.org/
+- Документация - https://openscad.org/documentation.html
+- Шпаргала по функциям - https://openscad.org/cheatsheet/index.html
+- Библиотеки - https://openscad.org/libraries.html
diff --git a/content/posts/2025-08-09-makeup-organizer.md b/content/posts/2025-08-09-makeup-organizer.md
new file mode 100644
index 0000000..b6a3feb
--- /dev/null
+++ b/content/posts/2025-08-09-makeup-organizer.md
@@ -0,0 +1,38 @@
+---
+cover: /posts/files/makeup-organizer_img/2.png
+date: '2025-08-09T16:00:00+03:00'
+tags:
+- 3D печать
+- гиковское
+title: Ещё немного печати
+---
+
+Я продолжаю погружаться в печать не просто готовых моделей из интернета, что не
+очень интересно, но так же и в проектирование и печать собственных изделий.
+Сегодня моя любимая супруга попросила напечатать ей органайзер для косметики.
+Показала референс, какой она хочет. ТЗ понятное, размеры подобрали, осталось
+дело за малым — непосредственно запрограммировать изделие.
+
+<!--more-->
+
+На практике, это пока самое сложное по детализации изделие из всех, что я делал.
+Код получился кривоватым, но рисует то, что нужно.
+
+Вот так результат в редакторе:
+
+![результат в редакторе](/posts/files/makeup-organizer_img/1.png)
+
+А вот так в слайсере:
+
+![слайсер](/posts/files/makeup-organizer_img/2.png)
+
+Ну и впервые решил добавить «клеймо мастера» со своим логотипом. Впредь, буду
+добавлять его на все свои изделия, которые запроектированы именно мной.
+
+![клеймо мастера](/posts/files/makeup-organizer_img/3.png)
+
+Фотографий готового изделия пока нет, ибо печататься ему ещё минимум 10 часов.
+Фото я приложу позже отдельным постом ;)
+
+**P.S.** [архив с исходниками и готовым для печати STL
+прилагаю](/posts/files/organizer.tar.zst)
diff --git a/content/posts/2025-09-01-travel-1.md b/content/posts/2025-09-01-travel-1.md
new file mode 100644
index 0000000..7d86c1f
--- /dev/null
+++ b/content/posts/2025-09-01-travel-1.md
@@ -0,0 +1,142 @@
+---
+cover: /posts/files/2025-travel-1_img/preview_1.webp
+date: '2025-09-01T20:00:00+03:00'
+tags:
+- тревелблог
+title: 'Поездка по Кавказу. Часть 1: САО РАН и Аланское городище в Нижнем Архызе'
+---
+
+[![Дорога на
+САО](/posts/files/2025-travel-1_img/preview_1.webp)](/posts/files/2025-travel-1_img/1.webp)
+
+## САО РАН
+
+Первая настоящая вылазка за этот отпуск. В этот раз мы ездили снова на [САО РАН
+(Специальная Астрофизическая Обсерватория Российской Академии
+Наук)](https://ru.ruwiki.ru/wiki/Специальная_астрофизическая_обсерватория_РАН) в
+посёлке Нижний Архыз. В том году мы уже там бывали, но, во-первых, прикосновение
+к настоящей науке вдохновляет каждый раз, и я не знаю на какой бы раз мне туда
+надоело ездить. А, во-вторых, в этот раз был другой научный сотрудник, с
+совершенно другой лекцией, так что, скучать не пришлось! Кстати, этот телескоп —
+с самым большим в Евразии диаметром главного зеркала: аж 6 метров и весом в 42
+тонны! Высота купола — 53 метра, а высота самого телескопа в вертикальном
+положении (как на фото) — более 40 метров!
+
+![САО РАН](/posts/files/2025-travel-1_img/saologo.png)
+
+<!--more-->
+
+[Место на
+карте](https://yandex.ru/maps/?l=sat%2Cskl&ll=41.440447%2C43.646825&pt=41.4404472%2C43.6468250&z=14)
+
+Дальше — небольшой фотоотчёт и расскажу о втором месте, где побывал.
+
+[![Внезапная
+встреча](/posts/files/2025-travel-1_img/preview_2.webp)](/posts/files/2025-travel-1_img/2.webp)
+
+Внезапная встреча
+
+[![Стадо козочек и
+барашков](/posts/files/2025-travel-1_img/preview_3.webp)](/posts/files/2025-travel-1_img/3.webp)
+
+Стадо козочек и барашков
+
+[![Купол
+САО](/posts/files/2025-travel-1_img/preview_4.webp)](/posts/files/2025-travel-1_img/4.webp)
+
+Купол САО
+
+[![Обсерватория
+поменьше](/posts/files/2025-travel-1_img/preview_5.webp)](/posts/files/2025-travel-1_img/5.webp)
+
+Обсерватория поменьше
+
+[![Огромный
+кран](/posts/files/2025-travel-1_img/preview_6.webp)](/posts/files/2025-travel-1_img/6.webp)
+
+Огромный кран, с помощью которого устанавливается зеркало
+
+[![БТА](/posts/files/2025-travel-1_img/preview_7.webp)](/posts/files/2025-travel-1_img/7.webp)
+
+И вот он сам! Его величество — [БТА (Большой Телескоп
+Азимутальный)](<https://ru.ruwiki.ru/wiki/БТА_(телескоп)>)!
+
+Внезапно, в самый разгар лекции, купол начал поворачиваться! Видимо,
+предполагались какие-то профилактические работы перед очередной рабочей сменой
+обсерватории (работает она только по ночам и в ясную погоду, что логично). В
+копилку этой версии говорит и тот факт, что после поворота на главное зеркало
+поднялся специалист и проводил непонятные мне, дилетанту, работы. Возможно,
+ремонтно-профилактические.
+
+После экскурсии ещё смотрели на солнце (через специальный фильтр, конечно же!) и
+я впервые своими глазами увидел настоящие пятна на солнце!
+
+## Нижне-Архызское городище
+
+Сразу после САО мы поехали в [Нижне-Архызское
+городище](https://ru.ruwiki.ru/wiki/Нижне-Архызское_городище), где находятся
+руины храмов и других построек X-XII веков.
+
+[Место на
+карте](https://yandex.ru/maps/?ll=41.47500,43.68528&pt=41.47500,43.68528&spn=0.1,0.1&l=sat,skl)
+
+Поскольку, я не историк, и рассказать мне про них сверх данных из Рувики нечего
+— просто опубликую фотографии.
+
+### Средний храм
+
+[![Изображение
+8](/posts/files/2025-travel-1_img/preview_8.webp)](/posts/files/2025-travel-1_img/8.webp)
+
+[![Изображение
+9](/posts/files/2025-travel-1_img/preview_9.webp)](/posts/files/2025-travel-1_img/9.webp)
+
+[![Изображение
+10](/posts/files/2025-travel-1_img/preview_10.webp)](/posts/files/2025-travel-1_img/10.webp)
+
+[![Изображение
+11](/posts/files/2025-travel-1_img/preview_11.webp)](/posts/files/2025-travel-1_img/11.webp)
+
+[![Изображение
+20](/posts/files/2025-travel-1_img/preview_20.webp)](/posts/files/2025-travel-1_img/20.webp)
+
+### Северный храм
+
+[![Изображение
+17](/posts/files/2025-travel-1_img/preview_17.webp)](/posts/files/2025-travel-1_img/17.webp)
+
+[![Изображение
+12](/posts/files/2025-travel-1_img/preview_12.webp)](/posts/files/2025-travel-1_img/12.webp)
+
+[![Изображение
+13](/posts/files/2025-travel-1_img/preview_13.webp)](/posts/files/2025-travel-1_img/13.webp)
+
+[![Изображение
+14](/posts/files/2025-travel-1_img/preview_14.webp)](/posts/files/2025-travel-1_img/14.webp)
+
+[![Изображение
+15](/posts/files/2025-travel-1_img/preview_15.webp)](/posts/files/2025-travel-1_img/15.webp)
+
+[![Изображение
+16](/posts/files/2025-travel-1_img/preview_16.webp)](/posts/files/2025-travel-1_img/16.webp)
+
+### Солярный круг
+
+[![Изображение
+18](/posts/files/2025-travel-1_img/preview_18.webp)](/posts/files/2025-travel-1_img/18.webp)
+
+[![Изображение
+19](/posts/files/2025-travel-1_img/preview_19.webp)](/posts/files/2025-travel-1_img/19.webp)
+
+### Половецкая баба
+
+[![Изображение
+21](/posts/files/2025-travel-1_img/preview_21.webp)](/posts/files/2025-travel-1_img/21.webp)
+
+[![Изображение
+22](/posts/files/2025-travel-1_img/preview_22.webp)](/posts/files/2025-travel-1_img/22.webp)
+
+[![Изображение
+23](/posts/files/2025-travel-1_img/preview_23.webp)](/posts/files/2025-travel-1_img/23.webp)
+
+Продолжение поездки следует...
diff --git a/content/posts/2025-10-06-ai.md b/content/posts/2025-10-06-ai.md
new file mode 100644
index 0000000..d6b30e0
--- /dev/null
+++ b/content/posts/2025-10-06-ai.md
@@ -0,0 +1,124 @@
+---
+cover: /posts/files/hype_curve.png
+date: '2025-10-06T22:00:00Z'
+tags:
+- размышления
+- разное
+- ИИ
+title: Размышления о будущем ИИ
+---
+
+Немного моих размышлений про будущее ИИ как технологии, а не философии.
+
+Как водится, когда речь о размышлениях — буду сначала вводить тезисы, а потом,
+синтез.
+
+<!--more-->
+
+# Тезис первый
+
+Хоть сам и не пользуюсь таким инструментом, как Cursor из третьих рук я узнал,
+что там не просто внутри нейронка, а целый их ансамбль. Более того, что главное,
+там есть автовыбор того, какая именно БЯМ (большая языковая модель) будет
+отвечать за конкретный запрос. И вот этот момент меня заинтересовал. Я
+задумался, как именно это может быть реализовано. Первая мысль, как самая
+очевидная была в том, что внутри помимо больших моделей, есть и маленькая,
+единственная функция которой (а может и не единственная, но, значит, основная) —
+классифицировать запрос (окей, промпт) по тому, какая из больших моделей возьмёт
+работу на себя.
+
+Мысль эта мне показалась немного диковатой, т.к. показалось, что это несколько
+пушкой по воробьям, и подумал, что может есть другое, более классическое,
+алгоритмическое решение. Думал-думал, ничего хорошего в голову не пришло.
+Поэтому всё же взял за рабочую гипотезу, что таки да, классифицирует маленькая и
+дешевая моделька. Маленькая и дешёвая да, но точно не локальная. Ведь даже для
+маленьких моделек нужны определённые мощности, которые есть далеко не у всех.
+
+И вот здесь-то мысль и полетела дальше! Представилось что в будущем всё больше и
+больше «классические» алгоритмические задачи будут «закрывать» нейронками там
+где надо и не надо. Чем-то напоминает ситуацию в электронике, когда экономически
+часто более целесообразно не придумывать схему на элементарных радиодеталях, а
+воткнуть просто унифицированный микроконтроллер, который с правильной прошивкой
+заменяет целую кучку рассыпухи.
+
+Но продолжение мысли пока попридержу. А пока...
+
+# Тезис второй
+
+Я человек молодой, но более менее успел застать такой интересный переферийный
+девайс, как [математический
+сопроцессор](https://ru.ruwiki.ru/wiki/Математический_сопроцессор). Назначение
+устройства — позволять компьютеру выполнять операции над вещественными числами.
+Представляете, когда-то процессоры такие операции сами не умели выполнять! Но
+надо делать скидку на время и то, что такие операции были, наверное, не всем
+нужными, а скорее уделом специалистов, которые знали зачем им эта железка и
+целенаправленно её докупали. Сейчас любой, даже самый слабейший процессор имеет
+этот сопроцессор внутри себя.
+
+Ничего не напоминает?
+
+Нейронки и видеокарты!
+
+А вот сейчас, соединим тезисы и придём к ...
+
+# Синтез
+
+Нейронки, однозначно, вошли в нашу жизнь уже на долго.
+
+![Кривая хайпа](/posts/files/hype_curve.png)
+
+Мы сейчас, по моей оценке, где-то между пиком и дном, причём ближе именно к
+пику. Затем, неизбежно будет дно разочарований. Но это не столь важно сейчас.
+Важнее — следующий этап. Выйдет ли технология на плато продуктивности? Скорее
+всего, да. Всё же, помимо того, что это «ыыы прикольная штука», это ещё и вещь
+со вполне очевидной прикладной пользой. Не буду вдаваться в подробности, но я
+имею в виду обработку естественного языка (классификация, суммаризация,
+генерация), а так же «нечёткие» алгоритмы, когда путь к решению не задан заранее
+(агенты и всё такое).
+
+И по той причине, что мы ещё не на плато, есть ощущение некоего «дикого запада».
+Ещё не устаканились методы и подходы, практически ежедневно что-то появляется
+новое, а старое исчезает. Горизонт - буквально пара месяцев. И инструменты всё
+ещё крайне сырые. Под инструментами я имею в виду даже не программные
+инструменты, а то на чём это запускается. А запускаются нейронки на видеокартах!
+ВИДЕОкарты, Карл! Лично мне это выглядит несколько костыльным. Причём даже
+мощные профессиональные решения типа A100, H100 за миллионы рублей это по сути
+именно что видеокарты, хоть и без видеовыходов. Даже у криптовалют когда они
+были на хайпе и майнились на тех же несчастных видеокартах достаточно быстро
+появились специализированные решения в виде
+[айсиков](https://ru.ruwiki.ru/wiki/Интегральная_схема_специального_назначения).
+Ждут ли нас специализированные решения для задач ИИ? Конечно. Даже более того,
+они уже есть. У того же Huawei. Устройства, которые заточены только для нейронок
+и никак не способные в графику. И это, ИМХО, правильный путь, туда индустрия и
+пойдёт.
+
+Но это, опять таки, всё ещё настоящее. А что там в будущем?
+
+А в будущем, думаю, нас ждёт то, что специализированные устройства для инференса
+(запуска готовых моделей, грубо говоря) буду встроены непосредственно во все
+потребительские компьютеры и даже носимую технику, типа телефонов. Ровно так же,
+как было с математическими сопроцессорами, которые начинали отдельным
+устройством, а сейчас уже давно — просто небольшая часть на кристалле
+процессора. А применение им вижу как раз таки в том, чтобы там постоянно сидела
+небольшая (ну небольшая для того, будущего времени, для нас настоящих, скорее
+всего, весьма большая) моделька, к которой по вполне стандартизированным API ОС
+будет обращаться прикладной софт, чтобы выполнять какие-то свои прикладные
+задачи. Типа той, про которую я говорил в самом начале, по классификации того, в
+какую большую модель пойдёт запрос пользователя. Более того, кажется, что со
+временем это станет настолько общим местом, что многий софт и не запустится на
+железе без встроенного «интеллектуального сопроцессора». Как сейчас не
+запустится многий софт без, даже не математического сопроцессора (где вы найдете
+процессор без него?), а, например, каких нибудь SSE2 инструкций (я, честно
+говоря, не очень знаю зачем они, но, подозреваю, без них многое не заработает).
+А значит в этом самом будущем эти «интеллектуальные сопроцессоры» будут просто
+базовой частью любой ЭВМ (ну нравится мне эта аббревиатура).
+
+Да, можно возразить, что никак физически невозможно впихнуть такую
+вычислительную мощь в маленький кристалл на плате ноутбука, а, тем более,
+телефона. На это я отвечу просто: не знаю. Может быть и невозможно и такого не
+будет. Но ведь когда-то казалось невозможным что компьютер не будет занимать
+несколько комнат, а умещаться в кармане джинс каждого человека! Причём, тот что
+в джинсах, ещё и на много порядков будет мощнее! Так что я бы ничего не
+исключал.
+
+А как вы думаете?
diff --git a/content/posts/2025-10-11-blog.md b/content/posts/2025-10-11-blog.md
new file mode 100644
index 0000000..2a67127
--- /dev/null
+++ b/content/posts/2025-10-11-blog.md
@@ -0,0 +1,32 @@
+---
+date: '2025-10-11'
+draft: true
+tags:
+- блог
+title: Очередная смена движка блога
+---
+
+Ну не совсем так. Скорее сильно переделал NXPCMS. По сути, превратил её в
+статический генератор по типу Hugo. Только с максимальной поддержкой Obsidian.
+Как ссылок, так и его варианта Markdown.
+
+<!--more-->
+
+А раз изменения настолько кардинальные — не грешно и дать проекту новое имя.
+Встречайте: [YASSG. Yet Another Static Site
+Generator](https://gitverse.ru/neonxp/yassg). Оригинально, да.
+
+Далее сделал pipeline чтобы при коммите нового поста в git - автоматически блог
+собирался и деплоился. А этим постом я по сути проверю сейчас как это работает.
+
+Сейчас последовательность такая:
+
+1. пишу новый пост в Obsidian (достаточно удобно)
+2. Из него же с помощью специального Git плагина коммичу в репозиторий
+ (https://gitverse.ru/neonxp/sites)
+3. В этом репозитории запускается пайплайн который скачивает последний билд моей
+ новой CMS (https://gitverse.ru/neonxp/yassg/releases) и с помощью неё
+ собирает Obsidian Vault в статический сайт и деплоит его на сервер.
+4. Всё!
+
+Получается достаточно удобно!
diff --git a/content/posts/2025-10-18-the-ghost-in-the-machine.md b/content/posts/2025-10-18-the-ghost-in-the-machine.md
new file mode 100644
index 0000000..b8dff9f
--- /dev/null
+++ b/content/posts/2025-10-18-the-ghost-in-the-machine.md
@@ -0,0 +1,184 @@
+---
+cover: /posts/files/laughing-man.jpeg
+date: '2025-10-18'
+tags:
+- книги
+- размышления
+- не_моё
+- ИИ
+title: Душа в машине
+---
+
+Станислав Лем
+
+![Небольшая отсылка](/posts/files/laughing-man.jpeg)
+
+<!--more-->
+
+Понятием "душа в машине" - the ghost in the machine - некоторые психологи
+(английские) закрепляют убеждение в том, что человек якобы является существом
+"двойственным", т.е. состоящим из "материи" и "души".
+
+Сознание не является технологической проблемой, потому что конструктора не
+интересует, чувствует ли машина, а только интересует, действует ли она. Таким
+образом "технология сознания", как бы это сказать, может появиться только
+мимоходом, когда окажется, что определенный класс кибернетических машин обладает
+субъективным миром психических переживаний.
+
+Но каким образом можно узнать о наличии сознания в машине? Эта проблема имеет не
+только абстрактно-философское значение, ибо предположение, что какая-то машина,
+которая отправляется на лом из-за того, что ремонт не оплачивается, имеет
+сознание, превращает наше решение уничтожить материальный предмет, типа
+граммофона, в акт уничтожения индивидуальности, осознанного убийства. Кто-то мог
+бы оснастить граммофон пластинкой и выключателем таким образом, что, если бы мы
+сдвинули его с места, то услышали бы крики: "Ах, умоляю, подари мне жизнь!". Как
+можно отличить такой, без сомнения, бездушный аппарат от мыслящей машины? Только
+вступая с ней в разговор. Английский математик Аллан Тьюринг (Allan Turing) в
+своей работе "Может ли машина мыслить?" предлагает в качестве решающего критерия
+"игру в имитацию", которая основывается на том, что мы задаем Кому-то
+произвольные вопросы и на основании ответов должны сделать заключение, является
+ли этот Кто-то человеком или машиной. Если мы не сможем отличить машину от
+человека, то следует признать, что машина ведет себя как человек, то есть что
+она обладает сознанием.
+
+Отметим со своей стороны, что игру можно усложнить. Можно предположить два вида
+машин. Первый вид является "обычной" цифровой машиной, которая устроена как
+человеческий мозг; с ней можно играть в шахматы, разговаривать о книгах, о мире
+и вообще на все темы. Если бы мы ее вскрыли, то увидели бы огромное количество
+соединений элементов, подобно соединениям нейронов в мозгу, кроме того - блоки
+ее памяти и т.д. и т.п.
+
+Второй вид машины совсем другой. Это увеличенный до размера планеты (или
+космоса) граммофон. Она имеет очень много, например, сто триллионов, записанных
+ответов на всевозможные вопросы. Таким образом, когда мы спрашиваем, машина
+ничего "не понимает", а только форма вопроса, т.е. очередность вибраций нашего
+голоса, приводит в движение передатчик, который запускает пластинку или ленту с
+записанным ответом. Не будем задумываться о технической стороне вопроса.
+Понятно, что такая машина неэкономична, что ее никто не создаст, потому что это
+невозможно и главное - неизвестно, зачем ее создавать. Но нас интересует
+теоретическая сторона. Потому что, если вывод о том, имеет ли машина сознание,
+делается на основе поведения, а не внутреннего строения, не придем ли мы
+неосмотрительно к выводу, что "космический граммофон" обладает им - и тем самым
+выскажем нонсенс? (А скорее неправду).
+
+Можно ли, однако, запрограммировать все возможные вопросы? Без сомнения, средний
+человек не отвечает в обычной жизни даже на один их биллион. Мы же на всякий
+случай записали их во много раз больше. Что же делать? Мы должны вести нашу игру
+по достаточно развитой стратегии. Мы задаем машине (то есть Кому-то, потому что
+не знаем, с кем имеем дело; разговор ведется, например, по телефону) вопрос,
+любит ли она анекдоты. Машина отвечает, скажем, что да, она любит хорошие
+анекдоты. Рассказываем ей анекдот. Машина смеется (т.е смеется голос в трубке).
+Или у ней был этот анекдот записан и это позволило ей правильно отреагировать,
+т.е. засмеяться, или это в самом деле мыслящая машина (или человек, ибо мы этого
+не знаем). Мы разговариваем с машиной какое-то время, а потом неожиданно
+спрашиваем, припоминает ли она анекдот, который мы ей рассказали. Она должна его
+помнить, если она действительно мыслит. Она скажет, что помнит. Мы попросим,
+чтобы она повторила его своими словами. Вот это уже очень трудно
+запрограммировать, потому что таким образом мы вынуждаем конструктора
+"космограммофона" записать не только отдельные ответы на возможные вопросы, но и
+целые последовательности разговоров, которые могут вестись. Это требует,
+конечно, памяти, т.е. дисков или лент, которых, может, и вся солнечная система
+не вместит. Положим, машина не может повторить нашего анекдота. И мы тем самым
+разоблачаем, что она - граммофон. Задетый конструктор берется за
+усовершенствование машины таким образом, что пристраивает ей такую память,
+благодаря которой она сможет вкратце повторить сказанное. Но таким образом он
+сделал первый шаг в направлении от машины-граммофона к машине мыслящей. Так как
+бездушная машина не может признать идентичными вопросы аналогичного содержания,
+но сформулированные даже с незначительными формальными отклонениями, типа:
+"Вчера было хорошо на улице?", "Вчера была прекрасная погода?", "Погожим ли был
+предыдущий день?" и т. д. и т. п., то для машины бездушной они будут вопросами
+различными, а для машины мыслящей идентичными. Конструктор вновь разоблаченной
+машины вынужден опять ее перерабатывать. В конце концов, после долгой серии
+переделок, он введет в машину способности индукции и дедукции, способность
+ассоциации, схватывания тождественной "формы" по-разному сформулированных, но
+одинаковых по содержанию высказываний, пока в результате не получит машину,
+которая просто будет "обычной" мыслящей машиной.
+
+Так появляется интересная проблема: когда именно в машине появилось сознание?
+Предположим, что конструктор не переделывал эти машины, а относил каждую в музей
+и следующую модель создавал с начала. В музее стоит 10 000 машин, потому что
+столько было очередных моделей. Результатом стал плавный переход от "бездушного
+автомата" типа играющего шкафа к "машине, которая мыслит". Должны ли мы признать
+машиной, имеющей сознание, машину номер 7852 или только номер 9973? Они
+отличаются друг от друга тем, что первая не умела объяснить, почему она смеется
+над рассказанным анекдотом, а только говорила, что анекдот очень смешен, а
+вторая умела. Но некоторые люди смеются над шутками, хотя и не могут объяснить,
+что именно в них смешно, потому что, как известно, теория юмора - это твердый
+орешек. Разве эти люди тоже лишены сознания? Нет же, они, наверное, просто не
+очень быстро реагируют или малообразованные, их ум не обладает навыками
+аналитического подхода к проблемам; но мы спрашиваем не о том, умная ли машина
+или скорее туповатая, мы только спрашиваем, имеет ли она сознание или нет.
+
+Казалось бы, следует признать, что модель номер 1 имеет ноль сознания, модель
+номер 10 000 имеет полное сознание, а все средние имеют "все больше" сознания.
+Это утверждение показывает, насколько безнадежной является мысль о том, что
+сознание можно точно локализовать. Отсоединение отдельных элементов ("нейронов")
+машины спровоцирует только слабые, количественные изменения ("ослабления")
+сознания так же, как это делает в живом мозге прогрессирующий процесс болезни
+или нож хирурга. Проблема не имеет ничего общего ни с использованным для
+конструкции материалом, ни с размерами "мыслящего" устройства. Электрическую
+мыслящую машину можно построить из отдельных блоков, соответствующих, положим,
+мозговым извилинам. Теперь разделим эти блоки и разместим на всей Земле так, что
+один находится в Москве, второй в Париже, третий в Мельбурне, четвертый в
+Иокогаме и т. д. Отделенные друг от друга, эти блоки "психически мертвы", а
+соединенные (например, телефонными кабелями) они стали бы одной, интегральной
+"индивидуальностью", единым "мыслящим гомеостатом". Сознание такой машины
+находится ни в Москве, ни в Париже, ни в Иокогаме, но, в определенном смысле, в
+каждом из этих городов и, в определенном смысле, ни в одном из них. Потому что о
+нем трудно сказать, что оно, как Висла, имеет протяженность от Татр до
+Балтийского моря. Впрочем, подобная проблема демонстрирует, хотя и не так ярко,
+человеческий мозг, потому что кровеносные сосуды, белковые молекулы и ткани
+находятся внутри мозга, но не внутри сознания, и опять-таки нельзя сказать, что
+сознание находится под самым куполом черепа или, скорее всего, ниже, над ушами,
+по обеим сторонам головы. Оно "рассеяно" по всему гомеостату, по его
+функциональной сети. Ничего больше заявить на эту тему не получится, если мы
+хотим соединить сознание с возможностью рассуждать.
+
+Вышеприведенный текст, скопированный из моей "Суммы технологии", был написан в
+середине 1963 года. С точки зрения сегодняшней ситуации он представляет очень
+сильное упрощение дороги, которую мы должны пройти, чтобы дойти до имитации
+описанной мной цели. Мы уже предполагаем, что "сознание" и "интеллект" - это в
+определенном смысле отдельные сути бытия. Мы знаем, что существуют достаточно
+различные состояния сознания, даже если шкала их находится между сном и
+реальностью. Но и сон, точнее, мечта во сне, может характеризоваться
+разнообразной насыщенностью конкретностей, которые имитируют реальность,
+сознательно переживаемую наяву. В свою очередь, сознание наяву, что каждый знает
+по собственному опыту, даже если он не является ни психологом, ни психиатром,
+может также иметь очень различные состояния. Человек в состоянии болезненного
+жара может осознавать свое состояние, то есть то, что его сознание подверглось
+нарушению. Различные химические средства могут самым разным образом формировать
+человеческое сознание. Кроме того, следует отметить, что есть множество
+действий, которые человек может делать машинально, то есть четко и неосознанно.
+Сознание водителя автомобиля, особенно быстрого, "не успевает" за реакциями
+этого водителя в ситуациях с неожиданной последовательностью событий. Вместе с
+тем машинально можно делать глупости, мы называем их чаще всего "действиями по
+рассеянности".
+
+Все это я сказал в отношении моего текста тридцатипятилетней давности, в котором
+я задумался над "ростками" сознания в машине, и делал я это потому, что мне
+казалось, что люди очень отличаются друг от друга уровнем умственных
+способностей, а сознание всем дано приблизительно похожее.
+
+Дороги напрямик, по прямой и восходящей линии, от полного автомата, каким
+является компьютер, к машине, которой мы могли бы приписать сознание, нет.
+Вместе с тем работу нашего мозга мы уже знаем настолько, чтобы узнать то, что
+так называемая каллотомия, или рассечение большой белой спайки, соединяющей
+полушария мозга, не ликвидирует сознания, но создает в разделенных полушариях
+две его разновидности. Кроме того, мы знаем, что мозг является системой,
+построенной из огромного количества функциональных модулей, которые в отдельных
+окрестностях мозга создали среду, формирующую сознание. Уточню сказанное
+примером. Существует часть коры мозга, способствующая тому, что мы видим цвета.
+Повреждение этого модуля приводит к тому, что таким образом пораженный человек
+видит все без цвета, как в черно-белом кино. Чем точнее мы узнаем специфику
+функциональной ориентации модулей мозга, тем с большим удивлением узнаем, как, с
+точки зрения инженерной экономии, хаотично устроен мозг, хотя мы при осознании
+самих себя не отдаем себе в этом отчета. Сегодня нам кажется, что отдельные
+модули, функционально похожие на модули мозга, мы уже сможем конструировать.
+Обычно это псевдонейронные сети различной сложности. Вместе с тем мы еще не
+умеем ни создать их в достаточном количестве, ни соединить их таким образом,
+чтобы созданное произведение смогло имитировать сознание. Следовательно, прямой
+дороги от бездумного автомата к сознательно мыслящей машине нет. Есть, однако,
+много сложных дорог, которые в будущем приведут нас к цели и, может быть, эту
+цель превзойдут. О такой возможности я написал книгу "Голем XIV".
+
+Краков, 7 июля 1998 года.
diff --git a/content/posts/2025-11-03-blog-deploy.md b/content/posts/2025-11-03-blog-deploy.md
new file mode 100644
index 0000000..2b394d6
--- /dev/null
+++ b/content/posts/2025-11-03-blog-deploy.md
@@ -0,0 +1,46 @@
+---
+date: '2025-11-03'
+tags:
+- блог
+title: Деплой блога
+---
+
+А ещё, я решил поделиться тем как я пишу в блог. Потому что, почему бы и нет.
+
+<!--more-->
+
+Во-первых, у меня есть такой вот Makefile просто в корне home:
+
+```Makefile
+new-post:
+ @printf "Введите имя поста (латиницей, без пробелов) [new-post]: "; \
+ read postname; \
+ if [ -z "$$postname" ]; then \
+ postname="new-post"; \
+ fi; \
+ date=$$(date +%Y-%m-%d); \
+ file="neonxp.ru/posts/$$date-$$postname.md"; \
+ echo "---" > "$$file"; \
+ echo "title: " >> "$$file"; \
+ echo "date: $$date" >> "$$file"; \
+ echo "tags: []" >> "$$file"; \
+ echo "---" >> "$$file"; \
+ echo "" >> "$$file"; \
+ echo "---" >> "$$file"; \
+ echo "Комментариев в блоге не предусмотрено, но вы всегда можете написать мне на e-mail [i@neonxp.ru](mailto:i@neonxp.ru) или в джаббер [i@neonxp.ru](xmpp://i@neonxp.ru)" >> "$$file"; \
+ nvim "$$file"
+
+publish-post:
+ yassg generate
+ scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/
+```
+
+И, соответственно, когда я хочу написать новый пост, я вызываю `make new-post`,
+скрипт у меня спрашивает имя файла, а затем открывает любимый neovim, в котором
+я уже и пишу сам текст поста.
+
+Затем я вызываю `make publish-post` и сначала мой генератор статических сайтов
+[YASSG](http://gitverse.ru/neonxp/yassg/) собирает сайт в статический HTML, а
+потом отправляет всё на сервер в директорию, из которой сайт раздаётся.
+
+Очень просто!
diff --git a/content/posts/2025-11-03-my-setup.md b/content/posts/2025-11-03-my-setup.md
new file mode 100644
index 0000000..a375155
--- /dev/null
+++ b/content/posts/2025-11-03-my-setup.md
@@ -0,0 +1,21 @@
+---
+date: '2025-11-03'
+tags:
+- гиковское
+- сетап
+title: Обновления по сетапу
+---
+
+Со времени [последнего поста](/posts/2025-06-08-my-setup/) про мой
+[сетап](/pages/setup/laptop/) произошли достаточно серьезные изменения.
+
+<!--more-->
+
+Я перешёл таки с KDE сначала на Hyprland, а затем окончательно осел на Gnome (48
+на текущий момент). ОС осталась та же — AltLinux P11. Что что, а Alt меня
+всецело устраивает.
+
+Первое время с Гнома прям отплёвывался после KDE то, но потом то ли привык, то
+ли просто как-то проникся внутренней эстетикой, но, в общем, мне стало заходить.
+
+По железу обновлений, к сожалению, нет.
diff --git a/content/posts/2025-11-04-blog-deploy-2.md b/content/posts/2025-11-04-blog-deploy-2.md
new file mode 100644
index 0000000..b692d94
--- /dev/null
+++ b/content/posts/2025-11-04-blog-deploy-2.md
@@ -0,0 +1,50 @@
+---
+date: '2025-11-04'
+tags:
+- блог
+title: Деплой блога — пересмотр
+---
+
+После [вчерашнего поста](2025-11-03-blog-deploy) мне написал один [хороший
+человек](http://www.stargrave.org) с дельным замечанием, что не стоит для этих
+целей использовать make. Действительно так. И предложил хорошее решение, что
+это стоило сделать просто sh скриптами.
+
+У меня только один вопрос. А почему я сам-то так сначала не сделал? Это же
+буквально на поверхности!
+
+Штош, бывает, затупил. Да и привык для всех гвоздей использовать этот молоток.
+
+<!--more-->
+
+Обновлённые скрипты:
+
+~/.local/bin/new-post
+
+```sh
+#!/bin/sh -e
+postname="${@:-new-post}"
+date=$(date +%Y-%m-%d)
+fn="neonxp.ru/posts/$date-$postname.md"
+cat >$fn <<EOF
+---
+title:
+date: $date
+tags: []
+---
+
+---
+EOF
+$EDITOR $fn
+```
+
+~/.local/bin/deploy-blog
+
+```sh
+#!/bin/sh -e
+yassg generate
+scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/
+```
+
+Сейчас раздумываю, а почему бы этот функционал не включить в сам yassg,
+например, аналогом хуков? Надо будет обмозговать.
diff --git a/content/posts/2025-11-09-migration.md b/content/posts/2025-11-09-migration.md
new file mode 100644
index 0000000..aec1df0
--- /dev/null
+++ b/content/posts/2025-11-09-migration.md
@@ -0,0 +1,55 @@
+---
+comments: true
+date: '2025-11-09'
+tags:
+- блог
+- разное
+title: Переезд?
+---
+
+В последнее время всё больше и больше думаю, что у меня перебор серверных
+мощностей. Да и софтовое хозяйство там немного в бардаке по историческим
+причинам. Есть желание капитально прибраться.
+
+<!--more-->
+
+Сейчас у меня основная железка на хозяйстве это Intel Xeon E3-1230 3.2 ГГц, 16
+ГБ DDR3ECC, 4x1TB HDD SATA в виде арендуемого Dedicated сервера.
+
+И вроде неплохо, а вроде как и перебор. Зачем мне так много?
+
+У меня сейчас крутится несколько сайтов (ну по сути 0 нагрузки), Jabber сервер
+(Prosody), почта (MOX), Mumble сервер да DNS (CoreDNS).
+
+~~Кажется, что под всё это хватит и небольшой VDS'ки.~~
+
+UPD: посмотрел цены, в общем, выигрыша по деньгам особо не будет. VDS стоят
+как-то неадекватно дорого. Видимо, придётся остаться на текущем дедике, просто
+основательно почистить его, видимо.
+
+~~Переезд я буду делать, скорее всего, поэтапно:~~
+
+Переезд получится единомоментным, т.к. переезд будет на тоже самое железо, а не
+на другое.
+
+1. ~~Заведу VDS'ку.~~ Новую заводить не буду, а почищу начисто текущий сервер.
+2. Настрою почту (MOX хорош, конечно, но я хочу чего-то более кондового, типа
+ Postfix) - перекину на новый сервер MX записи.
+3. Настрою Jabber (Prosody, как был - так и останется, он достаточно хорош) -
+ перекину на него SRV записи.
+4. Так же естественно, надо не забыть Coturn сервер для звонков по Jabber.
+5. И только после этого надо переносить Git (Forgejo), и сайты. При этом
+ перееду с Caddy на Angie. Перекину уже A (и даже AAAA!) записи.
+6. Перенос CoreDNS.
+7. Проверяю что всё хорошо и если так, то отказываюсь от арендованного сервака.
+
+Надеюсь, ничего не забыл. А если и забыл — значит оно мне и не нужно, в
+общем-то.
+
+Что по итогу? Самое главное — сброшу груз старья, который накопился за годы
+аренды дедика. И что тоже приятно, но не главное — оптимизирую расходы. Причём,
+наверное, раз в 10.
+
+По времени — думаю, растянется на неделю-две, т.к. свободного времени на всё
+это у меня, как всегда, катастрофически мало. Так что, если какие-то мои
+сервисы будут не доступны — значит я в процессе переезда.
diff --git a/content/posts/2025-11-23-org.md b/content/posts/2025-11-23-org.md
new file mode 100644
index 0000000..95b54ee
--- /dev/null
+++ b/content/posts/2025-11-23-org.md
@@ -0,0 +1,253 @@
+---
+comments: true
+date: '2025-11-23'
+tags:
+- гиковское
+- моё
+title: Личный органайзер
+---
+
+Пришло в голову, почему бы не рассказать как у меня организован личный
+органайзер.
+
+Для начала стоит очертить то, какие у меня потребности от органайзера:
+
+- Вести список ежедневных, еженедельных, ежегодных, а так же, одноразовых
+ событий
+- Вести быстрый список ближайших задач (ToDo список). Под быстрым, я
+ подразумеваю то, что внести новый пункт в него я могу не дольше, чем за пару
+ десятков секунд. Если это будет требовать бо́льших усилий, то я себя знаю: я
+ это быстро заброшу, т.к. это станет для меня не помощью, а повинностью.
+- Место для быстрых заметок в формате «бесконечного текстовика». Аналогично,
+ это должно быть под рукой в быстром доступе. Obsidian себя показал _слишком_
+ медленным. Настолько, что мне стало проще запоминать, чем испытывать свои
+ нервы каждый раз, наблюдая его длительный запуск. Да, звучит на первый взгляд
+ глупо, но у меня так: запуск Obsidian длительностью в десяток секунд
+ окончательно отбил у меня желание вовсе запускать его.
+
+Что же делать? Искать идеальный для себя инструмент? Идеального для _себя_
+точно не найду. Написать самому, ведь «яжпрограммист»? Можно, но откровенно
+жаль время. Что же делать-то?
+
+<!--more-->
+
+К счастью, я вспомнил что у меня же unix-подобная операционная система, в
+поставке которой огромное количество небольших программ, которые прекрасно
+выполняют какую-то небольшую функцию и при этом отлично стыкуются друг с другом
+через стандартный текстовый поток! Грешно не воспользоваться наработками
+гораздо более умных, чем я, программистов!
+
+# ToDo
+
+Проще всего оказалось с этим. Просто поставил себе
+[todo.txt](https://github.com/todotxt/todo.txt-cli). Хоть я и говорил выше, что
+идеального инструмента я не найду, но я тогда немного слукавил. Для ToDo этот
+инструмент _почти_ идеален. Всё что мне надо, кроме одного нюанса, там есть. А
+вот тот самый нюанс, я когда-нибудь исправлю. Возможно.
+
+Для удобства я себе в zsh добавил следующие alias:
+
+```zsh
+alias t=todo.sh
+```
+
+Таким образом, чтобы добавить задачку я просто пишу `t add текст задачи`. Куда
+уж проще и быстрее?
+
+# Календарь
+
+Идею организации календаря я подсмотрел в программе calendar, которая идёт в
+комплекте с BSD системами, но не идёт в конкретно моей ОС. Да, наверняка, можно
+и к себе притащить, но я из спортивного интереса хотел решить задачу
+максимально встроенными и стандартными инструментами.
+
+Лонг стори шорт:
+
+~/calendar.txt
+
+```
+01-28 ДР Лены
+10-18 ДР Мамы
+05-24 Годовщина свадьбы
+11-23 Ежегодное событие
+
+Пн 15 Еженедельный мит
+Пн 20-21 Чтение
+
+Вт 13 Архком
+Вт 15 Грумминг
+Вт 20-21 Чтение
+
+Ср 13 Техразвитие
+Ср 20-21 Чтение
+
+Чт 15 Грумминг
+Чт 20-21 Чтение
+
+Пт 20-21 Чтение
+Сб 20-21 Чтение
+Вс 20-21 Чтение
+
+2025-11-19 10 клуб амбассадоров
+2025-11-17 16:30-17:30 Встреча c 16:30 до 17:30
+2025-11-24 10:15 Golang Техком
+2025-11-24 11-12 Анализ логики состояния
+2025-11-23 21 Написать в блог о своём календаре
+```
+
+Пояснения:
+
+- `mm-dd\t\tСобытие` - некие ежегодные события, у которых указаны только месяц
+ и день месяца
+- `Пн\tвремя\tСобытие` - еженедельное событие. Про формат времени - будет ниже.
+- `yyyy-mm-dd\tвремя\tсобытие` - разовые события в конкретную дату и время.
+
+Формат времени: его я подсмотрел у формата
+[calendar.txt](https://terokarvinen.com/2021/calendar-txt/), то есть, запись
+формата `15` - это означает что событие начнётся в 15 часов, `20-21` - событие
+длится с 20 до 21 часа вечера. С минутами, которые не обязательны, думаю, всё
+понятно из примера.
+
+Формат сам по себе абсолютно не жёсткий, допускает много вольностей. Главное,
+всё сводится к тому, что у него 1 строка - 1 событие и сама строка состоит из 3
+полей разделённых табом (в формате calendar.txt предлагается точка, для меня
+это показалось неприемлемым, т.к. я записываю в события и ссылки на созвоны, а
+ссылка включает в себя минимум одну точку)
+
+В принципе, тут уже можно было бы и остановиться и жить с просто текстовиком,
+но так было бы не интересно. Я написал на языке оболочки несколько полезных
+скриптов. Они настолько маленькие, что я просто приведу их здесь:
+
+~/.local/bin/calendar
+
+```sh
+#! /bin/sh
+
+cur=${2:-`date +%Y-%m-%d`}
+file=${1:-~/calendar.txt}
+grep \
+ -e "^$(date +%Y-%m-%d -d $cur)"\
+ -e "^$(date +%a -d $cur)"\
+ -e "^$(date +%m-%d -d $cur)" $file |\
+sort -n -k 2 |\
+cut -f2- | fold -w 80 -s
+```
+
+Собственно, это главный скрипт, который собирает для текущей (или явно
+указанной) даты все релевантные события, сортирует их по времени и выводит
+форматированным списком. Примерно так:
+
+```
+% calendar
+ Ежегодное событие
+20-21 Чтение
+21 Написать в блог о своём календаре
+```
+
+На этом я не остановился, но сделал ещё парочку вспомогательных скриптов,
+использующих его за основу:
+
+~/.local/bin/today
+
+```sh
+#!/bin/sh
+echo "Календарь:"
+echo -e ''$_{1..80}'\b-'
+cal
+echo -e ''$_{1..80}'\b-'
+echo "События дня:"
+echo -e ''$_{1..80}'\b-'
+
+calendar
+
+echo -e ''$_{1..80}'\b-'
+
+echo "ToDo:"
+todo.sh ls
+```
+
+Делает по сути тоже самое что и просто calendar, только ещё и рисует красивый
+графический календарик и показывает список ToDo задач.
+
+~/.local/bin/week
+
+```sh
+#!/bin/sh
+
+echo "На 7 дней:"
+for i in {0..6}
+do
+ d=`date +%Y-%m-%d -d "+ $i day"`
+ echo -e ''$_{1..80}'\b-'
+ echo $d
+ echo -e ''$_{1..80}'\b-'
+ calendar ~/calendar.txt $d
+done
+echo -e ''$_{1..80}'\b-'
+echo "ToDo:"
+todo.sh ls
+```
+
+Выводит план на 7 дней вперёд.
+
+## Редактирование календаря
+
+Здесь тоже предельно просто: добавил в zshrc такой алиас:
+
+```zsh
+alias ev='nvim +/`date +"%Y-%m-%d"` ~/calendar.txt'
+```
+
+и просто по команде `ev` открывается neovim и готов принимать новое событие.
+Хотя это и не самая частая операция.
+
+# Быстрые заметки
+
+Тут тоже всё просто:
+
+```zsh
+alias qn='nvim "+normal G" ~/quicknote.txt'
+```
+
+Соответственно, по команде `qn` открывается мой текстовик для заметок на самой
+последней строке. Можно дописать или поискать что-то с конца. На самом деле
+очень удобно!
+
+# Мобильный?
+
+Я бы хотел все эти мои текстовики иметь и на мобильном устройстве. Даже не для
+редактирования, а например, свериться со списком задач / событий.
+
+Тут чуть сложнее. Для синхронизации с мобильным устройством я сделал такой финт:
+
+1. Все текстовики у меня лежат не в домашней директории, на самом деле, а в
+ некой директории из которой симлинками уже прокинуты в корень домашней
+ директории.
+2. Директория эта добавлена в Syncthing который синхронизирует её с NAS и
+ мобильным устройством.
+3. На мобильном устройстве стоит замечательная программа
+ [Markor](https://f-droid.org/packages/net.gsantner.markor/) которая нативно
+ понимает формат todo.txt, ну и достаточно неплохо позволяет смотреть
+ редактировать файлы calendar.txt и quicknote.txt.
+
+# Чтобы хотелось ещё?
+
+- Как я упоминал, в todo.txt для меня есть неприятный нюанс который я бы хотел
+ исправить, а именно, вложенные задачи, когда у одной задачи может быть
+ сколько угодно дочерних, у которых, так же могут быть дочерние. Пока думаю,
+ расширить формат табуляцией в начале строки. Количество \t - уровень
+ вложенности. Но тогда придётся модифицировать todo.txt-cli который я
+ использую. И непонятно как это проглотит Markor. Можно конечно использовать
+ встроенную возможность задавать key-value значения. Тогда будет что-то типа
+ `Подзадача parent:2`. Это, как будто, самый правильный способ, который и
+ рекомендуется разработчиками формата, но получается слишком многословно, а
+ даже если сократить до `p:2` - всё равно надо в голове держать номер
+ родительской задачи. Так себе. Не знаю ещё как поступлю, но как-то поступлю.
+- Было бы неплохо прикрутить парсинг ICS файлов из почты для автоматического
+ добавления событий в календарь. Это сто́ит сделать однозначно!
+- Ну и очень желательно сделать скрипт который по крону за 15 минут до события
+ напомнит о нём, через какой-нибудь `notify-send`. Это, на самом деле, из всех
+ хотелок самая приоритетная для меня сейчас.
+
+Если будет интересно, я могу здесь рассказывать о том, что сделал из этих
+хотелок.
diff --git a/content/posts/2025-12-02-httpsocalypse.md b/content/posts/2025-12-02-httpsocalypse.md
new file mode 100644
index 0000000..f38fa36
--- /dev/null
+++ b/content/posts/2025-12-02-httpsocalypse.md
@@ -0,0 +1,31 @@
+---
+comments: true
+date: '2025-12-02'
+tags:
+- размышления
+title: HTTPS и конец интернетов
+---
+
+[Let's Encrypt уменьшит срок действия сертификатов до 45
+дней.](https://www.opennet.ru/opennews/art.shtml?num=64363)
+
+А потом будет на неделю, на день, на запрос... Короче, да, по сути амерская
+конторка будет решать на какой сайт будет возможно зайти, а на какой нет. А то
+что хромые браузеры сделают невозможным заход на сайты без валидного
+(заверенного _кем надо_, конечно же) сертификата, я уже и не сомневаюсь.
+
+Во истину говорю вам: грядут последние дни интернета. Ну точнее WWW, если
+говорить конкретнее, но это уже душнилово.
+
+<!--more-->
+
+Но это не сильно то печаль. Интернет, всё равно, для большинства уже скукожился
+до двух десятков «сервисов». А для энтузиастов будут «свободные» браузеры,
+свободные не только с точки зрения кода, но и политики стран НАТО.
+
+К счастью, у нас есть Librewolf, Palemoon, Dilo, да Lynx наконец. Без
+интернета (окей, WWW) не останемся.
+
+Так же можно рассмотреть и альтернативные технологии типа gopher, gemini. Но
+это, как-нибудь, в другой раз. А пока запасаемся попкорном и смотрим как горит
+<del>мир</del> интернет.
diff --git a/content/posts/2025-12-21-sicktech.md b/content/posts/2025-12-21-sicktech.md
new file mode 100644
index 0000000..6a7428c
--- /dev/null
+++ b/content/posts/2025-12-21-sicktech.md
@@ -0,0 +1,228 @@
+---
+comments: true
+cover: /posts/files/2025-12-21-sicktech.png
+date: '2025-12-21T18:40:26+03:00'
+tags:
+- it
+- размышления
+- sicktech
+- лонгрид
+title: Про здоровые и нездоровые технологии
+---
+
+Я заметил, что часто стал в речи употреблять словосочетания «здоровая
+технология» или «нездоровая технология». Но при этом, я не задумывался о том, а
+что же именно это для меня значит, и как определить что есть здоровая, а что
+нездоровая технология. Я классифицировал исключительно интуитивно, исходя из
+принципа «я так чувствую».
+
+Но раз есть классификация, то должны быть и критерии. Так? Так. И критерии я
+опираясь на собственное ощущение, вроде как, нашёл.
+
+<!--more-->
+
+# Критерии
+
+Не буду сильно уходить в сторону, для меня основные критерий «здоровости» — то,
+предполагает ли технология сохранение у пользователя контроля над ней. Даже
+можно сказать более витиевато — превращает ли технология пользователя в
+потребителя?
+
+Это был первый критерий. И он же главный. Из него вытекают уже такие критерии
+как потенциальная познаваемость, ремонтопригодность, и даже, внезапно,
+надёжность и долговечность.
+
+# Примеры
+
+Пройдёмся немного по примерам. Начнём с «нездоровых» технологий и конкретных
+примеров.
+
+## Трактора John Deere
+
+![Трактор John Deere](/posts/files/2025-12-21-img1.jpg)
+
+Это достаточно известная история, про то, как производитель напрямую влияет на
+то, как пользователь пользуется своей собственностью. А именно, запрещал
+самостоятельный ремонт тракторов своего производства своим клиентом, кроме как с
+помощью «сертифицированного» специалиста. Здесь буквально прослеживается
+критерий превращения пользователя из обладателя собственности в потребителя в
+некотором роде услуги «владения трактором». Когда ты вроде и заплатил за него
+полную стоимость, но владеешь им на пол шишечки, ведь ты не имеешь права
+распоряжаться им так, как ты хочешь (например, самостоятельно ремонтировать, раз
+у тебя подходящая квалификация). Притом, что фермеры, в большинстве своём, или
+достаточно квалифицированны или могли бы найти такого квалифицированного
+человека поблизости, а не ждать дни, пока до них доберётся специалист и починит.
+
+[Подробная история](https://habr.com/ru/companies/itelma/articles/477638/)
+
+## Машины для мороженного в McDonalds
+
+![та самая мороженница](/posts/files/2025-12-21-img2.jpg)
+
+Здесь примерно та же история, только чуть больше налёта монополии. Краткая суть
+в том, что владелец франшизы McDonalds принуждал своих франчайзи закупать
+исключительно конкретные машины конкретного производителя. Всё было бы не так
+плохо, если бы эти машины регулярно не ломались, а обслуживать их мог опять таки
+«сертифицированный» техник. Опять таки пользователь превращался в бесправного
+потребителя. Причём, можно было бы сказать, что это же хорошо, ведь пользователь
+только что-то сломает, но не сделает хорошо. Этот аргумент ломается об то, что
+как раз таки для этих машин предприимчивая пара людей начала производить
+устройство, которое делает этим машинам «jail-break» который затем позволял
+успешно чинить и эксплуатировать автоматы дальше. И ничего страшного не
+произошло! Во всяком случае, именно для пользователей. Производителю, конечно
+же, это не понравилось. И да, суды, давление монополиста и всё как мы любим.
+
+[Подробная история](https://habr.com/ru/articles/557746/)
+
+## BMW и некоторые другие автоконцерны
+
+![Подогрев по подписке](/posts/files/2025-12-21-img3.png)
+
+Здесь немного другая история. Думаю, все и так слышали про эту историю, которая
+бы могла быть шуткой, но оказалась реальностью. Я говорю про _подписку_ на, мать
+его, подогрев сидений. Ну и другие опции, я не вдавался подробно, не люблю эту
+марку автомобилей. Можете хоть бить, хоть резать, но такое мне не влезает в
+голову! Человек _уже_ купил автомобиль и всё что в нём находится. В том числе и
+нагревательные элементы в креслах! Почему он _должен_ покупать право на
+включение устройства которое он и так купил? Я этому не вижу ни одного
+оправдания. Мне плевать на хотелки жирных баварских подсвинков и я обеими руками
+поддерживаю хакеров, которые [джейл-брейкают](https://habr.com/ru/news/678362/)
+в автомобилях эти функции!
+
+Так же [недавно были
+новости](https://www.gazeta.ru/auto/2025/12/03/22117009.shtml?utm_auth=true) про
+то, что владельцы других немецких автомобилей в России остались по сути с
+дорогой грудой металла.
+
+## Принтеры и их зачипованные картриджи
+
+Эта проблема известна всем владельцам принтеров. 99% (источник статистики: мой
+потолок) современных принтеров не будут печатать неродным картриджем или
+картриджем, в который залиты чернила или засыпан тонер повторно (т.к. никому,
+кроме производителя, не нужный чип на картридже сказал что картридж уже Б/У).
+
+## Apple
+
+Мне нужно пояснять? Думаю, нет. Хорошо хоть что железо у них достойное и
+достаточно надёжное, насколько я могу судить. Это хоть как-то оправдывает их
+право на существование.
+
+## Проприетарный софт
+
+Тоже в пояснениях не нуждается. Хуже только прориетарный софт от амеров.
+
+## <что-то> по подписке
+
+Как бы не было это удобно, но подписочная модель, по определению ставит
+пользователя <del>раком</del> в позу бесправного потребителя. И не надо мне
+писать про удобство игр, фильмов, музыки, книг «по подписке». Нет, это никогда
+не будет хорошим выбором. Никогда. А впрочем, я не склонен осуждать тех кто этим
+пользуется, если человек отдаёт себе отчёт в том что с одной стороны он ничем не
+владеет, а с другой стороны он во власти капиталистических свиней, которые и
+деньги за подписку возьмут и личные данные куда надо продадут. Тут уж каждый сам
+решает, или смотреть условный нетфликс пока ему добрый дядя разрешает, или
+покупать тоже самое с чуть меньшим удобством на _зелённом нетфликсе_.
+
+# А что делать-то?
+
+На самом деле, решение то весьма простое: нужно более сознательно подходить к
+выбору как софта, так и железа. Нужно стараться отвечать себе на вопрос «А что я
+буду делать, если производитель или поставщик вдруг исчезнет или решит, что не
+хочет иметь со мной дел?». В общем случае нужно выбирать то, что ремонтопригодно
+(а в случае софта — свободно), имеет в свободном доступе исчерпывающие
+документации и руководства, а так же независимых поставщиков запасных деталей и
+сервисного обслуживания. Так же, в идеале, если нет возможности вообще не
+зависеть от вендора, то выбирать всегда локального, то есть российского или, на
+худой конец, из дружественных стран типа РБ или КНР. Конечно, это не защитит от
+рисков что вендор исчезнет и оставит нас без поддержки, но сильно их сократит.
+Но опять же, это если без вендора ну совсем никак. И самое худшее что можно
+сделать — довериться вендорам стран НАТО. В этом случае это хорошая заявка на
+премию Дарвина, не иначе.
+
+Нужны примеры? Их есть у меня, даже из личного опыта:
+
+- Мой МФУ купленный сто лет назад до сих пор служит мне верой и правдой, потому
+ что в своё время я озаботился тем, чтобы выбрать модель, которая выпущена
+ ровно до конкретной даты и поддерживает неоригинальные картриджи, которые
+ стоят три копейки и даже поддерживают самостоятельную засыпку тонера. А
+ ремонтопригодность у него такая, что я буквально могу починить его или сам,
+ или в ремонтной мастерской в моём доме.
+- Автомобиль. Мой автомобиль, конечно, технически сложное устройство и сам я в
+ нём мало что починю. Но он и не настолько технически сложный, чтобы его не
+ починили в произвольном, даже неавторизованном, сервисном центре. При этом, у
+ него нет никакой зависимости от «облаков» и он полностью автономен в этом
+ отношении и не зависит от воли производителя. А насколько мне известно, в
+ стране более чем достаточно запасных частей и узлов для него. Так что,
+ длительная эксплуатация не будет проблемой. Тем более уже более семи лет
+ автомобилю и за это время он показал себя только с лучшей стороны.
+- Все художественные книги у меня в формате fb2, который не подразумевает
+ поддержки DRM, а технические книги в формате PDF, который хоть и умеет вроде
+ как в DRM, но я с ним не сталкивался в своей библиотеке. И да, у меня именно
+ локальная библиотека продублированная на NAS и на резервный носитель.
+- Аналогично, музыка. Да, хоть и в большинстве своём в формате mp3, а не ogg
+ (просто руки не доходят конвертнуть), но она именно локальная. На ноуте,
+ телефоне и на флешке для прослушивания в автомобиле. И что в случае с
+ музыкой, что в случае книг (а так же и сериалов и прочего) — я _точно_ знаю
+ что само по себе, а точнее по воле какого-то «правообладателя», никуда не
+ денется от меня. Точнее, сохранность лежит целиком в моих руках, а не чьих-то
+ ещё.
+- Игры? Только те, что не подразумевают обязательной работы с интернетом, читай
+ «игр-сервисов». Это или старьё типа старых Fallout, или свободные игры типа
+ OpenTTD да Hedgewars. Так же у меня есть Nintendo Switch. Но у неё зарезан
+ интернет и играю исключительно с физических картриджей, которые никуда не
+ денутся. А чтобы не сломались — у меня есть [MigSwitch](https://migflash.ru/)
+ и дампер картриджей для него.
+- Ноутбук? Тут сложнее. Я постарался взять самый ремонтопригодный ноутбук из
+ доступных мне, с самым большим запасом прочности, чтобы служил мне не менее
+ десятилетия. Но тут без гарантий. Поэтому, если критерий долгосрочной
+ доступности сервиса для вас критичен, можно рассмотреть местных
+ производителей, которые хотя бы не исчезнут с рынка в результате геополитики и
+ не оставят нас без сервисного обслуживания. Например, ICL. Сам не проверял,
+ это только мысли.
+- E-mail. Самая здоровая технология для коммуникации. Во-первых,
+ децентрализованная, во-вторых, полностью открытая и свободная. В-третьих,
+ асинхронная и дающая мне возможность читать и отвечать на неё когда именно мне
+ удобно. А я такое очень ценю. Да, в современном мире чаты и синхронное общение
+ неизбежны, но я не делаю на них большую ставку и если, а точнее, когда
+ очередной мессенджер помрёт или будет заблокирован, для меня это не будет
+ трагедией, потому что я и не жду от них что они будут со мной всегда. Ну,
+ окей, jabber и irc — это тоже здоровые технологии, только ими почти никто не
+ пользуется. А для голосового общения есть свободные SIP да Mumble. Но ими тоже
+ пользуется полтора калеки. Вообще, про коммуникации, наверное, стоит будет
+ написать подробнее потом, тема очень обширная.
+- Всегда, когда возможно, выбираю именно лицензированное под GPL. Не MIT или
+ Apache. А именно GPL. Но здесь, скорее вкусовщина.
+
+Примеров здоровых технологий меньше и они меньше описаны, но это сознательно. Я
+собираюсь в дальнейшем, отдельными постами писать именно преимущественно о них,
+а тему «нездоровых» касаться сильно меньше. Поэтому нездоровые расписал сразу,
+чтобы больше особо не возвращаться.
+
+# Вместо заключения
+
+Надеюсь, я смог дать хотя бы примерное представление о том, что я считаю
+«здоровыми» и «нездоровыми» технологиями. Ожидаю ли я что люди когда-нибудь
+поумнеют и начнут использовать исключительно здоровые технологии? Да нет
+конечно. Здесь каждый сам кузнец собственного счастья.
+
+Я хотел ещё много что написать как примеры здоровых и нездоровых технологий, но
+тогда я бы пост бы не выпустил примерно никогда, так как тема бесконечная.
+
+Если есть желание, предлагаю обсудить со мной пост или по
+[e-mail](mailto:i@neonxp.ru) или там, где вы можете достичь меня. Позже в этом
+блоге, я всё же сделаю удобные комментарии, но это совсем другая история.
+
+А напоследок я хочу дать несколько ссылок в тему:
+
+- [Очень хороший набор примеров «вредных» и «менее вредных» вещей от Сергея
+ Матвеева](http://www.stargrave.org/Harmful.html). В принципе, это примерно те
+ же «нездоровые» и «здоровые» технологии. В целом, почти со всем я согласен, а
+ поэтому могу рекомендовать список как даже некоторое руководство по выбору
+ «здоровых» технологий.
+- [Пост на французском про «низкие
+ технологии»](https://ploum.net/2025-05-16-manifeste-lowtech.html) — тоже на
+ очень близкую тему.
+
+Если есть схожие по теме материалы — не стесняйтесь советовать, тема для меня
+интересная, с удовольствием ознакомлюсь. А сам её продолжу, возможно, уже на
+следующей неделе!
diff --git a/content/posts/2025-12-23-comments.md b/content/posts/2025-12-23-comments.md
new file mode 100644
index 0000000..9a82612
--- /dev/null
+++ b/content/posts/2025-12-23-comments.md
@@ -0,0 +1,12 @@
+---
+comments: true
+date: '2025-12-23T21:22:57+03:00'
+tags:
+- блог
+title: Появились комментарии в блоге
+---
+
+Наконец-то сделал комментарии в этом блоге. Да, максимально по гиковски. Просто
+через отправку e-mail на адрес специального бота. Потом, для удобства наверное
+придумаю и другим способом. А может и так оставлю, ведь e-mail самый лучший и
+самый универсальный способ связи, как ни крути.
diff --git a/content/posts/2025-12-24-email.md b/content/posts/2025-12-24-email.md
new file mode 100644
index 0000000..a4011d3
--- /dev/null
+++ b/content/posts/2025-12-24-email.md
@@ -0,0 +1,99 @@
+---
+comments: true
+date: '2025-12-24T21:00:22+03:00'
+tags:
+- разное
+- sicktech
+title: Почему я люблю e-mail?
+---
+
+Я действительно очень люблю старую-добрую электронную почту. И вот почему.
+
+<!--more-->
+
+Во-первых, как и всё, что делалось в раннее время Интернета — e-mail достаточно
+простая и открытая технология. А я очень ценю и то и то. В простой и открытой
+технологии _возможно_ разобраться, в отличие от закрытых проприетарных систем.
+
+Во-вторых, она действительно децентрализованная, а значит отвечает духу того,
+как проектировался Интернет ещё до того, как корпорации захватили его и
+подчинили своей монополии. Если оглянуться шире — многие ранние технологии
+интернета так же децентрализованные. Например, WWW, DNS, внезапно, IRC, XMPP...
+Да много примеров. Ещё мне приходит в голову GIT, который спроектирован так,
+что может работать поверх, практически, чего угодно! И да, в том числе, даже
+поверх просто e-mail!
+
+В-третьих, она достаточно универсальна. По факту, e-mail это просто контейнер,
+внутри которого можно положить практиески что угодно. Например, то что из себя
+обычно представляет письмо — это или обычный текстовый файл (plaintext) или HTML
+страничка (это более распространённые письма которые содержат богатую разметку).
+Так же в том же письме могут быть приложены используемые в нём картинки, или,
+например, файл содержащий приглашение на определённое событие в формате iCal.
+И в последнем случае, наверняка, почтовая программа корректно обработает этот
+файл и добавит событие в календарь. А так же, если пользователь решит принять
+или отклонить приглашение, ответ уйдёт так же по e-mail. Что интересно, в какой
+бы корпорации я не работал, именно так и работает система событий и календари.
+
+В-четвёртых, и это для меня самое главное. Почта, в отличие от всяких разных
+мессенджеров, не предполагает синхронного общения! А это значит что? Что у меня
+есть прорва времени чтобы _неторопясь_ в комфортном для меня режиме собраться с
+мыслями, неторопясь аккуратно написать письмо. Проверить. Перепроверить. Ещё
+подумать. И только после этого направить адресату. И выбросить из головы.
+
+Я человек в принципе неторопливый, и это меня устраивает гораздо больше, чем
+незримое эмоциональное давление от осознания того, что мой собеседник _видит_ в
+мессенджере что я уже прочитал его сообщение и ждёт ответа. А тянуть при этом и
+задерживать человека очень не хочется. Это НЕ комфортно.
+
+Мне такое неторопливое общение кажется очень и очень уютным. По этой же причине,
+мне так сильно импонирует вести обычный классический текстовый блог, когда более
+модно вести условный телеграм канал. Канал то у меня тоже есть, но он или для
+уведомлений о новых записях блога, или для совсем уж быстрых коротких заметок.
+
+Конечно, я не сумасшедший, и понимаю что есть множество вопросов, которые
+действительно требуют и быстрого ответа и синхронного общения. Конечно же, в
+таком случае использовать почту только потому что это почта — глупо и
+нерационально. Здесь я не буду спорить. Всё так.
+
+Но общение — это гораздо более широкое понятие, и оно может быть _разным_. И
+если есть возможность — я предпочту комфортное общение без психолгоического и
+эмоционального давления.
+
+# Немного про другие коммуникации
+
+И да, в контексте, [предпредыдущего поста](/posts/2025-12-21-sicktech/), e-mail
+— это однозначно «здоровая технология». Но не единственная. Раз уж немного
+отклонился в сторону, приведу из этой же области ещё немного «здоровых» из
+области коммуникаций:
+
+- [IRC](https://ru.ruwiki.ru/wiki/IRC) — радикальная простота протокола,
+ универсальность и распределённость. А в последнее время даже пытается ожить с
+ новой версией [IRCv3](https://ircv3.net/).
+- [Jabber](https://ru.ruwiki.ru/wiki/XMPP) — уже не так просто, зато так же
+ открыто и децентрализованно. Так же, в последние годы обрёл второе дыхание и
+ развивается.
+- [Mumble](https://ru.ruwiki.ru/wiki/Mumble) — свободный голосовой чат. Имеет
+ отличное качество звука при очень низкой задержке и потрелении трафика.
+
+Это далеко не исчерпывающий список, но он по факту покрывает основные
+потребности в коммуникации.
+
+## И снова про e-mail и внезапная экономия там, где её не ждёшь
+
+Возращаясь к e-mail, я написал этот пост не как призыв всем всё бросить и писать
+только письма, а только как напоминание, что такой инструмент есть (и есть по
+факту почти у всех!) и нужно не забывать о нём и использовать тогда, когда он
+уместен.
+
+Шутка про то, что «Эту часовую встречу можно было заменить просто одним емейлом»
+— далеко не шутка, и очень часто так и есть. Таким образом, в некотором роде,
+даже учитывая общий неторопливый стиль переписки — она, внезапно, может и помочь
+сэкономить время! Не самый очевидный вывод, но так и есть.
+
+И да, постарайтесь не загаживать свой почтовый ящик ненужными автоматическими
+сообщениями. Если не охото удалять то, что потенциально может пригодиться через
+N лет — просто отправьте в архив. Разгребать свой почтовый ящик и, если нужно,
+отвечать на письма — достаточно приятная рутина, которая отнимает не так уж
+много времени. И да, весьма уютная и медитативная рутина, а результат, когда
+непрочитанных писем нет, и письма аккуратно разложены по папкам или удалены —
+приносит ощущение хорошо сделанного полезного дела. Попробуйте ;)
diff --git a/content/posts/2025-12-27-osm.md b/content/posts/2025-12-27-osm.md
new file mode 100644
index 0000000..1c9881c
--- /dev/null
+++ b/content/posts/2025-12-27-osm.md
@@ -0,0 +1,40 @@
+---
+comments: true
+cover: /posts/files/2025-12-27-osm_img/photo.jpg
+date: '2025-12-27T19:42:04+03:00'
+tags:
+- прогулки
+title: Сходили на ярмарку OSM
+---
+
+Сегодня с супругой съездили для интереса на ярмарку
+[OSM](https://kzngo.ru/event/market-osm-14307) (нет, это не OpenStreetMaps, а
+OpenSpaceMarket :) ) в гастрокомплексе «Кайт». Ярмарка не скажу что была сильно
+большой, но нам понравилось. Купили всякого не сильно много, поднос да пару
+ароматных свечек с зимними ароматами. Фотографии покупок да и самой прогулки
+прилагаю. Всё таки у нас очень красивый город!
+
+P.S. на фотку можно кликнуть, тогда она откроется в большем размере.
+
+<!--more-->
+
+## Покупочки
+
+[![Покупки](/posts/files/2025-12-27-osm_img/thumbs/photo.jpg)](/posts/files/2025-12-27-osm_img/photo.jpg)
+
+## Прогулка
+
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg)](/posts/files/2025-12-27-osm_img/photo_1.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg)](/posts/files/2025-12-27-osm_img/photo_2.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg)](/posts/files/2025-12-27-osm_img/photo_3.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg)](/posts/files/2025-12-27-osm_img/photo_4.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg)](/posts/files/2025-12-27-osm_img/photo_5.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg)](/posts/files/2025-12-27-osm_img/photo_6.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg)](/posts/files/2025-12-27-osm_img/photo_7.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg)](/posts/files/2025-12-27-osm_img/photo_8.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg)](/posts/files/2025-12-27-osm_img/photo_9.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg)](/posts/files/2025-12-27-osm_img/photo_10.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg)](/posts/files/2025-12-27-osm_img/photo_11.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg)](/posts/files/2025-12-27-osm_img/photo_12.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg)](/posts/files/2025-12-27-osm_img/photo_13.jpg)
+[![Прогулка](/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg)](/posts/files/2025-12-27-osm_img/photo_14.jpg)
diff --git a/content/posts/2025-12-28-philharmonic-park.md b/content/posts/2025-12-28-philharmonic-park.md
new file mode 100644
index 0000000..c692ecc
--- /dev/null
+++ b/content/posts/2025-12-28-philharmonic-park.md
@@ -0,0 +1,32 @@
+---
+comments: true
+cover: /posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg
+date: '2025-12-28T21:37:44+03:00'
+tags:
+- прогулки
+title: Прогулка в сквере филармонии
+---
+
+Вчера [гуляли с супругой на
+набережной](https://neonxp.ru/posts/2025-12-27-osm/), а сегодня чисто случайно
+решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только
+создавало больше уюта и ламповости этому хорошо украшенному скверику. К
+сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но
+продрогли сильно, т.к. гулять изначально не планировали и не были одеты
+соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :)
+
+Как водится, дальше будет немного фотографий :)
+
+<!--more-->
+
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg)
+[![Прогулка](/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg)](/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png)
diff --git a/content/posts/2025-12-29-newyear-excel.md b/content/posts/2025-12-29-newyear-excel.md
new file mode 100644
index 0000000..76916b2
--- /dev/null
+++ b/content/posts/2025-12-29-newyear-excel.md
@@ -0,0 +1,22 @@
+---
+comments: true
+cover: /posts/files/2025-12-29-newyear-excel_img/cover1.png
+date: '2025-12-29T11:47:14+03:00'
+tags:
+- разное
+title: Новогодний Excel
+---
+
+По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного
+предновогоднего офискора вам. Открываем в Excel или в LibreOffice
+соответствующий файл и жмём несколько раз клавишу F9.
+
+Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно.
+
+- [Версия для MS Excel](/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx)
+- [Версия для LibreOffice
+ Calc](/posts/files/2025-12-29-newyear-excel_img/new_year.ods)
+- [Онлайн версия в Документах
+ Mail.Ru](https://cloud.mail.ru/public/SF1M/ob3EeqtNF)
+
+![Результат](/posts/files/2025-12-29-newyear-excel_img/cover.png)
diff --git a/content/posts/2025-12-31-new-year.md b/content/posts/2025-12-31-new-year.md
new file mode 100644
index 0000000..7a3c3b0
--- /dev/null
+++ b/content/posts/2025-12-31-new-year.md
@@ -0,0 +1,28 @@
+---
+comments: true
+cover: /posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg
+date: '2025-12-31T15:27:17+03:00'
+tags:
+- разное
+title: С Новым Годом!
+---
+
+С наступающим Новым Годом!
+
+![2026](/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png)
+
+Предыдущий год был весьма и весьма разным. Было и хорошее и плохое. Отчёт по
+году как в [прошлом году](/posts/2024-12-31-new-year/) делать не буду. Честно
+говоря, нет особо моральных сил на это.
+
+<!--more-->
+
+Уходящий год для меня стал годом чередования работы и семейных забот. В целом,
+всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем
+желаю!
+
+А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды
+обходили ваш дом стороной.
+
+А пока, отправляюсь резать салатики и заниматься прочими домашними заботами, не
+всё же у компьютера сидеть :)
diff --git a/content/posts/2025-12-31-qchat.md b/content/posts/2025-12-31-qchat.md
new file mode 100644
index 0000000..8344933
--- /dev/null
+++ b/content/posts/2025-12-31-qchat.md
@@ -0,0 +1,46 @@
+---
+comments: true
+date: '2025-12-31T14:55:45+03:00'
+tags:
+- гиковское
+- IT
+title: qChat — чатик поверх SSH
+---
+
+Для собственного интереса написал на Go реализацию IRC-подобного чата, который
+работает поверх прокола SSH.
+
+Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы
+его можно было запустить без конфигурации, с минимальными усилиями на любой
+«картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей
+в одной локальной сети (хотя может работать и по интернету).
+
+Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны
+:)
+
+<!--more-->
+
+Приглашаю забежать на огонёк, если умеете пользоваться SSH:
+
+```
+ssh neonxp.ru -p 1337
+```
+
+Продублирую из README описание основных команд:
+
+- `/help` - эта справка.
+- `/join [chan]` - подключиться к каналу [chan]. Если его нет, он будет создан.
+- `/chans` - список каналов.
+- `/users` - список пользователей на сервере (не на канале, а именно на
+ сервере).
+- `/me [message]` - отправка сообщения как бы от третьего лица.
+
+Форматирование сообщений:
+
+- `*Полужирный*`
+- `+Курсив+`
+- `-Зачёркнутый текст-`
+- `_Подчёркнутый текст_`
+
+Про техническое описание — есть отдельная страница:
+[/projects/qchat/](/projects/qchat/)
diff --git a/content/posts/_index.md b/content/posts/_index.md
new file mode 100644
index 0000000..0fbcdff
--- /dev/null
+++ b/content/posts/_index.md
@@ -0,0 +1,8 @@
+---
+title: Блог
+cascade:
+ params:
+ comments: true
+---
+
+Просто мой блог
diff --git a/content/posts/files/2021-02-13-jsonnet_logo.webp b/content/posts/files/2021-02-13-jsonnet_logo.webp
new file mode 100644
index 0000000..45c63a6
--- /dev/null
+++ b/content/posts/files/2021-02-13-jsonnet_logo.webp
Binary files differ
diff --git a/content/posts/files/2024-07-13-joplin_joplin.webp b/content/posts/files/2024-07-13-joplin_joplin.webp
new file mode 100644
index 0000000..33326b7
--- /dev/null
+++ b/content/posts/files/2024-07-13-joplin_joplin.webp
Binary files differ
diff --git a/content/posts/files/2024-10-06-цитатник-рунета_bash_org.webp b/content/posts/files/2024-10-06-цитатник-рунета_bash_org.webp
new file mode 100644
index 0000000..e142633
--- /dev/null
+++ b/content/posts/files/2024-10-06-цитатник-рунета_bash_org.webp
Binary files differ
diff --git a/content/posts/files/2024-10-17-книги-2_Rama16wiki.webp b/content/posts/files/2024-10-17-книги-2_Rama16wiki.webp
new file mode 100644
index 0000000..b4d9ce9
--- /dev/null
+++ b/content/posts/files/2024-10-17-книги-2_Rama16wiki.webp
Binary files differ
diff --git a/content/posts/files/2024-11-17-obsidian_img/logo.webp b/content/posts/files/2024-11-17-obsidian_img/logo.webp
new file mode 100644
index 0000000..d5c747a
--- /dev/null
+++ b/content/posts/files/2024-11-17-obsidian_img/logo.webp
Binary files differ
diff --git a/content/posts/files/2024-11-17-obsidian_img/publish.webp b/content/posts/files/2024-11-17-obsidian_img/publish.webp
new file mode 100644
index 0000000..f8add88
--- /dev/null
+++ b/content/posts/files/2024-11-17-obsidian_img/publish.webp
Binary files differ
diff --git a/content/posts/files/2024-11-17-obsidian_img/templater.webp b/content/posts/files/2024-11-17-obsidian_img/templater.webp
new file mode 100644
index 0000000..facdd86
--- /dev/null
+++ b/content/posts/files/2024-11-17-obsidian_img/templater.webp
Binary files differ
diff --git a/content/posts/files/2024-11-27-hyperlocality_img/90e.webp b/content/posts/files/2024-11-27-hyperlocality_img/90e.webp
new file mode 100644
index 0000000..948d808
--- /dev/null
+++ b/content/posts/files/2024-11-27-hyperlocality_img/90e.webp
Binary files differ
diff --git a/content/posts/files/2024-11-27-hyperlocality_img/braindance.webp b/content/posts/files/2024-11-27-hyperlocality_img/braindance.webp
new file mode 100644
index 0000000..965e145
--- /dev/null
+++ b/content/posts/files/2024-11-27-hyperlocality_img/braindance.webp
Binary files differ
diff --git a/content/posts/files/2024-11-27-hyperlocality_img/camp.webp b/content/posts/files/2024-11-27-hyperlocality_img/camp.webp
new file mode 100644
index 0000000..a07d8ed
--- /dev/null
+++ b/content/posts/files/2024-11-27-hyperlocality_img/camp.webp
Binary files differ
diff --git a/content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp b/content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp
new file mode 100644
index 0000000..56d8c50
--- /dev/null
+++ b/content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp
Binary files differ
diff --git a/content/posts/files/2024-11-29-hobbies_dozor.webp b/content/posts/files/2024-11-29-hobbies_dozor.webp
new file mode 100644
index 0000000..eab9913
--- /dev/null
+++ b/content/posts/files/2024-11-29-hobbies_dozor.webp
Binary files differ
diff --git a/content/posts/files/2024-12-12-guessr_logo.webp b/content/posts/files/2024-12-12-guessr_logo.webp
new file mode 100644
index 0000000..3a414cd
--- /dev/null
+++ b/content/posts/files/2024-12-12-guessr_logo.webp
Binary files differ
diff --git a/content/posts/files/2024-12-15-conditional-operator-go_ternary.webp b/content/posts/files/2024-12-15-conditional-operator-go_ternary.webp
new file mode 100644
index 0000000..5eeea58
--- /dev/null
+++ b/content/posts/files/2024-12-15-conditional-operator-go_ternary.webp
Binary files differ
diff --git a/content/posts/files/2024-12-15-posse_posse.webp b/content/posts/files/2024-12-15-posse_posse.webp
new file mode 100644
index 0000000..aad6230
--- /dev/null
+++ b/content/posts/files/2024-12-15-posse_posse.webp
Binary files differ
diff --git a/content/posts/files/2024-12-17-infra_cover.webp b/content/posts/files/2024-12-17-infra_cover.webp
new file mode 100644
index 0000000..c02c8be
--- /dev/null
+++ b/content/posts/files/2024-12-17-infra_cover.webp
Binary files differ
diff --git a/content/posts/files/2024-12-30-irc_logo.webp b/content/posts/files/2024-12-30-irc_logo.webp
new file mode 100644
index 0000000..26c4182
--- /dev/null
+++ b/content/posts/files/2024-12-30-irc_logo.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/1.webp b/content/posts/files/2024-12-31-new-year_img/1.webp
new file mode 100644
index 0000000..f320b83
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/1.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/2.webp b/content/posts/files/2024-12-31-new-year_img/2.webp
new file mode 100644
index 0000000..49a1ed1
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/2.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/2025.webp b/content/posts/files/2024-12-31-new-year_img/2025.webp
new file mode 100644
index 0000000..9cc3c0b
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/2025.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/3.webp b/content/posts/files/2024-12-31-new-year_img/3.webp
new file mode 100644
index 0000000..64dedc8
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/3.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/4.webp b/content/posts/files/2024-12-31-new-year_img/4.webp
new file mode 100644
index 0000000..b5af0b5
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/4.webp
Binary files differ
diff --git a/content/posts/files/2024-12-31-new-year_img/5.webp b/content/posts/files/2024-12-31-new-year_img/5.webp
new file mode 100644
index 0000000..86a8c2d
--- /dev/null
+++ b/content/posts/files/2024-12-31-new-year_img/5.webp
Binary files differ
diff --git a/content/posts/files/2025-12-21-img1.jpg b/content/posts/files/2025-12-21-img1.jpg
new file mode 100644
index 0000000..2dd29f9
--- /dev/null
+++ b/content/posts/files/2025-12-21-img1.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-21-img2.jpg b/content/posts/files/2025-12-21-img2.jpg
new file mode 100644
index 0000000..0ea8467
--- /dev/null
+++ b/content/posts/files/2025-12-21-img2.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-21-img3.png b/content/posts/files/2025-12-21-img3.png
new file mode 100644
index 0000000..3e41caf
--- /dev/null
+++ b/content/posts/files/2025-12-21-img3.png
Binary files differ
diff --git a/content/posts/files/2025-12-21-sicktech.png b/content/posts/files/2025-12-21-sicktech.png
new file mode 100644
index 0000000..32c7b9f
--- /dev/null
+++ b/content/posts/files/2025-12-21-sicktech.png
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo.jpg b/content/posts/files/2025-12-27-osm_img/photo.jpg
new file mode 100644
index 0000000..4ea3f89
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_1.jpg b/content/posts/files/2025-12-27-osm_img/photo_1.jpg
new file mode 100644
index 0000000..d14ed56
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_1.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_10.jpg b/content/posts/files/2025-12-27-osm_img/photo_10.jpg
new file mode 100644
index 0000000..66a5727
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_10.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_11.jpg b/content/posts/files/2025-12-27-osm_img/photo_11.jpg
new file mode 100644
index 0000000..aed7c5b
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_11.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_12.jpg b/content/posts/files/2025-12-27-osm_img/photo_12.jpg
new file mode 100644
index 0000000..b78b33b
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_12.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_13.jpg b/content/posts/files/2025-12-27-osm_img/photo_13.jpg
new file mode 100644
index 0000000..6bb6bd0
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_13.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_14.jpg b/content/posts/files/2025-12-27-osm_img/photo_14.jpg
new file mode 100644
index 0000000..806471f
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_14.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_2.jpg b/content/posts/files/2025-12-27-osm_img/photo_2.jpg
new file mode 100644
index 0000000..d4f788a
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_2.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_3.jpg b/content/posts/files/2025-12-27-osm_img/photo_3.jpg
new file mode 100644
index 0000000..74ef585
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_3.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_4.jpg b/content/posts/files/2025-12-27-osm_img/photo_4.jpg
new file mode 100644
index 0000000..ea5a5d0
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_4.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_5.jpg b/content/posts/files/2025-12-27-osm_img/photo_5.jpg
new file mode 100644
index 0000000..462b570
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_5.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_6.jpg b/content/posts/files/2025-12-27-osm_img/photo_6.jpg
new file mode 100644
index 0000000..253af73
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_6.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_7.jpg b/content/posts/files/2025-12-27-osm_img/photo_7.jpg
new file mode 100644
index 0000000..cd92319
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_7.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_8.jpg b/content/posts/files/2025-12-27-osm_img/photo_8.jpg
new file mode 100644
index 0000000..bebc4b3
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_8.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/photo_9.jpg b/content/posts/files/2025-12-27-osm_img/photo_9.jpg
new file mode 100644
index 0000000..8e4358b
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/photo_9.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg
new file mode 100644
index 0000000..ae1a7eb
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg
new file mode 100644
index 0000000..7d3df90
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg
new file mode 100644
index 0000000..ee69188
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg
new file mode 100644
index 0000000..72c288f
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg
new file mode 100644
index 0000000..8bbd32c
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg
new file mode 100644
index 0000000..1608d5b
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg
new file mode 100644
index 0000000..5cab91a
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg
new file mode 100644
index 0000000..870578b
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg
new file mode 100644
index 0000000..44b2637
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg
new file mode 100644
index 0000000..462b1bc
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg
new file mode 100644
index 0000000..4c9d1d6
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg
new file mode 100644
index 0000000..9ad1280
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg
new file mode 100644
index 0000000..7054792
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg
new file mode 100644
index 0000000..edd7f59
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg b/content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg
new file mode 100644
index 0000000..859bade
--- /dev/null
+++ b/content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..a7602ed
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..d0ff6f2
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..7007409
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..17d8e06
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..87658fc
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png b/content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png
new file mode 100644
index 0000000..de29bfb
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..e028728
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..0c83ba7
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png b/content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png
new file mode 100644
index 0000000..00eddcc
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png b/content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png
new file mode 100644
index 0000000..a01eae9
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..615da4b
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..69ad012
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..7768b6e
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..369d229
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..35e1cd5
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..ccb1005
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..066be5c
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..ccab7b5
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..71aebf0
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..f9ef2da
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..381faff
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..f9e8a43
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..302bb88
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg
new file mode 100644
index 0000000..3c6b8f1
--- /dev/null
+++ b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg
Binary files differ
diff --git a/content/posts/files/2025-12-29-newyear-excel_img/cover.png b/content/posts/files/2025-12-29-newyear-excel_img/cover.png
new file mode 100644
index 0000000..ae331d5
--- /dev/null
+++ b/content/posts/files/2025-12-29-newyear-excel_img/cover.png
Binary files differ
diff --git a/content/posts/files/2025-12-29-newyear-excel_img/cover1.png b/content/posts/files/2025-12-29-newyear-excel_img/cover1.png
new file mode 100644
index 0000000..b252f6e
--- /dev/null
+++ b/content/posts/files/2025-12-29-newyear-excel_img/cover1.png
Binary files differ
diff --git a/content/posts/files/2025-12-29-newyear-excel_img/new_year.ods b/content/posts/files/2025-12-29-newyear-excel_img/new_year.ods
new file mode 100644
index 0000000..2d8aad2
--- /dev/null
+++ b/content/posts/files/2025-12-29-newyear-excel_img/new_year.ods
Binary files differ
diff --git a/content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx b/content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx
new file mode 100644
index 0000000..ca4469c
--- /dev/null
+++ b/content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/1.webp b/content/posts/files/2025-travel-1_img/1.webp
new file mode 100644
index 0000000..bc037f2
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/1.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/10.webp b/content/posts/files/2025-travel-1_img/10.webp
new file mode 100644
index 0000000..32bb46f
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/10.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/11.webp b/content/posts/files/2025-travel-1_img/11.webp
new file mode 100644
index 0000000..12f0933
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/11.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/12.webp b/content/posts/files/2025-travel-1_img/12.webp
new file mode 100644
index 0000000..c797bf3
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/12.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/13.webp b/content/posts/files/2025-travel-1_img/13.webp
new file mode 100644
index 0000000..96db2e5
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/13.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/14.webp b/content/posts/files/2025-travel-1_img/14.webp
new file mode 100644
index 0000000..66a53d8
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/14.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/15.webp b/content/posts/files/2025-travel-1_img/15.webp
new file mode 100644
index 0000000..a71672b
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/15.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/16.webp b/content/posts/files/2025-travel-1_img/16.webp
new file mode 100644
index 0000000..e690ba3
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/16.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/17.webp b/content/posts/files/2025-travel-1_img/17.webp
new file mode 100644
index 0000000..81fa05b
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/17.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/18.webp b/content/posts/files/2025-travel-1_img/18.webp
new file mode 100644
index 0000000..5905999
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/18.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/19.webp b/content/posts/files/2025-travel-1_img/19.webp
new file mode 100644
index 0000000..ab80bd9
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/19.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/2.webp b/content/posts/files/2025-travel-1_img/2.webp
new file mode 100644
index 0000000..b9ecc86
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/2.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/20.webp b/content/posts/files/2025-travel-1_img/20.webp
new file mode 100644
index 0000000..1cc4e35
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/20.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/21.webp b/content/posts/files/2025-travel-1_img/21.webp
new file mode 100644
index 0000000..0f3cc2c
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/21.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/22.webp b/content/posts/files/2025-travel-1_img/22.webp
new file mode 100644
index 0000000..b2d032d
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/22.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/23.webp b/content/posts/files/2025-travel-1_img/23.webp
new file mode 100644
index 0000000..00ad3f9
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/23.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/3.webp b/content/posts/files/2025-travel-1_img/3.webp
new file mode 100644
index 0000000..37ec362
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/3.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/4.webp b/content/posts/files/2025-travel-1_img/4.webp
new file mode 100644
index 0000000..dfb29bd
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/4.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/5.webp b/content/posts/files/2025-travel-1_img/5.webp
new file mode 100644
index 0000000..b5e1a8f
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/5.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/6.webp b/content/posts/files/2025-travel-1_img/6.webp
new file mode 100644
index 0000000..6b6bbca
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/6.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/7.webp b/content/posts/files/2025-travel-1_img/7.webp
new file mode 100644
index 0000000..fcce61f
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/7.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/8.webp b/content/posts/files/2025-travel-1_img/8.webp
new file mode 100644
index 0000000..b777d4c
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/8.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/9.webp b/content/posts/files/2025-travel-1_img/9.webp
new file mode 100644
index 0000000..f40de11
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/9.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_1.webp b/content/posts/files/2025-travel-1_img/preview_1.webp
new file mode 100644
index 0000000..c18dc0c
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_1.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_10.webp b/content/posts/files/2025-travel-1_img/preview_10.webp
new file mode 100644
index 0000000..4d23293
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_10.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_11.webp b/content/posts/files/2025-travel-1_img/preview_11.webp
new file mode 100644
index 0000000..07e38b6
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_11.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_12.webp b/content/posts/files/2025-travel-1_img/preview_12.webp
new file mode 100644
index 0000000..7a23c41
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_12.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_13.webp b/content/posts/files/2025-travel-1_img/preview_13.webp
new file mode 100644
index 0000000..953fac9
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_13.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_14.webp b/content/posts/files/2025-travel-1_img/preview_14.webp
new file mode 100644
index 0000000..08cb032
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_14.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_15.webp b/content/posts/files/2025-travel-1_img/preview_15.webp
new file mode 100644
index 0000000..627702d
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_15.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_16.webp b/content/posts/files/2025-travel-1_img/preview_16.webp
new file mode 100644
index 0000000..2bfa651
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_16.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_17.webp b/content/posts/files/2025-travel-1_img/preview_17.webp
new file mode 100644
index 0000000..814ace2
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_17.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_18.webp b/content/posts/files/2025-travel-1_img/preview_18.webp
new file mode 100644
index 0000000..82422a8
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_18.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_19.webp b/content/posts/files/2025-travel-1_img/preview_19.webp
new file mode 100644
index 0000000..b234b0c
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_19.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_2.webp b/content/posts/files/2025-travel-1_img/preview_2.webp
new file mode 100644
index 0000000..c730b03
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_2.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_20.webp b/content/posts/files/2025-travel-1_img/preview_20.webp
new file mode 100644
index 0000000..266a83e
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_20.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_21.webp b/content/posts/files/2025-travel-1_img/preview_21.webp
new file mode 100644
index 0000000..3cab02c
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_21.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_22.webp b/content/posts/files/2025-travel-1_img/preview_22.webp
new file mode 100644
index 0000000..5530efa
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_22.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_23.webp b/content/posts/files/2025-travel-1_img/preview_23.webp
new file mode 100644
index 0000000..aca8d32
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_23.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_3.webp b/content/posts/files/2025-travel-1_img/preview_3.webp
new file mode 100644
index 0000000..511e4c4
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_3.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_4.webp b/content/posts/files/2025-travel-1_img/preview_4.webp
new file mode 100644
index 0000000..bfbe20e
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_4.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_5.webp b/content/posts/files/2025-travel-1_img/preview_5.webp
new file mode 100644
index 0000000..5d5811d
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_5.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_6.webp b/content/posts/files/2025-travel-1_img/preview_6.webp
new file mode 100644
index 0000000..076e35b
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_6.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_7.webp b/content/posts/files/2025-travel-1_img/preview_7.webp
new file mode 100644
index 0000000..02cd89a
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_7.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_8.webp b/content/posts/files/2025-travel-1_img/preview_8.webp
new file mode 100644
index 0000000..4c87281
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_8.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/preview_9.webp b/content/posts/files/2025-travel-1_img/preview_9.webp
new file mode 100644
index 0000000..3791fbb
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/preview_9.webp
Binary files differ
diff --git a/content/posts/files/2025-travel-1_img/saologo.png b/content/posts/files/2025-travel-1_img/saologo.png
new file mode 100644
index 0000000..3fceeeb
--- /dev/null
+++ b/content/posts/files/2025-travel-1_img/saologo.png
Binary files differ
diff --git a/content/posts/files/hype_curve.png b/content/posts/files/hype_curve.png
new file mode 100644
index 0000000..9147d5e
--- /dev/null
+++ b/content/posts/files/hype_curve.png
Binary files differ
diff --git a/content/posts/files/laughing-man.jpeg b/content/posts/files/laughing-man.jpeg
new file mode 100644
index 0000000..652603c
--- /dev/null
+++ b/content/posts/files/laughing-man.jpeg
Binary files differ
diff --git a/content/posts/files/lets-code-3d_img/1.jpg b/content/posts/files/lets-code-3d_img/1.jpg
new file mode 100644
index 0000000..87f41e7
--- /dev/null
+++ b/content/posts/files/lets-code-3d_img/1.jpg
Binary files differ
diff --git a/content/posts/files/lets-code-3d_img/2.jpg b/content/posts/files/lets-code-3d_img/2.jpg
new file mode 100644
index 0000000..db14947
--- /dev/null
+++ b/content/posts/files/lets-code-3d_img/2.jpg
Binary files differ
diff --git a/content/posts/files/lets-code-3d_img/3.png b/content/posts/files/lets-code-3d_img/3.png
new file mode 100644
index 0000000..9887043
--- /dev/null
+++ b/content/posts/files/lets-code-3d_img/3.png
Binary files differ
diff --git a/content/posts/files/lets-code-3d_img/4.jpg b/content/posts/files/lets-code-3d_img/4.jpg
new file mode 100644
index 0000000..4e7ebc7
--- /dev/null
+++ b/content/posts/files/lets-code-3d_img/4.jpg
Binary files differ
diff --git a/content/posts/files/lets-code-3d_result.stl b/content/posts/files/lets-code-3d_result.stl
new file mode 100644
index 0000000..fdd4d19
--- /dev/null
+++ b/content/posts/files/lets-code-3d_result.stl
Binary files differ
diff --git a/content/posts/files/lets-code-3d_source.scad b/content/posts/files/lets-code-3d_source.scad
new file mode 100644
index 0000000..b651cb3
--- /dev/null
+++ b/content/posts/files/lets-code-3d_source.scad
@@ -0,0 +1,66 @@
+// Толщина стенки
+wall = 2;
+
+// Высота внешняя
+height = 12;
+
+// Длина основной части (внутренняя)
+l1 = 15;
+
+// Длина носика (внутренняя)
+l2 = 20;
+
+// Ширина у основания (внутренняя)
+w = 15;
+
+// Толщина метала бокорезов
+toolWidth = 2.1;
+
+// Нижняя крышка
+cover(0);
+
+// Верхняя крышка
+cover(height - wall);
+
+// Корпус
+difference() {
+ linear_extrude(height)
+ polygon(
+ [ // Полигон идёт против часовой стрелки
+ [0, 0],
+ [wall, 0],
+ [wall, l1],
+ [w / 2 + wall, l1 + l2], // Внутренний кончик носика
+ [w + wall, l1],
+ [w + wall, 0],
+ [w + wall * 2, 0],
+ [w + wall * 2, l1],
+ [w / 2 + wall / 2 + wall, l1 + l2 + wall], // Внешний кончик носика
+ [w / 2 - wall / 2 + wall, l1 + l2 + wall],
+ [0, l1],
+ ]
+ );
+
+ // Вырезы
+ translate([w + wall, 0, height / 2 - toolWidth]) // Правый вырез чуть ниже середины
+ cube([wall, l1 / 2, toolWidth]);
+ translate([0, 0, height / 2]) // Левый вырез чуть выше середины
+ cube([wall, l1 / 2, toolWidth]);
+}
+
+
+// Крышка
+module cover(z) {
+ translate([0, 0, z])
+ linear_extrude(wall)
+ polygon(
+ [ // Полигон идёт против часовой стрелки
+ [0, 0],
+ [w + wall * 2, 0],
+ [w + wall * 2, l1],
+ [w / 2 + wall / 2 + wall, l1 + l2 + wall],
+ [w / 2 - wall / 2 + wall, l1 + l2 + wall],
+ [0, l1],
+ ]
+ );
+}
diff --git a/content/posts/files/makeup-organizer_img/1.png b/content/posts/files/makeup-organizer_img/1.png
new file mode 100644
index 0000000..8f26704
--- /dev/null
+++ b/content/posts/files/makeup-organizer_img/1.png
Binary files differ
diff --git a/content/posts/files/makeup-organizer_img/2.png b/content/posts/files/makeup-organizer_img/2.png
new file mode 100644
index 0000000..6613744
--- /dev/null
+++ b/content/posts/files/makeup-organizer_img/2.png
Binary files differ
diff --git a/content/posts/files/makeup-organizer_img/3.png b/content/posts/files/makeup-organizer_img/3.png
new file mode 100644
index 0000000..993135e
--- /dev/null
+++ b/content/posts/files/makeup-organizer_img/3.png
Binary files differ
diff --git a/content/posts/files/makeup-organizer_organizer.tar.zst b/content/posts/files/makeup-organizer_organizer.tar.zst
new file mode 100644
index 0000000..7e2e2bb
--- /dev/null
+++ b/content/posts/files/makeup-organizer_organizer.tar.zst
Binary files differ
diff --git a/content/posts/files/meshtastic_img/tbeam.jpg b/content/posts/files/meshtastic_img/tbeam.jpg
new file mode 100644
index 0000000..214dc21
--- /dev/null
+++ b/content/posts/files/meshtastic_img/tbeam.jpg
Binary files differ
diff --git a/content/posts/files/meshtastic_img/tbeam.webp b/content/posts/files/meshtastic_img/tbeam.webp
new file mode 100644
index 0000000..7e89d94
--- /dev/null
+++ b/content/posts/files/meshtastic_img/tbeam.webp
Binary files differ