From 49458f5ffd5a48c465117ec27f6437683f75acc1 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Sat, 31 Jan 2026 20:38:50 +0300 Subject: initial --- content/posts/2021-02-13-jsonnet.md | 101 ++++++ ...270\320\263\320\270\320\265\320\275\320\260.md" | 91 +++++ ...266\320\264\320\265\320\275\320\270\320\265.md" | 27 ++ content/posts/2022-05-31-golang-1.md | 44 +++ content/posts/2023-01-12-gitrepo.md | 167 +++++++++ content/posts/2023-05-26-gist.md | 19 + content/posts/2023-07-24-tls.md | 85 +++++ ...265\321\200\320\265\320\265\320\267\320\264.md" | 28 ++ ...03-\320\260\321\200\321\205\320\270\320\262.md" | 14 + content/posts/2024-02-21-tls.md | 54 +++ ...75\321\213-\320\277\321\203\321\210\320\270.md" | 110 ++++++ ...-\320\272\320\275\320\270\320\263\320\270-1.md" | 21 ++ content/posts/2024-07-13-joplin.md | 43 +++ content/posts/2024-07-21-bbs.md | 33 ++ content/posts/2024-09-26-hugo-wordpress.md | 16 + ...200\321\203\320\275\320\265\321\202\320\260.md" | 64 ++++ ...-\320\272\320\275\320\270\320\263\320\270-2.md" | 39 ++ content/posts/2024-11-15-hugo.md | 19 + content/posts/2024-11-17-obsidian.md | 240 +++++++++++++ content/posts/2024-11-27-hyperlocality.md | 182 ++++++++++ content/posts/2024-11-29-hobbies.md | 44 +++ content/posts/2024-12-12-guessr.md | 130 +++++++ .../posts/2024-12-15-conditional-operator-go.md | 35 ++ content/posts/2024-12-15-posse.md | 81 +++++ content/posts/2024-12-17-infra.md | 120 +++++++ content/posts/2024-12-30-irc.md | 75 ++++ content/posts/2024-12-31-new-year.md | 50 +++ content/posts/2025-04-05-tabs-or-spaces.md | 400 +++++++++++++++++++++ content/posts/2025-05-19-nxpcms-2.md | 19 + content/posts/2025-05-19-nxpcms.md | 77 ++++ content/posts/2025-06-08-my-setup.md | 31 ++ content/posts/2025-08-02-meshtastic.md | 66 ++++ content/posts/2025-08-05-lets-code-3d.md | 154 ++++++++ content/posts/2025-08-09-makeup-organizer.md | 38 ++ content/posts/2025-09-01-travel-1.md | 142 ++++++++ content/posts/2025-10-06-ai.md | 124 +++++++ content/posts/2025-10-11-blog.md | 32 ++ .../posts/2025-10-18-the-ghost-in-the-machine.md | 184 ++++++++++ content/posts/2025-11-03-blog-deploy.md | 46 +++ content/posts/2025-11-03-my-setup.md | 21 ++ content/posts/2025-11-04-blog-deploy-2.md | 50 +++ content/posts/2025-11-09-migration.md | 55 +++ content/posts/2025-11-23-org.md | 253 +++++++++++++ content/posts/2025-12-02-httpsocalypse.md | 31 ++ content/posts/2025-12-21-sicktech.md | 228 ++++++++++++ content/posts/2025-12-23-comments.md | 12 + content/posts/2025-12-24-email.md | 99 +++++ content/posts/2025-12-27-osm.md | 40 +++ content/posts/2025-12-28-philharmonic-park.md | 32 ++ content/posts/2025-12-29-newyear-excel.md | 22 ++ content/posts/2025-12-31-new-year.md | 28 ++ content/posts/2025-12-31-qchat.md | 46 +++ content/posts/_index.md | 8 + content/posts/files/2021-02-13-jsonnet_logo.webp | Bin 0 -> 47006 bytes content/posts/files/2024-07-13-joplin_joplin.webp | Bin 0 -> 111506 bytes ...\320\275\320\265\321\202\320\260_bash_org.webp" | Bin 0 -> 20774 bytes ...\275\320\270\320\263\320\270-2_Rama16wiki.webp" | Bin 0 -> 44726 bytes .../posts/files/2024-11-17-obsidian_img/logo.webp | Bin 0 -> 9244 bytes .../files/2024-11-17-obsidian_img/publish.webp | Bin 0 -> 23110 bytes .../files/2024-11-17-obsidian_img/templater.webp | Bin 0 -> 17140 bytes .../files/2024-11-27-hyperlocality_img/90e.webp | Bin 0 -> 71910 bytes .../2024-11-27-hyperlocality_img/braindance.webp | Bin 0 -> 92740 bytes .../files/2024-11-27-hyperlocality_img/camp.webp | Bin 0 -> 115704 bytes .../2024-11-27-hyperlocality_img/in-internet.webp | Bin 0 -> 136578 bytes content/posts/files/2024-11-29-hobbies_dozor.webp | Bin 0 -> 101246 bytes content/posts/files/2024-12-12-guessr_logo.webp | Bin 0 -> 112508 bytes ...2024-12-15-conditional-operator-go_ternary.webp | Bin 0 -> 7408 bytes content/posts/files/2024-12-15-posse_posse.webp | Bin 0 -> 60800 bytes content/posts/files/2024-12-17-infra_cover.webp | Bin 0 -> 532556 bytes content/posts/files/2024-12-30-irc_logo.webp | Bin 0 -> 10130 bytes content/posts/files/2024-12-31-new-year_img/1.webp | Bin 0 -> 141164 bytes content/posts/files/2024-12-31-new-year_img/2.webp | Bin 0 -> 212740 bytes .../posts/files/2024-12-31-new-year_img/2025.webp | Bin 0 -> 163920 bytes content/posts/files/2024-12-31-new-year_img/3.webp | Bin 0 -> 446502 bytes content/posts/files/2024-12-31-new-year_img/4.webp | Bin 0 -> 146032 bytes content/posts/files/2024-12-31-new-year_img/5.webp | Bin 0 -> 190524 bytes content/posts/files/2025-12-21-img1.jpg | Bin 0 -> 162511 bytes content/posts/files/2025-12-21-img2.jpg | Bin 0 -> 88801 bytes content/posts/files/2025-12-21-img3.png | Bin 0 -> 340974 bytes content/posts/files/2025-12-21-sicktech.png | Bin 0 -> 263578 bytes content/posts/files/2025-12-27-osm_img/photo.jpg | Bin 0 -> 227501 bytes content/posts/files/2025-12-27-osm_img/photo_1.jpg | Bin 0 -> 221795 bytes .../posts/files/2025-12-27-osm_img/photo_10.jpg | Bin 0 -> 127547 bytes .../posts/files/2025-12-27-osm_img/photo_11.jpg | Bin 0 -> 151264 bytes .../posts/files/2025-12-27-osm_img/photo_12.jpg | Bin 0 -> 121963 bytes .../posts/files/2025-12-27-osm_img/photo_13.jpg | Bin 0 -> 126052 bytes .../posts/files/2025-12-27-osm_img/photo_14.jpg | Bin 0 -> 225031 bytes content/posts/files/2025-12-27-osm_img/photo_2.jpg | Bin 0 -> 226528 bytes content/posts/files/2025-12-27-osm_img/photo_3.jpg | Bin 0 -> 234383 bytes content/posts/files/2025-12-27-osm_img/photo_4.jpg | Bin 0 -> 214772 bytes content/posts/files/2025-12-27-osm_img/photo_5.jpg | Bin 0 -> 179943 bytes content/posts/files/2025-12-27-osm_img/photo_6.jpg | Bin 0 -> 168080 bytes content/posts/files/2025-12-27-osm_img/photo_7.jpg | Bin 0 -> 161387 bytes content/posts/files/2025-12-27-osm_img/photo_8.jpg | Bin 0 -> 127482 bytes content/posts/files/2025-12-27-osm_img/photo_9.jpg | Bin 0 -> 213571 bytes .../files/2025-12-27-osm_img/thumbs/photo.jpg | Bin 0 -> 11353 bytes .../files/2025-12-27-osm_img/thumbs/photo_1.jpg | Bin 0 -> 14146 bytes .../files/2025-12-27-osm_img/thumbs/photo_10.jpg | Bin 0 -> 9230 bytes .../files/2025-12-27-osm_img/thumbs/photo_11.jpg | Bin 0 -> 10581 bytes .../files/2025-12-27-osm_img/thumbs/photo_12.jpg | Bin 0 -> 13124 bytes .../files/2025-12-27-osm_img/thumbs/photo_13.jpg | Bin 0 -> 14557 bytes .../files/2025-12-27-osm_img/thumbs/photo_14.jpg | Bin 0 -> 15019 bytes .../files/2025-12-27-osm_img/thumbs/photo_2.jpg | Bin 0 -> 15041 bytes .../files/2025-12-27-osm_img/thumbs/photo_3.jpg | Bin 0 -> 15339 bytes .../files/2025-12-27-osm_img/thumbs/photo_4.jpg | Bin 0 -> 14214 bytes .../files/2025-12-27-osm_img/thumbs/photo_5.jpg | Bin 0 -> 12279 bytes .../files/2025-12-27-osm_img/thumbs/photo_6.jpg | Bin 0 -> 10936 bytes .../files/2025-12-27-osm_img/thumbs/photo_7.jpg | Bin 0 -> 15840 bytes .../files/2025-12-27-osm_img/thumbs/photo_8.jpg | Bin 0 -> 11695 bytes .../files/2025-12-27-osm_img/thumbs/photo_9.jpg | Bin 0 -> 15837 bytes .../photo_19_2025-12-28_21-35-40.jpg | Bin 0 -> 307509 bytes .../photo_1_2025-12-28_21-35-40.jpg | Bin 0 -> 284188 bytes .../photo_20_2025-12-28_21-35-40.jpg | Bin 0 -> 253734 bytes .../photo_25_2025-12-28_21-35-40.jpg | Bin 0 -> 242625 bytes .../photo_27_2025-12-28_21-35-40.jpg | Bin 0 -> 331494 bytes .../photo_2_2025-12-28_21-35-40.png | Bin 0 -> 1966164 bytes .../photo_30_2025-12-28_21-35-40.jpg | Bin 0 -> 352290 bytes .../photo_31_2025-12-28_21-35-40.jpg | Bin 0 -> 216175 bytes .../photo_32_2025-12-28_21-35-40.png | Bin 0 -> 1423681 bytes .../photo_3_2025-12-28_21-35-40.png | Bin 0 -> 1487705 bytes .../photo_5_2025-12-28_21-35-40.jpg | Bin 0 -> 294826 bytes .../photo_9_2025-12-28_21-35-40.jpg | Bin 0 -> 183104 bytes .../thumbs/photo_19_2025-12-28_21-35-40.jpg | Bin 0 -> 18056 bytes .../thumbs/photo_1_2025-12-28_21-35-40.jpg | Bin 0 -> 12003 bytes .../thumbs/photo_20_2025-12-28_21-35-40.jpg | Bin 0 -> 17032 bytes .../thumbs/photo_25_2025-12-28_21-35-40.jpg | Bin 0 -> 17446 bytes .../thumbs/photo_27_2025-12-28_21-35-40.jpg | Bin 0 -> 16794 bytes .../thumbs/photo_2_2025-12-28_21-35-40.jpg | Bin 0 -> 29912 bytes .../thumbs/photo_30_2025-12-28_21-35-40.jpg | Bin 0 -> 21623 bytes .../thumbs/photo_31_2025-12-28_21-35-40.jpg | Bin 0 -> 10522 bytes .../thumbs/photo_32_2025-12-28_21-35-40.jpg | Bin 0 -> 14036 bytes .../thumbs/photo_3_2025-12-28_21-35-40.jpg | Bin 0 -> 25867 bytes .../thumbs/photo_5_2025-12-28_21-35-40.jpg | Bin 0 -> 18394 bytes .../thumbs/photo_9_2025-12-28_21-35-40.jpg | Bin 0 -> 15546 bytes .../files/2025-12-29-newyear-excel_img/cover.png | Bin 0 -> 46582 bytes .../files/2025-12-29-newyear-excel_img/cover1.png | Bin 0 -> 14651 bytes .../2025-12-29-newyear-excel_img/new_year.ods | Bin 0 -> 28669 bytes .../2025-12-29-newyear-excel_img/new_year.xlsx | Bin 0 -> 7859 bytes content/posts/files/2025-travel-1_img/1.webp | Bin 0 -> 1307382 bytes content/posts/files/2025-travel-1_img/10.webp | Bin 0 -> 1024096 bytes content/posts/files/2025-travel-1_img/11.webp | Bin 0 -> 1031876 bytes content/posts/files/2025-travel-1_img/12.webp | Bin 0 -> 373748 bytes content/posts/files/2025-travel-1_img/13.webp | Bin 0 -> 574476 bytes content/posts/files/2025-travel-1_img/14.webp | Bin 0 -> 385098 bytes content/posts/files/2025-travel-1_img/15.webp | Bin 0 -> 381654 bytes content/posts/files/2025-travel-1_img/16.webp | Bin 0 -> 2601414 bytes content/posts/files/2025-travel-1_img/17.webp | Bin 0 -> 3254752 bytes content/posts/files/2025-travel-1_img/18.webp | Bin 0 -> 1640240 bytes content/posts/files/2025-travel-1_img/19.webp | Bin 0 -> 2578076 bytes content/posts/files/2025-travel-1_img/2.webp | Bin 0 -> 1660606 bytes content/posts/files/2025-travel-1_img/20.webp | Bin 0 -> 3858586 bytes content/posts/files/2025-travel-1_img/21.webp | Bin 0 -> 4400828 bytes content/posts/files/2025-travel-1_img/22.webp | Bin 0 -> 2109710 bytes content/posts/files/2025-travel-1_img/23.webp | Bin 0 -> 988944 bytes content/posts/files/2025-travel-1_img/3.webp | Bin 0 -> 5237948 bytes content/posts/files/2025-travel-1_img/4.webp | Bin 0 -> 1403370 bytes content/posts/files/2025-travel-1_img/5.webp | Bin 0 -> 1424414 bytes content/posts/files/2025-travel-1_img/6.webp | Bin 0 -> 1129282 bytes content/posts/files/2025-travel-1_img/7.webp | Bin 0 -> 1178630 bytes content/posts/files/2025-travel-1_img/8.webp | Bin 0 -> 4411964 bytes content/posts/files/2025-travel-1_img/9.webp | Bin 0 -> 755094 bytes .../posts/files/2025-travel-1_img/preview_1.webp | Bin 0 -> 68140 bytes .../posts/files/2025-travel-1_img/preview_10.webp | Bin 0 -> 119806 bytes .../posts/files/2025-travel-1_img/preview_11.webp | Bin 0 -> 114776 bytes .../posts/files/2025-travel-1_img/preview_12.webp | Bin 0 -> 27904 bytes .../posts/files/2025-travel-1_img/preview_13.webp | Bin 0 -> 36594 bytes .../posts/files/2025-travel-1_img/preview_14.webp | Bin 0 -> 29198 bytes .../posts/files/2025-travel-1_img/preview_15.webp | Bin 0 -> 30840 bytes .../posts/files/2025-travel-1_img/preview_16.webp | Bin 0 -> 83166 bytes .../posts/files/2025-travel-1_img/preview_17.webp | Bin 0 -> 154656 bytes .../posts/files/2025-travel-1_img/preview_18.webp | Bin 0 -> 99452 bytes .../posts/files/2025-travel-1_img/preview_19.webp | Bin 0 -> 94816 bytes .../posts/files/2025-travel-1_img/preview_2.webp | Bin 0 -> 49558 bytes .../posts/files/2025-travel-1_img/preview_20.webp | Bin 0 -> 144248 bytes .../posts/files/2025-travel-1_img/preview_21.webp | Bin 0 -> 179974 bytes .../posts/files/2025-travel-1_img/preview_22.webp | Bin 0 -> 56148 bytes .../posts/files/2025-travel-1_img/preview_23.webp | Bin 0 -> 64300 bytes .../posts/files/2025-travel-1_img/preview_3.webp | Bin 0 -> 162906 bytes .../posts/files/2025-travel-1_img/preview_4.webp | Bin 0 -> 45526 bytes .../posts/files/2025-travel-1_img/preview_5.webp | Bin 0 -> 48660 bytes .../posts/files/2025-travel-1_img/preview_6.webp | Bin 0 -> 52192 bytes .../posts/files/2025-travel-1_img/preview_7.webp | Bin 0 -> 44236 bytes .../posts/files/2025-travel-1_img/preview_8.webp | Bin 0 -> 110076 bytes .../posts/files/2025-travel-1_img/preview_9.webp | Bin 0 -> 83176 bytes content/posts/files/2025-travel-1_img/saologo.png | Bin 0 -> 20791 bytes content/posts/files/hype_curve.png | Bin 0 -> 130810 bytes content/posts/files/laughing-man.jpeg | Bin 0 -> 234679 bytes content/posts/files/lets-code-3d_img/1.jpg | Bin 0 -> 86020 bytes content/posts/files/lets-code-3d_img/2.jpg | Bin 0 -> 58451 bytes content/posts/files/lets-code-3d_img/3.png | Bin 0 -> 108360 bytes content/posts/files/lets-code-3d_img/4.jpg | Bin 0 -> 75461 bytes content/posts/files/lets-code-3d_result.stl | Bin 0 -> 3684 bytes content/posts/files/lets-code-3d_source.scad | 66 ++++ content/posts/files/makeup-organizer_img/1.png | Bin 0 -> 180919 bytes content/posts/files/makeup-organizer_img/2.png | Bin 0 -> 354046 bytes content/posts/files/makeup-organizer_img/3.png | Bin 0 -> 115406 bytes .../posts/files/makeup-organizer_organizer.tar.zst | Bin 0 -> 660078 bytes content/posts/files/meshtastic_img/tbeam.jpg | Bin 0 -> 269445 bytes content/posts/files/meshtastic_img/tbeam.webp | Bin 0 -> 116662 bytes 199 files changed, 4236 insertions(+) create mode 100644 content/posts/2021-02-13-jsonnet.md create mode 100644 "content/posts/2021-05-13-\321\206\320\270\321\204\321\200\320\276\320\262\320\260\321\217-\320\263\320\270\320\263\320\270\320\265\320\275\320\260.md" create mode 100644 "content/posts/2022-05-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265.md" create mode 100644 content/posts/2022-05-31-golang-1.md create mode 100644 content/posts/2023-01-12-gitrepo.md create mode 100644 content/posts/2023-05-26-gist.md create mode 100644 content/posts/2023-07-24-tls.md create mode 100644 "content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264.md" create mode 100644 "content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262.md" create mode 100644 content/posts/2024-02-21-tls.md create mode 100644 "content/posts/2024-06-01-\320\262\320\260\320\274-\320\275\320\265-\320\275\321\203\320\266\320\275\321\213-\320\277\321\203\321\210\320\270.md" create mode 100644 "content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-1.md" create mode 100644 content/posts/2024-07-13-joplin.md create mode 100644 content/posts/2024-07-21-bbs.md create mode 100644 content/posts/2024-09-26-hugo-wordpress.md create mode 100644 "content/posts/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260.md" create mode 100644 "content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2.md" create mode 100644 content/posts/2024-11-15-hugo.md create mode 100644 content/posts/2024-11-17-obsidian.md create mode 100644 content/posts/2024-11-27-hyperlocality.md create mode 100644 content/posts/2024-11-29-hobbies.md create mode 100644 content/posts/2024-12-12-guessr.md create mode 100644 content/posts/2024-12-15-conditional-operator-go.md create mode 100644 content/posts/2024-12-15-posse.md create mode 100644 content/posts/2024-12-17-infra.md create mode 100644 content/posts/2024-12-30-irc.md create mode 100644 content/posts/2024-12-31-new-year.md create mode 100644 content/posts/2025-04-05-tabs-or-spaces.md create mode 100644 content/posts/2025-05-19-nxpcms-2.md create mode 100644 content/posts/2025-05-19-nxpcms.md create mode 100644 content/posts/2025-06-08-my-setup.md create mode 100644 content/posts/2025-08-02-meshtastic.md create mode 100644 content/posts/2025-08-05-lets-code-3d.md create mode 100644 content/posts/2025-08-09-makeup-organizer.md create mode 100644 content/posts/2025-09-01-travel-1.md create mode 100644 content/posts/2025-10-06-ai.md create mode 100644 content/posts/2025-10-11-blog.md create mode 100644 content/posts/2025-10-18-the-ghost-in-the-machine.md create mode 100644 content/posts/2025-11-03-blog-deploy.md create mode 100644 content/posts/2025-11-03-my-setup.md create mode 100644 content/posts/2025-11-04-blog-deploy-2.md create mode 100644 content/posts/2025-11-09-migration.md create mode 100644 content/posts/2025-11-23-org.md create mode 100644 content/posts/2025-12-02-httpsocalypse.md create mode 100644 content/posts/2025-12-21-sicktech.md create mode 100644 content/posts/2025-12-23-comments.md create mode 100644 content/posts/2025-12-24-email.md create mode 100644 content/posts/2025-12-27-osm.md create mode 100644 content/posts/2025-12-28-philharmonic-park.md create mode 100644 content/posts/2025-12-29-newyear-excel.md create mode 100644 content/posts/2025-12-31-new-year.md create mode 100644 content/posts/2025-12-31-qchat.md create mode 100644 content/posts/_index.md create mode 100644 content/posts/files/2021-02-13-jsonnet_logo.webp create mode 100644 content/posts/files/2024-07-13-joplin_joplin.webp create mode 100644 "content/posts/files/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260_bash_org.webp" create mode 100644 "content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" create mode 100644 content/posts/files/2024-11-17-obsidian_img/logo.webp create mode 100644 content/posts/files/2024-11-17-obsidian_img/publish.webp create mode 100644 content/posts/files/2024-11-17-obsidian_img/templater.webp create mode 100644 content/posts/files/2024-11-27-hyperlocality_img/90e.webp create mode 100644 content/posts/files/2024-11-27-hyperlocality_img/braindance.webp create mode 100644 content/posts/files/2024-11-27-hyperlocality_img/camp.webp create mode 100644 content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp create mode 100644 content/posts/files/2024-11-29-hobbies_dozor.webp create mode 100644 content/posts/files/2024-12-12-guessr_logo.webp create mode 100644 content/posts/files/2024-12-15-conditional-operator-go_ternary.webp create mode 100644 content/posts/files/2024-12-15-posse_posse.webp create mode 100644 content/posts/files/2024-12-17-infra_cover.webp create mode 100644 content/posts/files/2024-12-30-irc_logo.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/1.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/2.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/2025.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/3.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/4.webp create mode 100644 content/posts/files/2024-12-31-new-year_img/5.webp create mode 100644 content/posts/files/2025-12-21-img1.jpg create mode 100644 content/posts/files/2025-12-21-img2.jpg create mode 100644 content/posts/files/2025-12-21-img3.png create mode 100644 content/posts/files/2025-12-21-sicktech.png create mode 100644 content/posts/files/2025-12-27-osm_img/photo.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_1.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_10.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_11.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_12.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_13.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_14.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_2.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_3.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_4.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_5.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_6.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_7.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_8.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/photo_9.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg create mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg create mode 100644 content/posts/files/2025-12-29-newyear-excel_img/cover.png create mode 100644 content/posts/files/2025-12-29-newyear-excel_img/cover1.png create mode 100644 content/posts/files/2025-12-29-newyear-excel_img/new_year.ods create mode 100644 content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx create mode 100644 content/posts/files/2025-travel-1_img/1.webp create mode 100644 content/posts/files/2025-travel-1_img/10.webp create mode 100644 content/posts/files/2025-travel-1_img/11.webp create mode 100644 content/posts/files/2025-travel-1_img/12.webp create mode 100644 content/posts/files/2025-travel-1_img/13.webp create mode 100644 content/posts/files/2025-travel-1_img/14.webp create mode 100644 content/posts/files/2025-travel-1_img/15.webp create mode 100644 content/posts/files/2025-travel-1_img/16.webp create mode 100644 content/posts/files/2025-travel-1_img/17.webp create mode 100644 content/posts/files/2025-travel-1_img/18.webp create mode 100644 content/posts/files/2025-travel-1_img/19.webp create mode 100644 content/posts/files/2025-travel-1_img/2.webp create mode 100644 content/posts/files/2025-travel-1_img/20.webp create mode 100644 content/posts/files/2025-travel-1_img/21.webp create mode 100644 content/posts/files/2025-travel-1_img/22.webp create mode 100644 content/posts/files/2025-travel-1_img/23.webp create mode 100644 content/posts/files/2025-travel-1_img/3.webp create mode 100644 content/posts/files/2025-travel-1_img/4.webp create mode 100644 content/posts/files/2025-travel-1_img/5.webp create mode 100644 content/posts/files/2025-travel-1_img/6.webp create mode 100644 content/posts/files/2025-travel-1_img/7.webp create mode 100644 content/posts/files/2025-travel-1_img/8.webp create mode 100644 content/posts/files/2025-travel-1_img/9.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_1.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_10.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_11.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_12.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_13.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_14.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_15.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_16.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_17.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_18.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_19.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_2.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_20.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_21.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_22.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_23.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_3.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_4.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_5.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_6.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_7.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_8.webp create mode 100644 content/posts/files/2025-travel-1_img/preview_9.webp create mode 100644 content/posts/files/2025-travel-1_img/saologo.png create mode 100644 content/posts/files/hype_curve.png create mode 100644 content/posts/files/laughing-man.jpeg create mode 100644 content/posts/files/lets-code-3d_img/1.jpg create mode 100644 content/posts/files/lets-code-3d_img/2.jpg create mode 100644 content/posts/files/lets-code-3d_img/3.png create mode 100644 content/posts/files/lets-code-3d_img/4.jpg create mode 100644 content/posts/files/lets-code-3d_result.stl create mode 100644 content/posts/files/lets-code-3d_source.scad create mode 100644 content/posts/files/makeup-organizer_img/1.png create mode 100644 content/posts/files/makeup-organizer_img/2.png create mode 100644 content/posts/files/makeup-organizer_img/3.png create mode 100644 content/posts/files/makeup-organizer_organizer.tar.zst create mode 100644 content/posts/files/meshtastic_img/tbeam.jpg create mode 100644 content/posts/files/meshtastic_img/tbeam.webp (limited to 'content/posts') 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-\321\206\320\270\321\204\321\200\320\276\320\262\320\260\321\217-\320\263\320\270\320\263\320\270\320\265\320\275\320\260.md" "b/content/posts/2021-05-13-\321\206\320\270\321\204\321\200\320\276\320\262\320\260\321\217-\320\263\320\270\320\263\320\270\320\265\320\275\320\260.md" new file mode 100644 index 0000000..d9fcede --- /dev/null +++ "b/content/posts/2021-05-13-\321\206\320\270\321\204\321\200\320\276\320\262\320\260\321\217-\320\263\320\270\320\263\320\270\320\265\320\275\320\260.md" @@ -0,0 +1,91 @@ +--- +categories: +- Без рубрики +date: '2021-05-13T15:37:01Z' +tags: +- it +- паранойя +- разное +title: Немного о цифровой гигиене +--- + +## Вступление + +Как раз вступление тут особо и не нужно. Ни для кого не открою америки, что в +современном цифровом обществе все мы являемся товаром для интернет-медиа +гигантов, того же фейсбука да гугла. Не скажу что это для меня, как личности +опасно или вредно, но мне это неприятно. Решил с этим что-то делать. + +## Вводные + +- В интернетах я уже очень давно и много где и как “наследил” своими данными. И + с этим уже ничего не поделать. +- У меня в телефоне и на всех компьютерах куча приложений работающих с + интернетом, и не только мессенджеры. +- У меня достаточно узкий круг людей с кем бы я хотел быть на связи, и не хочу + чтобы мои действия как-то ухудшили или усложнили их жизнь. +- Вопрос анонимности для меня не стоит, я не анонимен и это моё осознанное + решение. Я законопослушный человек и прятаться мне не от кого. И да, я знаю + что этот тезис стараниями либерах нынче пытаются выставить как глупость, но + нет. Глупость — это слушать либерах, а не иметь свою голову на плечах. И + контртезис “Гы гы гы, ну раз тебе нечего скрывать — поставь камеру у себя в + спальне и ванной” даже комментировать не буду в силу его ущербности. +- Я пользователь техники Apple и с этим уже ничего не поделать, менять целиком + экосистему для меня не вариант (это очень дорого, бессмысленно, а местами и + невозможно, например, рабочий мак мне поменять не на что). И да, есть наивная + надежда что у яблок в плане приватности всё получше чем у ведроидов. Во всяком + случае по сравнению со стоком. Гиковские прошивки с вырезанными зондами в + расчет не беру, верю что у них совсем всё хорошо. + +## Цели + +1. Уменьшить информационный шум вокруг себя и тем самым улучшить качество жизни. +2. Уменьшить свой “информационный след” +3. Иметь больше контроля над своими данными, чтобы мои волосы стали мягкими и + шелковистыми. + +## Наброски плана + +1. Перейти максимально на собственные ресурсы, которые я контролирую и которые + *точно* не сливают ничего налево.Примерно так: социалки => + , GitHub => , Облачные + диски => локальный NAS Synology и т.д. +2. Мне надо сократить мессенджеры в идеале до одного, не считая корпоративного + рабочего. Тут всё просто — оставляю Telegram, остальные сношу. +3. Мне надо отказаться от неэтичных социальных сетей, где я не могу полностью + контролировать свои данные. +4. При отказе от социальных сетей чтобы не доставить проблем моим контактам надо + оставить “новый адрес” по которому со мной можно связаться и, например, этот + пост. Я не хочу чтобы для всех мои действия были прозрачны и понятны, а не + “молча удалиться” оставив кого-то в недоумении. +5. Везде где возможно отключить или заблокировать телеметрию, чтобы как можно + меньше моих данных неконтролируемо утекало. Да, полностью не перекрыть, но + сократить возможно. +6. Для связи с “миром” оставить только e-mail как наиболее удобный асинхронный + метод коммуникации. + +## Дальнейшие шаги + +1. Превратить наброски плана в цельный план. Написать манифест? Возможно. +2. Подготовить “визитку” с актуальными контактами и объяснением что произошло. + Причем как в виде изображения, так и текста. +3. Вышеуказанную визитку поместить на уже неактуальных для меня местах обитания + (инстаграм, вк и проч). Удаляться не хочу. Жалко контент за столько лет, да и + пункт 3 предыдущего абзаца. +4. Удалить “лишние” приложения от вышеуказанных сервисов. +5. Разлогиниться в этих сервисах и очистить браузеры от них, чтобы исключить + треккинг на сторонних сайтах. +6. ????? +7. PROFIT! + +## Обратная связь + +Очень бы хотелось получить обратную связь по моему плану. Комментарии про то что +упустил и предложения улучшений приветствуются в комментариях к посту, в +комментариях к [телеграм каналу](https://t.me/neonxp), или на почту + (кстати, стоит наверное и почту перевести к себе? Но пока +уровень сервиса врядли смогу адекватный обеспечить) + +*UPD:* Да, я знаю что уже данные так и останутся в чужих руках, но со временем +они будут всё больше и больше протухать, а мой “цифровой профиль” терять +актуальность. Ведь я не скала, я тоже меняюсь и ухожу от этого профиля. \ No newline at end of file diff --git "a/content/posts/2022-05-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265.md" "b/content/posts/2022-05-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265.md" new file mode 100644 index 0000000..c6721c8 --- /dev/null +++ "b/content/posts/2022-05-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265.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: + + +Сервер физически находится в датацентре в Москве у весьма годного провайдера +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. Для себя я выбрал второй путь, с самоподписанными +сертификатами. Чекнуть как работает можно на зеркале блога на + . Там я выпустил сам себе сертификат на домен от своего +собственного удостоверяющего центра 🙂 А доверять ему или не доверять — дело +посетителей сайта. + +Если доверяете мне то [вот сертификат моего УЦ](/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-\320\277\320\265\321\200\320\265\320\265\320\267\320\264.md" "b/content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264.md" new file mode 100644 index 0000000..c4a17bf --- /dev/null +++ "b/content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264.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-\320\260\321\200\321\205\320\270\320\262.md" "b/content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262.md" new file mode 100644 index 0000000..65a5be8 --- /dev/null +++ "b/content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262.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 дней) — заметка +мне самому пригодится на будущее. + +Началось всё с того, что я с удивлением обнаружил, что на госуслугах теперь +можно выпустить сертификат для домена физлицу.Это меня обрадовало, хотя ранее я +приунывал что нет никакой альтернативы простым смертным. Теперь есть. +Закрывайте буржуйнет. + +Поехали! + +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-\320\262\320\260\320\274-\320\275\320\265-\320\275\321\203\320\266\320\275\321\213-\320\277\321\203\321\210\320\270.md" "b/content/posts/2024-06-01-\320\262\320\260\320\274-\320\275\320\265-\320\275\321\203\320\266\320\275\321\213-\320\277\321\203\321\210\320\270.md" new file mode 100644 index 0000000..4d5960f --- /dev/null +++ "b/content/posts/2024-06-01-\320\262\320\260\320\274-\320\275\320\265-\320\275\321\203\320\266\320\275\321\213-\320\277\321\203\321\210\320\270.md" @@ -0,0 +1,110 @@ +--- +categories: +- Без рубрики +date: '2024-06-01T21:05:55Z' +tags: +- it +- разное +title: Вам не нужны пуши! +--- + +Я не шучу. Серьёзно. + +С неделю назад меня осенила крайне простая мысль, которая ранее, почему-то, мне +не приходила. + + + +Но сначала, две вводных, или, скажем, тезиса, которые послужили для вывода этой +мысли: + +## Тезис №1 + +Меня действительно огорчает количество пушей которые постоянно сыплются мне на +телефон. Это вызывает раздражение сразуна нескольких уровнях: + +1. Сам момент их прихода — я автоматически смотрю на телефон, что же пришло +2. Если я игнорирую пуш — он потом висит в шторке вызывая раздражение +3. Очень часто это сранная реклама от какого-нибудь озона или магнит маркета + (бывш. KazanExpress) + +Но бывают же и полезные пуши! Например, уведомления от Госуслуг или информация +что заказ доставлен ну илисообщения в мессенджерах. + +То есть, как будто, ради вышеуказанных полезных пушей, я должен терпеть и тонну +бесполезного говна! + +## Тезис №2 + +Ну и вторая вводная, которая, какмне кажется подтолкнула меня — я всегда любил +_простые_ и открытые технологии, какдревние, типа RSS, e-mail, irc, так и новые, +но такие же простые и открытые, как, например, gemini (да, сейчас он наэтом +сайте сломан, но я его починю на днях, честно!), федиверс и прочие подобные. +Кстати, сейчас подумалось, что именноэти качества меня и так сильно влюбили в +golang 🙂 + +## Та самая простая мысль + +На стыке двух вышеуказанных тезисов у меня внезапно для себя самого и +синтезировалась крайне простая мысль: + +> **Действительно** важные вещи всегда приходят на электропочту, а +> сообщения в мессенджерах — это не срочно! + +Таким образом, запретив на телефоне вообще все пуши кроме электропочты я +избавился от этого угнетающего информационногошума, оставив только полезный +сигнал. + +-Хей, да на почте же один спам! — скажешь ты мне + +На самом деле, уже давно нет. Я лично использую почту mail.ru (в данном случае, +это не очень важно и относится к любой)и на ней спама как такового уже давно нет +(если думаешь, что это не так, перепроверь, возможно, твои +представленияустарели). При этом, самое великое в этом то, что почта (на самом +деле, не важно, какая именно — mail.ru, yandex или,прости господи, гмейл) +предоставляет гибкие фильтры входящей почты. И потратив буквально пару десятков +минут можносформировать правила, чтобы, например, от того же озона пропускались +только письма со статусом заказа и больше ничего. + +Вот так, древняя технология обычных, старых-добрых, писем позволяет решить +проблему современных назойливых уведомлений! + +При этом, почта не пушит проверять её постоянно! Самое главное её преимущество +для меня — это её ассинхронность, вотличие от мессенджеров. Можно отключить от +нее уведомления тоже, но завести себе правило, что раз в Н времени выделятьвремя +на ее проверку. Самое главное — делать это в _комфортное для себя_ время. + +## Так же как и на мессенджеры, кстати! + +Выше я уже сказал, что мессенджеры — это не срочно. Ничего страшного не +случится, если я отвечу через час-два-три иливообще вечером. Если будет что-то +_действительно_ срочное — мне можно и позвонить. Но, к счастью, мне повезло, что +мояжизнь достаточно спокойная и _действительно_ срочное почти не случается. +Отрефлексируй, уважаемый читатель, насколько*действительно* срочные и важные +вопросы, которые ты таковыми считаешь и которыми ежедневно дёргают тебя? И +ответь себечестно, мир бы разрушился, если бы ты их отложил на комфортное для +_себя_, а не других время? + +Такой эксперимент я ставлю на себе уже неделю. Я практически не захожу в +мессенджеры, всё действительно важное мнеприходит на почту, лишней рекламы я не +вижу, нет никакого информационного шума, который буквально стал +бичомсовременности. + +## Вывод за неделю + +Моё внутреннее состояние ощущается как очень спокойное и, главное, комфортное. Я +чувствую полный контроль над тем, чтои когда я потребляю и нет никакого +информационного насилия, как его называет +[Столяров](http://stolyarov.info/)(хоть мне этот персонаж и кажется чрезвычайно +радикальным и оттого отталкивающим, но что-то в его словах таки есть). + +Считаю, что эксперимент оказался удачным, и я его продолжу! + +## Пишите письма! + +Напомню раз пришлось к слову, пожалуй, свою электропочту: или + обе почты абсолютноравноценны, писать можно на любую. +Очевидно из поста, что молниеносный ответ я не гарантирую, но, сам факт ответа +вобозримое время гарантирован! + +73! diff --git "a/content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-1.md" "b/content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-1.md" new file mode 100644 index 0000000..0173245 --- /dev/null +++ "b/content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-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://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://yandex.ru/support/id/authorization/app-passwords.html)). + +Но почему же стоит поднять свой сервер? Ну хотя бы для того, чтобы иметь +возможность спокойно публиковать заметки, например, вот так: +. + +Или возможность совместной работы, например, со своей парой над общим списком +покупок. + +~~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-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260.md" "b/content/posts/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260.md" new file mode 100644 index 0000000..cc9ba60 --- /dev/null +++ "b/content/posts/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260.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-\320\272\320\275\320\270\320\263\320\270-2.md" "b/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2.md" new file mode 100644 index 0000000..96cafc7 --- /dev/null +++ "b/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-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) +- В виде аудиокниги: +- Если надо — могу выложить по запросу в формате 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. + + + +## Основные функции и преимущества + +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: Гиперлокальность +--- + +Это очередной пост моих пространных рассуждений про тенденции и будущее +интернета, которых в последнее время становится как-то многовато. Вероятно, в +последствии, это станет даже серией постов. + +Этот же я воспринимаю, как вводный в лор гиперлокальности. + +Сначала, пожалуй, расскажу про посылки, а потом уже о том, куда они ведут, и +какие из этого можно сделать выводы. + +## Посылка + +Думаю, все мы заметили как много вокруг стало ИИ инструментов. Сейчас ИИ на +хайпе и его засовывают буквально куда можно и куда нельзя. Само по себе меня это +не беспокоит. Я отношусь к ИИ как к просто очередному инструменту, который можно +и нужно использовать там, где он применим. С этим нет проблем. Пройдёт какое-то +время и ИИ инструменты займут ниши, где они наиболее уместны и где от них +наибольшая польза. Однако тут есть и негативный нюанс. Этот инструмент будет +способствовать в том числе и тому, что интернет станет (если ещё не стал!) по +сути своей «мёртвым». Не мёртвым буквально, а «мёртвым» в том же смысле, в +котором в «Руководстве путешествующего автостопом по галактики» Д. Адамса была +вселенная обозначена необитаемой. + +> Вселенная — кое-какая информация, облегчающая существование в ней. +> +> <...> +> +> 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 лет. + + + +Сейчас давно уже не играю, но многие мои нынешние увлечения берут начало именно +оттуда. Например, самый очевидный пример — интерес к картографии и ГИСам +(геоинформационным системам), поскольку для «Дозоров» они были неотъемлемой +частью. Также сюда относится и то, что я хорошо ориентируюсь в своем городе и +немного интересуюсь его историей. + +Кроме того, можно проследить интерес к радиоэлектронике: пару раз, когда с +командой организовывали игры, я придумывал задания, основанные на простых +электронных устройствах, собранных на микроконтроллерах. + +Туда же и любовь к исключительно ноутбукам, да и вообще переносной, что важно, +технике. Теплое отношение к простым, надёжным, нетребовательным технологиям. Это +всё оттуда же! + +Любовь к программированию у меня возникла чуть раньше, поэтому её связать с +этими играми я не могу. Здесь, скорее случилось наоборот. И я не менее трех раз +даже порывался писать собственный «движок» для НПИ. Но, пока ни разу не успешно. +Вероятно, меня здесь привлекает процесс, а не результат. Так что, последний мой +заход хоть и является вполне себе функционально законченным, но для его развития +времени я не выкраиваю, к сожалению. + +Что-то еще было, но я не успел записать, и теперь забыл. Вывод: не стоит давать +остывать размышлениям дольше суток, а писать сразу 🙂 \ 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) + +Это практика, когда изначально любой материал публикуется на полностью +подконтрольном собственном сайте, а только затем переразмещаяется на всякие +социальные сети, типа ВК, Телеги и прочих Мастодонов. + + + +## Почему это важно? + +* Во-первых, **платформы ненадежны**. Любая платформа в любой момент может + сделать что угодно с вашим контентом, или закрыться. +* Во-вторых, **право собственности**. Не секрет, что у платформ весьма вольное + представление об авторском праве на материалы размещаемые пользователями. С + одной стороны, у них неограниченное право распоряжения контентом для любых + целей, а с другой никакой ответственности за содержание контента. Не слишком + ли кучеряво? А следуя 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** — собственно, жесткий диск моего микросервера +* **Корпус с активным охлаждением** — не самое необходимое, но хотелось, чтобы + выглядело красиво + + + +## Программное обеспечение + +По сути, на первом уровне, установлены 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: С Новым Годом! +--- + +Ну что же, друзья, с наступающим! + +В этот день принято подводить итоги года. Ну и я подведу немного: + +- Поступил в институт брака. Раз уж нет классического высшего, что ещё остаётся то ;) +- В аккурат под конец года разрешились проблемы на работе. Причем разрешились + настолько удачно, что я почти что жду окончания новогоднего отпуска, чтобы + скорее начались трудовыебудни. +- Стал активно вести блог. Но всё равно не оставляет подспудное ощущение, что + уже стал надоедать этим тем, кто подписан. После каждого поста жду что кто-то + да отпишется :) Но мне нравится его вести, так что, уже не остановлюсь :) +- Ездили с новоиспеченной супругой на Кавказ. Самое яркое — посетили + обсерваторию в Нижнем Архызе. Под впечатлением, купили по приезду настоящий + телескоп! +- Начали строить свой домик в деревне. Но пока ещё до заселения далеко, вот + только окна поставили. + +Под катом приложу фоточки наиболее ярких моментов, пожалуй. + + + +* Институт брака + ![Институт брака](/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: Табы или пробелы? +--- + +Так получилось, что с Нового Года я ничего в блог не писал. Тому причина в +личной загруженности, и в не менее личной лени. Так же я делал некоторые +эксперименты над самим блогом, потому что моё внутреннее чувство прекрасного не +даёт мне просто остановиться и не трогать то, что работает. + +Но всё же, я чувствую внутреннюю потребность написать небольшую заметку с +размышлениями, которые недавно приходили ко мне в голову. + +А связаны они с тем, что есть определённые догмы в индустрии, которые непонятно +(ну или понятно) почему появились, и которым слепо следуют, хотя, как будто они +уже не имеют смысла. + + + +## Вечный спор + +Для затравки, «вечный спор» табы или пробелы использовать в коде для отсутпов. +Лично для меня здесь не то что выбор очевиден, для меня очевидно, что и самого +выбора то нет. Конечно же, только табы! Отступ пробелами просто не имеет права +на жизнь, и вот почему: + +* Во-первых, это просто какой-то костыль, использовать пробел не по назначению. + Наверное, не очень очевидно, но назначение пробела — это именно разделение + слов. Невероятно! А наначение таба — как раз таки форматирование отступа. + Давайте использовать инструменты по назначению! +* Во-вторых, и самое главное, как по мне, это гибкость табуляции. Я, как + читающий код, волен сам выбирать размер отступа. Например, если у меня узкий + экран (смартфон, например) — я выберу отступ в 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 хуки +на форматирование в принятый в команде формат? Возможно да. Иначе получится, что +борясь за личную свободу — нарушаешь чужую свободу писать говнокод. + +А .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 в последнее время. Если выйдет что интересное - напишу об этом. + +А пока хотел написать вот о чём. + +Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам +с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло +время и мне его описать. + + + +- [Ноутбук](/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). + + + +Базово, как это выглядит при использовании: + +У каждого участника сети есть небольшое портативное радиоустройство (готовое или +самодельное - не важно), прошитое специальной прошивкой. К устройству, чаще +всего (но необязательно!) подключен смартфон со специальным одноимённым +приложением. Устройство ищет и старается подключиться к другим подобным +устройствам, а со смартфона можно писать как в публичные, так и в приватные +каналы. Но только текстом, т.к. скорость исчисляется байтами в секунду. При +этом, хоть и радиус каждого устройства достаточно небольшой, но засчёт ячеистой +топологии можно передавать сообщения не только тем, кто в радиусе приёма, но и +тем, кого напрямую устройство «не видит», зато видят соседи или соседи соседей +(в среднем, не больше 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 принтере, который есть +у меня на хозяйстве. + + + +![Бокорез и родной колпачок](/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), обмерил штангенциркулем +оригинальный колпачок и пошёл проектировать программировать. На всё +про всё у меня ушло где-то с полчаса. И у меня получилась первая версия +колпачка. Максимально простая и дубовая. Первая куцая версия: + +![Колпачок 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: Ещё немного печати +--- + +Я продолжаю погружаться в печать не просто готовых моделей из интернета, что не +очень интересно, но так же и в проектирование и печать собственных изделий. +Сегодня моя любимая супруга попросила напечатать ей органайзер для косметики. +Показала референс, какой она хочет. ТЗ понятное, размеры подобрали, осталось +дело за малым — непосредственно запрограммировать изделие. + + + +На практике, это пока самое сложное по детализации изделие из всех, что я делал. +Код получился кривоватым, но рисует то, что нужно. + +Вот так результат в редакторе: + +![результат в редакторе](/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) + + + +[Место на +карте](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/Нижне-Архызское_городище), где находятся +руины храмов и других построек 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: Размышления о будущем ИИ +--- + +Немного моих размышлений про будущее ИИ как технологии, а не философии. + +Как водится, когда речь о размышлениях — буду сначала вводить тезисы, а потом, +синтез. + + + +# Тезис первый + +Хоть сам и не пользуюсь таким инструментом, как 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. + + + +А раз изменения настолько кардинальные — не грешно и дать проекту новое имя. +Встречайте: [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) + + + +Понятием "душа в машине" - 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: Деплой блога +--- + +А ещё, я решил поделиться тем как я пишу в блог. Потому что, почему бы и нет. + + + +Во-первых, у меня есть такой вот 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/) произошли достаточно серьезные изменения. + + + +Я перешёл таки с 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 скриптами. + +У меня только один вопрос. А почему я сам-то так сначала не сделал? Это же +буквально на поверхности! + +Штош, бывает, затупил. Да и привык для всех гвоздей использовать этот молоток. + + + +Обновлённые скрипты: + +~/.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 < + +Сейчас у меня основная железка на хозяйстве это 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 длительностью в десяток секунд + окончательно отбил у меня желание вовсе запускать его. + +Что же делать? Искать идеальный для себя инструмент? Идеального для _себя_ +точно не найду. Написать самому, ведь «яжпрограммист»? Можно, но откровенно +жаль время. Что же делать-то? + + + +К счастью, я вспомнил что у меня же 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, если +говорить конкретнее, но это уже душнилово. + + + +Но это не сильно то печаль. Интернет, всё равно, для большинства уже скукожился +до двух десятков «сервисов». А для энтузиастов будут «свободные» браузеры, +свободные не только с точки зрения кода, но и политики стран НАТО. + +К счастью, у нас есть Librewolf, Palemoon, Dilo, да Lynx наконец. Без +интернета (окей, WWW) не останемся. + +Так же можно рассмотреть и альтернативные технологии типа gopher, gemini. Но +это, как-нибудь, в другой раз. А пока запасаемся попкорном и смотрим как горит +мир интернет. 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: Про здоровые и нездоровые технологии +--- + +Я заметил, что часто стал в речи употреблять словосочетания «здоровая +технология» или «нездоровая технология». Но при этом, я не задумывался о том, а +что же именно это для меня значит, и как определить что есть здоровая, а что +нездоровая технология. Я классифицировал исключительно интуитивно, исходя из +принципа «я так чувствую». + +Но раз есть классификация, то должны быть и критерии. Так? Так. И критерии я +опираясь на собственное ощущение, вроде как, нашёл. + + + +# Критерии + +Не буду сильно уходить в сторону, для меня основные критерий «здоровости» — то, +предполагает ли технология сохранение у пользователя контроля над ней. Даже +можно сказать более витиевато — превращает ли технология пользователя в +потребителя? + +Это был первый критерий. И он же главный. Из него вытекают уже такие критерии +как потенциальная познаваемость, ремонтопригодность, и даже, внезапно, +надёжность и долговечность. + +# Примеры + +Пройдёмся немного по примерам. Начнём с «нездоровых» технологий и конкретных +примеров. + +## Трактора 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 + +Мне нужно пояснять? Думаю, нет. Хорошо хоть что железо у них достойное и +достаточно надёжное, насколько я могу судить. Это хоть как-то оправдывает их +право на существование. + +## Проприетарный софт + +Тоже в пояснениях не нуждается. Хуже только прориетарный софт от амеров. + +## <что-то> по подписке + +Как бы не было это удобно, но подписочная модель, по определению ставит +пользователя раком в позу бесправного потребителя. И не надо мне +писать про удобство игр, фильмов, музыки, книг «по подписке». Нет, это никогда +не будет хорошим выбором. Никогда. А впрочем, я не склонен осуждать тех кто этим +пользуется, если человек отдаёт себе отчёт в том что с одной стороны он ничем не +владеет, а с другой стороны он во власти капиталистических свиней, которые и +деньги за подписку возьмут и личные данные куда надо продадут. Тут уж каждый сам +решает, или смотреть условный нетфликс пока ему добрый дядя разрешает, или +покупать тоже самое с чуть меньшим удобством на _зелённом нетфликсе_. + +# А что делать-то? + +На самом деле, решение то весьма простое: нужно более сознательно подходить к +выбору как софта, так и железа. Нужно стараться отвечать себе на вопрос «А что я +буду делать, если производитель или поставщик вдруг исчезнет или решит, что не +хочет иметь со мной дел?». В общем случае нужно выбирать то, что ремонтопригодно +(а в случае софта — свободно), имеет в свободном доступе исчерпывающие +документации и руководства, а так же независимых поставщиков запасных деталей и +сервисного обслуживания. Так же, в идеале, если нет возможности вообще не +зависеть от вендора, то выбирать всегда локального, то есть российского или, на +худой конец, из дружественных стран типа РБ или КНР. Конечно, это не защитит от +рисков что вендор исчезнет и оставит нас без поддержки, но сильно их сократит. +Но опять же, это если без вендора ну совсем никак. И самое худшее что можно +сделать — довериться вендорам стран НАТО. В этом случае это хорошая заявка на +премию Дарвина, не иначе. + +Нужны примеры? Их есть у меня, даже из личного опыта: + +- Мой МФУ купленный сто лет назад до сих пор служит мне верой и правдой, потому + что в своё время я озаботился тем, чтобы выбрать модель, которая выпущена + ровно до конкретной даты и поддерживает неоригинальные картриджи, которые + стоят три копейки и даже поддерживают самостоятельную засыпку тонера. А + ремонтопригодность у него такая, что я буквально могу починить его или сам, + или в ремонтной мастерской в моём доме. +- Автомобиль. Мой автомобиль, конечно, технически сложное устройство и сам я в + нём мало что починю. Но он и не настолько технически сложный, чтобы его не + починили в произвольном, даже неавторизованном, сервисном центре. При этом, у + него нет никакой зависимости от «облаков» и он полностью автономен в этом + отношении и не зависит от воли производителя. А насколько мне известно, в + стране более чем достаточно запасных частей и узлов для него. Так что, + длительная эксплуатация не будет проблемой. Тем более уже более семи лет + автомобилю и за это время он показал себя только с лучшей стороны. +- Все художественные книги у меня в формате 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? +--- + +Я действительно очень люблю старую-добрую электронную почту. И вот почему. + + + +Во-первых, как и всё, что делалось в раннее время Интернета — 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. на фотку можно кликнуть, тогда она откроется в большем размере. + + + +## Покупочки + +[![Покупки](/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°, но +продрогли сильно, т.к. гулять изначально не планировали и не были одеты +соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :) + +Как водится, дальше будет немного фотографий :) + + + +[![Прогулка](/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/) делать не буду. Честно +говоря, нет особо моральных сил на это. + + + +Уходящий год для меня стал годом чередования работы и семейных забот. В целом, +всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем +желаю! + +А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды +обходили ваш дом стороной. + +А пока, отправляюсь резать салатики и заниматься прочими домашними заботами, не +всё же у компьютера сидеть :) 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. + +Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы +его можно было запустить без конфигурации, с минимальными усилиями на любой +«картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей +в одной локальной сети (хотя может работать и по интернету). + +Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны +:) + + + +Приглашаю забежать на огонёк, если умеете пользоваться 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 Binary files /dev/null and b/content/posts/files/2021-02-13-jsonnet_logo.webp 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 Binary files /dev/null and b/content/posts/files/2024-07-13-joplin_joplin.webp differ diff --git "a/content/posts/files/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260_bash_org.webp" "b/content/posts/files/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260_bash_org.webp" new file mode 100644 index 0000000..e142633 Binary files /dev/null and "b/content/posts/files/2024-10-06-\321\206\320\270\321\202\320\260\321\202\320\275\320\270\320\272-\321\200\321\203\320\275\320\265\321\202\320\260_bash_org.webp" differ diff --git "a/content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" "b/content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" new file mode 100644 index 0000000..b4d9ce9 Binary files /dev/null and "b/content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" 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 Binary files /dev/null and b/content/posts/files/2024-11-17-obsidian_img/logo.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-17-obsidian_img/publish.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-17-obsidian_img/templater.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-27-hyperlocality_img/90e.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-27-hyperlocality_img/braindance.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-27-hyperlocality_img/camp.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp 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 Binary files /dev/null and b/content/posts/files/2024-11-29-hobbies_dozor.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-12-guessr_logo.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-15-conditional-operator-go_ternary.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-15-posse_posse.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-17-infra_cover.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-30-irc_logo.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/1.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/2.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/2025.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/3.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/4.webp 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 Binary files /dev/null and b/content/posts/files/2024-12-31-new-year_img/5.webp 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 Binary files /dev/null and b/content/posts/files/2025-12-21-img1.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-21-img2.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-21-img3.png 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 Binary files /dev/null and b/content/posts/files/2025-12-21-sicktech.png 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_1.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_10.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_11.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_12.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_13.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_14.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_2.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_3.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_4.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_5.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_6.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_7.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_8.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/photo_9.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg 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 Binary files /dev/null and b/content/posts/files/2025-12-29-newyear-excel_img/cover.png 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 Binary files /dev/null and b/content/posts/files/2025-12-29-newyear-excel_img/cover1.png 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 Binary files /dev/null and b/content/posts/files/2025-12-29-newyear-excel_img/new_year.ods 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 Binary files /dev/null and b/content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/1.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/10.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/11.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/12.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/13.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/14.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/15.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/16.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/17.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/18.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/19.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/2.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/20.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/21.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/22.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/23.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/3.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/4.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/5.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/6.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/7.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/8.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/9.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_1.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_10.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_11.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_12.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_13.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_14.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_15.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_16.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_17.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_18.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_19.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_2.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_20.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_21.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_22.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_23.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_3.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_4.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_5.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_6.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_7.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_8.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/preview_9.webp 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 Binary files /dev/null and b/content/posts/files/2025-travel-1_img/saologo.png differ diff --git a/content/posts/files/hype_curve.png b/content/posts/files/hype_curve.png new file mode 100644 index 0000000..9147d5e Binary files /dev/null and b/content/posts/files/hype_curve.png differ diff --git a/content/posts/files/laughing-man.jpeg b/content/posts/files/laughing-man.jpeg new file mode 100644 index 0000000..652603c Binary files /dev/null and b/content/posts/files/laughing-man.jpeg 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 Binary files /dev/null and b/content/posts/files/lets-code-3d_img/1.jpg 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 Binary files /dev/null and b/content/posts/files/lets-code-3d_img/2.jpg 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 Binary files /dev/null and b/content/posts/files/lets-code-3d_img/3.png 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 Binary files /dev/null and b/content/posts/files/lets-code-3d_img/4.jpg 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 Binary files /dev/null and b/content/posts/files/lets-code-3d_result.stl 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 Binary files /dev/null and b/content/posts/files/makeup-organizer_img/1.png 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 Binary files /dev/null and b/content/posts/files/makeup-organizer_img/2.png 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 Binary files /dev/null and b/content/posts/files/makeup-organizer_img/3.png 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 Binary files /dev/null and b/content/posts/files/makeup-organizer_organizer.tar.zst 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 Binary files /dev/null and b/content/posts/files/meshtastic_img/tbeam.jpg 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 Binary files /dev/null and b/content/posts/files/meshtastic_img/tbeam.webp differ -- cgit v1.2.3