From bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Mon, 2 Feb 2026 00:35:54 +0300 Subject: =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=B0=D1=8F=20=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=B1=D0=BB=D0=BE=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/pages/_index.md | 1 - content/posts/2021-02-13-jsonnet.md | 92 ----- content/posts/2021-02-13-jsonnet/index.md | 94 +++++ content/posts/2021-02-13-jsonnet/jsonnet_logo.webp | Bin 0 -> 47006 bytes ...270\320\263\320\270\320\265\320\275\320\260.md" | 91 ----- .../index.md" | 91 +++++ ...266\320\264\320\265\320\275\320\270\320\265.md" | 27 -- .../index.md" | 27 ++ content/posts/2022-05-31-golang-1.md | 44 --- content/posts/2022-05-31-golang-1/index.md | 44 +++ content/posts/2023-01-12-gitrepo.md | 167 --------- content/posts/2023-01-12-gitrepo/index.md | 166 +++++++++ content/posts/2023-05-26-gist.md | 19 - content/posts/2023-05-26-gist/index.md | 18 + content/posts/2023-07-24-tls.md | 85 ----- content/posts/2023-07-24-tls/index.md | 79 ++++ ...265\321\200\320\265\320\265\320\267\320\264.md" | 28 -- .../index.md" | 28 ++ ...03-\320\260\321\200\321\205\320\270\320\262.md" | 14 - .../index.md" | 14 + content/posts/2024-02-21-tls.md | 54 --- content/posts/2024-02-21-tls/index.md | 54 +++ ...75\321\213-\320\277\321\203\321\210\320\270.md" | 110 ------ .../index.md" | 110 ++++++ ...-\320\272\320\275\320\270\320\263\320\270-1.md" | 21 -- .../index.md" | 21 ++ content/posts/2024-07-13-joplin.md | 43 --- content/posts/2024-07-13-joplin/index.md | 45 +++ content/posts/2024-07-13-joplin/joplin.webp | Bin 0 -> 111506 bytes content/posts/2024-07-21-bbs.md | 33 -- content/posts/2024-07-21-bbs/index.md | 33 ++ content/posts/2024-09-26-hugo-wordpress.md | 16 - content/posts/2024-09-26-hugo-wordpress/index.md | 16 + ...200\321\203\320\275\320\265\321\202\320\260.md" | 64 ---- .../index.md" | 64 ++++ ...\320\275\320\265\321\202\320\260_bash_org.webp" | Bin 0 -> 20774 bytes ...-\320\272\320\275\320\270\320\263\320\270-2.md" | 39 -- .../Rama16wiki.webp" | Bin 0 -> 44726 bytes .../index.md" | 39 ++ content/posts/2024-11-15-hugo.md | 19 - content/posts/2024-11-15-hugo/index.md | 19 + content/posts/2024-11-17-obsidian.md | 240 ------------- content/posts/2024-11-17-obsidian/index.md | 240 +++++++++++++ content/posts/2024-11-17-obsidian/logo.webp | Bin 0 -> 9244 bytes content/posts/2024-11-17-obsidian/publish.webp | Bin 0 -> 23110 bytes content/posts/2024-11-17-obsidian/templater.webp | Bin 0 -> 17140 bytes content/posts/2024-11-27-hyperlocality.md | 182 ---------- content/posts/2024-11-27-hyperlocality/90e.webp | Bin 0 -> 71910 bytes .../posts/2024-11-27-hyperlocality/braindance.webp | Bin 0 -> 92740 bytes content/posts/2024-11-27-hyperlocality/camp.webp | Bin 0 -> 115704 bytes .../2024-11-27-hyperlocality/in-internet.webp | Bin 0 -> 136578 bytes content/posts/2024-11-27-hyperlocality/index.md | 184 ++++++++++ content/posts/2024-11-29-hobbies.md | 44 --- .../posts/2024-11-29-hobbies/hobbies_dozor.webp | Bin 0 -> 101246 bytes content/posts/2024-11-29-hobbies/index.md | 44 +++ content/posts/2024-12-12-guessr.md | 130 ------- content/posts/2024-12-12-guessr/guessr_logo.webp | Bin 0 -> 112508 bytes content/posts/2024-12-12-guessr/index.md | 134 +++++++ .../posts/2024-12-15-conditional-operator-go.md | 35 -- .../conditional-operator-go_ternary.webp | Bin 0 -> 7408 bytes .../2024-12-15-conditional-operator-go/index.md | 35 ++ content/posts/2024-12-15-posse.md | 81 ----- content/posts/2024-12-15-posse/index.md | 81 +++++ content/posts/2024-12-15-posse/posse_posse.webp | Bin 0 -> 60800 bytes content/posts/2024-12-17-infra.md | 120 ------- content/posts/2024-12-17-infra/index.md | 119 ++++++ content/posts/2024-12-17-infra/infra_cover.webp | Bin 0 -> 532556 bytes content/posts/2024-12-30-irc.md | 75 ---- content/posts/2024-12-30-irc/index.md | 75 ++++ content/posts/2024-12-30-irc/irc_logo.webp | Bin 0 -> 10130 bytes content/posts/2024-12-31-new-year.md | 50 --- content/posts/2024-12-31-new-year/img/1.webp | Bin 0 -> 141164 bytes content/posts/2024-12-31-new-year/img/2.webp | Bin 0 -> 212740 bytes content/posts/2024-12-31-new-year/img/2025.webp | Bin 0 -> 163920 bytes content/posts/2024-12-31-new-year/img/3.webp | Bin 0 -> 446502 bytes content/posts/2024-12-31-new-year/img/4.webp | Bin 0 -> 146032 bytes content/posts/2024-12-31-new-year/img/5.webp | Bin 0 -> 190524 bytes content/posts/2024-12-31-new-year/index.md | 52 +++ content/posts/2025-04-05-tabs-or-spaces.md | 400 --------------------- content/posts/2025-04-05-tabs-or-spaces/index.md | 398 ++++++++++++++++++++ content/posts/2025-05-19-nxpcms-2.md | 19 - content/posts/2025-05-19-nxpcms-2/index.md | 19 + content/posts/2025-05-19-nxpcms.md | 77 ---- content/posts/2025-05-19-nxpcms/index.md | 84 +++++ content/posts/2025-06-08-my-setup.md | 31 -- content/posts/2025-06-08-my-setup/index.md | 20 ++ content/posts/2025-08-02-meshtastic.md | 66 ---- content/posts/2025-08-02-meshtastic/index.md | 66 ++++ content/posts/2025-08-02-meshtastic/tbeam.jpg | Bin 0 -> 269445 bytes content/posts/2025-08-02-meshtastic/tbeam.webp | Bin 0 -> 116662 bytes content/posts/2025-08-05-lets-code-3d.md | 154 -------- content/posts/2025-08-05-lets-code-3d/1.jpg | Bin 0 -> 86020 bytes content/posts/2025-08-05-lets-code-3d/2.jpg | Bin 0 -> 58451 bytes content/posts/2025-08-05-lets-code-3d/3.png | Bin 0 -> 108360 bytes content/posts/2025-08-05-lets-code-3d/4.jpg | Bin 0 -> 75461 bytes content/posts/2025-08-05-lets-code-3d/index.md | 154 ++++++++ .../lets-code-3d_result.stl | Bin 0 -> 3684 bytes .../lets-code-3d_source.scad | 66 ++++ content/posts/2025-08-09-makeup-organizer.md | 38 -- content/posts/2025-08-09-makeup-organizer/1.png | Bin 0 -> 180919 bytes content/posts/2025-08-09-makeup-organizer/2.png | Bin 0 -> 354046 bytes content/posts/2025-08-09-makeup-organizer/3.png | Bin 0 -> 115406 bytes content/posts/2025-08-09-makeup-organizer/index.md | 38 ++ .../makeup-organizer_organizer.tar.zst | Bin 0 -> 660078 bytes content/posts/2025-09-01-travel-1.md | 142 -------- content/posts/2025-09-01-travel-1/1.webp | Bin 0 -> 1307382 bytes content/posts/2025-09-01-travel-1/10.webp | Bin 0 -> 1024096 bytes content/posts/2025-09-01-travel-1/11.webp | Bin 0 -> 1031876 bytes content/posts/2025-09-01-travel-1/12.webp | Bin 0 -> 373748 bytes content/posts/2025-09-01-travel-1/13.webp | Bin 0 -> 574476 bytes content/posts/2025-09-01-travel-1/14.webp | Bin 0 -> 385098 bytes content/posts/2025-09-01-travel-1/15.webp | Bin 0 -> 381654 bytes content/posts/2025-09-01-travel-1/16.webp | Bin 0 -> 2601414 bytes content/posts/2025-09-01-travel-1/17.webp | Bin 0 -> 3254752 bytes content/posts/2025-09-01-travel-1/18.webp | Bin 0 -> 1640240 bytes content/posts/2025-09-01-travel-1/19.webp | Bin 0 -> 2578076 bytes content/posts/2025-09-01-travel-1/2.webp | Bin 0 -> 1660606 bytes content/posts/2025-09-01-travel-1/20.webp | Bin 0 -> 3858586 bytes content/posts/2025-09-01-travel-1/21.webp | Bin 0 -> 4400828 bytes content/posts/2025-09-01-travel-1/22.webp | Bin 0 -> 2109710 bytes content/posts/2025-09-01-travel-1/23.webp | Bin 0 -> 988944 bytes content/posts/2025-09-01-travel-1/3.webp | Bin 0 -> 5237948 bytes content/posts/2025-09-01-travel-1/4.webp | Bin 0 -> 1403370 bytes content/posts/2025-09-01-travel-1/5.webp | Bin 0 -> 1424414 bytes content/posts/2025-09-01-travel-1/6.webp | Bin 0 -> 1129282 bytes content/posts/2025-09-01-travel-1/7.webp | Bin 0 -> 1178630 bytes content/posts/2025-09-01-travel-1/8.webp | Bin 0 -> 4411964 bytes content/posts/2025-09-01-travel-1/9.webp | Bin 0 -> 755094 bytes content/posts/2025-09-01-travel-1/index.md | 142 ++++++++ content/posts/2025-09-01-travel-1/preview_1.webp | Bin 0 -> 68140 bytes content/posts/2025-09-01-travel-1/preview_10.webp | Bin 0 -> 119806 bytes content/posts/2025-09-01-travel-1/preview_11.webp | Bin 0 -> 114776 bytes content/posts/2025-09-01-travel-1/preview_12.webp | Bin 0 -> 27904 bytes content/posts/2025-09-01-travel-1/preview_13.webp | Bin 0 -> 36594 bytes content/posts/2025-09-01-travel-1/preview_14.webp | Bin 0 -> 29198 bytes content/posts/2025-09-01-travel-1/preview_15.webp | Bin 0 -> 30840 bytes content/posts/2025-09-01-travel-1/preview_16.webp | Bin 0 -> 83166 bytes content/posts/2025-09-01-travel-1/preview_17.webp | Bin 0 -> 154656 bytes content/posts/2025-09-01-travel-1/preview_18.webp | Bin 0 -> 99452 bytes content/posts/2025-09-01-travel-1/preview_19.webp | Bin 0 -> 94816 bytes content/posts/2025-09-01-travel-1/preview_2.webp | Bin 0 -> 49558 bytes content/posts/2025-09-01-travel-1/preview_20.webp | Bin 0 -> 144248 bytes content/posts/2025-09-01-travel-1/preview_21.webp | Bin 0 -> 179974 bytes content/posts/2025-09-01-travel-1/preview_22.webp | Bin 0 -> 56148 bytes content/posts/2025-09-01-travel-1/preview_23.webp | Bin 0 -> 64300 bytes content/posts/2025-09-01-travel-1/preview_3.webp | Bin 0 -> 162906 bytes content/posts/2025-09-01-travel-1/preview_4.webp | Bin 0 -> 45526 bytes content/posts/2025-09-01-travel-1/preview_5.webp | Bin 0 -> 48660 bytes content/posts/2025-09-01-travel-1/preview_6.webp | Bin 0 -> 52192 bytes content/posts/2025-09-01-travel-1/preview_7.webp | Bin 0 -> 44236 bytes content/posts/2025-09-01-travel-1/preview_8.webp | Bin 0 -> 110076 bytes content/posts/2025-09-01-travel-1/preview_9.webp | Bin 0 -> 83176 bytes content/posts/2025-09-01-travel-1/saologo.png | Bin 0 -> 20791 bytes content/posts/2025-10-06-ai.md | 124 ------- content/posts/2025-10-06-ai/hype_curve.png | Bin 0 -> 130810 bytes content/posts/2025-10-06-ai/index.md | 124 +++++++ content/posts/2025-10-11-blog.md | 32 -- content/posts/2025-10-11-blog/index.md | 32 ++ .../posts/2025-10-18-the-ghost-in-the-machine.md | 184 ---------- .../2025-10-18-the-ghost-in-the-machine/index.md | 184 ++++++++++ .../laughing-man.jpeg | Bin 0 -> 234679 bytes content/posts/2025-11-03-blog-deploy.md | 46 --- content/posts/2025-11-03-blog-deploy/index.md | 46 +++ content/posts/2025-11-03-my-setup.md | 21 -- content/posts/2025-11-03-my-setup/index.md | 31 ++ content/posts/2025-11-04-blog-deploy-2.md | 50 --- content/posts/2025-11-04-blog-deploy-2/index.md | 50 +++ content/posts/2025-11-09-migration.md | 55 --- content/posts/2025-11-09-migration/index.md | 55 +++ content/posts/2025-11-23-org.md | 253 ------------- content/posts/2025-11-23-org/index.md | 253 +++++++++++++ content/posts/2025-12-02-httpsocalypse.md | 31 -- content/posts/2025-12-02-httpsocalypse/index.md | 31 ++ content/posts/2025-12-21-sicktech.md | 228 ------------ content/posts/2025-12-21-sicktech/files/img1.jpg | Bin 0 -> 162511 bytes content/posts/2025-12-21-sicktech/files/img2.jpg | Bin 0 -> 88801 bytes content/posts/2025-12-21-sicktech/files/img3.png | Bin 0 -> 340974 bytes .../posts/2025-12-21-sicktech/files/sicktech.png | Bin 0 -> 263578 bytes content/posts/2025-12-21-sicktech/index.md | 228 ++++++++++++ content/posts/2025-12-23-comments.md | 12 - content/posts/2025-12-23-comments/index.md | 12 + content/posts/2025-12-24-email.md | 99 ----- content/posts/2025-12-24-email/index.md | 99 +++++ content/posts/2025-12-27-osm.md | 40 --- content/posts/2025-12-27-osm/files/photo.jpg | Bin 0 -> 11353 bytes content/posts/2025-12-27-osm/files/photo_1.jpg | Bin 0 -> 14146 bytes content/posts/2025-12-27-osm/files/photo_10.jpg | Bin 0 -> 9230 bytes content/posts/2025-12-27-osm/files/photo_11.jpg | Bin 0 -> 10581 bytes content/posts/2025-12-27-osm/files/photo_12.jpg | Bin 0 -> 13124 bytes content/posts/2025-12-27-osm/files/photo_13.jpg | Bin 0 -> 14557 bytes content/posts/2025-12-27-osm/files/photo_14.jpg | Bin 0 -> 15019 bytes content/posts/2025-12-27-osm/files/photo_2.jpg | Bin 0 -> 15041 bytes content/posts/2025-12-27-osm/files/photo_3.jpg | Bin 0 -> 15339 bytes content/posts/2025-12-27-osm/files/photo_4.jpg | Bin 0 -> 14214 bytes content/posts/2025-12-27-osm/files/photo_5.jpg | Bin 0 -> 12279 bytes content/posts/2025-12-27-osm/files/photo_6.jpg | Bin 0 -> 10936 bytes content/posts/2025-12-27-osm/files/photo_7.jpg | Bin 0 -> 15840 bytes content/posts/2025-12-27-osm/files/photo_8.jpg | Bin 0 -> 11695 bytes content/posts/2025-12-27-osm/files/photo_9.jpg | Bin 0 -> 15837 bytes content/posts/2025-12-27-osm/index.md | 40 +++ content/posts/2025-12-28-philharmonic-park.md | 32 -- .../files/photo_19_2025-12-28_21-35-40.jpg | Bin 0 -> 18056 bytes .../files/photo_1_2025-12-28_21-35-40.jpg | Bin 0 -> 12003 bytes .../files/photo_20_2025-12-28_21-35-40.jpg | Bin 0 -> 17032 bytes .../files/photo_25_2025-12-28_21-35-40.jpg | Bin 0 -> 17446 bytes .../files/photo_27_2025-12-28_21-35-40.jpg | Bin 0 -> 16794 bytes .../files/photo_2_2025-12-28_21-35-40.jpg | Bin 0 -> 29912 bytes .../files/photo_2_2025-12-28_21-35-40.png | Bin 0 -> 1966164 bytes .../files/photo_30_2025-12-28_21-35-40.jpg | Bin 0 -> 21623 bytes .../files/photo_31_2025-12-28_21-35-40.jpg | Bin 0 -> 10522 bytes .../files/photo_32_2025-12-28_21-35-40.jpg | Bin 0 -> 14036 bytes .../files/photo_32_2025-12-28_21-35-40.png | Bin 0 -> 1423681 bytes .../files/photo_3_2025-12-28_21-35-40.jpg | Bin 0 -> 25867 bytes .../files/photo_3_2025-12-28_21-35-40.png | Bin 0 -> 1487705 bytes .../files/photo_5_2025-12-28_21-35-40.jpg | Bin 0 -> 18394 bytes .../files/photo_9_2025-12-28_21-35-40.jpg | Bin 0 -> 15546 bytes .../posts/2025-12-28-philharmonic-park/index.md | 32 ++ content/posts/2025-12-29-newyear-excel.md | 22 -- .../posts/2025-12-29-newyear-excel/files/cover.png | Bin 0 -> 46582 bytes .../2025-12-29-newyear-excel/files/cover1.png | Bin 0 -> 14651 bytes .../2025-12-29-newyear-excel/files/new_year.ods | Bin 0 -> 28669 bytes .../2025-12-29-newyear-excel/files/new_year.xlsx | Bin 0 -> 7859 bytes content/posts/2025-12-29-newyear-excel/index.md | 22 ++ content/posts/2025-12-31-new-year.md | 28 -- content/posts/2025-12-31-new-year/index.md | 28 ++ content/posts/2025-12-31-qchat.md | 46 --- content/posts/2025-12-31-qchat/index.md | 45 +++ content/posts/2026-02-01-grouper/grouper.png | Bin 0 -> 234092 bytes content/posts/2026-02-01-grouper/index.md | 44 +++ content/posts/files/2021-02-13-jsonnet_logo.webp | Bin 47006 -> 0 bytes content/posts/files/2024-07-13-joplin_joplin.webp | Bin 111506 -> 0 bytes ...\320\275\320\265\321\202\320\260_bash_org.webp" | Bin 20774 -> 0 bytes ...\275\320\270\320\263\320\270-2_Rama16wiki.webp" | Bin 44726 -> 0 bytes .../posts/files/2024-11-17-obsidian_img/logo.webp | Bin 9244 -> 0 bytes .../files/2024-11-17-obsidian_img/publish.webp | Bin 23110 -> 0 bytes .../files/2024-11-17-obsidian_img/templater.webp | Bin 17140 -> 0 bytes .../files/2024-11-27-hyperlocality_img/90e.webp | Bin 71910 -> 0 bytes .../2024-11-27-hyperlocality_img/braindance.webp | Bin 92740 -> 0 bytes .../files/2024-11-27-hyperlocality_img/camp.webp | Bin 115704 -> 0 bytes .../2024-11-27-hyperlocality_img/in-internet.webp | Bin 136578 -> 0 bytes content/posts/files/2024-11-29-hobbies_dozor.webp | Bin 101246 -> 0 bytes content/posts/files/2024-12-12-guessr_logo.webp | Bin 112508 -> 0 bytes ...2024-12-15-conditional-operator-go_ternary.webp | Bin 7408 -> 0 bytes content/posts/files/2024-12-15-posse_posse.webp | Bin 60800 -> 0 bytes content/posts/files/2024-12-17-infra_cover.webp | Bin 532556 -> 0 bytes content/posts/files/2024-12-30-irc_logo.webp | Bin 10130 -> 0 bytes content/posts/files/2024-12-31-new-year_img/1.webp | Bin 141164 -> 0 bytes content/posts/files/2024-12-31-new-year_img/2.webp | Bin 212740 -> 0 bytes .../posts/files/2024-12-31-new-year_img/2025.webp | Bin 163920 -> 0 bytes content/posts/files/2024-12-31-new-year_img/3.webp | Bin 446502 -> 0 bytes content/posts/files/2024-12-31-new-year_img/4.webp | Bin 146032 -> 0 bytes content/posts/files/2024-12-31-new-year_img/5.webp | Bin 190524 -> 0 bytes content/posts/files/2025-12-21-img1.jpg | Bin 162511 -> 0 bytes content/posts/files/2025-12-21-img2.jpg | Bin 88801 -> 0 bytes content/posts/files/2025-12-21-img3.png | Bin 340974 -> 0 bytes content/posts/files/2025-12-21-sicktech.png | Bin 263578 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo.jpg | Bin 227501 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_1.jpg | Bin 221795 -> 0 bytes .../posts/files/2025-12-27-osm_img/photo_10.jpg | Bin 127547 -> 0 bytes .../posts/files/2025-12-27-osm_img/photo_11.jpg | Bin 151264 -> 0 bytes .../posts/files/2025-12-27-osm_img/photo_12.jpg | Bin 121963 -> 0 bytes .../posts/files/2025-12-27-osm_img/photo_13.jpg | Bin 126052 -> 0 bytes .../posts/files/2025-12-27-osm_img/photo_14.jpg | Bin 225031 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_2.jpg | Bin 226528 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_3.jpg | Bin 234383 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_4.jpg | Bin 214772 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_5.jpg | Bin 179943 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_6.jpg | Bin 168080 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_7.jpg | Bin 161387 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_8.jpg | Bin 127482 -> 0 bytes content/posts/files/2025-12-27-osm_img/photo_9.jpg | Bin 213571 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo.jpg | Bin 11353 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_1.jpg | Bin 14146 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_10.jpg | Bin 9230 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_11.jpg | Bin 10581 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_12.jpg | Bin 13124 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_13.jpg | Bin 14557 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_14.jpg | Bin 15019 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_2.jpg | Bin 15041 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_3.jpg | Bin 15339 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_4.jpg | Bin 14214 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_5.jpg | Bin 12279 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_6.jpg | Bin 10936 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_7.jpg | Bin 15840 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_8.jpg | Bin 11695 -> 0 bytes .../files/2025-12-27-osm_img/thumbs/photo_9.jpg | Bin 15837 -> 0 bytes .../photo_19_2025-12-28_21-35-40.jpg | Bin 307509 -> 0 bytes .../photo_1_2025-12-28_21-35-40.jpg | Bin 284188 -> 0 bytes .../photo_20_2025-12-28_21-35-40.jpg | Bin 253734 -> 0 bytes .../photo_25_2025-12-28_21-35-40.jpg | Bin 242625 -> 0 bytes .../photo_27_2025-12-28_21-35-40.jpg | Bin 331494 -> 0 bytes .../photo_2_2025-12-28_21-35-40.png | Bin 1966164 -> 0 bytes .../photo_30_2025-12-28_21-35-40.jpg | Bin 352290 -> 0 bytes .../photo_31_2025-12-28_21-35-40.jpg | Bin 216175 -> 0 bytes .../photo_32_2025-12-28_21-35-40.png | Bin 1423681 -> 0 bytes .../photo_3_2025-12-28_21-35-40.png | Bin 1487705 -> 0 bytes .../photo_5_2025-12-28_21-35-40.jpg | Bin 294826 -> 0 bytes .../photo_9_2025-12-28_21-35-40.jpg | Bin 183104 -> 0 bytes .../thumbs/photo_19_2025-12-28_21-35-40.jpg | Bin 18056 -> 0 bytes .../thumbs/photo_1_2025-12-28_21-35-40.jpg | Bin 12003 -> 0 bytes .../thumbs/photo_20_2025-12-28_21-35-40.jpg | Bin 17032 -> 0 bytes .../thumbs/photo_25_2025-12-28_21-35-40.jpg | Bin 17446 -> 0 bytes .../thumbs/photo_27_2025-12-28_21-35-40.jpg | Bin 16794 -> 0 bytes .../thumbs/photo_2_2025-12-28_21-35-40.jpg | Bin 29912 -> 0 bytes .../thumbs/photo_30_2025-12-28_21-35-40.jpg | Bin 21623 -> 0 bytes .../thumbs/photo_31_2025-12-28_21-35-40.jpg | Bin 10522 -> 0 bytes .../thumbs/photo_32_2025-12-28_21-35-40.jpg | Bin 14036 -> 0 bytes .../thumbs/photo_3_2025-12-28_21-35-40.jpg | Bin 25867 -> 0 bytes .../thumbs/photo_5_2025-12-28_21-35-40.jpg | Bin 18394 -> 0 bytes .../thumbs/photo_9_2025-12-28_21-35-40.jpg | Bin 15546 -> 0 bytes .../files/2025-12-29-newyear-excel_img/cover.png | Bin 46582 -> 0 bytes .../files/2025-12-29-newyear-excel_img/cover1.png | Bin 14651 -> 0 bytes .../2025-12-29-newyear-excel_img/new_year.ods | Bin 28669 -> 0 bytes .../2025-12-29-newyear-excel_img/new_year.xlsx | Bin 7859 -> 0 bytes content/posts/files/2025-travel-1_img/1.webp | Bin 1307382 -> 0 bytes content/posts/files/2025-travel-1_img/10.webp | Bin 1024096 -> 0 bytes content/posts/files/2025-travel-1_img/11.webp | Bin 1031876 -> 0 bytes content/posts/files/2025-travel-1_img/12.webp | Bin 373748 -> 0 bytes content/posts/files/2025-travel-1_img/13.webp | Bin 574476 -> 0 bytes content/posts/files/2025-travel-1_img/14.webp | Bin 385098 -> 0 bytes content/posts/files/2025-travel-1_img/15.webp | Bin 381654 -> 0 bytes content/posts/files/2025-travel-1_img/16.webp | Bin 2601414 -> 0 bytes content/posts/files/2025-travel-1_img/17.webp | Bin 3254752 -> 0 bytes content/posts/files/2025-travel-1_img/18.webp | Bin 1640240 -> 0 bytes content/posts/files/2025-travel-1_img/19.webp | Bin 2578076 -> 0 bytes content/posts/files/2025-travel-1_img/2.webp | Bin 1660606 -> 0 bytes content/posts/files/2025-travel-1_img/20.webp | Bin 3858586 -> 0 bytes content/posts/files/2025-travel-1_img/21.webp | Bin 4400828 -> 0 bytes content/posts/files/2025-travel-1_img/22.webp | Bin 2109710 -> 0 bytes content/posts/files/2025-travel-1_img/23.webp | Bin 988944 -> 0 bytes content/posts/files/2025-travel-1_img/3.webp | Bin 5237948 -> 0 bytes content/posts/files/2025-travel-1_img/4.webp | Bin 1403370 -> 0 bytes content/posts/files/2025-travel-1_img/5.webp | Bin 1424414 -> 0 bytes content/posts/files/2025-travel-1_img/6.webp | Bin 1129282 -> 0 bytes content/posts/files/2025-travel-1_img/7.webp | Bin 1178630 -> 0 bytes content/posts/files/2025-travel-1_img/8.webp | Bin 4411964 -> 0 bytes content/posts/files/2025-travel-1_img/9.webp | Bin 755094 -> 0 bytes .../posts/files/2025-travel-1_img/preview_1.webp | Bin 68140 -> 0 bytes .../posts/files/2025-travel-1_img/preview_10.webp | Bin 119806 -> 0 bytes .../posts/files/2025-travel-1_img/preview_11.webp | Bin 114776 -> 0 bytes .../posts/files/2025-travel-1_img/preview_12.webp | Bin 27904 -> 0 bytes .../posts/files/2025-travel-1_img/preview_13.webp | Bin 36594 -> 0 bytes .../posts/files/2025-travel-1_img/preview_14.webp | Bin 29198 -> 0 bytes .../posts/files/2025-travel-1_img/preview_15.webp | Bin 30840 -> 0 bytes .../posts/files/2025-travel-1_img/preview_16.webp | Bin 83166 -> 0 bytes .../posts/files/2025-travel-1_img/preview_17.webp | Bin 154656 -> 0 bytes .../posts/files/2025-travel-1_img/preview_18.webp | Bin 99452 -> 0 bytes .../posts/files/2025-travel-1_img/preview_19.webp | Bin 94816 -> 0 bytes .../posts/files/2025-travel-1_img/preview_2.webp | Bin 49558 -> 0 bytes .../posts/files/2025-travel-1_img/preview_20.webp | Bin 144248 -> 0 bytes .../posts/files/2025-travel-1_img/preview_21.webp | Bin 179974 -> 0 bytes .../posts/files/2025-travel-1_img/preview_22.webp | Bin 56148 -> 0 bytes .../posts/files/2025-travel-1_img/preview_23.webp | Bin 64300 -> 0 bytes .../posts/files/2025-travel-1_img/preview_3.webp | Bin 162906 -> 0 bytes .../posts/files/2025-travel-1_img/preview_4.webp | Bin 45526 -> 0 bytes .../posts/files/2025-travel-1_img/preview_5.webp | Bin 48660 -> 0 bytes .../posts/files/2025-travel-1_img/preview_6.webp | Bin 52192 -> 0 bytes .../posts/files/2025-travel-1_img/preview_7.webp | Bin 44236 -> 0 bytes .../posts/files/2025-travel-1_img/preview_8.webp | Bin 110076 -> 0 bytes .../posts/files/2025-travel-1_img/preview_9.webp | Bin 83176 -> 0 bytes content/posts/files/2025-travel-1_img/saologo.png | Bin 20791 -> 0 bytes content/posts/files/hype_curve.png | Bin 130810 -> 0 bytes content/posts/files/laughing-man.jpeg | Bin 234679 -> 0 bytes content/posts/files/lets-code-3d_img/1.jpg | Bin 86020 -> 0 bytes content/posts/files/lets-code-3d_img/2.jpg | Bin 58451 -> 0 bytes content/posts/files/lets-code-3d_img/3.png | Bin 108360 -> 0 bytes content/posts/files/lets-code-3d_img/4.jpg | Bin 75461 -> 0 bytes content/posts/files/lets-code-3d_result.stl | Bin 3684 -> 0 bytes content/posts/files/lets-code-3d_source.scad | 66 ---- content/posts/files/makeup-organizer_img/1.png | Bin 180919 -> 0 bytes content/posts/files/makeup-organizer_img/2.png | Bin 354046 -> 0 bytes content/posts/files/makeup-organizer_img/3.png | Bin 115406 -> 0 bytes .../posts/files/makeup-organizer_organizer.tar.zst | Bin 660078 -> 0 bytes content/posts/files/meshtastic_img/tbeam.jpg | Bin 269445 -> 0 bytes content/posts/files/meshtastic_img/tbeam.webp | Bin 116662 -> 0 bytes content/projects/games/index.md | 20 +- content/projects/grouper/index.md | 40 +++ content/projects/qchat.md | 89 ----- content/projects/qchat/index.md | 91 +++++ 379 files changed, 4411 insertions(+), 4318 deletions(-) delete mode 100644 content/posts/2021-02-13-jsonnet.md create mode 100644 content/posts/2021-02-13-jsonnet/index.md create mode 100644 content/posts/2021-02-13-jsonnet/jsonnet_logo.webp delete 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/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/index.md" delete 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-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265/index.md" delete mode 100644 content/posts/2022-05-31-golang-1.md create mode 100644 content/posts/2022-05-31-golang-1/index.md delete mode 100644 content/posts/2023-01-12-gitrepo.md create mode 100644 content/posts/2023-01-12-gitrepo/index.md delete mode 100644 content/posts/2023-05-26-gist.md create mode 100644 content/posts/2023-05-26-gist/index.md delete mode 100644 content/posts/2023-07-24-tls.md create mode 100644 content/posts/2023-07-24-tls/index.md delete 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/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264/index.md" delete mode 100644 "content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262.md" create mode 100644 "content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262/index.md" delete mode 100644 content/posts/2024-02-21-tls.md create mode 100644 content/posts/2024-02-21-tls/index.md delete 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-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/index.md" delete 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-06-02-\320\272\320\275\320\270\320\263\320\270-1/index.md" delete mode 100644 content/posts/2024-07-13-joplin.md create mode 100644 content/posts/2024-07-13-joplin/index.md create mode 100644 content/posts/2024-07-13-joplin/joplin.webp delete mode 100644 content/posts/2024-07-21-bbs.md create mode 100644 content/posts/2024-07-21-bbs/index.md delete mode 100644 content/posts/2024-09-26-hugo-wordpress.md create mode 100644 content/posts/2024-09-26-hugo-wordpress/index.md delete 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-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/index.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/\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" delete 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-10-17-\320\272\320\275\320\270\320\263\320\270-2/Rama16wiki.webp" create mode 100644 "content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2/index.md" delete mode 100644 content/posts/2024-11-15-hugo.md create mode 100644 content/posts/2024-11-15-hugo/index.md delete mode 100644 content/posts/2024-11-17-obsidian.md create mode 100644 content/posts/2024-11-17-obsidian/index.md create mode 100644 content/posts/2024-11-17-obsidian/logo.webp create mode 100644 content/posts/2024-11-17-obsidian/publish.webp create mode 100644 content/posts/2024-11-17-obsidian/templater.webp delete mode 100644 content/posts/2024-11-27-hyperlocality.md create mode 100644 content/posts/2024-11-27-hyperlocality/90e.webp create mode 100644 content/posts/2024-11-27-hyperlocality/braindance.webp create mode 100644 content/posts/2024-11-27-hyperlocality/camp.webp create mode 100644 content/posts/2024-11-27-hyperlocality/in-internet.webp create mode 100644 content/posts/2024-11-27-hyperlocality/index.md delete mode 100644 content/posts/2024-11-29-hobbies.md create mode 100644 content/posts/2024-11-29-hobbies/hobbies_dozor.webp create mode 100644 content/posts/2024-11-29-hobbies/index.md delete mode 100644 content/posts/2024-12-12-guessr.md create mode 100644 content/posts/2024-12-12-guessr/guessr_logo.webp create mode 100644 content/posts/2024-12-12-guessr/index.md delete mode 100644 content/posts/2024-12-15-conditional-operator-go.md create mode 100644 content/posts/2024-12-15-conditional-operator-go/conditional-operator-go_ternary.webp create mode 100644 content/posts/2024-12-15-conditional-operator-go/index.md delete mode 100644 content/posts/2024-12-15-posse.md create mode 100644 content/posts/2024-12-15-posse/index.md create mode 100644 content/posts/2024-12-15-posse/posse_posse.webp delete mode 100644 content/posts/2024-12-17-infra.md create mode 100644 content/posts/2024-12-17-infra/index.md create mode 100644 content/posts/2024-12-17-infra/infra_cover.webp delete mode 100644 content/posts/2024-12-30-irc.md create mode 100644 content/posts/2024-12-30-irc/index.md create mode 100644 content/posts/2024-12-30-irc/irc_logo.webp delete mode 100644 content/posts/2024-12-31-new-year.md create mode 100644 content/posts/2024-12-31-new-year/img/1.webp create mode 100644 content/posts/2024-12-31-new-year/img/2.webp create mode 100644 content/posts/2024-12-31-new-year/img/2025.webp create mode 100644 content/posts/2024-12-31-new-year/img/3.webp create mode 100644 content/posts/2024-12-31-new-year/img/4.webp create mode 100644 content/posts/2024-12-31-new-year/img/5.webp create mode 100644 content/posts/2024-12-31-new-year/index.md delete mode 100644 content/posts/2025-04-05-tabs-or-spaces.md create mode 100644 content/posts/2025-04-05-tabs-or-spaces/index.md delete mode 100644 content/posts/2025-05-19-nxpcms-2.md create mode 100644 content/posts/2025-05-19-nxpcms-2/index.md delete mode 100644 content/posts/2025-05-19-nxpcms.md create mode 100644 content/posts/2025-05-19-nxpcms/index.md delete mode 100644 content/posts/2025-06-08-my-setup.md create mode 100644 content/posts/2025-06-08-my-setup/index.md delete mode 100644 content/posts/2025-08-02-meshtastic.md create mode 100644 content/posts/2025-08-02-meshtastic/index.md create mode 100644 content/posts/2025-08-02-meshtastic/tbeam.jpg create mode 100644 content/posts/2025-08-02-meshtastic/tbeam.webp delete mode 100644 content/posts/2025-08-05-lets-code-3d.md create mode 100644 content/posts/2025-08-05-lets-code-3d/1.jpg create mode 100644 content/posts/2025-08-05-lets-code-3d/2.jpg create mode 100644 content/posts/2025-08-05-lets-code-3d/3.png create mode 100644 content/posts/2025-08-05-lets-code-3d/4.jpg create mode 100644 content/posts/2025-08-05-lets-code-3d/index.md create mode 100644 content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl create mode 100644 content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad delete mode 100644 content/posts/2025-08-09-makeup-organizer.md create mode 100644 content/posts/2025-08-09-makeup-organizer/1.png create mode 100644 content/posts/2025-08-09-makeup-organizer/2.png create mode 100644 content/posts/2025-08-09-makeup-organizer/3.png create mode 100644 content/posts/2025-08-09-makeup-organizer/index.md create mode 100644 content/posts/2025-08-09-makeup-organizer/makeup-organizer_organizer.tar.zst delete mode 100644 content/posts/2025-09-01-travel-1.md create mode 100644 content/posts/2025-09-01-travel-1/1.webp create mode 100644 content/posts/2025-09-01-travel-1/10.webp create mode 100644 content/posts/2025-09-01-travel-1/11.webp create mode 100644 content/posts/2025-09-01-travel-1/12.webp create mode 100644 content/posts/2025-09-01-travel-1/13.webp create mode 100644 content/posts/2025-09-01-travel-1/14.webp create mode 100644 content/posts/2025-09-01-travel-1/15.webp create mode 100644 content/posts/2025-09-01-travel-1/16.webp create mode 100644 content/posts/2025-09-01-travel-1/17.webp create mode 100644 content/posts/2025-09-01-travel-1/18.webp create mode 100644 content/posts/2025-09-01-travel-1/19.webp create mode 100644 content/posts/2025-09-01-travel-1/2.webp create mode 100644 content/posts/2025-09-01-travel-1/20.webp create mode 100644 content/posts/2025-09-01-travel-1/21.webp create mode 100644 content/posts/2025-09-01-travel-1/22.webp create mode 100644 content/posts/2025-09-01-travel-1/23.webp create mode 100644 content/posts/2025-09-01-travel-1/3.webp create mode 100644 content/posts/2025-09-01-travel-1/4.webp create mode 100644 content/posts/2025-09-01-travel-1/5.webp create mode 100644 content/posts/2025-09-01-travel-1/6.webp create mode 100644 content/posts/2025-09-01-travel-1/7.webp create mode 100644 content/posts/2025-09-01-travel-1/8.webp create mode 100644 content/posts/2025-09-01-travel-1/9.webp create mode 100644 content/posts/2025-09-01-travel-1/index.md create mode 100644 content/posts/2025-09-01-travel-1/preview_1.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_10.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_11.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_12.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_13.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_14.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_15.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_16.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_17.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_18.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_19.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_2.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_20.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_21.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_22.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_23.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_3.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_4.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_5.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_6.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_7.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_8.webp create mode 100644 content/posts/2025-09-01-travel-1/preview_9.webp create mode 100644 content/posts/2025-09-01-travel-1/saologo.png delete mode 100644 content/posts/2025-10-06-ai.md create mode 100644 content/posts/2025-10-06-ai/hype_curve.png create mode 100644 content/posts/2025-10-06-ai/index.md delete mode 100644 content/posts/2025-10-11-blog.md create mode 100644 content/posts/2025-10-11-blog/index.md delete mode 100644 content/posts/2025-10-18-the-ghost-in-the-machine.md create mode 100644 content/posts/2025-10-18-the-ghost-in-the-machine/index.md create mode 100644 content/posts/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg delete mode 100644 content/posts/2025-11-03-blog-deploy.md create mode 100644 content/posts/2025-11-03-blog-deploy/index.md delete mode 100644 content/posts/2025-11-03-my-setup.md create mode 100644 content/posts/2025-11-03-my-setup/index.md delete mode 100644 content/posts/2025-11-04-blog-deploy-2.md create mode 100644 content/posts/2025-11-04-blog-deploy-2/index.md delete mode 100644 content/posts/2025-11-09-migration.md create mode 100644 content/posts/2025-11-09-migration/index.md delete mode 100644 content/posts/2025-11-23-org.md create mode 100644 content/posts/2025-11-23-org/index.md delete mode 100644 content/posts/2025-12-02-httpsocalypse.md create mode 100644 content/posts/2025-12-02-httpsocalypse/index.md delete mode 100644 content/posts/2025-12-21-sicktech.md create mode 100644 content/posts/2025-12-21-sicktech/files/img1.jpg create mode 100644 content/posts/2025-12-21-sicktech/files/img2.jpg create mode 100644 content/posts/2025-12-21-sicktech/files/img3.png create mode 100644 content/posts/2025-12-21-sicktech/files/sicktech.png create mode 100644 content/posts/2025-12-21-sicktech/index.md delete mode 100644 content/posts/2025-12-23-comments.md create mode 100644 content/posts/2025-12-23-comments/index.md delete mode 100644 content/posts/2025-12-24-email.md create mode 100644 content/posts/2025-12-24-email/index.md delete mode 100644 content/posts/2025-12-27-osm.md create mode 100644 content/posts/2025-12-27-osm/files/photo.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_1.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_10.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_11.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_12.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_13.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_14.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_2.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_3.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_4.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_5.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_6.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_7.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_8.jpg create mode 100644 content/posts/2025-12-27-osm/files/photo_9.jpg create mode 100644 content/posts/2025-12-27-osm/index.md delete mode 100644 content/posts/2025-12-28-philharmonic-park.md create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_1_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.png create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.png create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.png create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg create mode 100644 content/posts/2025-12-28-philharmonic-park/index.md delete mode 100644 content/posts/2025-12-29-newyear-excel.md create mode 100644 content/posts/2025-12-29-newyear-excel/files/cover.png create mode 100644 content/posts/2025-12-29-newyear-excel/files/cover1.png create mode 100644 content/posts/2025-12-29-newyear-excel/files/new_year.ods create mode 100644 content/posts/2025-12-29-newyear-excel/files/new_year.xlsx create mode 100644 content/posts/2025-12-29-newyear-excel/index.md delete mode 100644 content/posts/2025-12-31-new-year.md create mode 100644 content/posts/2025-12-31-new-year/index.md delete mode 100644 content/posts/2025-12-31-qchat.md create mode 100644 content/posts/2025-12-31-qchat/index.md create mode 100644 content/posts/2026-02-01-grouper/grouper.png create mode 100644 content/posts/2026-02-01-grouper/index.md delete mode 100644 content/posts/files/2021-02-13-jsonnet_logo.webp delete mode 100644 content/posts/files/2024-07-13-joplin_joplin.webp delete 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" delete mode 100644 "content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" delete mode 100644 content/posts/files/2024-11-17-obsidian_img/logo.webp delete mode 100644 content/posts/files/2024-11-17-obsidian_img/publish.webp delete mode 100644 content/posts/files/2024-11-17-obsidian_img/templater.webp delete mode 100644 content/posts/files/2024-11-27-hyperlocality_img/90e.webp delete mode 100644 content/posts/files/2024-11-27-hyperlocality_img/braindance.webp delete mode 100644 content/posts/files/2024-11-27-hyperlocality_img/camp.webp delete mode 100644 content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp delete mode 100644 content/posts/files/2024-11-29-hobbies_dozor.webp delete mode 100644 content/posts/files/2024-12-12-guessr_logo.webp delete mode 100644 content/posts/files/2024-12-15-conditional-operator-go_ternary.webp delete mode 100644 content/posts/files/2024-12-15-posse_posse.webp delete mode 100644 content/posts/files/2024-12-17-infra_cover.webp delete mode 100644 content/posts/files/2024-12-30-irc_logo.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/1.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/2.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/2025.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/3.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/4.webp delete mode 100644 content/posts/files/2024-12-31-new-year_img/5.webp delete mode 100644 content/posts/files/2025-12-21-img1.jpg delete mode 100644 content/posts/files/2025-12-21-img2.jpg delete mode 100644 content/posts/files/2025-12-21-img3.png delete mode 100644 content/posts/files/2025-12-21-sicktech.png delete mode 100644 content/posts/files/2025-12-27-osm_img/photo.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_1.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_10.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_11.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_12.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_13.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_14.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_2.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_3.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_4.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_5.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_6.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_7.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_8.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/photo_9.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg delete mode 100644 content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg delete mode 100644 content/posts/files/2025-12-29-newyear-excel_img/cover.png delete mode 100644 content/posts/files/2025-12-29-newyear-excel_img/cover1.png delete mode 100644 content/posts/files/2025-12-29-newyear-excel_img/new_year.ods delete mode 100644 content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx delete mode 100644 content/posts/files/2025-travel-1_img/1.webp delete mode 100644 content/posts/files/2025-travel-1_img/10.webp delete mode 100644 content/posts/files/2025-travel-1_img/11.webp delete mode 100644 content/posts/files/2025-travel-1_img/12.webp delete mode 100644 content/posts/files/2025-travel-1_img/13.webp delete mode 100644 content/posts/files/2025-travel-1_img/14.webp delete mode 100644 content/posts/files/2025-travel-1_img/15.webp delete mode 100644 content/posts/files/2025-travel-1_img/16.webp delete mode 100644 content/posts/files/2025-travel-1_img/17.webp delete mode 100644 content/posts/files/2025-travel-1_img/18.webp delete mode 100644 content/posts/files/2025-travel-1_img/19.webp delete mode 100644 content/posts/files/2025-travel-1_img/2.webp delete mode 100644 content/posts/files/2025-travel-1_img/20.webp delete mode 100644 content/posts/files/2025-travel-1_img/21.webp delete mode 100644 content/posts/files/2025-travel-1_img/22.webp delete mode 100644 content/posts/files/2025-travel-1_img/23.webp delete mode 100644 content/posts/files/2025-travel-1_img/3.webp delete mode 100644 content/posts/files/2025-travel-1_img/4.webp delete mode 100644 content/posts/files/2025-travel-1_img/5.webp delete mode 100644 content/posts/files/2025-travel-1_img/6.webp delete mode 100644 content/posts/files/2025-travel-1_img/7.webp delete mode 100644 content/posts/files/2025-travel-1_img/8.webp delete mode 100644 content/posts/files/2025-travel-1_img/9.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_1.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_10.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_11.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_12.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_13.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_14.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_15.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_16.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_17.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_18.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_19.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_2.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_20.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_21.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_22.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_23.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_3.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_4.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_5.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_6.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_7.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_8.webp delete mode 100644 content/posts/files/2025-travel-1_img/preview_9.webp delete mode 100644 content/posts/files/2025-travel-1_img/saologo.png delete mode 100644 content/posts/files/hype_curve.png delete mode 100644 content/posts/files/laughing-man.jpeg delete mode 100644 content/posts/files/lets-code-3d_img/1.jpg delete mode 100644 content/posts/files/lets-code-3d_img/2.jpg delete mode 100644 content/posts/files/lets-code-3d_img/3.png delete mode 100644 content/posts/files/lets-code-3d_img/4.jpg delete mode 100644 content/posts/files/lets-code-3d_result.stl delete mode 100644 content/posts/files/lets-code-3d_source.scad delete mode 100644 content/posts/files/makeup-organizer_img/1.png delete mode 100644 content/posts/files/makeup-organizer_img/2.png delete mode 100644 content/posts/files/makeup-organizer_img/3.png delete mode 100644 content/posts/files/makeup-organizer_organizer.tar.zst delete mode 100644 content/posts/files/meshtastic_img/tbeam.jpg delete mode 100644 content/posts/files/meshtastic_img/tbeam.webp create mode 100644 content/projects/grouper/index.md delete mode 100644 content/projects/qchat.md create mode 100644 content/projects/qchat/index.md (limited to 'content') diff --git a/content/pages/_index.md b/content/pages/_index.md index 3d813e3..b2a7532 100644 --- a/content/pages/_index.md +++ b/content/pages/_index.md @@ -1,4 +1,3 @@ --- -order: '20' title: Разное --- diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md deleted file mode 100644 index 9b03e5d..0000000 --- a/content/posts/2021-02-13-jsonnet.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -date: "2021-02-13T22:08:19Z" -image: files/2021-02-13-jsonnet_logo.webp -tags: - - go - - it - - разное -categories: - - Без рубрики -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 системы: - -```jsonnet -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 на новом сервере. Почему бы и нет?:) - -Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! diff --git a/content/posts/2021-02-13-jsonnet/index.md b/content/posts/2021-02-13-jsonnet/index.md new file mode 100644 index 0000000..4018d46 --- /dev/null +++ b/content/posts/2021-02-13-jsonnet/index.md @@ -0,0 +1,94 @@ +--- +date: "2021-02-13T22:08:19Z" +image: /posts/2021-02-13-jsonnet/jsonnet_logo.webp +tags: + - go + - it + - разное +categories: + - Без рубрики +title: Jsonnet +--- + +Редко такое бывает, что случайно натыкаешься на какую-то технологию и она +вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня +такой технологией стал [Jsonnet](https://jsonnet.org/) от Google. + +![Jsonnet](/posts/2021-02-13-jsonnet/jsonnet_logo.webp) + +В кратце, это надмножество 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 системы: + +```jsonnet +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 на новом сервере. Почему бы и нет?:) + +Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! diff --git a/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp b/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp new file mode 100644 index 0000000..45c63a6 Binary files /dev/null and b/content/posts/2021-02-13-jsonnet/jsonnet_logo.webp differ 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" deleted file mode 100644 index d9fcede..0000000 --- "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" +++ /dev/null @@ -1,91 +0,0 @@ ---- -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/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/index.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/index.md" new file mode 100644 index 0000000..4130b8b --- /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/index.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:_ Да, я знаю что уже данные так и останутся в чужих руках, но со временем +они будут всё больше и больше протухать, а мой “цифровой профиль” терять +актуальность. Ведь я не скала, я тоже меняюсь и ухожу от этого профиля. 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" deleted file mode 100644 index c6721c8..0000000 --- "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" +++ /dev/null @@ -1,27 +0,0 @@ ---- -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-30-\320\262\320\276\320\267\321\200\320\276\320\266\320\264\320\265\320\275\320\270\320\265/index.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/index.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/index.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 deleted file mode 100644 index 75e1b64..0000000 --- a/content/posts/2022-05-31-golang-1.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -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/2022-05-31-golang-1/index.md b/content/posts/2022-05-31-golang-1/index.md new file mode 100644 index 0000000..51e511c --- /dev/null +++ b/content/posts/2022-05-31-golang-1/index.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 конфиги. diff --git a/content/posts/2023-01-12-gitrepo.md b/content/posts/2023-01-12-gitrepo.md deleted file mode 100644 index 7e521c3..0000000 --- a/content/posts/2023-01-12-gitrepo.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -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-01-12-gitrepo/index.md b/content/posts/2023-01-12-gitrepo/index.md new file mode 100644 index 0000000..c10dd9d --- /dev/null +++ b/content/posts/2023-01-12-gitrepo/index.md @@ -0,0 +1,166 @@ +--- +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 этого файла на сервак. Такое себе. + +Как это решить — есть интересная идея, но это уже в другой раз. diff --git a/content/posts/2023-05-26-gist.md b/content/posts/2023-05-26-gist.md deleted file mode 100644 index 25b362f..0000000 --- a/content/posts/2023-05-26-gist.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -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-05-26-gist/index.md b/content/posts/2023-05-26-gist/index.md new file mode 100644 index 0000000..d05e322 --- /dev/null +++ b/content/posts/2023-05-26-gist/index.md @@ -0,0 +1,18 @@ +--- +categories: + - Мои проекты +date: "2023-05-26T17:40:21Z" +tags: + - it + - моё +title: Импортозамещение Gist +--- + +И в догонку к комментариям, запустил на своём серваке свой аналог Gist’ов от +GitHub. + +Вот и он: [gist.neonxp.ru](https://gist.neonxp.ru/) + +Пользуйтесь 🙂 + +[Другие мои проекты](/projects) diff --git a/content/posts/2023-07-24-tls.md b/content/posts/2023-07-24-tls.md deleted file mode 100644 index 43ee345..0000000 --- a/content/posts/2023-07-24-tls.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -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-07-24-tls/index.md b/content/posts/2023-07-24-tls/index.md new file mode 100644 index 0000000..edcf4c3 --- /dev/null +++ b/content/posts/2023-07-24-tls/index.md @@ -0,0 +1,79 @@ +--- +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. Для себя я выбрал второй путь, с самоподписанными +сертификатами. Чекнуть как работает можно на зеркале блога на + . Там я выпустил сам себе сертификат на домен от своего +собственного удостоверяющего центра 🙂 А доверять ему или не доверять — дело +посетителей сайта. + +Ну и совсем краткая инструкция как выпустить сертификат для себя: + +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 в доверенные для себя. 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" deleted file mode 100644 index c4a17bf..0000000 --- "a/content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264.md" +++ /dev/null @@ -1,28 +0,0 @@ ---- -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/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264/index.md" "b/content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264/index.md" new file mode 100644 index 0000000..176052f --- /dev/null +++ "b/content/posts/2023-12-29-\320\277\320\265\321\200\320\265\320\265\320\267\320\264/index.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/tls/). + +Пока что как-то так 🤷🏻‍♂️ 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" deleted file mode 100644 index 65a5be8..0000000 --- "a/content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262.md" +++ /dev/null @@ -1,14 +0,0 @@ ---- -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-01-03-\320\260\321\200\321\205\320\270\320\262/index.md" "b/content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262/index.md" new file mode 100644 index 0000000..7b240a3 --- /dev/null +++ "b/content/posts/2024-01-03-\320\260\321\200\321\205\320\270\320\262/index.md" @@ -0,0 +1,14 @@ +--- +categories: + - Без рубрики +date: "2024-01-03T17:28:40Z" +tags: + - блог +title: Архив +--- + +Покопавшись по вебархиву смог вытащить древние посты с разных моих старых +блогов. В основном, кринжовые, конечно, но это моя жизнь, как она была в то +время. Так что пусть будут. + +[Архив блога](https://neonxp.ru/archive/) diff --git a/content/posts/2024-02-21-tls.md b/content/posts/2024-02-21-tls.md deleted file mode 100644 index 65f8dfa..0000000 --- a/content/posts/2024-02-21-tls.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -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-02-21-tls/index.md b/content/posts/2024-02-21-tls/index.md new file mode 100644 index 0000000..4529bd9 --- /dev/null +++ b/content/posts/2024-02-21-tls/index.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" deleted file mode 100644 index 4d5960f..0000000 --- "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" +++ /dev/null @@ -1,110 +0,0 @@ ---- -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-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/index.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/index.md" new file mode 100644 index 0000000..1801364 --- /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/index.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" deleted file mode 100644 index 0173245..0000000 --- "a/content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-1.md" +++ /dev/null @@ -1,21 +0,0 @@ ---- -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-06-02-\320\272\320\275\320\270\320\263\320\270-1/index.md" "b/content/posts/2024-06-02-\320\272\320\275\320\270\320\263\320\270-1/index.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/index.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 deleted file mode 100644 index f23bcc7..0000000 --- a/content/posts/2024-07-13-joplin.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -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-13-joplin/index.md b/content/posts/2024-07-13-joplin/index.md new file mode 100644 index 0000000..9457c48 --- /dev/null +++ b/content/posts/2024-07-13-joplin/index.md @@ -0,0 +1,45 @@ +--- +categories: + - Без рубрики +date: "2024-07-13T20:49:12Z" +image: /posts/2024-07-13-joplin/joplin.webp +tags: + - it + - joplin +title: Заметочник Joplin +--- + +Просто хочу поделиться отличным приложением для заметок, вместо популярного +Notion и менее популярного Obsidian. + +Название на для русского уха звучит по дурацки — +[Joplin](https://joplinapp.org/). Но, не смотря на такое название, +самоприложение очень даже серьёзное. + +![Интерфейс](/posts/2024-07-13-joplin/joplin.webp) + +В общем и целом, это достаточно продвинутый опенсорсный заметочник. В качестве +формата текста он использует 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 — пишите на +почту, самостоятельной регистрации на сервере синхронизации не предусмотренно. +Вот только не забудьте при синхронизации включить в настройках шифрование +заметок. Я не хочу потом получать подозрения в нарушение приватности.~~ diff --git a/content/posts/2024-07-13-joplin/joplin.webp b/content/posts/2024-07-13-joplin/joplin.webp new file mode 100644 index 0000000..33326b7 Binary files /dev/null and b/content/posts/2024-07-13-joplin/joplin.webp differ diff --git a/content/posts/2024-07-21-bbs.md b/content/posts/2024-07-21-bbs.md deleted file mode 100644 index c304c84..0000000 --- a/content/posts/2024-07-21-bbs.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -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-07-21-bbs/index.md b/content/posts/2024-07-21-bbs/index.md new file mode 100644 index 0000000..c304c84 --- /dev/null +++ b/content/posts/2024-07-21-bbs/index.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 deleted file mode 100644 index aa862ef..0000000 --- a/content/posts/2024-09-26-hugo-wordpress.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -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-09-26-hugo-wordpress/index.md b/content/posts/2024-09-26-hugo-wordpress/index.md new file mode 100644 index 0000000..aa862ef --- /dev/null +++ b/content/posts/2024-09-26-hugo-wordpress/index.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" deleted file mode 100644 index cc9ba60..0000000 --- "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" +++ /dev/null @@ -1,64 +0,0 @@ ---- -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-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/index.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/index.md" new file mode 100644 index 0000000..60d46e0 --- /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/index.md" @@ -0,0 +1,64 @@ +--- +categories: + - Мои проекты +date: "2024-10-06T12:00:11Z" +image: цитатник-рунета_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 и оформляет цитату как надо. Как +вам такая идея? + +Вообще, я бы хотел это как-то, наверное, обсудить, относительно того как это +развивать и стоит ли? 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/\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/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/\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/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/\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/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" deleted file mode 100644 index 96cafc7..0000000 --- "a/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2.md" +++ /dev/null @@ -1,39 +0,0 @@ ---- -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-10-17-\320\272\320\275\320\270\320\263\320\270-2/Rama16wiki.webp" "b/content/posts/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/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2/Rama16wiki.webp" differ diff --git "a/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2/index.md" "b/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2/index.md" new file mode 100644 index 0000000..2b476bc --- /dev/null +++ "b/content/posts/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2/index.md" @@ -0,0 +1,39 @@ +--- +categories: + - Без рубрики +date: "2024-10-17T19:26:00Z" +image: /posts/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 лет. Причиной отправки стали принятые с окрестной +планеты радио сигналы, свидетельствующие о наличии разумной жизни на ней. + +Книга является частью цикла, и я прикладываю цикл целиком: + +[Цикл «КенгХо» скачать](/posts/2024-10-17-книги-2/КенгХо.zip) diff --git a/content/posts/2024-11-15-hugo.md b/content/posts/2024-11-15-hugo.md deleted file mode 100644 index 7a677a4..0000000 --- a/content/posts/2024-11-15-hugo.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -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-15-hugo/index.md b/content/posts/2024-11-15-hugo/index.md new file mode 100644 index 0000000..7a677a4 --- /dev/null +++ b/content/posts/2024-11-15-hugo/index.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 deleted file mode 100644 index 9ecf5f4..0000000 --- a/content/posts/2024-11-17-obsidian.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -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-17-obsidian/index.md b/content/posts/2024-11-17-obsidian/index.md new file mode 100644 index 0000000..6feba39 --- /dev/null +++ b/content/posts/2024-11-17-obsidian/index.md @@ -0,0 +1,240 @@ +--- +categories: + - Без рубрики +date: "2024-11-17T22:30:37+03:00" +description: "" +image: 2024-11-17-obsidian_img/logo.webp +location: Казань +tags: + - it + - joplin + - obsidian +title: Obsidian +--- + +Некоторое время назад я [писал](/posts/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/2024-11-17-obsidian/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/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-17-obsidian/logo.webp b/content/posts/2024-11-17-obsidian/logo.webp new file mode 100644 index 0000000..d5c747a Binary files /dev/null and b/content/posts/2024-11-17-obsidian/logo.webp differ diff --git a/content/posts/2024-11-17-obsidian/publish.webp b/content/posts/2024-11-17-obsidian/publish.webp new file mode 100644 index 0000000..f8add88 Binary files /dev/null and b/content/posts/2024-11-17-obsidian/publish.webp differ diff --git a/content/posts/2024-11-17-obsidian/templater.webp b/content/posts/2024-11-17-obsidian/templater.webp new file mode 100644 index 0000000..facdd86 Binary files /dev/null and b/content/posts/2024-11-17-obsidian/templater.webp differ diff --git a/content/posts/2024-11-27-hyperlocality.md b/content/posts/2024-11-27-hyperlocality.md deleted file mode 100644 index eb8ff84..0000000 --- a/content/posts/2024-11-27-hyperlocality.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -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-27-hyperlocality/90e.webp b/content/posts/2024-11-27-hyperlocality/90e.webp new file mode 100644 index 0000000..948d808 Binary files /dev/null and b/content/posts/2024-11-27-hyperlocality/90e.webp differ diff --git a/content/posts/2024-11-27-hyperlocality/braindance.webp b/content/posts/2024-11-27-hyperlocality/braindance.webp new file mode 100644 index 0000000..965e145 Binary files /dev/null and b/content/posts/2024-11-27-hyperlocality/braindance.webp differ diff --git a/content/posts/2024-11-27-hyperlocality/camp.webp b/content/posts/2024-11-27-hyperlocality/camp.webp new file mode 100644 index 0000000..a07d8ed Binary files /dev/null and b/content/posts/2024-11-27-hyperlocality/camp.webp differ diff --git a/content/posts/2024-11-27-hyperlocality/in-internet.webp b/content/posts/2024-11-27-hyperlocality/in-internet.webp new file mode 100644 index 0000000..56d8c50 Binary files /dev/null and b/content/posts/2024-11-27-hyperlocality/in-internet.webp differ diff --git a/content/posts/2024-11-27-hyperlocality/index.md b/content/posts/2024-11-27-hyperlocality/index.md new file mode 100644 index 0000000..858c1d6 --- /dev/null +++ b/content/posts/2024-11-27-hyperlocality/index.md @@ -0,0 +1,184 @@ +--- +categories: + - гиперлокальность +date: "2024-11-27T17:50:18+03:00" +description: "" +location: Казань +tags: + - разное + - IT + - размышления + - гиперлокальность +title: Гиперлокальность +--- + +Это очередной пост моих пространных рассуждений про тенденции и будущее +интернета, которых в последнее время становится как-то многовато. Вероятно, в +последствии, это станет даже серией постов. + +Этот же я воспринимаю, как вводный в лор гиперлокальности. + +Сначала, пожалуй, расскажу про посылки, а потом уже о том, куда они ведут, и +какие из этого можно сделать выводы. + + + +## Посылка + +Думаю, все мы заметили как много вокруг стало ИИ инструментов. Сейчас ИИ на +хайпе и его засовывают буквально куда можно и куда нельзя. Само по себе меня это +не беспокоит. Я отношусь к ИИ как к просто очередному инструменту, который можно +и нужно использовать там, где он применим. С этим нет проблем. Пройдёт какое-то +время и ИИ инструменты займут ниши, где они наиболее уместны и где от них +наибольшая польза. Однако тут есть и негативный нюанс. Этот инструмент будет +способствовать в том числе и тому, что интернет станет (если ещё не стал!) по +сути своей «мёртвым». Не мёртвым буквально, а «мёртвым» в том же смысле, в +котором в «Руководстве путешествующего автостопом по галактики» Д. Адамса была +вселенная обозначена необитаемой. + +> Вселенная — кое-какая информация, облегчающая существование в ней. +> +> <...> +> +> 4. Население: Отсутствует. Известно, что существует бесконечное множество +> планет. Это объясняется той простой причиной, что пространство, в котором они +> могут существовать, также бесконечно. Однако не всякая из этих планет +> обитаема. Отсюда следует, что число обитаемых планет конечно. Частное от +> деления любого конечного числа на бесконечность стремится к нулю и не дает +> остатка, следовательно, можно заключить, что средняя численность населения +> планет Вселенной равна нулю. Отсюда следует, что численность населения во всей +> Вселенной также равна нулю, и потому все люди, которые порой попадаются на +> вашем пути, являются продуктом вашего воспаленного воображения. +> +> Д. Адамс — Ресторан «У края Вселенной», 19 глава + +## Следствие + +Количество сгенерированного ИИ контента, ИИ ботов пишущих комментарии и иным +способом имитирующих людей будет расти нелинейно. Таким образом будет +«размываться» весьма конечное количиство «живых» пользователей «неживыми» до +того, что все эти миллиарды «живых» пользователей будут лишь статистической +погрешностью относительно «неживых» ИИ ботов. + +## Как это повлияет на наше восприятие реальности? + +Представьте себе мир, где большинство сообщений, комментариев и публикаций +создаются ИИ. Мы будем жить в мире, где трудно отличить реальность от иллюзии. +Где каждый день нам придётся задаваться вопросом: кто написал этот комментарий – +реальный человек или искусственный интеллект? Это приведёт к тому, что доверие к +информации в интернете начнёт стремительно падать. Люди станут всё больше +сомневаться в подлинности того, что видят и читают. В итоге, интернет +превратится в огромное море данных, где настоящие голоса людей тонут в океане +фальшивок и симуляций. + +![Киберпанк который мы +заслужили](/posts/2024-11-27-hyperlocality/braindance.webp "Киберпанк +который мы заслужили") + +## Гиперлокальность + +Уже сейчас вполне себе просматиривается контур того, что я, за неимением лучшего +термина, называю «Гиперлокальностью». Термин мне нравится тем что он, с одной +стороны, хорошо описывает то, куда, по моему мнению, мы придём, а с другой +стороны, названием отсылает к «гипертексту». + +### Что я под этим подразумеваю? + +Помните старые времена, когда интернет только-только появлялся и из каждого +утюга звучало как одно из его преимуществ, то, что «вы сможете находить себе +собеседников и друзьей в любой точке мира, не выходя из дома». Звучало +многообещающе, и в каком-то смысле, оно так и было. + +![Наивное представление из 90х о том, что интернет будет нас +соединять](/posts/2024-11-27-hyperlocality/90e.webp "Наивное +представление из 90х о том, что интернет будет нас соединять") + +Но что происходит сейчас? Интернет, вместо того чтобы соединять людей по всему +миру, начинает дробиться на маленькие замкнутые круги. Почему так происходит? +Ответ кроется в недоверии. Когда невозможно понять, кто перед тобой – настоящий +человек или ИИ-бот, люди начинают замыкаться в узких кругах тех, кому они +доверяют. + +> Интернет, он не сближает. Это скопление одиночества. Мы вроде вместе, но +> каждый один. Иллюзия общения, иллюзия дружбы, иллюзия жизни… +> +> Януш Леон Вишневский — Одиночество в Сети + +Эти круги становятся всё меньше и меньше, пока не превращаются в замкнутые +сообщества, где общение ограничено только теми, кого знаешь лично. Таким +образом, получается некая WebOfTrust, но только по валидации «человечности». Это +напоминает модель «доверительных сетей», которая существовала задолго до +появления интернета, но теперь она приобретает новый смысл в цифровую эпоху. + +А личные знакомства они, как правило, достаточно локальные. А следовательно, в +ближайшее время мы увидим расцвет изолированных «анклавов» из _лично_ знакомых +между собой людей, который и будут существовать своими маленькими, +**гиперлокальными** сообществами. Размер при этом может быть почти любой, как +группка из трёх друзей, так и небольшой клуб из пары десятков _лично знакомых_ +единомышленников. + +Причём, примеры гиперлокальных сообществ уже сейчас есть и в большом количестве. +Например, у меня с друзьями уже почти 10 лет есть свой маленький чатик на шесть +голов. И, в принципе, этого круга общения мне вполне хватает. И в своём кругу +мы, конечно же, уверенны в «человечности» каждого из нас, ибо знакомы и ИРЛ. + +Причём, «достаточность» этого кружка для меня такая, что если у меня, вдруг, +магическим образом, останется только этот чатик, мой NAS в который загруженно +примерно 50К книг и несколько любимых сериалов, и, конечно, VPN до работы, чтобы +я мог зарабатывать на жизнь — то, это и будет вся моя гиперлокальная сеть. И как +будто, не сильно то я и потеряю если останется только это, ну или как минимум, +уж точно выживу. Если что, это именно магически и гипотетически, но тем не +менее. + +Так же, подобные кружки, я видел и, например, у своих старших родственников. +Они, в основном, устраивают гиперлокальные «кружки» в том же вотсаппе. Там они +делятся рекомендациями фильмов, рецептами, шутками, новостями и прочим подобным. + +### А к чему я это всё? + +Да к тому что на текущем этапе развития интернета, мы всё больше уходим от +**глобальной** сети к **гиперлокальной**. И, наверное, мне это даже вполне +нравится. Это как-то... уютно чтоли. + +![Примерно так я визуализирую гиперлокальное +сообщество](/posts/2024-11-27-hyperlocality/camp.webp "Примерно так я +визуализирую гиперлокальное сообщество") + +## Перспективы + +Дисклеймер. Дальше идут мои размышления, которые основываются в основном на +интуитивных, а не объективных предположениях + +С развитием этого тренда будут всё больше и больше отмирать крупные социальные +сети типа ВК или РКНбука. История сделает виток и восскресит т.н. локалки, +которые были популярны в 90е-00е. Конечно же, уже в другом облике. Никто не +будет лазать по чердакам чтобы протянуть витуху между соседями, но именно суть +останется. А суть в том, что будет бо́льшая концентрация на небольшом числе +условно локальных ресурсов, где человек будет только со своими друзьями, а +«большой» интернет отходит на второй план. + +Так же могут получить развитие indieweb технологии, а так же self-hosted решения +для общения, например, Matrix. Эти инструменты потребуются как ответ на +заполненные ботами и спамом соцсети и мессенджеры. Конечно же, всё что нужно не +затащить в свою уютненькую локалочку, но вылазка за недостающей инфой в интернет +будет ощущаться, как выход из своей зоны комфорта в дикую и опасную пустошь. + +![Вылазка в «большой» +интернет](/posts/2024-11-27-hyperlocality/in-internet.webp "Вылазка в +«большой» интернет") + +## Окончание? + +Я отдаю себе отчёт что то, что я написал выше — весьма сумбурно. Но это +следствие того, что я ещё не до конца исследовал эту тему, и многие мысли на эту +тему в моей голове пока ещё не сформированы в слова, а остаются на интуитивном +уровне. + +А написал я это, скорее как повод начать дискуссию на эту тему. Мне интересно, +что вы думаете по этой теме. Возможно, мнение со стороны меня наведёт на еще +какие мысли. + +В дальнейшем у меня уже есть некоторые мысли на развитие темы, но уже в каких то +отдельных аспектах. + +Остаёмся на связи, 73! diff --git a/content/posts/2024-11-29-hobbies.md b/content/posts/2024-11-29-hobbies.md deleted file mode 100644 index 50fc928..0000000 --- a/content/posts/2024-11-29-hobbies.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -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-11-29-hobbies/hobbies_dozor.webp b/content/posts/2024-11-29-hobbies/hobbies_dozor.webp new file mode 100644 index 0000000..eab9913 Binary files /dev/null and b/content/posts/2024-11-29-hobbies/hobbies_dozor.webp differ diff --git a/content/posts/2024-11-29-hobbies/index.md b/content/posts/2024-11-29-hobbies/index.md new file mode 100644 index 0000000..b0763a7 --- /dev/null +++ b/content/posts/2024-11-29-hobbies/index.md @@ -0,0 +1,44 @@ +--- +categories: +- Мысли вслух +date: '2024-11-29T18:00:36+03:00' +description: '' +image: 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 deleted file mode 100644 index 235901c..0000000 --- a/content/posts/2024-12-12-guessr.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -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-12-guessr/guessr_logo.webp b/content/posts/2024-12-12-guessr/guessr_logo.webp new file mode 100644 index 0000000..3a414cd Binary files /dev/null and b/content/posts/2024-12-12-guessr/guessr_logo.webp differ diff --git a/content/posts/2024-12-12-guessr/index.md b/content/posts/2024-12-12-guessr/index.md new file mode 100644 index 0000000..39c5c54 --- /dev/null +++ b/content/posts/2024-12-12-guessr/index.md @@ -0,0 +1,134 @@ +--- +categories: + - Мои проекты +date: "2024-12-12T22:27:49+03:00" +description: "" +image: 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) +``` + +## Дальнейшие планы + +В комментах к анонсу ребята накидали достаточно много хороших идей, синтезировав +которые, и добавив свои хотелки я составил примерно такой чеклист: + +- [ ] Авторизация и общая доска лидерства +- [ ] После угадывания спрашивать у игрока «сложность», чтобы потом можно было, + например, настраивать чтобы попадались только простые объекты. И, например, + разное количество очков за простые и сложные объекты +- [ ] Подумать как вынести игру в оффлайн, по типу того же ингресса. Это сложно + и предстоит хорошо это обдумать + +Как-то так :) А впереди новые выходные и новые «проекты выходного дня»! diff --git a/content/posts/2024-12-15-conditional-operator-go.md b/content/posts/2024-12-15-conditional-operator-go.md deleted file mode 100644 index 480ba42..0000000 --- a/content/posts/2024-12-15-conditional-operator-go.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -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-conditional-operator-go/conditional-operator-go_ternary.webp b/content/posts/2024-12-15-conditional-operator-go/conditional-operator-go_ternary.webp new file mode 100644 index 0000000..5eeea58 Binary files /dev/null and b/content/posts/2024-12-15-conditional-operator-go/conditional-operator-go_ternary.webp differ diff --git a/content/posts/2024-12-15-conditional-operator-go/index.md b/content/posts/2024-12-15-conditional-operator-go/index.md new file mode 100644 index 0000000..edbd1ef --- /dev/null +++ b/content/posts/2024-12-15-conditional-operator-go/index.md @@ -0,0 +1,35 @@ +--- +categories: + - Без рубрики +date: "2024-12-15T23:47:08+03:00" +description: "" +image: 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 deleted file mode 100644 index 023e1e2..0000000 --- a/content/posts/2024-12-15-posse.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -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-15-posse/index.md b/content/posts/2024-12-15-posse/index.md new file mode 100644 index 0000000..34cc240 --- /dev/null +++ b/content/posts/2024-12-15-posse/index.md @@ -0,0 +1,81 @@ +--- +categories: + - Блог +date: "2024-12-15T22:10:46+03:00" +description: "" +image: 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-15-posse/posse_posse.webp b/content/posts/2024-12-15-posse/posse_posse.webp new file mode 100644 index 0000000..aad6230 Binary files /dev/null and b/content/posts/2024-12-15-posse/posse_posse.webp differ diff --git a/content/posts/2024-12-17-infra.md b/content/posts/2024-12-17-infra.md deleted file mode 100644 index 8998c27..0000000 --- a/content/posts/2024-12-17-infra.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -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-17-infra/index.md b/content/posts/2024-12-17-infra/index.md new file mode 100644 index 0000000..64b702c --- /dev/null +++ b/content/posts/2024-12-17-infra/index.md @@ -0,0 +1,119 @@ +--- +categories: + - Мета +date: "2024-12-17T21:07:53+03:00" +description: "" +draft: true +image: 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-17-infra/infra_cover.webp b/content/posts/2024-12-17-infra/infra_cover.webp new file mode 100644 index 0000000..c02c8be Binary files /dev/null and b/content/posts/2024-12-17-infra/infra_cover.webp differ diff --git a/content/posts/2024-12-30-irc.md b/content/posts/2024-12-30-irc.md deleted file mode 100644 index d58ecf6..0000000 --- a/content/posts/2024-12-30-irc.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -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-30-irc/index.md b/content/posts/2024-12-30-irc/index.md new file mode 100644 index 0000000..4e6086a --- /dev/null +++ b/content/posts/2024-12-30-irc/index.md @@ -0,0 +1,75 @@ +--- +categories: + - Заметка +date: "2024-12-30T14:54:08+03:00" +description: "" +draft: true +image: 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-30-irc/irc_logo.webp b/content/posts/2024-12-30-irc/irc_logo.webp new file mode 100644 index 0000000..26c4182 Binary files /dev/null and b/content/posts/2024-12-30-irc/irc_logo.webp differ diff --git a/content/posts/2024-12-31-new-year.md b/content/posts/2024-12-31-new-year.md deleted file mode 100644 index 56e2891..0000000 --- a/content/posts/2024-12-31-new-year.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -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/2024-12-31-new-year/img/1.webp b/content/posts/2024-12-31-new-year/img/1.webp new file mode 100644 index 0000000..f320b83 Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/1.webp differ diff --git a/content/posts/2024-12-31-new-year/img/2.webp b/content/posts/2024-12-31-new-year/img/2.webp new file mode 100644 index 0000000..49a1ed1 Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/2.webp differ diff --git a/content/posts/2024-12-31-new-year/img/2025.webp b/content/posts/2024-12-31-new-year/img/2025.webp new file mode 100644 index 0000000..9cc3c0b Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/2025.webp differ diff --git a/content/posts/2024-12-31-new-year/img/3.webp b/content/posts/2024-12-31-new-year/img/3.webp new file mode 100644 index 0000000..64dedc8 Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/3.webp differ diff --git a/content/posts/2024-12-31-new-year/img/4.webp b/content/posts/2024-12-31-new-year/img/4.webp new file mode 100644 index 0000000..b5af0b5 Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/4.webp differ diff --git a/content/posts/2024-12-31-new-year/img/5.webp b/content/posts/2024-12-31-new-year/img/5.webp new file mode 100644 index 0000000..86a8c2d Binary files /dev/null and b/content/posts/2024-12-31-new-year/img/5.webp differ diff --git a/content/posts/2024-12-31-new-year/index.md b/content/posts/2024-12-31-new-year/index.md new file mode 100644 index 0000000..17d08e0 --- /dev/null +++ b/content/posts/2024-12-31-new-year/index.md @@ -0,0 +1,52 @@ +--- +categories: + - Без рубрики +date: "2024-12-31T15:48:25+03:00" +description: "" +image: 2025.webp +location: Казань +tags: + - разное +title: С Новым Годом! +--- + +Ну что же, друзья, с наступающим! + +![2025 год](/posts/2024-12-31-new-year/img/2025.webp "2025") + +В этот день принято подводить итоги года. Ну и я подведу немного: + +- Поступил в институт брака. Раз уж нет классического высшего, что ещё остаётся то ;) +- В аккурат под конец года разрешились проблемы на работе. Причем разрешились + настолько удачно, что я почти что жду окончания новогоднего отпуска, чтобы + скорее начались трудовыебудни. +- Стал активно вести блог. Но всё равно не оставляет подспудное ощущение, что + уже стал надоедать этим тем, кто подписан. После каждого поста жду что кто-то + да отпишется :) Но мне нравится его вести, так что, уже не остановлюсь :) +- Ездили с новоиспеченной супругой на Кавказ. Самое яркое — посетили + обсерваторию в Нижнем Архызе. Под впечатлением, купили по приезду настоящий + телескоп! +- Начали строить свой домик в деревне. Но пока ещё до заселения далеко, вот + только окна поставили. + +Под катом приложу фоточки наиболее ярких моментов, пожалуй. + + + +- Институт брака + ![Институт брака](/posts/2024-12-31-new-year/img/1.webp "Институт брака") +- Выхожу с работы + ![Выхожу с работы](/posts/2024-12-31-new-year/img/2.webp "Выхожу с работы") +- Собаньки на Кавказе + ![Собаньки на Кавказе](/posts/2024-12-31-new-year/img/3.webp "Собаньки на Кавказе") +- Своя личная обсерватория + ![Своя личная обсерватория](/posts/2024-12-31-new-year/img/4.webp "Своя личная обсерватория") +- Домик в деревне + ![Домик в деревне](/posts/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 deleted file mode 100644 index a44e052..0000000 --- a/content/posts/2025-04-05-tabs-or-spaces.md +++ /dev/null @@ -1,400 +0,0 @@ ---- -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-04-05-tabs-or-spaces/index.md b/content/posts/2025-04-05-tabs-or-spaces/index.md new file mode 100644 index 0000000..8122e06 --- /dev/null +++ b/content/posts/2025-04-05-tabs-or-spaces/index.md @@ -0,0 +1,398 @@ +--- +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 deleted file mode 100644 index b92a308..0000000 --- a/content/posts/2025-05-19-nxpcms-2.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -date: '2025-05-19T01:00:00+03:00' -title: NXPCMS — моя CMS'ка (ч.2) ---- - -Всё же, не могу не поделиться, какое же это счастье, когда пользуешься своим же -самописным софтом! - -С одной стороны, конечно, когда видишь косячки — понимаешь, что это именно ты -продолбался, и тебе это решать. А с другой стороны, полный контроль и ты -понимаешь, _что_ пошло не так и _как_ это чинить! - -В дополнение предыдущего поста, про принципы системы, хочу добавить то, что -сознательно не буду внедрять ни теги, ни категории. Вместо этого — обычное -дерево файлов + в ближайшем плане полнотекстовый поиск по материалам сайта. -А теги мне так и так казались какой-то порочной фигнёй. - -Вот и поделился радостью. Своя CMS располагает к тому, чтобы писать сюда больше -и чаще ;) diff --git a/content/posts/2025-05-19-nxpcms-2/index.md b/content/posts/2025-05-19-nxpcms-2/index.md new file mode 100644 index 0000000..cc44c59 --- /dev/null +++ b/content/posts/2025-05-19-nxpcms-2/index.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 deleted file mode 100644 index d1d30e6..0000000 --- a/content/posts/2025-05-19-nxpcms.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -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-05-19-nxpcms/index.md b/content/posts/2025-05-19-nxpcms/index.md new file mode 100644 index 0000000..11b8d53 --- /dev/null +++ b/content/posts/2025-05-19-nxpcms/index.md @@ -0,0 +1,84 @@ +--- +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 deleted file mode 100644 index a4b6dc7..0000000 --- a/content/posts/2025-06-08-my-setup.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -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-06-08-my-setup/index.md b/content/posts/2025-06-08-my-setup/index.md new file mode 100644 index 0000000..6d99346 --- /dev/null +++ b/content/posts/2025-06-08-my-setup/index.md @@ -0,0 +1,20 @@ +--- +date: "2025-06-08T00:00:00+03:00" +tags: + - сетап + - гиковское +title: Мой сетап 2025 +--- + +Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и +LLM в последнее время. Если выйдет что интересное - напишу об этом. + +А пока хотел написать вот о чём. + +Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам +с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло +время и мне его описать. + + + +[Пост переехал в постоянный раздел](/pages/setup/) diff --git a/content/posts/2025-08-02-meshtastic.md b/content/posts/2025-08-02-meshtastic.md deleted file mode 100644 index fad4394..0000000 --- a/content/posts/2025-08-02-meshtastic.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -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-02-meshtastic/index.md b/content/posts/2025-08-02-meshtastic/index.md new file mode 100644 index 0000000..40ef5a6 --- /dev/null +++ b/content/posts/2025-08-02-meshtastic/index.md @@ -0,0 +1,66 @@ +--- +cover: /posts/2025-08-02-meshtastic/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/2025-08-02-meshtastic/tbeam.webp) + +Чехол всратоватый потому что я его печатал в наихудшем качестве, на +неотрегулированном принтере. Главное - свою задачу защиты выполняет. + +Понятное дело, что это просто игрушка и никакого практического применения у неё +нет, а в основном чате - бо́льшую часть времени сплошные «Пинг, меня слышно?». +Но! Очень забавная игрушка. И да, теоретически может позволить экстренно +связаться там, где другой сети просто нет. Просто, это не мой случай. Хотя, +недавно оказался в ситуации, когда и электричества дома не было (а с ним и +домашней сети) и одновременно была БПЛА опасность, а значит, никакущая мобильная +сеть. То есть, практически, идеальные условия для мышастика :). + +Несмотря на это, я всё же не удержался и заказал ещё два устройства, но в этот +раз попроще. Брошу один в машину, а второй или супруге отдам, или в рюкзаке +носить буду носить. Буду своими скромными силами хоть немного, да расширять сеть +своими устройствами. + +Так же ездил на стройку своего будущего дома с устройством, но, ожидаемо, там +оно сеть не увидело. Значит буду думать или о высокой антенне на крыше, или ещё +что выдумывать, чтобы из своих пердей «дотянуться» до большой городской сети. + +А к чему я про него рассказываю? А просто так. Забавная гиковская штука. diff --git a/content/posts/2025-08-02-meshtastic/tbeam.jpg b/content/posts/2025-08-02-meshtastic/tbeam.jpg new file mode 100644 index 0000000..214dc21 Binary files /dev/null and b/content/posts/2025-08-02-meshtastic/tbeam.jpg differ diff --git a/content/posts/2025-08-02-meshtastic/tbeam.webp b/content/posts/2025-08-02-meshtastic/tbeam.webp new file mode 100644 index 0000000..7e89d94 Binary files /dev/null and b/content/posts/2025-08-02-meshtastic/tbeam.webp differ diff --git a/content/posts/2025-08-05-lets-code-3d.md b/content/posts/2025-08-05-lets-code-3d.md deleted file mode 100644 index 3809861..0000000 --- a/content/posts/2025-08-05-lets-code-3d.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -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-05-lets-code-3d/1.jpg b/content/posts/2025-08-05-lets-code-3d/1.jpg new file mode 100644 index 0000000..87f41e7 Binary files /dev/null and b/content/posts/2025-08-05-lets-code-3d/1.jpg differ diff --git a/content/posts/2025-08-05-lets-code-3d/2.jpg b/content/posts/2025-08-05-lets-code-3d/2.jpg new file mode 100644 index 0000000..db14947 Binary files /dev/null and b/content/posts/2025-08-05-lets-code-3d/2.jpg differ diff --git a/content/posts/2025-08-05-lets-code-3d/3.png b/content/posts/2025-08-05-lets-code-3d/3.png new file mode 100644 index 0000000..9887043 Binary files /dev/null and b/content/posts/2025-08-05-lets-code-3d/3.png differ diff --git a/content/posts/2025-08-05-lets-code-3d/4.jpg b/content/posts/2025-08-05-lets-code-3d/4.jpg new file mode 100644 index 0000000..4e7ebc7 Binary files /dev/null and b/content/posts/2025-08-05-lets-code-3d/4.jpg differ diff --git a/content/posts/2025-08-05-lets-code-3d/index.md b/content/posts/2025-08-05-lets-code-3d/index.md new file mode 100644 index 0000000..700c666 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/index.md @@ -0,0 +1,154 @@ +--- +cover: /posts/2025-08-05-lets-code-3d/4.jpg +date: "2025-08-05T20:00:00+03:00" +tags: + - 3D печать + - гиковское +title: Давай запрограммируем деталь? +--- + +Некоторое время назад я по глупости запорол свои бокорезы, так, что для +откусывания ножек радио деталей они больше не годятся. К счастью, стоят они +совершенно не дорого, и тем же днём были заказанные новые в небезызвестном +сервисе, который в девичестве содержал в себе название моего родного города. При +получении я немного огорчился тем, что в комплекте к ним не шёл колпачок, +который был у предыдущих, хотя выглядят они идентично. + +Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот +колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть +у меня на хозяйстве. + + + +![Бокорез и родной колпачок](/posts/2025-08-05-lets-code-3d/1.jpg) Бокорезы и +колпачок + +## Проектирование + +Обычно, детали для печати проектируются в CAD программах твердотельного +моделирования. Но я в них совершенно не умею, хотя и сын +инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый +худший! Посему, я решил воспользоваться свободной программой для твердотельного +моделирования [OpenSCAD](https://openscad.org/). К счастью, в репозитории +любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он +присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём +не _рисуется_, а именно что _программируется_. Для понимания, приведу простой +пример: + +```openscad +cube([25,35,55]); / Нарисовать куб размерами 25мм х 25мм х 55мм +``` + +Просто? Очень! А учитывая что язык полноценный, с циклами и условиями +«напрограммировать» в нём можно многое. + +## Первая версия + +Вот и я не стал долго думать, открыл [мануал с +оффсайта](https://openscad.org/documentation.html), обмерил штангенциркулем +оригинальный колпачок и пошёл проектировать программировать. На всё +про всё у меня ушло где-то с полчаса. И у меня получилась первая версия +колпачка. Максимально простая и дубовая. Первая куцая версия: + +![Колпачок v1](/posts/2025-08-05-lets-code-3d/2.jpg) + +## Вторая версия + +В принципе, на этом можно было и остановиться, ведь свою функцию он выполняет. +Но у меня сработал мой перфекционист и я подумал, что было бы неплохо вырезы в +корпусе сделать один под другим, а не на одной линии, чтобы бокорез сидел ровно, +а не под углом. Потом пришла мысль, что было бы неплохо ещё и параметризировать +модель, чтобы было легко менять её размеры, а не хардкодить их. И вот получилась +вторая, и на текущий момент окончательная версия: + +![Колпачок v2 код](/posts/2025-08-05-lets-code-3d/3.png) + +И результат «в железе», то есть в пластике :) + +![Колпачок v2 результат](/posts/2025-08-05-lets-code-3d/4.jpg) + +А сам код, думаю, он достаточно понятен ([исходники](/posts/2025-08-05-lets-code-3d/source.scad) и +[STL модель](/posts/2025-08-05-lets-code-3d/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-05-lets-code-3d/lets-code-3d_result.stl b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl new file mode 100644 index 0000000..fdd4d19 Binary files /dev/null and b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_result.stl differ diff --git a/content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad b/content/posts/2025-08-05-lets-code-3d/lets-code-3d_source.scad new file mode 100644 index 0000000..b651cb3 --- /dev/null +++ b/content/posts/2025-08-05-lets-code-3d/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/2025-08-09-makeup-organizer.md b/content/posts/2025-08-09-makeup-organizer.md deleted file mode 100644 index b6a3feb..0000000 --- a/content/posts/2025-08-09-makeup-organizer.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -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-08-09-makeup-organizer/1.png b/content/posts/2025-08-09-makeup-organizer/1.png new file mode 100644 index 0000000..8f26704 Binary files /dev/null and b/content/posts/2025-08-09-makeup-organizer/1.png differ diff --git a/content/posts/2025-08-09-makeup-organizer/2.png b/content/posts/2025-08-09-makeup-organizer/2.png new file mode 100644 index 0000000..6613744 Binary files /dev/null and b/content/posts/2025-08-09-makeup-organizer/2.png differ diff --git a/content/posts/2025-08-09-makeup-organizer/3.png b/content/posts/2025-08-09-makeup-organizer/3.png new file mode 100644 index 0000000..993135e Binary files /dev/null and b/content/posts/2025-08-09-makeup-organizer/3.png differ diff --git a/content/posts/2025-08-09-makeup-organizer/index.md b/content/posts/2025-08-09-makeup-organizer/index.md new file mode 100644 index 0000000..271b37d --- /dev/null +++ b/content/posts/2025-08-09-makeup-organizer/index.md @@ -0,0 +1,38 @@ +--- +cover: /posts/2025-08-09-makeup-organizer/2.png +date: "2025-08-09T16:00:00+03:00" +tags: + - 3D печать + - гиковское +title: Ещё немного печати +--- + +Я продолжаю погружаться в печать не просто готовых моделей из интернета, что не +очень интересно, но так же и в проектирование и печать собственных изделий. +Сегодня моя любимая супруга попросила напечатать ей органайзер для косметики. +Показала референс, какой она хочет. ТЗ понятное, размеры подобрали, осталось +дело за малым — непосредственно запрограммировать изделие. + + + +На практике, это пока самое сложное по детализации изделие из всех, что я делал. +Код получился кривоватым, но рисует то, что нужно. + +Вот так результат в редакторе: + +![результат в редакторе](/posts/2025-08-09-makeup-organizer/1.png) + +А вот так в слайсере: + +![слайсер](/posts/2025-08-09-makeup-organizer/2.png) + +Ну и впервые решил добавить «клеймо мастера» со своим логотипом. Впредь, буду +добавлять его на все свои изделия, которые запроектированы именно мной. + +![клеймо мастера](/posts/2025-08-09-makeup-organizer/3.png) + +Фотографий готового изделия пока нет, ибо печататься ему ещё минимум 10 часов. +Фото я приложу позже отдельным постом ;) + +**P.S.** [архив с исходниками и готовым для печати STL +прилагаю](/posts/2025-08-09-makeup-organizer/organizer.tar.zst) diff --git a/content/posts/2025-08-09-makeup-organizer/makeup-organizer_organizer.tar.zst b/content/posts/2025-08-09-makeup-organizer/makeup-organizer_organizer.tar.zst new file mode 100644 index 0000000..7e2e2bb Binary files /dev/null and b/content/posts/2025-08-09-makeup-organizer/makeup-organizer_organizer.tar.zst differ diff --git a/content/posts/2025-09-01-travel-1.md b/content/posts/2025-09-01-travel-1.md deleted file mode 100644 index 7d86c1f..0000000 --- a/content/posts/2025-09-01-travel-1.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -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-09-01-travel-1/1.webp b/content/posts/2025-09-01-travel-1/1.webp new file mode 100644 index 0000000..bc037f2 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/1.webp differ diff --git a/content/posts/2025-09-01-travel-1/10.webp b/content/posts/2025-09-01-travel-1/10.webp new file mode 100644 index 0000000..32bb46f Binary files /dev/null and b/content/posts/2025-09-01-travel-1/10.webp differ diff --git a/content/posts/2025-09-01-travel-1/11.webp b/content/posts/2025-09-01-travel-1/11.webp new file mode 100644 index 0000000..12f0933 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/11.webp differ diff --git a/content/posts/2025-09-01-travel-1/12.webp b/content/posts/2025-09-01-travel-1/12.webp new file mode 100644 index 0000000..c797bf3 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/12.webp differ diff --git a/content/posts/2025-09-01-travel-1/13.webp b/content/posts/2025-09-01-travel-1/13.webp new file mode 100644 index 0000000..96db2e5 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/13.webp differ diff --git a/content/posts/2025-09-01-travel-1/14.webp b/content/posts/2025-09-01-travel-1/14.webp new file mode 100644 index 0000000..66a53d8 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/14.webp differ diff --git a/content/posts/2025-09-01-travel-1/15.webp b/content/posts/2025-09-01-travel-1/15.webp new file mode 100644 index 0000000..a71672b Binary files /dev/null and b/content/posts/2025-09-01-travel-1/15.webp differ diff --git a/content/posts/2025-09-01-travel-1/16.webp b/content/posts/2025-09-01-travel-1/16.webp new file mode 100644 index 0000000..e690ba3 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/16.webp differ diff --git a/content/posts/2025-09-01-travel-1/17.webp b/content/posts/2025-09-01-travel-1/17.webp new file mode 100644 index 0000000..81fa05b Binary files /dev/null and b/content/posts/2025-09-01-travel-1/17.webp differ diff --git a/content/posts/2025-09-01-travel-1/18.webp b/content/posts/2025-09-01-travel-1/18.webp new file mode 100644 index 0000000..5905999 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/18.webp differ diff --git a/content/posts/2025-09-01-travel-1/19.webp b/content/posts/2025-09-01-travel-1/19.webp new file mode 100644 index 0000000..ab80bd9 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/19.webp differ diff --git a/content/posts/2025-09-01-travel-1/2.webp b/content/posts/2025-09-01-travel-1/2.webp new file mode 100644 index 0000000..b9ecc86 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/2.webp differ diff --git a/content/posts/2025-09-01-travel-1/20.webp b/content/posts/2025-09-01-travel-1/20.webp new file mode 100644 index 0000000..1cc4e35 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/20.webp differ diff --git a/content/posts/2025-09-01-travel-1/21.webp b/content/posts/2025-09-01-travel-1/21.webp new file mode 100644 index 0000000..0f3cc2c Binary files /dev/null and b/content/posts/2025-09-01-travel-1/21.webp differ diff --git a/content/posts/2025-09-01-travel-1/22.webp b/content/posts/2025-09-01-travel-1/22.webp new file mode 100644 index 0000000..b2d032d Binary files /dev/null and b/content/posts/2025-09-01-travel-1/22.webp differ diff --git a/content/posts/2025-09-01-travel-1/23.webp b/content/posts/2025-09-01-travel-1/23.webp new file mode 100644 index 0000000..00ad3f9 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/23.webp differ diff --git a/content/posts/2025-09-01-travel-1/3.webp b/content/posts/2025-09-01-travel-1/3.webp new file mode 100644 index 0000000..37ec362 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/3.webp differ diff --git a/content/posts/2025-09-01-travel-1/4.webp b/content/posts/2025-09-01-travel-1/4.webp new file mode 100644 index 0000000..dfb29bd Binary files /dev/null and b/content/posts/2025-09-01-travel-1/4.webp differ diff --git a/content/posts/2025-09-01-travel-1/5.webp b/content/posts/2025-09-01-travel-1/5.webp new file mode 100644 index 0000000..b5e1a8f Binary files /dev/null and b/content/posts/2025-09-01-travel-1/5.webp differ diff --git a/content/posts/2025-09-01-travel-1/6.webp b/content/posts/2025-09-01-travel-1/6.webp new file mode 100644 index 0000000..6b6bbca Binary files /dev/null and b/content/posts/2025-09-01-travel-1/6.webp differ diff --git a/content/posts/2025-09-01-travel-1/7.webp b/content/posts/2025-09-01-travel-1/7.webp new file mode 100644 index 0000000..fcce61f Binary files /dev/null and b/content/posts/2025-09-01-travel-1/7.webp differ diff --git a/content/posts/2025-09-01-travel-1/8.webp b/content/posts/2025-09-01-travel-1/8.webp new file mode 100644 index 0000000..b777d4c Binary files /dev/null and b/content/posts/2025-09-01-travel-1/8.webp differ diff --git a/content/posts/2025-09-01-travel-1/9.webp b/content/posts/2025-09-01-travel-1/9.webp new file mode 100644 index 0000000..f40de11 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/9.webp differ diff --git a/content/posts/2025-09-01-travel-1/index.md b/content/posts/2025-09-01-travel-1/index.md new file mode 100644 index 0000000..0c5e499 --- /dev/null +++ b/content/posts/2025-09-01-travel-1/index.md @@ -0,0 +1,142 @@ +--- +cover: /posts/2025-09-01-travel-1/preview_1.webp +date: "2025-09-01T20:00:00+03:00" +tags: + - тревелблог +title: "Поездка по Кавказу. Часть 1: САО РАН и Аланское городище в Нижнем Архызе" +--- + +[![Дорога на +САО](/posts/2025-09-01-travel-1/preview_1.webp)](/posts/2025-09-01-travel-1/1.webp) + +## САО РАН + +Первая настоящая вылазка за этот отпуск. В этот раз мы ездили снова на [САО РАН +(Специальная Астрофизическая Обсерватория Российской Академии +Наук)](https://ru.ruwiki.ru/wiki/Специальная_астрофизическая_обсерватория_РАН) в +посёлке Нижний Архыз. В том году мы уже там бывали, но, во-первых, прикосновение +к настоящей науке вдохновляет каждый раз, и я не знаю на какой бы раз мне туда +надоело ездить. А, во-вторых, в этот раз был другой научный сотрудник, с +совершенно другой лекцией, так что, скучать не пришлось! Кстати, этот телескоп — +с самым большим в Евразии диаметром главного зеркала: аж 6 метров и весом в 42 +тонны! Высота купола — 53 метра, а высота самого телескопа в вертикальном +положении (как на фото) — более 40 метров! + +![САО РАН](/posts/2025-09-01-travel-1/saologo.png) + + + +[Место на +карте](https://yandex.ru/maps/?l=sat%2Cskl&ll=41.440447%2C43.646825&pt=41.4404472%2C43.6468250&z=14) + +Дальше — небольшой фотоотчёт и расскажу о втором месте, где побывал. + +[![Внезапная +встреча](/posts/2025-09-01-travel-1/preview_2.webp)](/posts/2025-09-01-travel-1/2.webp) + +Внезапная встреча + +[![Стадо козочек и +барашков](/posts/2025-09-01-travel-1/preview_3.webp)](/posts/2025-09-01-travel-1/3.webp) + +Стадо козочек и барашков + +[![Купол +САО](/posts/2025-09-01-travel-1/preview_4.webp)](/posts/2025-09-01-travel-1/4.webp) + +Купол САО + +[![Обсерватория +поменьше](/posts/2025-09-01-travel-1/preview_5.webp)](/posts/2025-09-01-travel-1/5.webp) + +Обсерватория поменьше + +[![Огромный +кран](/posts/2025-09-01-travel-1/preview_6.webp)](/posts/2025-09-01-travel-1/6.webp) + +Огромный кран, с помощью которого устанавливается зеркало + +[![БТА](/posts/2025-09-01-travel-1/preview_7.webp)](/posts/2025-09-01-travel-1/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/2025-09-01-travel-1/preview_8.webp)](/posts/2025-09-01-travel-1/8.webp) + +[![Изображение +9](/posts/2025-09-01-travel-1/preview_9.webp)](/posts/2025-09-01-travel-1/9.webp) + +[![Изображение +10](/posts/2025-09-01-travel-1/preview_10.webp)](/posts/2025-09-01-travel-1/10.webp) + +[![Изображение +11](/posts/2025-09-01-travel-1/preview_11.webp)](/posts/2025-09-01-travel-1/11.webp) + +[![Изображение +20](/posts/2025-09-01-travel-1/preview_20.webp)](/posts/2025-09-01-travel-1/20.webp) + +### Северный храм + +[![Изображение +17](/posts/2025-09-01-travel-1/preview_17.webp)](/posts/2025-09-01-travel-1/17.webp) + +[![Изображение +12](/posts/2025-09-01-travel-1/preview_12.webp)](/posts/2025-09-01-travel-1/12.webp) + +[![Изображение +13](/posts/2025-09-01-travel-1/preview_13.webp)](/posts/2025-09-01-travel-1/13.webp) + +[![Изображение +14](/posts/2025-09-01-travel-1/preview_14.webp)](/posts/2025-09-01-travel-1/14.webp) + +[![Изображение +15](/posts/2025-09-01-travel-1/preview_15.webp)](/posts/2025-09-01-travel-1/15.webp) + +[![Изображение +16](/posts/2025-09-01-travel-1/preview_16.webp)](/posts/2025-09-01-travel-1/16.webp) + +### Солярный круг + +[![Изображение +18](/posts/2025-09-01-travel-1/preview_18.webp)](/posts/2025-09-01-travel-1/18.webp) + +[![Изображение +19](/posts/2025-09-01-travel-1/preview_19.webp)](/posts/2025-09-01-travel-1/19.webp) + +### Половецкая баба + +[![Изображение +21](/posts/2025-09-01-travel-1/preview_21.webp)](/posts/2025-09-01-travel-1/21.webp) + +[![Изображение +22](/posts/2025-09-01-travel-1/preview_22.webp)](/posts/2025-09-01-travel-1/22.webp) + +[![Изображение +23](/posts/2025-09-01-travel-1/preview_23.webp)](/posts/2025-09-01-travel-1/23.webp) + +Продолжение поездки следует... diff --git a/content/posts/2025-09-01-travel-1/preview_1.webp b/content/posts/2025-09-01-travel-1/preview_1.webp new file mode 100644 index 0000000..c18dc0c Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_1.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_10.webp b/content/posts/2025-09-01-travel-1/preview_10.webp new file mode 100644 index 0000000..4d23293 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_10.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_11.webp b/content/posts/2025-09-01-travel-1/preview_11.webp new file mode 100644 index 0000000..07e38b6 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_11.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_12.webp b/content/posts/2025-09-01-travel-1/preview_12.webp new file mode 100644 index 0000000..7a23c41 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_12.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_13.webp b/content/posts/2025-09-01-travel-1/preview_13.webp new file mode 100644 index 0000000..953fac9 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_13.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_14.webp b/content/posts/2025-09-01-travel-1/preview_14.webp new file mode 100644 index 0000000..08cb032 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_14.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_15.webp b/content/posts/2025-09-01-travel-1/preview_15.webp new file mode 100644 index 0000000..627702d Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_15.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_16.webp b/content/posts/2025-09-01-travel-1/preview_16.webp new file mode 100644 index 0000000..2bfa651 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_16.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_17.webp b/content/posts/2025-09-01-travel-1/preview_17.webp new file mode 100644 index 0000000..814ace2 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_17.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_18.webp b/content/posts/2025-09-01-travel-1/preview_18.webp new file mode 100644 index 0000000..82422a8 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_18.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_19.webp b/content/posts/2025-09-01-travel-1/preview_19.webp new file mode 100644 index 0000000..b234b0c Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_19.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_2.webp b/content/posts/2025-09-01-travel-1/preview_2.webp new file mode 100644 index 0000000..c730b03 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_2.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_20.webp b/content/posts/2025-09-01-travel-1/preview_20.webp new file mode 100644 index 0000000..266a83e Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_20.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_21.webp b/content/posts/2025-09-01-travel-1/preview_21.webp new file mode 100644 index 0000000..3cab02c Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_21.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_22.webp b/content/posts/2025-09-01-travel-1/preview_22.webp new file mode 100644 index 0000000..5530efa Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_22.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_23.webp b/content/posts/2025-09-01-travel-1/preview_23.webp new file mode 100644 index 0000000..aca8d32 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_23.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_3.webp b/content/posts/2025-09-01-travel-1/preview_3.webp new file mode 100644 index 0000000..511e4c4 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_3.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_4.webp b/content/posts/2025-09-01-travel-1/preview_4.webp new file mode 100644 index 0000000..bfbe20e Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_4.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_5.webp b/content/posts/2025-09-01-travel-1/preview_5.webp new file mode 100644 index 0000000..5d5811d Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_5.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_6.webp b/content/posts/2025-09-01-travel-1/preview_6.webp new file mode 100644 index 0000000..076e35b Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_6.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_7.webp b/content/posts/2025-09-01-travel-1/preview_7.webp new file mode 100644 index 0000000..02cd89a Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_7.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_8.webp b/content/posts/2025-09-01-travel-1/preview_8.webp new file mode 100644 index 0000000..4c87281 Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_8.webp differ diff --git a/content/posts/2025-09-01-travel-1/preview_9.webp b/content/posts/2025-09-01-travel-1/preview_9.webp new file mode 100644 index 0000000..3791fbb Binary files /dev/null and b/content/posts/2025-09-01-travel-1/preview_9.webp differ diff --git a/content/posts/2025-09-01-travel-1/saologo.png b/content/posts/2025-09-01-travel-1/saologo.png new file mode 100644 index 0000000..3fceeeb Binary files /dev/null and b/content/posts/2025-09-01-travel-1/saologo.png differ diff --git a/content/posts/2025-10-06-ai.md b/content/posts/2025-10-06-ai.md deleted file mode 100644 index d6b30e0..0000000 --- a/content/posts/2025-10-06-ai.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -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-06-ai/hype_curve.png b/content/posts/2025-10-06-ai/hype_curve.png new file mode 100644 index 0000000..9147d5e Binary files /dev/null and b/content/posts/2025-10-06-ai/hype_curve.png differ diff --git a/content/posts/2025-10-06-ai/index.md b/content/posts/2025-10-06-ai/index.md new file mode 100644 index 0000000..fe9f933 --- /dev/null +++ b/content/posts/2025-10-06-ai/index.md @@ -0,0 +1,124 @@ +--- +cover: /posts/2025-10-06-ai/hype_curve.png +date: "2025-10-06T22:00:00Z" +tags: + - размышления + - разное + - ИИ +title: Размышления о будущем ИИ +--- + +Немного моих размышлений про будущее ИИ как технологии, а не философии. + +Как водится, когда речь о размышлениях — буду сначала вводить тезисы, а потом, +синтез. + + + +# Тезис первый + +Хоть сам и не пользуюсь таким инструментом, как Cursor из третьих рук я узнал, +что там не просто внутри нейронка, а целый их ансамбль. Более того, что главное, +там есть автовыбор того, какая именно БЯМ (большая языковая модель) будет +отвечать за конкретный запрос. И вот этот момент меня заинтересовал. Я +задумался, как именно это может быть реализовано. Первая мысль, как самая +очевидная была в том, что внутри помимо больших моделей, есть и маленькая, +единственная функция которой (а может и не единственная, но, значит, основная) — +классифицировать запрос (окей, промпт) по тому, какая из больших моделей возьмёт +работу на себя. + +Мысль эта мне показалась немного диковатой, т.к. показалось, что это несколько +пушкой по воробьям, и подумал, что может есть другое, более классическое, +алгоритмическое решение. Думал-думал, ничего хорошего в голову не пришло. +Поэтому всё же взял за рабочую гипотезу, что таки да, классифицирует маленькая и +дешевая моделька. Маленькая и дешёвая да, но точно не локальная. Ведь даже для +маленьких моделек нужны определённые мощности, которые есть далеко не у всех. + +И вот здесь-то мысль и полетела дальше! Представилось что в будущем всё больше и +больше «классические» алгоритмические задачи будут «закрывать» нейронками там +где надо и не надо. Чем-то напоминает ситуацию в электронике, когда экономически +часто более целесообразно не придумывать схему на элементарных радиодеталях, а +воткнуть просто унифицированный микроконтроллер, который с правильной прошивкой +заменяет целую кучку рассыпухи. + +Но продолжение мысли пока попридержу. А пока... + +# Тезис второй + +Я человек молодой, но более менее успел застать такой интересный переферийный +девайс, как [математический +сопроцессор](https://ru.ruwiki.ru/wiki/Математический_сопроцессор). Назначение +устройства — позволять компьютеру выполнять операции над вещественными числами. +Представляете, когда-то процессоры такие операции сами не умели выполнять! Но +надо делать скидку на время и то, что такие операции были, наверное, не всем +нужными, а скорее уделом специалистов, которые знали зачем им эта железка и +целенаправленно её докупали. Сейчас любой, даже самый слабейший процессор имеет +этот сопроцессор внутри себя. + +Ничего не напоминает? + +Нейронки и видеокарты! + +А вот сейчас, соединим тезисы и придём к ... + +# Синтез + +Нейронки, однозначно, вошли в нашу жизнь уже на долго. + +![Кривая хайпа](/posts/2025-10-06-ai/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 deleted file mode 100644 index 2a67127..0000000 --- a/content/posts/2025-10-11-blog.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -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-11-blog/index.md b/content/posts/2025-10-11-blog/index.md new file mode 100644 index 0000000..5c59713 --- /dev/null +++ b/content/posts/2025-10-11-blog/index.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 deleted file mode 100644 index b8dff9f..0000000 --- a/content/posts/2025-10-18-the-ghost-in-the-machine.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -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-10-18-the-ghost-in-the-machine/index.md b/content/posts/2025-10-18-the-ghost-in-the-machine/index.md new file mode 100644 index 0000000..01da22e --- /dev/null +++ b/content/posts/2025-10-18-the-ghost-in-the-machine/index.md @@ -0,0 +1,184 @@ +--- +cover: /posts/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg +date: "2025-10-18" +tags: + - книги + - размышления + - не_моё + - ИИ +title: Душа в машине +--- + +Станислав Лем + +![Небольшая отсылка](/posts/2025-10-18-the-ghost-in-the-machine/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-10-18-the-ghost-in-the-machine/laughing-man.jpeg b/content/posts/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg new file mode 100644 index 0000000..652603c Binary files /dev/null and b/content/posts/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg differ diff --git a/content/posts/2025-11-03-blog-deploy.md b/content/posts/2025-11-03-blog-deploy.md deleted file mode 100644 index 2b394d6..0000000 --- a/content/posts/2025-11-03-blog-deploy.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -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-blog-deploy/index.md b/content/posts/2025-11-03-blog-deploy/index.md new file mode 100644 index 0000000..a23ba91 --- /dev/null +++ b/content/posts/2025-11-03-blog-deploy/index.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 deleted file mode 100644 index a375155..0000000 --- a/content/posts/2025-11-03-my-setup.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -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-03-my-setup/index.md b/content/posts/2025-11-03-my-setup/index.md new file mode 100644 index 0000000..a4b6dc7 --- /dev/null +++ b/content/posts/2025-11-03-my-setup/index.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-11-04-blog-deploy-2.md b/content/posts/2025-11-04-blog-deploy-2.md deleted file mode 100644 index b692d94..0000000 --- a/content/posts/2025-11-04-blog-deploy-2.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -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 < + +Обновлённые скрипты: + +~/.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-09-migration/index.md b/content/posts/2025-11-09-migration/index.md new file mode 100644 index 0000000..aec1df0 --- /dev/null +++ b/content/posts/2025-11-09-migration/index.md @@ -0,0 +1,55 @@ +--- +comments: true +date: '2025-11-09' +tags: +- блог +- разное +title: Переезд? +--- + +В последнее время всё больше и больше думаю, что у меня перебор серверных +мощностей. Да и софтовое хозяйство там немного в бардаке по историческим +причинам. Есть желание капитально прибраться. + + + +Сейчас у меня основная железка на хозяйстве это 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 deleted file mode 100644 index 95b54ee..0000000 --- a/content/posts/2025-11-23-org.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -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-11-23-org/index.md b/content/posts/2025-11-23-org/index.md new file mode 100644 index 0000000..481b9f6 --- /dev/null +++ b/content/posts/2025-11-23-org/index.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 deleted file mode 100644 index f38fa36..0000000 --- a/content/posts/2025-12-02-httpsocalypse.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -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-02-httpsocalypse/index.md b/content/posts/2025-12-02-httpsocalypse/index.md new file mode 100644 index 0000000..c90a16c --- /dev/null +++ b/content/posts/2025-12-02-httpsocalypse/index.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 deleted file mode 100644 index 6a7428c..0000000 --- a/content/posts/2025-12-21-sicktech.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -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-21-sicktech/files/img1.jpg b/content/posts/2025-12-21-sicktech/files/img1.jpg new file mode 100644 index 0000000..2dd29f9 Binary files /dev/null and b/content/posts/2025-12-21-sicktech/files/img1.jpg differ diff --git a/content/posts/2025-12-21-sicktech/files/img2.jpg b/content/posts/2025-12-21-sicktech/files/img2.jpg new file mode 100644 index 0000000..0ea8467 Binary files /dev/null and b/content/posts/2025-12-21-sicktech/files/img2.jpg differ diff --git a/content/posts/2025-12-21-sicktech/files/img3.png b/content/posts/2025-12-21-sicktech/files/img3.png new file mode 100644 index 0000000..3e41caf Binary files /dev/null and b/content/posts/2025-12-21-sicktech/files/img3.png differ diff --git a/content/posts/2025-12-21-sicktech/files/sicktech.png b/content/posts/2025-12-21-sicktech/files/sicktech.png new file mode 100644 index 0000000..32c7b9f Binary files /dev/null and b/content/posts/2025-12-21-sicktech/files/sicktech.png differ diff --git a/content/posts/2025-12-21-sicktech/index.md b/content/posts/2025-12-21-sicktech/index.md new file mode 100644 index 0000000..78ee618 --- /dev/null +++ b/content/posts/2025-12-21-sicktech/index.md @@ -0,0 +1,228 @@ +--- +comments: true +cover: /posts/2025-12-21-sicktech/files/sicktech.png +date: "2025-12-21T18:40:26+03:00" +tags: + - it + - размышления + - sicktech + - лонгрид +title: Про здоровые и нездоровые технологии +--- + +Я заметил, что часто стал в речи употреблять словосочетания «здоровая +технология» или «нездоровая технология». Но при этом, я не задумывался о том, а +что же именно это для меня значит, и как определить что есть здоровая, а что +нездоровая технология. Я классифицировал исключительно интуитивно, исходя из +принципа «я так чувствую». + +Но раз есть классификация, то должны быть и критерии. Так? Так. И критерии я +опираясь на собственное ощущение, вроде как, нашёл. + + + +# Критерии + +Не буду сильно уходить в сторону, для меня основные критерий «здоровости» — то, +предполагает ли технология сохранение у пользователя контроля над ней. Даже +можно сказать более витиевато — превращает ли технология пользователя в +потребителя? + +Это был первый критерий. И он же главный. Из него вытекают уже такие критерии +как потенциальная познаваемость, ремонтопригодность, и даже, внезапно, +надёжность и долговечность. + +# Примеры + +Пройдёмся немного по примерам. Начнём с «нездоровых» технологий и конкретных +примеров. + +## Трактора John Deere + +![Трактор John Deere](/posts/2025-12-21-sicktech/files/img1.jpg) + +Это достаточно известная история, про то, как производитель напрямую влияет на +то, как пользователь пользуется своей собственностью. А именно, запрещал +самостоятельный ремонт тракторов своего производства своим клиентом, кроме как с +помощью «сертифицированного» специалиста. Здесь буквально прослеживается +критерий превращения пользователя из обладателя собственности в потребителя в +некотором роде услуги «владения трактором». Когда ты вроде и заплатил за него +полную стоимость, но владеешь им на пол шишечки, ведь ты не имеешь права +распоряжаться им так, как ты хочешь (например, самостоятельно ремонтировать, раз +у тебя подходящая квалификация). Притом, что фермеры, в большинстве своём, или +достаточно квалифицированны или могли бы найти такого квалифицированного +человека поблизости, а не ждать дни, пока до них доберётся специалист и починит. + +[Подробная история](https://habr.com/ru/companies/itelma/articles/477638/) + +## Машины для мороженного в McDonalds + +![та самая мороженница](/posts/2025-12-21-sicktech/files/img2.jpg) + +Здесь примерно та же история, только чуть больше налёта монополии. Краткая суть +в том, что владелец франшизы McDonalds принуждал своих франчайзи закупать +исключительно конкретные машины конкретного производителя. Всё было бы не так +плохо, если бы эти машины регулярно не ломались, а обслуживать их мог опять таки +«сертифицированный» техник. Опять таки пользователь превращался в бесправного +потребителя. Причём, можно было бы сказать, что это же хорошо, ведь пользователь +только что-то сломает, но не сделает хорошо. Этот аргумент ломается об то, что +как раз таки для этих машин предприимчивая пара людей начала производить +устройство, которое делает этим машинам «jail-break» который затем позволял +успешно чинить и эксплуатировать автоматы дальше. И ничего страшного не +произошло! Во всяком случае, именно для пользователей. Производителю, конечно +же, это не понравилось. И да, суды, давление монополиста и всё как мы любим. + +[Подробная история](https://habr.com/ru/articles/557746/) + +## BMW и некоторые другие автоконцерны + +![Подогрев по подписке](/posts/2025-12-21-sicktech/files/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 deleted file mode 100644 index 9a82612..0000000 --- a/content/posts/2025-12-23-comments.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -comments: true -date: '2025-12-23T21:22:57+03:00' -tags: -- блог -title: Появились комментарии в блоге ---- - -Наконец-то сделал комментарии в этом блоге. Да, максимально по гиковски. Просто -через отправку e-mail на адрес специального бота. Потом, для удобства наверное -придумаю и другим способом. А может и так оставлю, ведь e-mail самый лучший и -самый универсальный способ связи, как ни крути. diff --git a/content/posts/2025-12-23-comments/index.md b/content/posts/2025-12-23-comments/index.md new file mode 100644 index 0000000..9a82612 --- /dev/null +++ b/content/posts/2025-12-23-comments/index.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 deleted file mode 100644 index a4011d3..0000000 --- a/content/posts/2025-12-24-email.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -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-24-email/index.md b/content/posts/2025-12-24-email/index.md new file mode 100644 index 0000000..174c268 --- /dev/null +++ b/content/posts/2025-12-24-email/index.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/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 deleted file mode 100644 index 1c9881c..0000000 --- a/content/posts/2025-12-27-osm.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -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-27-osm/files/photo.jpg b/content/posts/2025-12-27-osm/files/photo.jpg new file mode 100644 index 0000000..ae1a7eb Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_1.jpg b/content/posts/2025-12-27-osm/files/photo_1.jpg new file mode 100644 index 0000000..7d3df90 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_1.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_10.jpg b/content/posts/2025-12-27-osm/files/photo_10.jpg new file mode 100644 index 0000000..ee69188 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_10.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_11.jpg b/content/posts/2025-12-27-osm/files/photo_11.jpg new file mode 100644 index 0000000..72c288f Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_11.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_12.jpg b/content/posts/2025-12-27-osm/files/photo_12.jpg new file mode 100644 index 0000000..8bbd32c Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_12.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_13.jpg b/content/posts/2025-12-27-osm/files/photo_13.jpg new file mode 100644 index 0000000..1608d5b Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_13.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_14.jpg b/content/posts/2025-12-27-osm/files/photo_14.jpg new file mode 100644 index 0000000..5cab91a Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_14.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_2.jpg b/content/posts/2025-12-27-osm/files/photo_2.jpg new file mode 100644 index 0000000..870578b Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_2.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_3.jpg b/content/posts/2025-12-27-osm/files/photo_3.jpg new file mode 100644 index 0000000..44b2637 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_3.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_4.jpg b/content/posts/2025-12-27-osm/files/photo_4.jpg new file mode 100644 index 0000000..462b1bc Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_4.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_5.jpg b/content/posts/2025-12-27-osm/files/photo_5.jpg new file mode 100644 index 0000000..4c9d1d6 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_5.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_6.jpg b/content/posts/2025-12-27-osm/files/photo_6.jpg new file mode 100644 index 0000000..9ad1280 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_6.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_7.jpg b/content/posts/2025-12-27-osm/files/photo_7.jpg new file mode 100644 index 0000000..7054792 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_7.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_8.jpg b/content/posts/2025-12-27-osm/files/photo_8.jpg new file mode 100644 index 0000000..edd7f59 Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_8.jpg differ diff --git a/content/posts/2025-12-27-osm/files/photo_9.jpg b/content/posts/2025-12-27-osm/files/photo_9.jpg new file mode 100644 index 0000000..859bade Binary files /dev/null and b/content/posts/2025-12-27-osm/files/photo_9.jpg differ diff --git a/content/posts/2025-12-27-osm/index.md b/content/posts/2025-12-27-osm/index.md new file mode 100644 index 0000000..48955a8 --- /dev/null +++ b/content/posts/2025-12-27-osm/index.md @@ -0,0 +1,40 @@ +--- +comments: true +cover: /posts/2025-12-27-osm/files/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/2025-12-27-osm/files/photo.jpg)](/posts/2025-12-27-osm/files/photo.jpg) + +## Прогулка + +[![Прогулка](/posts/2025-12-27-osm/files/photo_1.jpg)](/posts/2025-12-27-osm/files/photo_1.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_2.jpg)](/posts/2025-12-27-osm/files/photo_2.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_3.jpg)](/posts/2025-12-27-osm/files/photo_3.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_4.jpg)](/posts/2025-12-27-osm/files/photo_4.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_5.jpg)](/posts/2025-12-27-osm/files/photo_5.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_6.jpg)](/posts/2025-12-27-osm/files/photo_6.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_7.jpg)](/posts/2025-12-27-osm/files/photo_7.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_8.jpg)](/posts/2025-12-27-osm/files/photo_8.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_9.jpg)](/posts/2025-12-27-osm/files/photo_9.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_10.jpg)](/posts/2025-12-27-osm/files/photo_10.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_11.jpg)](/posts/2025-12-27-osm/files/photo_11.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_12.jpg)](/posts/2025-12-27-osm/files/photo_12.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_13.jpg)](/posts/2025-12-27-osm/files/photo_13.jpg) +[![Прогулка](/posts/2025-12-27-osm/files/photo_14.jpg)](/posts/2025-12-27-osm/files/photo_14.jpg) diff --git a/content/posts/2025-12-28-philharmonic-park.md b/content/posts/2025-12-28-philharmonic-park.md deleted file mode 100644 index c692ecc..0000000 --- a/content/posts/2025-12-28-philharmonic-park.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -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-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..7768b6e Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_1_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_1_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..369d229 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_1_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..35e1cd5 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..ccb1005 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..066be5c Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..ccab7b5 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.png b/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.png new file mode 100644 index 0000000..de29bfb Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.png differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..71aebf0 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..f9ef2da Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..381faff Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.png b/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.png new file mode 100644 index 0000000..00eddcc Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.png differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..f9e8a43 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.png b/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.png new file mode 100644 index 0000000..a01eae9 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.png differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..302bb88 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg b/content/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg new file mode 100644 index 0000000..3c6b8f1 Binary files /dev/null and b/content/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg differ diff --git a/content/posts/2025-12-28-philharmonic-park/index.md b/content/posts/2025-12-28-philharmonic-park/index.md new file mode 100644 index 0000000..03b397d --- /dev/null +++ b/content/posts/2025-12-28-philharmonic-park/index.md @@ -0,0 +1,32 @@ +--- +comments: true +cover: /posts/2025-12-28-philharmonic-park/photo_1_2025-12-28_21-35-40.jpg +date: "2025-12-28T21:37:44+03:00" +tags: + - прогулки +title: Прогулка в сквере филармонии +--- + +Вчера [гуляли с супругой на +набережной](https://neonxp.ru/posts/osm/), а сегодня чисто случайно +решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только +создавало больше уюта и ламповости этому хорошо украшенному скверику. К +сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но +продрогли сильно, т.к. гулять изначально не планировали и не были одеты +соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :) + +Как водится, дальше будет немного фотографий :) + + + +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.png) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.png) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg) +[![Прогулка](/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg)](/posts/2025-12-28-philharmonic-park/files/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 deleted file mode 100644 index 76916b2..0000000 --- a/content/posts/2025-12-29-newyear-excel.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -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-29-newyear-excel/files/cover.png b/content/posts/2025-12-29-newyear-excel/files/cover.png new file mode 100644 index 0000000..ae331d5 Binary files /dev/null and b/content/posts/2025-12-29-newyear-excel/files/cover.png differ diff --git a/content/posts/2025-12-29-newyear-excel/files/cover1.png b/content/posts/2025-12-29-newyear-excel/files/cover1.png new file mode 100644 index 0000000..b252f6e Binary files /dev/null and b/content/posts/2025-12-29-newyear-excel/files/cover1.png differ diff --git a/content/posts/2025-12-29-newyear-excel/files/new_year.ods b/content/posts/2025-12-29-newyear-excel/files/new_year.ods new file mode 100644 index 0000000..2d8aad2 Binary files /dev/null and b/content/posts/2025-12-29-newyear-excel/files/new_year.ods differ diff --git a/content/posts/2025-12-29-newyear-excel/files/new_year.xlsx b/content/posts/2025-12-29-newyear-excel/files/new_year.xlsx new file mode 100644 index 0000000..ca4469c Binary files /dev/null and b/content/posts/2025-12-29-newyear-excel/files/new_year.xlsx differ diff --git a/content/posts/2025-12-29-newyear-excel/index.md b/content/posts/2025-12-29-newyear-excel/index.md new file mode 100644 index 0000000..31a9240 --- /dev/null +++ b/content/posts/2025-12-29-newyear-excel/index.md @@ -0,0 +1,22 @@ +--- +comments: true +cover: /posts/2025-12-29-newyear-excel/cover1.png +date: "2025-12-29T11:47:14+03:00" +tags: + - разное +title: Новогодний Excel +--- + +По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного +предновогоднего офискора вам. Открываем в Excel или в LibreOffice +соответствующий файл и жмём несколько раз клавишу F9. + +Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно. + +- [Версия для MS Excel](/posts/2025-12-29-newyear-excel/files/new_year.xlsx) +- [Версия для LibreOffice + Calc](/posts/2025-12-29-newyear-excel/files/new_year.ods) +- [Онлайн версия в Документах + Mail.Ru](https://cloud.mail.ru/public/SF1M/ob3EeqtNF) + +![Результат](/posts/2025-12-29-newyear-excel/files/cover.png) diff --git a/content/posts/2025-12-31-new-year.md b/content/posts/2025-12-31-new-year.md deleted file mode 100644 index 7a3c3b0..0000000 --- a/content/posts/2025-12-31-new-year.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -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-new-year/index.md b/content/posts/2025-12-31-new-year/index.md new file mode 100644 index 0000000..c1554a7 --- /dev/null +++ b/content/posts/2025-12-31-new-year/index.md @@ -0,0 +1,28 @@ +--- +comments: true +cover: /posts/2025-12-31-new-year/photo_31_2025-12-28_21-35-40.jpg +date: "2025-12-31T15:27:17+03:00" +tags: + - разное +title: С Новым Годом! +--- + +С наступающим Новым Годом! + +![2026](/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.png) + +Предыдущий год был весьма и весьма разным. Было и хорошее и плохое. Отчёт по +году как в [прошлом году](/posts/new-year/) делать не буду. Честно +говоря, нет особо моральных сил на это. + + + +Уходящий год для меня стал годом чередования работы и семейных забот. В целом, +всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем +желаю! + +А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды +обходили ваш дом стороной. + +А пока, отправляюсь резать салатики и заниматься прочими домашними заботами, не +всё же у компьютера сидеть :) diff --git a/content/posts/2025-12-31-qchat.md b/content/posts/2025-12-31-qchat.md deleted file mode 100644 index 8344933..0000000 --- a/content/posts/2025-12-31-qchat.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -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/2025-12-31-qchat/index.md b/content/posts/2025-12-31-qchat/index.md new file mode 100644 index 0000000..54486ac --- /dev/null +++ b/content/posts/2025-12-31-qchat/index.md @@ -0,0 +1,45 @@ +--- +date: "2025-12-31T14:55:45+03:00" +title: qChat — чатик поверх SSH +tags: + - гиковское + - IT +--- + +Для собственного интереса написал на 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/2026-02-01-grouper/grouper.png b/content/posts/2026-02-01-grouper/grouper.png new file mode 100644 index 0000000..6f5053d Binary files /dev/null and b/content/posts/2026-02-01-grouper/grouper.png differ diff --git a/content/posts/2026-02-01-grouper/index.md b/content/posts/2026-02-01-grouper/index.md new file mode 100644 index 0000000..519277f --- /dev/null +++ b/content/posts/2026-02-01-grouper/index.md @@ -0,0 +1,44 @@ +--- +date: "2026-02-01T22:26:32+03:00" +title: Моё первое дополнение для Firefox +tags: + - гиковское + - IT +--- + +Буквально только что пришло письмо, что наконец-то опубликовано публично моё +первое расширение для Firefox! + +Без долгих разгонов, вот ссылка: +https://addons.mozilla.org/ru/firefox/addon/groupper/ + +И, конечно же, исходники: https://gitrepo.ru/NeonXP/Grouper + +А теперь немного про то, что это за расширение: это расширение для Firefox для +автоматической группировки вкладок по группам на базе доменного имени сайта. При +этом домен преобразуется в имя вкладки по следующим правилам: + +1. Домен делится по точкам +2. Отсекается домен 1 уровня (.ru, .com, .net и т.п.) +3. Если самый верхний уровень домена — www, то он так же отсекается, как не + информативная часть +4. Оставшееся преобразуется в Title Case (то есть первая буква каждого слова + становится заглавной) + +Таким образом, например, все страницы домена `www.some.site.ru` сгруппируются +автоматически в группу `Some Site`. + +И вот так это выглядит у меня: + +![grouper](/posts/2026-02-01-grouper/grouper.png) + +Да, подобных расширений более одного, но мне хотелось именно эти правила по +формированию имен групп. В других расширениях или использовался только домен +второго уровня, или были другие неудобности. Например, все группы были одного +цвета, а хотелось бы автоматически разного, чтобы визуально различались, или ещё +какие шороховатости. Я не говорю, что у меня идеально, но оно идеально для _меня_! + +Отдельно, хотел бы отметить его простоту. Оно делает только то что написано +выше, никаких треккингов, реклам или прочего мусора! Более того, js код никак не +обфусцирован, соответственно, любой может убедиться в этом сам. Да да, в +современном мире, это скорее особенность, чем само собой разумеющееся. diff --git a/content/posts/files/2021-02-13-jsonnet_logo.webp b/content/posts/files/2021-02-13-jsonnet_logo.webp deleted file mode 100644 index 45c63a6..0000000 Binary files a/content/posts/files/2021-02-13-jsonnet_logo.webp and /dev/null differ diff --git a/content/posts/files/2024-07-13-joplin_joplin.webp b/content/posts/files/2024-07-13-joplin_joplin.webp deleted file mode 100644 index 33326b7..0000000 Binary files a/content/posts/files/2024-07-13-joplin_joplin.webp and /dev/null 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" deleted file mode 100644 index e142633..0000000 Binary files "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" and /dev/null 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" deleted file mode 100644 index b4d9ce9..0000000 Binary files "a/content/posts/files/2024-10-17-\320\272\320\275\320\270\320\263\320\270-2_Rama16wiki.webp" and /dev/null 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 deleted file mode 100644 index d5c747a..0000000 Binary files a/content/posts/files/2024-11-17-obsidian_img/logo.webp and /dev/null 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 deleted file mode 100644 index f8add88..0000000 Binary files a/content/posts/files/2024-11-17-obsidian_img/publish.webp and /dev/null 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 deleted file mode 100644 index facdd86..0000000 Binary files a/content/posts/files/2024-11-17-obsidian_img/templater.webp and /dev/null 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 deleted file mode 100644 index 948d808..0000000 Binary files a/content/posts/files/2024-11-27-hyperlocality_img/90e.webp and /dev/null 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 deleted file mode 100644 index 965e145..0000000 Binary files a/content/posts/files/2024-11-27-hyperlocality_img/braindance.webp and /dev/null 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 deleted file mode 100644 index a07d8ed..0000000 Binary files a/content/posts/files/2024-11-27-hyperlocality_img/camp.webp and /dev/null 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 deleted file mode 100644 index 56d8c50..0000000 Binary files a/content/posts/files/2024-11-27-hyperlocality_img/in-internet.webp and /dev/null differ diff --git a/content/posts/files/2024-11-29-hobbies_dozor.webp b/content/posts/files/2024-11-29-hobbies_dozor.webp deleted file mode 100644 index eab9913..0000000 Binary files a/content/posts/files/2024-11-29-hobbies_dozor.webp and /dev/null differ diff --git a/content/posts/files/2024-12-12-guessr_logo.webp b/content/posts/files/2024-12-12-guessr_logo.webp deleted file mode 100644 index 3a414cd..0000000 Binary files a/content/posts/files/2024-12-12-guessr_logo.webp and /dev/null 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 deleted file mode 100644 index 5eeea58..0000000 Binary files a/content/posts/files/2024-12-15-conditional-operator-go_ternary.webp and /dev/null differ diff --git a/content/posts/files/2024-12-15-posse_posse.webp b/content/posts/files/2024-12-15-posse_posse.webp deleted file mode 100644 index aad6230..0000000 Binary files a/content/posts/files/2024-12-15-posse_posse.webp and /dev/null differ diff --git a/content/posts/files/2024-12-17-infra_cover.webp b/content/posts/files/2024-12-17-infra_cover.webp deleted file mode 100644 index c02c8be..0000000 Binary files a/content/posts/files/2024-12-17-infra_cover.webp and /dev/null differ diff --git a/content/posts/files/2024-12-30-irc_logo.webp b/content/posts/files/2024-12-30-irc_logo.webp deleted file mode 100644 index 26c4182..0000000 Binary files a/content/posts/files/2024-12-30-irc_logo.webp and /dev/null 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 deleted file mode 100644 index f320b83..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/1.webp and /dev/null 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 deleted file mode 100644 index 49a1ed1..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/2.webp and /dev/null 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 deleted file mode 100644 index 9cc3c0b..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/2025.webp and /dev/null 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 deleted file mode 100644 index 64dedc8..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/3.webp and /dev/null 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 deleted file mode 100644 index b5af0b5..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/4.webp and /dev/null 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 deleted file mode 100644 index 86a8c2d..0000000 Binary files a/content/posts/files/2024-12-31-new-year_img/5.webp and /dev/null differ diff --git a/content/posts/files/2025-12-21-img1.jpg b/content/posts/files/2025-12-21-img1.jpg deleted file mode 100644 index 2dd29f9..0000000 Binary files a/content/posts/files/2025-12-21-img1.jpg and /dev/null differ diff --git a/content/posts/files/2025-12-21-img2.jpg b/content/posts/files/2025-12-21-img2.jpg deleted file mode 100644 index 0ea8467..0000000 Binary files a/content/posts/files/2025-12-21-img2.jpg and /dev/null differ diff --git a/content/posts/files/2025-12-21-img3.png b/content/posts/files/2025-12-21-img3.png deleted file mode 100644 index 3e41caf..0000000 Binary files a/content/posts/files/2025-12-21-img3.png and /dev/null differ diff --git a/content/posts/files/2025-12-21-sicktech.png b/content/posts/files/2025-12-21-sicktech.png deleted file mode 100644 index 32c7b9f..0000000 Binary files a/content/posts/files/2025-12-21-sicktech.png and /dev/null 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 deleted file mode 100644 index 4ea3f89..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo.jpg and /dev/null 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 deleted file mode 100644 index d14ed56..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_1.jpg and /dev/null 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 deleted file mode 100644 index 66a5727..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_10.jpg and /dev/null 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 deleted file mode 100644 index aed7c5b..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_11.jpg and /dev/null 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 deleted file mode 100644 index b78b33b..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_12.jpg and /dev/null 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 deleted file mode 100644 index 6bb6bd0..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_13.jpg and /dev/null 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 deleted file mode 100644 index 806471f..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_14.jpg and /dev/null 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 deleted file mode 100644 index d4f788a..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_2.jpg and /dev/null 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 deleted file mode 100644 index 74ef585..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_3.jpg and /dev/null 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 deleted file mode 100644 index ea5a5d0..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_4.jpg and /dev/null 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 deleted file mode 100644 index 462b570..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_5.jpg and /dev/null 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 deleted file mode 100644 index 253af73..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_6.jpg and /dev/null 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 deleted file mode 100644 index cd92319..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_7.jpg and /dev/null 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 deleted file mode 100644 index bebc4b3..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_8.jpg and /dev/null 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 deleted file mode 100644 index 8e4358b..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/photo_9.jpg and /dev/null 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 deleted file mode 100644 index ae1a7eb..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo.jpg and /dev/null 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 deleted file mode 100644 index 7d3df90..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_1.jpg and /dev/null 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 deleted file mode 100644 index ee69188..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_10.jpg and /dev/null 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 deleted file mode 100644 index 72c288f..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_11.jpg and /dev/null 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 deleted file mode 100644 index 8bbd32c..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_12.jpg and /dev/null 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 deleted file mode 100644 index 1608d5b..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_13.jpg and /dev/null 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 deleted file mode 100644 index 5cab91a..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_14.jpg and /dev/null 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 deleted file mode 100644 index 870578b..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_2.jpg and /dev/null 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 deleted file mode 100644 index 44b2637..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_3.jpg and /dev/null 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 deleted file mode 100644 index 462b1bc..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_4.jpg and /dev/null 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 deleted file mode 100644 index 4c9d1d6..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_5.jpg and /dev/null 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 deleted file mode 100644 index 9ad1280..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_6.jpg and /dev/null 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 deleted file mode 100644 index 7054792..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_7.jpg and /dev/null 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 deleted file mode 100644 index edd7f59..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_8.jpg and /dev/null 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 deleted file mode 100644 index 859bade..0000000 Binary files a/content/posts/files/2025-12-27-osm_img/thumbs/photo_9.jpg and /dev/null 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 deleted file mode 100644 index a7602ed..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_19_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index d0ff6f2..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_1_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 7007409..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_20_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 17d8e06..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_25_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 87658fc..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_27_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index de29bfb..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_2_2025-12-28_21-35-40.png and /dev/null 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 deleted file mode 100644 index e028728..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_30_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 0c83ba7..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_31_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 00eddcc..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_32_2025-12-28_21-35-40.png and /dev/null 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 deleted file mode 100644 index a01eae9..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_3_2025-12-28_21-35-40.png and /dev/null 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 deleted file mode 100644 index 615da4b..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_5_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 69ad012..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/photo_9_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 7768b6e..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_19_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 369d229..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_1_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 35e1cd5..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_20_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index ccb1005..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_25_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 066be5c..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_27_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index ccab7b5..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_2_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 71aebf0..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_30_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index f9ef2da..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_31_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 381faff..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_32_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index f9e8a43..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_3_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 302bb88..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_5_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index 3c6b8f1..0000000 Binary files a/content/posts/files/2025-12-28-philharmonic-park_img/thumbs/photo_9_2025-12-28_21-35-40.jpg and /dev/null 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 deleted file mode 100644 index ae331d5..0000000 Binary files a/content/posts/files/2025-12-29-newyear-excel_img/cover.png and /dev/null 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 deleted file mode 100644 index b252f6e..0000000 Binary files a/content/posts/files/2025-12-29-newyear-excel_img/cover1.png and /dev/null 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 deleted file mode 100644 index 2d8aad2..0000000 Binary files a/content/posts/files/2025-12-29-newyear-excel_img/new_year.ods and /dev/null 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 deleted file mode 100644 index ca4469c..0000000 Binary files a/content/posts/files/2025-12-29-newyear-excel_img/new_year.xlsx and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/1.webp b/content/posts/files/2025-travel-1_img/1.webp deleted file mode 100644 index bc037f2..0000000 Binary files a/content/posts/files/2025-travel-1_img/1.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/10.webp b/content/posts/files/2025-travel-1_img/10.webp deleted file mode 100644 index 32bb46f..0000000 Binary files a/content/posts/files/2025-travel-1_img/10.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/11.webp b/content/posts/files/2025-travel-1_img/11.webp deleted file mode 100644 index 12f0933..0000000 Binary files a/content/posts/files/2025-travel-1_img/11.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/12.webp b/content/posts/files/2025-travel-1_img/12.webp deleted file mode 100644 index c797bf3..0000000 Binary files a/content/posts/files/2025-travel-1_img/12.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/13.webp b/content/posts/files/2025-travel-1_img/13.webp deleted file mode 100644 index 96db2e5..0000000 Binary files a/content/posts/files/2025-travel-1_img/13.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/14.webp b/content/posts/files/2025-travel-1_img/14.webp deleted file mode 100644 index 66a53d8..0000000 Binary files a/content/posts/files/2025-travel-1_img/14.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/15.webp b/content/posts/files/2025-travel-1_img/15.webp deleted file mode 100644 index a71672b..0000000 Binary files a/content/posts/files/2025-travel-1_img/15.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/16.webp b/content/posts/files/2025-travel-1_img/16.webp deleted file mode 100644 index e690ba3..0000000 Binary files a/content/posts/files/2025-travel-1_img/16.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/17.webp b/content/posts/files/2025-travel-1_img/17.webp deleted file mode 100644 index 81fa05b..0000000 Binary files a/content/posts/files/2025-travel-1_img/17.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/18.webp b/content/posts/files/2025-travel-1_img/18.webp deleted file mode 100644 index 5905999..0000000 Binary files a/content/posts/files/2025-travel-1_img/18.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/19.webp b/content/posts/files/2025-travel-1_img/19.webp deleted file mode 100644 index ab80bd9..0000000 Binary files a/content/posts/files/2025-travel-1_img/19.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/2.webp b/content/posts/files/2025-travel-1_img/2.webp deleted file mode 100644 index b9ecc86..0000000 Binary files a/content/posts/files/2025-travel-1_img/2.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/20.webp b/content/posts/files/2025-travel-1_img/20.webp deleted file mode 100644 index 1cc4e35..0000000 Binary files a/content/posts/files/2025-travel-1_img/20.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/21.webp b/content/posts/files/2025-travel-1_img/21.webp deleted file mode 100644 index 0f3cc2c..0000000 Binary files a/content/posts/files/2025-travel-1_img/21.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/22.webp b/content/posts/files/2025-travel-1_img/22.webp deleted file mode 100644 index b2d032d..0000000 Binary files a/content/posts/files/2025-travel-1_img/22.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/23.webp b/content/posts/files/2025-travel-1_img/23.webp deleted file mode 100644 index 00ad3f9..0000000 Binary files a/content/posts/files/2025-travel-1_img/23.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/3.webp b/content/posts/files/2025-travel-1_img/3.webp deleted file mode 100644 index 37ec362..0000000 Binary files a/content/posts/files/2025-travel-1_img/3.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/4.webp b/content/posts/files/2025-travel-1_img/4.webp deleted file mode 100644 index dfb29bd..0000000 Binary files a/content/posts/files/2025-travel-1_img/4.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/5.webp b/content/posts/files/2025-travel-1_img/5.webp deleted file mode 100644 index b5e1a8f..0000000 Binary files a/content/posts/files/2025-travel-1_img/5.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/6.webp b/content/posts/files/2025-travel-1_img/6.webp deleted file mode 100644 index 6b6bbca..0000000 Binary files a/content/posts/files/2025-travel-1_img/6.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/7.webp b/content/posts/files/2025-travel-1_img/7.webp deleted file mode 100644 index fcce61f..0000000 Binary files a/content/posts/files/2025-travel-1_img/7.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/8.webp b/content/posts/files/2025-travel-1_img/8.webp deleted file mode 100644 index b777d4c..0000000 Binary files a/content/posts/files/2025-travel-1_img/8.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/9.webp b/content/posts/files/2025-travel-1_img/9.webp deleted file mode 100644 index f40de11..0000000 Binary files a/content/posts/files/2025-travel-1_img/9.webp and /dev/null 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 deleted file mode 100644 index c18dc0c..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_1.webp and /dev/null 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 deleted file mode 100644 index 4d23293..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_10.webp and /dev/null 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 deleted file mode 100644 index 07e38b6..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_11.webp and /dev/null 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 deleted file mode 100644 index 7a23c41..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_12.webp and /dev/null 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 deleted file mode 100644 index 953fac9..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_13.webp and /dev/null 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 deleted file mode 100644 index 08cb032..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_14.webp and /dev/null 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 deleted file mode 100644 index 627702d..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_15.webp and /dev/null 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 deleted file mode 100644 index 2bfa651..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_16.webp and /dev/null 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 deleted file mode 100644 index 814ace2..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_17.webp and /dev/null 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 deleted file mode 100644 index 82422a8..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_18.webp and /dev/null 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 deleted file mode 100644 index b234b0c..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_19.webp and /dev/null 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 deleted file mode 100644 index c730b03..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_2.webp and /dev/null 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 deleted file mode 100644 index 266a83e..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_20.webp and /dev/null 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 deleted file mode 100644 index 3cab02c..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_21.webp and /dev/null 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 deleted file mode 100644 index 5530efa..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_22.webp and /dev/null 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 deleted file mode 100644 index aca8d32..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_23.webp and /dev/null 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 deleted file mode 100644 index 511e4c4..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_3.webp and /dev/null 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 deleted file mode 100644 index bfbe20e..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_4.webp and /dev/null 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 deleted file mode 100644 index 5d5811d..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_5.webp and /dev/null 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 deleted file mode 100644 index 076e35b..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_6.webp and /dev/null 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 deleted file mode 100644 index 02cd89a..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_7.webp and /dev/null 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 deleted file mode 100644 index 4c87281..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_8.webp and /dev/null 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 deleted file mode 100644 index 3791fbb..0000000 Binary files a/content/posts/files/2025-travel-1_img/preview_9.webp and /dev/null differ diff --git a/content/posts/files/2025-travel-1_img/saologo.png b/content/posts/files/2025-travel-1_img/saologo.png deleted file mode 100644 index 3fceeeb..0000000 Binary files a/content/posts/files/2025-travel-1_img/saologo.png and /dev/null differ diff --git a/content/posts/files/hype_curve.png b/content/posts/files/hype_curve.png deleted file mode 100644 index 9147d5e..0000000 Binary files a/content/posts/files/hype_curve.png and /dev/null differ diff --git a/content/posts/files/laughing-man.jpeg b/content/posts/files/laughing-man.jpeg deleted file mode 100644 index 652603c..0000000 Binary files a/content/posts/files/laughing-man.jpeg and /dev/null differ diff --git a/content/posts/files/lets-code-3d_img/1.jpg b/content/posts/files/lets-code-3d_img/1.jpg deleted file mode 100644 index 87f41e7..0000000 Binary files a/content/posts/files/lets-code-3d_img/1.jpg and /dev/null differ diff --git a/content/posts/files/lets-code-3d_img/2.jpg b/content/posts/files/lets-code-3d_img/2.jpg deleted file mode 100644 index db14947..0000000 Binary files a/content/posts/files/lets-code-3d_img/2.jpg and /dev/null differ diff --git a/content/posts/files/lets-code-3d_img/3.png b/content/posts/files/lets-code-3d_img/3.png deleted file mode 100644 index 9887043..0000000 Binary files a/content/posts/files/lets-code-3d_img/3.png and /dev/null differ diff --git a/content/posts/files/lets-code-3d_img/4.jpg b/content/posts/files/lets-code-3d_img/4.jpg deleted file mode 100644 index 4e7ebc7..0000000 Binary files a/content/posts/files/lets-code-3d_img/4.jpg and /dev/null differ diff --git a/content/posts/files/lets-code-3d_result.stl b/content/posts/files/lets-code-3d_result.stl deleted file mode 100644 index fdd4d19..0000000 Binary files a/content/posts/files/lets-code-3d_result.stl and /dev/null differ diff --git a/content/posts/files/lets-code-3d_source.scad b/content/posts/files/lets-code-3d_source.scad deleted file mode 100644 index b651cb3..0000000 --- a/content/posts/files/lets-code-3d_source.scad +++ /dev/null @@ -1,66 +0,0 @@ -// Толщина стенки -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 deleted file mode 100644 index 8f26704..0000000 Binary files a/content/posts/files/makeup-organizer_img/1.png and /dev/null differ diff --git a/content/posts/files/makeup-organizer_img/2.png b/content/posts/files/makeup-organizer_img/2.png deleted file mode 100644 index 6613744..0000000 Binary files a/content/posts/files/makeup-organizer_img/2.png and /dev/null differ diff --git a/content/posts/files/makeup-organizer_img/3.png b/content/posts/files/makeup-organizer_img/3.png deleted file mode 100644 index 993135e..0000000 Binary files a/content/posts/files/makeup-organizer_img/3.png and /dev/null differ diff --git a/content/posts/files/makeup-organizer_organizer.tar.zst b/content/posts/files/makeup-organizer_organizer.tar.zst deleted file mode 100644 index 7e2e2bb..0000000 Binary files a/content/posts/files/makeup-organizer_organizer.tar.zst and /dev/null differ diff --git a/content/posts/files/meshtastic_img/tbeam.jpg b/content/posts/files/meshtastic_img/tbeam.jpg deleted file mode 100644 index 214dc21..0000000 Binary files a/content/posts/files/meshtastic_img/tbeam.jpg and /dev/null differ diff --git a/content/posts/files/meshtastic_img/tbeam.webp b/content/posts/files/meshtastic_img/tbeam.webp deleted file mode 100644 index 7e89d94..0000000 Binary files a/content/posts/files/meshtastic_img/tbeam.webp and /dev/null differ diff --git a/content/projects/games/index.md b/content/projects/games/index.md index 4533a08..6a9cf4c 100644 --- a/content/projects/games/index.md +++ b/content/projects/games/index.md @@ -9,22 +9,24 @@ title: PICO-8 [![/projects/games/lines.p8.png](/projects/games/lines.p8.png)](/projects/games/lines.p8.png) [![/projects/games/snake.p8.png](/projects/games/snake.p8.png)](/projects/games/snake.p8.png) + + И на всякий случай дистрибутивы самих приложений. Ведь их больше не купить у нас в стране, а значит это не пиратство, а корсарство! Яррр! # PICO-8 -| Linux | macOS | Windows | -|-------|-------|---------| -|[Скачать](/files/pico-8_0_2_6b_amd64.zip)|[Скачать](/files/pico-8_0_2_6b_osx.zip)|[Скачать](/files/pico-8_0_2_6b_windows.zip)| +| Linux | macOS | Windows | +| ----------------------------------------- | --------------------------------------- | ------------------------------------------- | +| [Скачать](/files/pico-8_0_2_6b_amd64.zip) | [Скачать](/files/pico-8_0_2_6b_osx.zip) | [Скачать](/files/pico-8_0_2_6b_windows.zip) | # Picotron -| Linux | macOS | Windows | -|-------|-------|---------| -|[Скачать](/files/picotron_0_1_0g_amd64.zip)|[Скачать](/files/picotron_0_1_0g_osx.zip)|[Скачать](/files/picotron_0_1_0g_windows.zip)| +| Linux | macOS | Windows | +| ------------------------------------------- | ----------------------------------------- | --------------------------------------------- | +| [Скачать](/files/picotron_0_1_0g_amd64.zip) | [Скачать](/files/picotron_0_1_0g_osx.zip) | [Скачать](/files/picotron_0_1_0g_windows.zip) | # Voxatron -| Linux | macOS | Windows | -|-------|-------|---------| -|[Скачать](/files/voxatron_0_3_5b_amd64.zip)|[Скачать](/files/voxatron_0_3_5b_osx.zip)|[Скачать](/files/voxatron_0_3_5b_windows.zip)| +| Linux | macOS | Windows | +| ------------------------------------------- | ----------------------------------------- | --------------------------------------------- | +| [Скачать](/files/voxatron_0_3_5b_amd64.zip) | [Скачать](/files/voxatron_0_3_5b_osx.zip) | [Скачать](/files/voxatron_0_3_5b_windows.zip) | diff --git a/content/projects/grouper/index.md b/content/projects/grouper/index.md new file mode 100644 index 0000000..e7e79f3 --- /dev/null +++ b/content/projects/grouper/index.md @@ -0,0 +1,40 @@ +--- +title: "grouper - Дополнение для Firefox" +--- + +Ссылка на Addons Mozilla: https://addons.mozilla.org/ru/firefox/addon/groupper/ + +Репозиторий: https://gitrepo.ru/NeonXP/Grouper + +Расширение для Firefox для автоматической группировки вкладок по группам на базе +доменного имени сайта. + + + +При этом домен преобразуется в имя вкладки по следующим +правилам: + +1. Домен делится по точкам +2. Отсекается домен 1 уровня (.ru, .com, .net и т.п.) +3. Если самый верхний уровень домена — www, то он так же отсекается, как не + информативная часть +4. Оставшееся преобразуется в Title Case (то есть первая буква каждого слова + становится заглавной) + +Таким образом, например, все страницы домена `www.some.site.ru` сгруппируются +автоматически в группу `Some Site`. + +И вот так это выглядит у меня: + +![grouper](/posts/2026-02-01-grouper/grouper.png) + +Да, подобных расширений более одного, но мне хотелось именно эти правила по +формированию имен групп. В других расширениях или использовался только домен +второго уровня, или были другие неудобности. Например, все группы были одного +цвета, а хотелось бы автоматически разного, чтобы визуально различались, или ещё +какие шороховатости. Я не говорю, что у меня идеально, но оно идеально для _меня_! + +Отдельно, хотел бы отметить его простоту. Оно делает только то что написано +выше, никаких треккингов, реклам или прочего мусора! Более того, js код никак не +обфусцирован, соответственно, любой может убедиться в этом сам. Да да, в +современном мире, это скорее особенность, чем само собой разумеющееся. diff --git a/content/projects/qchat.md b/content/projects/qchat.md deleted file mode 100644 index ed3b9a0..0000000 --- a/content/projects/qchat.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: 'qChat - quick chat' ---- - -Репозиторий: https://gitrepo.ru/NeonXP/qChat - -Очень маленький и минималистичный чат, который реализует собой чат поверх SSH. - -Внешних зависимостей нет, должен работать на любой картошке. - -Подключение к демонстрационному чату: - -``` -ssh neonxp.ru -p 1337 -``` - -## Установка и запуск - -Просто скачайте и запустите бинарник для соответствующей платформы. При первом -запуске в текущей рабочей директории будет создан конфиг файл с умолчальной -конфигурацией. При последующих запусках — будет он использоваться и не -пересоздаваться. - -В конфиге лежит приватный ключ! Его нужно хранить в секрете. Остальные параметры -там — дефолтный список каналов и название сервера. Их можно менять. - -### Ссылки для скачивания - -#### v0.0.2 [Исходники](https://gitrepo.ru/NeonXP/qChat/archive/v0.0.2.tar.gz) - -Готовые бинарники: - -- [Linux amd64](/files/qchat/v0.0.2/qchat-linux-amd64.tar.gz) -- [Linux arm64](/files/qchat/v0.0.2/qchat-linux-arm64.tar.gz) -- [Linux x86](/files/qchat/v0.0.2/qchat-linux-386.tar.gz) -- [Linux arm/v6](/files/qchat/v0.0.2/qchat-linux-arm-v6.tar.gz) -- [Linux arm/v7](/files/qchat/v0.0.2/qchat-linux-arm-v7.tar.gz) -- [macOS amd64](/files/qchat/v0.0.2/qchat-darwin-amd64.tar.gz) -- [macOS arm64](/files/qchat/v0.0.2/qchat-darwin-arm64.tar.gz) -- [Windows x32](/files/qchat/v0.0.2/qchat-windows-386.zip) -- [Windows x64](/files/qchat/v0.0.2/qchat-windows-amd64.zip) -- [dragonfly amd64](/files/qchat/v0.0.2/qchat-dragonfly-amd64.tar.gz) -- [FreeBSD amd64](/files/qchat/v0.0.2/qchat-freebsd-amd64.tar.gz) -- [FreeBSD arm64](/files/qchat/v0.0.2/qchat-freebsd-arm64.tar.gz) -- [NetBSD amd64](/files/qchat/v0.0.2/qchat-netbsd-amd64.tar.gz) -- [NetBSD arm64](/files/qchat/v0.0.2/qchat-netbsd-arm64.tar.gz) -- [OpenBSD amd64](/files/qchat/v0.0.2/qchat-openbsd-amd64.tar.gz) -- [OpenBSD arm64](/files/qchat/v0.0.2/qchat-openbsd-arm64.tar.gz) -- [Solaris amd64](/files/qchat/v0.0.2/qchat-solaris-amd64.tar.gz) - -## Установка с помощью Docker - -``` -docker volume create qchat_conf -docker run -d --name qchat -p 1337:1337 -v qchat_conf:/etc/qchat gitrepo.ru/neonxp/qchat /app/qchat -config /etc/qchat/config.json -``` - -## Подключение к чату - -Для подключения к чату достаточно стандартного клиента ssh. Во всех адекватных -ОС он есть из коробки. Для Windows - можно использовать Putty. - -``` -ssh [имя_пользователя@]хост -p 1337 -``` - -Например, при локально запущенном чате: - -``` -ssh localhost -p 1337 -``` - -Подойдёт любой эмулятор терминала совместимый с VT100. - -## Команды сервера - -Полную справку так же можно получить с помощью команды `/help`. - -- `/join [chan]` - подключиться к каналу [chan]. Если его нет, он будет создан. -- `/chans` - список каналов -- `/users` - список пользователей на сервере (не на канале, а именно на сервере) -- `/me [message]` - отправка сообщения как бы от третьего лица - -## Форматирование сообщений - -- `*Полужирный*` -- `+Курсив+` -- `-Зачёркнутый текст-` -- `_Подчёркнутый текст_` diff --git a/content/projects/qchat/index.md b/content/projects/qchat/index.md new file mode 100644 index 0000000..0737a51 --- /dev/null +++ b/content/projects/qchat/index.md @@ -0,0 +1,91 @@ +--- +title: "qChat - quick chat" +--- + +Репозиторий: https://gitrepo.ru/NeonXP/qChat + +Очень маленький и минималистичный чат, который реализует собой чат поверх SSH. + + + +Внешних зависимостей нет, должен работать на любой картошке. + +Подключение к демонстрационному чату: + +``` +ssh neonxp.ru -p 1337 +``` + +## Установка и запуск + +Просто скачайте и запустите бинарник для соответствующей платформы. При первом +запуске в текущей рабочей директории будет создан конфиг файл с умолчальной +конфигурацией. При последующих запусках — будет он использоваться и не +пересоздаваться. + +В конфиге лежит приватный ключ! Его нужно хранить в секрете. Остальные параметры +там — дефолтный список каналов и название сервера. Их можно менять. + +### Ссылки для скачивания + +#### v0.0.2 [Исходники](https://gitrepo.ru/NeonXP/qChat/archive/v0.0.2.tar.gz) + +Готовые бинарники: + +- [Linux amd64](/files/qchat/v0.0.2/qchat-linux-amd64.tar.gz) +- [Linux arm64](/files/qchat/v0.0.2/qchat-linux-arm64.tar.gz) +- [Linux x86](/files/qchat/v0.0.2/qchat-linux-386.tar.gz) +- [Linux arm/v6](/files/qchat/v0.0.2/qchat-linux-arm-v6.tar.gz) +- [Linux arm/v7](/files/qchat/v0.0.2/qchat-linux-arm-v7.tar.gz) +- [macOS amd64](/files/qchat/v0.0.2/qchat-darwin-amd64.tar.gz) +- [macOS arm64](/files/qchat/v0.0.2/qchat-darwin-arm64.tar.gz) +- [Windows x32](/files/qchat/v0.0.2/qchat-windows-386.zip) +- [Windows x64](/files/qchat/v0.0.2/qchat-windows-amd64.zip) +- [dragonfly amd64](/files/qchat/v0.0.2/qchat-dragonfly-amd64.tar.gz) +- [FreeBSD amd64](/files/qchat/v0.0.2/qchat-freebsd-amd64.tar.gz) +- [FreeBSD arm64](/files/qchat/v0.0.2/qchat-freebsd-arm64.tar.gz) +- [NetBSD amd64](/files/qchat/v0.0.2/qchat-netbsd-amd64.tar.gz) +- [NetBSD arm64](/files/qchat/v0.0.2/qchat-netbsd-arm64.tar.gz) +- [OpenBSD amd64](/files/qchat/v0.0.2/qchat-openbsd-amd64.tar.gz) +- [OpenBSD arm64](/files/qchat/v0.0.2/qchat-openbsd-arm64.tar.gz) +- [Solaris amd64](/files/qchat/v0.0.2/qchat-solaris-amd64.tar.gz) + +## Установка с помощью Docker + +``` +docker volume create qchat_conf +docker run -d --name qchat -p 1337:1337 -v qchat_conf:/etc/qchat gitrepo.ru/neonxp/qchat /app/qchat -config /etc/qchat/config.json +``` + +## Подключение к чату + +Для подключения к чату достаточно стандартного клиента ssh. Во всех адекватных +ОС он есть из коробки. Для Windows - можно использовать Putty. + +``` +ssh [имя_пользователя@]хост -p 1337 +``` + +Например, при локально запущенном чате: + +``` +ssh localhost -p 1337 +``` + +Подойдёт любой эмулятор терминала совместимый с VT100. + +## Команды сервера + +Полную справку так же можно получить с помощью команды `/help`. + +- `/join [chan]` - подключиться к каналу [chan]. Если его нет, он будет создан. +- `/chans` - список каналов +- `/users` - список пользователей на сервере (не на канале, а именно на сервере) +- `/me [message]` - отправка сообщения как бы от третьего лица + +## Форматирование сообщений + +- `*Полужирный*` +- `+Курсив+` +- `-Зачёркнутый текст-` +- `_Подчёркнутый текст_` -- cgit v1.2.3